Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / include / core / SkImageEncoder.h
1
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #ifndef SkImageEncoder_DEFINED
9 #define SkImageEncoder_DEFINED
10
11 #include "SkTypes.h"
12 #include "SkTRegistry.h"
13
14 class SkBitmap;
15 class SkData;
16 class SkWStream;
17
18 class SkImageEncoder {
19 public:
20     enum Type {
21         kUnknown_Type,
22         kBMP_Type,
23         kGIF_Type,
24         kICO_Type,
25         kJPEG_Type,
26         kPNG_Type,
27         kWBMP_Type,
28         kWEBP_Type,
29         kKTX_Type,
30     };
31     static SkImageEncoder* Create(Type);
32
33     virtual ~SkImageEncoder();
34
35     /*  Quality ranges from 0..100 */
36     enum {
37         kDefaultQuality = 80
38     };
39
40     /**
41      *  Encode bitmap 'bm', returning the results in an SkData, at quality level
42      *  'quality' (which can be in range 0-100). If the bitmap cannot be
43      *  encoded, return null. On success, the caller is responsible for
44      *  calling unref() on the data when they are finished.
45      */
46     SkData* encodeData(const SkBitmap&, int quality);
47
48     /**
49      * Encode bitmap 'bm' in the desired format, writing results to
50      * file 'file', at quality level 'quality' (which can be in range
51      * 0-100). Returns false on failure.
52      */
53     bool encodeFile(const char file[], const SkBitmap& bm, int quality);
54
55     /**
56      * Encode bitmap 'bm' in the desired format, writing results to
57      * stream 'stream', at quality level 'quality' (which can be in
58      * range 0-100). Returns false on failure.
59      */
60     bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality);
61
62     static SkData* EncodeData(const SkBitmap&, Type, int quality);
63     static bool EncodeFile(const char file[], const SkBitmap&, Type,
64                            int quality);
65     static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
66                            int quality);
67
68 protected:
69     /**
70      * Encode bitmap 'bm' in the desired format, writing results to
71      * stream 'stream', at quality level 'quality' (which can be in
72      * range 0-100).
73      *
74      * This must be overridden by each SkImageEncoder implementation.
75      */
76     virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0;
77 };
78
79 // This macro declares a global (i.e., non-class owned) creation entry point
80 // for each encoder (e.g., CreateJPEGImageEncoder)
81 #define DECLARE_ENCODER_CREATOR(codec)          \
82     SkImageEncoder *Create ## codec ();
83
84 // This macro defines the global creation entry point for each encoder. Each
85 // encoder implementation that registers with the encoder factory must call it.
86 #define DEFINE_ENCODER_CREATOR(codec)           \
87     SkImageEncoder *Create ## codec () {        \
88         return SkNEW( Sk ## codec );            \
89     }
90
91 // All the encoders known by Skia. Note that, depending on the compiler settings,
92 // not all of these will be available
93 /** An ARGBImageEncoder will always write out
94  *  bitmap.width() * bitmap.height() * 4
95  *  bytes.
96  */
97 DECLARE_ENCODER_CREATOR(ARGBImageEncoder);
98 DECLARE_ENCODER_CREATOR(JPEGImageEncoder);
99 DECLARE_ENCODER_CREATOR(PNGImageEncoder);
100 DECLARE_ENCODER_CREATOR(KTXImageEncoder);
101 DECLARE_ENCODER_CREATOR(WEBPImageEncoder);
102
103 #ifdef SK_BUILD_FOR_IOS
104 DECLARE_ENCODER_CREATOR(PNGImageEncoder_IOS);
105 #endif
106
107 // Typedef to make registering encoder callback easier
108 // This has to be defined outside SkImageEncoder. :(
109 typedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;
110 #endif