Home | History | Annotate | Download | only in images
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #ifndef SkScaledBitmapSampler_DEFINED
      9 #define SkScaledBitmapSampler_DEFINED
     10 
     11 #include "SkTypes.h"
     12 #include "SkColor.h"
     13 #include "SkImageDecoder.h"
     14 
     15 class SkBitmap;
     16 
     17 class SkScaledBitmapSampler {
     18 public:
     19     SkScaledBitmapSampler(int origWidth, int origHeight, int cellSize);
     20 
     21     int scaledWidth() const { return fScaledWidth; }
     22     int scaledHeight() const { return fScaledHeight; }
     23 
     24     int srcY0() const { return fY0; }
     25     int srcDX() const { return fDX; }
     26     int srcDY() const { return fDY; }
     27 
     28     enum SrcConfig {
     29         kGray,  // 1 byte per pixel
     30         kIndex, // 1 byte per pixel
     31         kRGB,   // 3 bytes per pixel
     32         kRGBX,  // 4 byes per pixel (ignore 4th)
     33         kRGBA,  // 4 bytes per pixel
     34         kRGB_565 // 2 bytes per pixel
     35     };
     36 
     37     struct Options {
     38         bool fDither;
     39         bool fPremultiplyAlpha;
     40         bool fSkipZeros;
     41         explicit Options(const SkImageDecoder &dec)
     42             : fDither(dec.getDitherImage())
     43             , fPremultiplyAlpha(!dec.getRequireUnpremultipliedColors())
     44             , fSkipZeros(dec.getSkipWritingZeroes())
     45             { }
     46     };
     47 
     48     // Given a dst bitmap (with pixels already allocated) and a src-config,
     49     // prepares iterator to process the src colors and write them into dst.
     50     // Returns false if the request cannot be fulfulled.
     51     bool begin(SkBitmap* dst, SrcConfig sc, const SkImageDecoder& decoder,
     52                const SkPMColor* = nullptr);
     53     bool begin(SkBitmap* dst, SrcConfig sc, const Options& opts,
     54                const SkPMColor* = nullptr);
     55     // call with row of src pixels, for y = 0...scaledHeight-1.
     56     // returns true if the row had non-opaque alpha in it
     57     bool next(const uint8_t* SK_RESTRICT src);
     58 
     59     // Like next(), but specifies the y value of the source row, so the
     60     // rows can come in any order. If the row is not part of the output
     61     // sample, it will be skipped. Only sampleInterlaced OR next should
     62     // be called for one SkScaledBitmapSampler.
     63     bool sampleInterlaced(const uint8_t* SK_RESTRICT src, int srcY);
     64 
     65     typedef bool (*RowProc)(void* SK_RESTRICT dstRow,
     66                             const uint8_t* SK_RESTRICT src,
     67                             int width, int deltaSrc, int y,
     68                             const SkPMColor[]);
     69 
     70 private:
     71     int fScaledWidth;
     72     int fScaledHeight;
     73 
     74     int fX0;    // first X coord to sample
     75     int fY0;    // first Y coord (scanline) to sample
     76     int fDX;    // step between X samples
     77     int fDY;    // step between Y samples
     78 
     79 #ifdef SK_DEBUG
     80     // Keep track of whether the caller is using next or sampleInterlaced.
     81     // Only one can be used per sampler.
     82     enum SampleMode {
     83         kUninitialized_SampleMode,
     84         kConsecutive_SampleMode,
     85         kInterlaced_SampleMode,
     86     };
     87 
     88     SampleMode fSampleMode;
     89 #endif
     90 
     91     // setup state
     92     char*   fDstRow; // points into bitmap's pixels
     93     size_t  fDstRowBytes;
     94     int     fCurrY; // used for dithering
     95     int     fSrcPixelSize;  // 1, 3, 4
     96     RowProc fRowProc;
     97 
     98     // optional reference to the src colors if the src is a palette model
     99     const SkPMColor* fCTable;
    100 
    101 #ifdef SK_DEBUG
    102     // Helper class allowing a test to have access to fRowProc.
    103     friend class RowProcTester;
    104 #endif
    105 };
    106 
    107 #endif
    108