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