1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com#ifndef SkImageEncoder_DEFINED
9b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com#define SkImageEncoder_DEFINED
10b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
11b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com#include "SkTypes.h"
12bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.com#include "SkTRegistry.h"
13b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
14b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.comclass SkBitmap;
154b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.comclass SkData;
16b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.comclass SkWStream;
17b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
18b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.comclass SkImageEncoder {
19b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.compublic:
20b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    enum Type {
2139edf4cd94e6fbeb8c1187a588b314e9795c81e4scroggo@google.com        kUnknown_Type,
224c6adf9a089dbdd541f25d01d257ec05aedcb57dscroggo@google.com        kBMP_Type,
234c6adf9a089dbdd541f25d01d257ec05aedcb57dscroggo@google.com        kGIF_Type,
244c6adf9a089dbdd541f25d01d257ec05aedcb57dscroggo@google.com        kICO_Type,
25b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com        kJPEG_Type,
26a936e37cc76614868f5b489395bceeb340cc04cdcommit-bot@chromium.org        kPNG_Type,
274c6adf9a089dbdd541f25d01d257ec05aedcb57dscroggo@google.com        kWBMP_Type,
284c6adf9a089dbdd541f25d01d257ec05aedcb57dscroggo@google.com        kWEBP_Type,
29c250d2e4abdbe8193357696518592af8a0b4555akrajcevski        kKTX_Type,
30b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    };
31b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    static SkImageEncoder* Create(Type);
32b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
33b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    virtual ~SkImageEncoder();
34fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
35b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    /*  Quality ranges from 0..100 */
36b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    enum {
37b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com        kDefaultQuality = 80
38b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    };
39b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
404ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com    /**
414b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     *  Encode bitmap 'bm', returning the results in an SkData, at quality level
424b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     *  'quality' (which can be in range 0-100). If the bitmap cannot be
434b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     *  encoded, return null. On success, the caller is responsible for
444b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     *  calling unref() on the data when they are finished.
454b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     */
464b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    SkData* encodeData(const SkBitmap&, int quality);
474b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com
484b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    /**
494ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * Encode bitmap 'bm' in the desired format, writing results to
504ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * file 'file', at quality level 'quality' (which can be in range
514b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     * 0-100). Returns false on failure.
524ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     */
534ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com    bool encodeFile(const char file[], const SkBitmap& bm, int quality);
544ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com
554ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com    /**
564ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * Encode bitmap 'bm' in the desired format, writing results to
574ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * stream 'stream', at quality level 'quality' (which can be in
584b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com     * range 0-100). Returns false on failure.
594ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     */
604ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com    bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality);
61b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
624b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    static SkData* EncodeData(const SkBitmap&, Type, int quality);
63b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    static bool EncodeFile(const char file[], const SkBitmap&, Type,
64b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com                           int quality);
65b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com    static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
66b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com                           int quality);
67b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
68b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.comprotected:
694ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com    /**
704ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * Encode bitmap 'bm' in the desired format, writing results to
714ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * stream 'stream', at quality level 'quality' (which can be in
724ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * range 0-100).
734ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     *
744ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     * This must be overridden by each SkImageEncoder implementation.
754ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com     */
764ce738b98ee0be1771712e3036a7711c21f3b7f4epoger@google.com    virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0;
77b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com};
78b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com
79ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com// This macro declares a global (i.e., non-class owned) creation entry point
80ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com// for each encoder (e.g., CreateJPEGImageEncoder)
81ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com#define DECLARE_ENCODER_CREATOR(codec)          \
82ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com    SkImageEncoder *Create ## codec ();
83ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com
84ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com// This macro defines the global creation entry point for each encoder. Each
85ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com// encoder implementation that registers with the encoder factory must call it.
86ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com#define DEFINE_ENCODER_CREATOR(codec)           \
87ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com    SkImageEncoder *Create ## codec () {        \
88ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com        return SkNEW( Sk ## codec );            \
89ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com    }
90ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com
91ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com// All the encoders known by Skia. Note that, depending on the compiler settings,
92ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com// not all of these will be available
938c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com/** An ARGBImageEncoder will always write out
948c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com *  bitmap.width() * bitmap.height() * 4
958c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com *  bytes.
968c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com */
978c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.comDECLARE_ENCODER_CREATOR(ARGBImageEncoder);
98ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.comDECLARE_ENCODER_CREATOR(JPEGImageEncoder);
99ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.comDECLARE_ENCODER_CREATOR(PNGImageEncoder);
100c250d2e4abdbe8193357696518592af8a0b4555akrajcevskiDECLARE_ENCODER_CREATOR(KTXImageEncoder);
101a936e37cc76614868f5b489395bceeb340cc04cdcommit-bot@chromium.orgDECLARE_ENCODER_CREATOR(WEBPImageEncoder);
102ec51cb863409e238b40c5beef458669d9a824481robertphillips@google.com
103bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.com// Typedef to make registering encoder callback easier
104bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.com// This has to be defined outside SkImageEncoder. :(
105bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.comtypedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;
106b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com#endif
107