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     // Given a dst bitmap (with pixels already allocated) and a src-config,
     38     // prepares iterator to process the src colors and write them into dst.
     39     // Returns false if the request cannot be fulfulled.
     40     bool begin(SkBitmap* dst, SrcConfig sc, const SkImageDecoder& decoder,
     41                const SkPMColor* = NULL);
     42     // call with row of src pixels, for y = 0...scaledHeight-1.
     43     // returns true if the row had non-opaque alpha in it
     44     bool next(const uint8_t* SK_RESTRICT src);
     45 
     46     // Like next(), but specifies the y value of the source row, so the
     47     // rows can come in any order. If the row is not part of the output
     48     // sample, it will be skipped. Only sampleInterlaced OR next should
     49     // be called for one SkScaledBitmapSampler.
     50     bool sampleInterlaced(const uint8_t* SK_RESTRICT src, int srcY);
     51 
     52     typedef bool (*RowProc)(void* SK_RESTRICT dstRow,
     53                             const uint8_t* SK_RESTRICT src,
     54                             int width, int deltaSrc, int y,
     55                             const SkPMColor[]);
     56 
     57 private:
     58     int fScaledWidth;
     59     int fScaledHeight;
     60 
     61     int fX0;    // first X coord to sample
     62     int fY0;    // first Y coord (scanline) to sample
     63     int fDX;    // step between X samples
     64     int fDY;    // step between Y samples
     65 
     66 #ifdef SK_DEBUG
     67     // Keep track of whether the caller is using next or sampleInterlaced.
     68     // Only one can be used per sampler.
     69     enum SampleMode {
     70         kUninitialized_SampleMode,
     71         kConsecutive_SampleMode,
     72         kInterlaced_SampleMode,
     73     };
     74 
     75     SampleMode fSampleMode;
     76 #endif
     77 
     78     // setup state
     79     char*   fDstRow; // points into bitmap's pixels
     80     size_t  fDstRowBytes;
     81     int     fCurrY; // used for dithering
     82     int     fSrcPixelSize;  // 1, 3, 4
     83     RowProc fRowProc;
     84 
     85     // optional reference to the src colors if the src is a palette model
     86     const SkPMColor* fCTable;
     87 
     88 #ifdef SK_DEBUG
     89     // Helper class allowing a test to have access to fRowProc.
     90     friend class RowProcTester;
     91 #endif
     92 };
     93 
     94 #endif
     95