180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkImageEncoder_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkImageEncoder_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTypes.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkBitmap; 147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass SkData; 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkWStream; 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkImageEncoder { 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum Type { 207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kUnknown_Type, 217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kBMP_Type, 227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kGIF_Type, 237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kICO_Type, 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kJPEG_Type, 25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kPNG_Type, 267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kWBMP_Type, 277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kWEBP_Type, 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageEncoder* Create(Type); 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~SkImageEncoder(); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* Quality ranges from 0..100 */ 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum { 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDefaultQuality = 80 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Encode bitmap 'bm', returning the results in an SkData, at quality level 407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * 'quality' (which can be in range 0-100). If the bitmap cannot be 417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * encoded, return null. On success, the caller is responsible for 427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * calling unref() on the data when they are finished. 437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkData* encodeData(const SkBitmap&, int quality); 457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger /** 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Encode bitmap 'bm' in the desired format, writing results to 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * file 'file', at quality level 'quality' (which can be in range 497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * 0-100). Returns false on failure. 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool encodeFile(const char file[], const SkBitmap& bm, int quality); 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Encode bitmap 'bm' in the desired format, writing results to 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * stream 'stream', at quality level 'quality' (which can be in 567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * range 0-100). Returns false on failure. 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality); 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static SkData* EncodeData(const SkBitmap&, Type, int quality); 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static bool EncodeFile(const char file[], const SkBitmap&, Type, 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int quality); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static bool EncodeStream(SkWStream*, const SkBitmap&, Type, 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int quality); 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Encode bitmap 'bm' in the desired format, writing results to 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * stream 'stream', at quality level 'quality' (which can be in 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * range 0-100). 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * This must be overridden by each SkImageEncoder implementation. 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0; 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// This macro declares a global (i.e., non-class owned) creation entry point 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// for each encoder (e.g., CreateJPEGImageEncoder) 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define DECLARE_ENCODER_CREATOR(codec) \ 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkImageEncoder *Create ## codec (); 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// This macro defines the global creation entry point for each encoder. Each 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// encoder implementation that registers with the encoder factory must call it. 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define DEFINE_ENCODER_CREATOR(codec) \ 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkImageEncoder *Create ## codec () { \ 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkNEW( Sk ## codec ); \ 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// All the encoders known by Skia. Note that, depending on the compiler settings, 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// not all of these will be available 917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** An ARGBImageEncoder will always write out 927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * bitmap.width() * bitmap.height() * 4 937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * bytes. 947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerDECLARE_ENCODER_CREATOR(ARGBImageEncoder); 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDECLARE_ENCODER_CREATOR(JPEGImageEncoder); 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDECLARE_ENCODER_CREATOR(PNGImageEncoder); 98096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDECLARE_ENCODER_CREATOR(WEBPImageEncoder); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 101