Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2011 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkImageEncoder_DEFINED
      9 #define SkImageEncoder_DEFINED
     10 
     11 #include "SkImageInfo.h"
     12 #include "SkTRegistry.h"
     13 
     14 class SkBitmap;
     15 class SkData;
     16 class SkWStream;
     17 
     18 class SkImageEncoder {
     19 public:
     20     // TODO (scroggo): Merge with SkEncodedFormat.
     21     enum Type {
     22         kUnknown_Type,
     23         kBMP_Type,
     24         kGIF_Type,
     25         kICO_Type,
     26         kJPEG_Type,
     27         kPNG_Type,
     28         kWBMP_Type,
     29         kWEBP_Type,
     30         kKTX_Type,
     31     };
     32     static SkImageEncoder* Create(Type);
     33 
     34     virtual ~SkImageEncoder();
     35 
     36     /*  Quality ranges from 0..100 */
     37     enum {
     38         kDefaultQuality = 80
     39     };
     40 
     41     /**
     42      *  Encode bitmap 'bm', returning the results in an SkData, at quality level
     43      *  'quality' (which can be in range 0-100). If the bitmap cannot be
     44      *  encoded, return null. On success, the caller is responsible for
     45      *  calling unref() on the data when they are finished.
     46      */
     47     SkData* encodeData(const SkBitmap&, int quality);
     48 
     49     /**
     50      * Encode bitmap 'bm' in the desired format, writing results to
     51      * file 'file', at quality level 'quality' (which can be in range
     52      * 0-100). Returns false on failure.
     53      */
     54     bool encodeFile(const char file[], const SkBitmap& bm, int quality);
     55 
     56     /**
     57      * Encode bitmap 'bm' in the desired format, writing results to
     58      * stream 'stream', at quality level 'quality' (which can be in
     59      * range 0-100). Returns false on failure.
     60      */
     61     bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality);
     62 
     63     static SkData* EncodeData(const SkImageInfo&, const void* pixels, size_t rowBytes,
     64                               Type, int quality);
     65     static SkData* EncodeData(const SkBitmap&, Type, int quality);
     66 
     67     static bool EncodeFile(const char file[], const SkBitmap&, Type,
     68                            int quality);
     69     static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
     70                            int quality);
     71 
     72 protected:
     73     /**
     74      * Encode bitmap 'bm' in the desired format, writing results to
     75      * stream 'stream', at quality level 'quality' (which can be in
     76      * range 0-100).
     77      *
     78      * This must be overridden by each SkImageEncoder implementation.
     79      */
     80     virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0;
     81 };
     82 
     83 // This macro declares a global (i.e., non-class owned) creation entry point
     84 // for each encoder (e.g., CreateJPEGImageEncoder)
     85 #define DECLARE_ENCODER_CREATOR(codec)          \
     86     SkImageEncoder *Create ## codec ();
     87 
     88 // This macro defines the global creation entry point for each encoder. Each
     89 // encoder implementation that registers with the encoder factory must call it.
     90 #define DEFINE_ENCODER_CREATOR(codec)           \
     91     SkImageEncoder *Create ## codec () {        \
     92         return SkNEW( Sk ## codec );            \
     93     }
     94 
     95 // All the encoders known by Skia. Note that, depending on the compiler settings,
     96 // not all of these will be available
     97 /** An ARGBImageEncoder will always write out
     98  *  bitmap.width() * bitmap.height() * 4
     99  *  bytes.
    100  */
    101 DECLARE_ENCODER_CREATOR(ARGBImageEncoder);
    102 DECLARE_ENCODER_CREATOR(JPEGImageEncoder);
    103 DECLARE_ENCODER_CREATOR(PNGImageEncoder);
    104 DECLARE_ENCODER_CREATOR(KTXImageEncoder);
    105 DECLARE_ENCODER_CREATOR(WEBPImageEncoder);
    106 
    107 #ifdef SK_BUILD_FOR_IOS
    108 DECLARE_ENCODER_CREATOR(PNGImageEncoder_IOS);
    109 #endif
    110 
    111 // Typedef to make registering encoder callback easier
    112 // This has to be defined outside SkImageEncoder. :(
    113 typedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;
    114 #endif
    115