SkImageEncoder.h revision 096defe64d408e54474fe19f418c95bf1a554fc7
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; 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkWStream; 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkImageEncoder { 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum Type { 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kJPEG_Type, 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kPNG_Type, 21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kWEBP_Type 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageEncoder* Create(Type); 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~SkImageEncoder(); 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* Quality ranges from 0..100 */ 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum { 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDefaultQuality = 80 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Encode bitmap 'bm' in the desired format, writing results to 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * file 'file', at quality level 'quality' (which can be in range 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 0-100). 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Calls the particular implementation's onEncode() method to 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * actually do the encoding. 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool encodeFile(const char file[], const SkBitmap& bm, int quality); 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Encode bitmap 'bm' in the desired format, writing results to 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * stream 'stream', at quality level 'quality' (which can be in 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * range 0-100). 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Calls the particular implementation's onEncode() method to 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * actually do the encoding. 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static bool EncodeFile(const char file[], const SkBitmap&, Type, 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int quality); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static bool EncodeStream(SkWStream*, const SkBitmap&, Type, 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int quality); 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Encode bitmap 'bm' in the desired format, writing results to 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * stream 'stream', at quality level 'quality' (which can be in 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * range 0-100). 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * This must be overridden by each SkImageEncoder implementation. 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0; 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// This macro declares a global (i.e., non-class owned) creation entry point 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// for each encoder (e.g., CreateJPEGImageEncoder) 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define DECLARE_ENCODER_CREATOR(codec) \ 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkImageEncoder *Create ## codec (); 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// This macro defines the global creation entry point for each encoder. Each 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// encoder implementation that registers with the encoder factory must call it. 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define DEFINE_ENCODER_CREATOR(codec) \ 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkImageEncoder *Create ## codec () { \ 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkNEW( Sk ## codec ); \ 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// All the encoders known by Skia. Note that, depending on the compiler settings, 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// not all of these will be available 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDECLARE_ENCODER_CREATOR(JPEGImageEncoder); 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDECLARE_ENCODER_CREATOR(PNGImageEncoder); 84096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDECLARE_ENCODER_CREATOR(WEBPImageEncoder); 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 87