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