blob: a9eecc4367be497bf1815021ab9528d5aec8af73 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
reed53b9e2e2014-12-19 12:26:07 -08007
reed@android.comb08eb2b2009-01-06 20:16:26 +00008#ifndef SkImageEncoder_DEFINED
9#define SkImageEncoder_DEFINED
10
reed53b9e2e2014-12-19 12:26:07 -080011#include "SkImageInfo.h"
mtklein@google.combd6343b2013-09-04 17:20:18 +000012#include "SkTRegistry.h"
reed@android.comb08eb2b2009-01-06 20:16:26 +000013
14class SkBitmap;
reed@google.com4b0757b2013-05-20 16:33:41 +000015class SkData;
reed@android.comb08eb2b2009-01-06 20:16:26 +000016class SkWStream;
17
18class SkImageEncoder {
19public:
scroggo1dd3ea92015-03-20 11:55:55 -070020 // TODO (scroggo): Merge with SkEncodedFormat.
reed@android.comb08eb2b2009-01-06 20:16:26 +000021 enum Type {
scroggo@google.com39edf4c2013-04-25 17:33:51 +000022 kUnknown_Type,
scroggo@google.com4c6adf92013-04-17 21:07:55 +000023 kBMP_Type,
24 kGIF_Type,
25 kICO_Type,
reed@android.comb08eb2b2009-01-06 20:16:26 +000026 kJPEG_Type,
commit-bot@chromium.orga936e372013-03-14 14:42:18 +000027 kPNG_Type,
scroggo@google.com4c6adf92013-04-17 21:07:55 +000028 kWBMP_Type,
29 kWEBP_Type,
krajcevskic250d2e2014-06-06 06:16:28 -070030 kKTX_Type,
reed@android.comb08eb2b2009-01-06 20:16:26 +000031 };
32 static SkImageEncoder* Create(Type);
33
34 virtual ~SkImageEncoder();
rmistry@google.comfbfcd562012-08-23 18:09:54 +000035
reed@android.comb08eb2b2009-01-06 20:16:26 +000036 /* Quality ranges from 0..100 */
37 enum {
38 kDefaultQuality = 80
39 };
40
epoger@google.com4ce738b2012-11-16 18:44:18 +000041 /**
reed@google.com4b0757b2013-05-20 16:33:41 +000042 * Encode bitmap 'bm', returning the results in an SkData, at quality level
43 * 'quality' (which can be in range 0-100). If the bitmap cannot be
44 * encoded, return null. On success, the caller is responsible for
45 * calling unref() on the data when they are finished.
46 */
47 SkData* encodeData(const SkBitmap&, int quality);
48
49 /**
epoger@google.com4ce738b2012-11-16 18:44:18 +000050 * Encode bitmap 'bm' in the desired format, writing results to
51 * file 'file', at quality level 'quality' (which can be in range
reed@google.com4b0757b2013-05-20 16:33:41 +000052 * 0-100). Returns false on failure.
epoger@google.com4ce738b2012-11-16 18:44:18 +000053 */
54 bool encodeFile(const char file[], const SkBitmap& bm, int quality);
55
56 /**
57 * Encode bitmap 'bm' in the desired format, writing results to
58 * stream 'stream', at quality level 'quality' (which can be in
reed@google.com4b0757b2013-05-20 16:33:41 +000059 * range 0-100). Returns false on failure.
epoger@google.com4ce738b2012-11-16 18:44:18 +000060 */
61 bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality);
reed@android.comb08eb2b2009-01-06 20:16:26 +000062
reed53b9e2e2014-12-19 12:26:07 -080063 static SkData* EncodeData(const SkImageInfo&, const void* pixels, size_t rowBytes,
64 Type, int quality);
reed@google.com4b0757b2013-05-20 16:33:41 +000065 static SkData* EncodeData(const SkBitmap&, Type, int quality);
reed53b9e2e2014-12-19 12:26:07 -080066
reed@android.comb08eb2b2009-01-06 20:16:26 +000067 static bool EncodeFile(const char file[], const SkBitmap&, Type,
68 int quality);
69 static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
70 int quality);
71
72protected:
epoger@google.com4ce738b2012-11-16 18:44:18 +000073 /**
74 * Encode bitmap 'bm' in the desired format, writing results to
75 * stream 'stream', at quality level 'quality' (which can be in
76 * range 0-100).
77 *
78 * This must be overridden by each SkImageEncoder implementation.
79 */
80 virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0;
reed@android.comb08eb2b2009-01-06 20:16:26 +000081};
82
robertphillips@google.comec51cb82012-03-23 18:13:47 +000083// This macro declares a global (i.e., non-class owned) creation entry point
84// for each encoder (e.g., CreateJPEGImageEncoder)
85#define DECLARE_ENCODER_CREATOR(codec) \
86 SkImageEncoder *Create ## codec ();
87
88// This macro defines the global creation entry point for each encoder. Each
89// encoder implementation that registers with the encoder factory must call it.
90#define DEFINE_ENCODER_CREATOR(codec) \
91 SkImageEncoder *Create ## codec () { \
92 return SkNEW( Sk ## codec ); \
93 }
94
95// All the encoders known by Skia. Note that, depending on the compiler settings,
96// not all of these will be available
bungeman@google.com8c6a4f22013-04-23 18:06:23 +000097/** An ARGBImageEncoder will always write out
98 * bitmap.width() * bitmap.height() * 4
99 * bytes.
100 */
101DECLARE_ENCODER_CREATOR(ARGBImageEncoder);
robertphillips@google.comec51cb82012-03-23 18:13:47 +0000102DECLARE_ENCODER_CREATOR(JPEGImageEncoder);
103DECLARE_ENCODER_CREATOR(PNGImageEncoder);
krajcevskic250d2e2014-06-06 06:16:28 -0700104DECLARE_ENCODER_CREATOR(KTXImageEncoder);
commit-bot@chromium.orga936e372013-03-14 14:42:18 +0000105DECLARE_ENCODER_CREATOR(WEBPImageEncoder);
robertphillips@google.comec51cb82012-03-23 18:13:47 +0000106
caryclark936b7342014-07-11 12:14:51 -0700107#ifdef SK_BUILD_FOR_IOS
108DECLARE_ENCODER_CREATOR(PNGImageEncoder_IOS);
109#endif
110
mtklein@google.combd6343b2013-09-04 17:20:18 +0000111// Typedef to make registering encoder callback easier
112// This has to be defined outside SkImageEncoder. :(
113typedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;
reed@android.comb08eb2b2009-01-06 20:16:26 +0000114#endif