SkScaledBitmapSampler.h revision 8d2392487cd97e68c0a71da9fd5d2b42ecac5ec8
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 15class SkBitmap; 16 17class SkScaledBitmapSampler { 18public: 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 srcDY() const { return fDY; } 26 27 enum SrcConfig { 28 kGray, // 1 byte per pixel 29 kIndex, // 1 byte per pixel 30 kRGB, // 3 bytes per pixel 31 kRGBX, // 4 byes per pixel (ignore 4th) 32 kRGBA, // 4 bytes per pixel 33 kRGB_565 // 2 bytes per pixel 34 }; 35 36 // Given a dst bitmap (with pixels already allocated) and a src-config, 37 // prepares iterator to process the src colors and write them into dst. 38 // Returns false if the request cannot be fulfulled. 39 bool begin(SkBitmap* dst, SrcConfig sc, const SkImageDecoder& decoder, 40 const SkPMColor* = NULL); 41 // call with row of src pixels, for y = 0...scaledHeight-1. 42 // returns true if the row had non-opaque alpha in it 43 bool next(const uint8_t* SK_RESTRICT src); 44 45 typedef bool (*RowProc)(void* SK_RESTRICT dstRow, 46 const uint8_t* SK_RESTRICT src, 47 int width, int deltaSrc, int y, 48 const SkPMColor[]); 49 50private: 51 int fScaledWidth; 52 int fScaledHeight; 53 54 int fX0; // first X coord to sample 55 int fY0; // first Y coord (scanline) to sample 56 int fDX; // step between X samples 57 int fDY; // step between Y samples 58 59 // setup state 60 char* fDstRow; // points into bitmap's pixels 61 size_t fDstRowBytes; 62 int fCurrY; // used for dithering 63 int fSrcPixelSize; // 1, 3, 4 64 RowProc fRowProc; 65 66 // optional reference to the src colors if the src is a palette model 67 const SkPMColor* fCTable; 68 69#ifdef SK_DEBUG 70 // Helper class allowing a test to have access to fRowProc. 71 friend class RowProcTester; 72#endif 73}; 74 75#endif 76