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