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