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