blob: 4d4d2a83c0f18a0bd31a8d42bd64d947703a8126 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@android.comb08eb2b2009-01-06 20:16:26 +00008#ifndef SkImageEncoder_DEFINED
9#define SkImageEncoder_DEFINED
10
11#include "SkTypes.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:
20 enum Type {
scroggo@google.com39edf4c2013-04-25 17:33:51 +000021 kUnknown_Type,
scroggo@google.com4c6adf92013-04-17 21:07:55 +000022 kBMP_Type,
23 kGIF_Type,
24 kICO_Type,
reed@android.comb08eb2b2009-01-06 20:16:26 +000025 kJPEG_Type,
commit-bot@chromium.orga936e372013-03-14 14:42:18 +000026 kPNG_Type,
scroggo@google.com4c6adf92013-04-17 21:07:55 +000027 kWBMP_Type,
28 kWEBP_Type,
krajcevskic250d2e2014-06-06 06:16:28 -070029 kKTX_Type,
reed@android.comb08eb2b2009-01-06 20:16:26 +000030 };
31 static SkImageEncoder* Create(Type);
32
33 virtual ~SkImageEncoder();
rmistry@google.comfbfcd562012-08-23 18:09:54 +000034
reed@android.comb08eb2b2009-01-06 20:16:26 +000035 /* Quality ranges from 0..100 */
36 enum {
37 kDefaultQuality = 80
38 };
39
epoger@google.com4ce738b2012-11-16 18:44:18 +000040 /**
reed@google.com4b0757b2013-05-20 16:33:41 +000041 * 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 /**
epoger@google.com4ce738b2012-11-16 18:44:18 +000049 * Encode bitmap 'bm' in the desired format, writing results to
50 * file 'file', at quality level 'quality' (which can be in range
reed@google.com4b0757b2013-05-20 16:33:41 +000051 * 0-100). Returns false on failure.
epoger@google.com4ce738b2012-11-16 18:44:18 +000052 */
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
reed@google.com4b0757b2013-05-20 16:33:41 +000058 * range 0-100). Returns false on failure.
epoger@google.com4ce738b2012-11-16 18:44:18 +000059 */
60 bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality);
reed@android.comb08eb2b2009-01-06 20:16:26 +000061
reed@google.com4b0757b2013-05-20 16:33:41 +000062 static SkData* EncodeData(const SkBitmap&, Type, int quality);
reed@android.comb08eb2b2009-01-06 20:16:26 +000063 static bool EncodeFile(const char file[], const SkBitmap&, Type,
64 int quality);
65 static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
66 int quality);
67
68protected:
epoger@google.com4ce738b2012-11-16 18:44:18 +000069 /**
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;
reed@android.comb08eb2b2009-01-06 20:16:26 +000077};
78
robertphillips@google.comec51cb82012-03-23 18:13:47 +000079// 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
bungeman@google.com8c6a4f22013-04-23 18:06:23 +000093/** An ARGBImageEncoder will always write out
94 * bitmap.width() * bitmap.height() * 4
95 * bytes.
96 */
97DECLARE_ENCODER_CREATOR(ARGBImageEncoder);
robertphillips@google.comec51cb82012-03-23 18:13:47 +000098DECLARE_ENCODER_CREATOR(JPEGImageEncoder);
99DECLARE_ENCODER_CREATOR(PNGImageEncoder);
krajcevskic250d2e2014-06-06 06:16:28 -0700100DECLARE_ENCODER_CREATOR(KTXImageEncoder);
commit-bot@chromium.orga936e372013-03-14 14:42:18 +0000101DECLARE_ENCODER_CREATOR(WEBPImageEncoder);
robertphillips@google.comec51cb82012-03-23 18:13:47 +0000102
caryclark936b7342014-07-11 12:14:51 -0700103#ifdef SK_BUILD_FOR_IOS
104DECLARE_ENCODER_CREATOR(PNGImageEncoder_IOS);
105#endif
106
mtklein@google.combd6343b2013-09-04 17:20:18 +0000107// Typedef to make registering encoder callback easier
108// This has to be defined outside SkImageEncoder. :(
109typedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;
reed@android.comb08eb2b2009-01-06 20:16:26 +0000110#endif