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