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