
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef SkScaledBitmapSampler_DEFINED
#define SkScaledBitmapSampler_DEFINED

#include "SkTypes.h"
#include "SkColor.h"
#include "SkImageDecoder.h"

class SkBitmap;

class SkScaledBitmapSampler {
public:
    SkScaledBitmapSampler(int origWidth, int origHeight, int cellSize);

    int scaledWidth() const { return fScaledWidth; }
    int scaledHeight() const { return fScaledHeight; }

    int srcY0() const { return fY0; }
    int srcDX() const { return fDX; }
    int srcDY() const { return fDY; }

    enum SrcConfig {
        kGray,  // 1 byte per pixel
        kIndex, // 1 byte per pixel
        kRGB,   // 3 bytes per pixel
        kRGBX,  // 4 byes per pixel (ignore 4th)
        kRGBA,  // 4 bytes per pixel
        kRGB_565 // 2 bytes per pixel
    };

    struct Options {
        bool fDither;
        bool fPremultiplyAlpha;
        bool fSkipZeros;
        explicit Options(const SkImageDecoder &dec)
            : fDither(dec.getDitherImage())
            , fPremultiplyAlpha(!dec.getRequireUnpremultipliedColors())
            , fSkipZeros(dec.getSkipWritingZeroes())
            { }
    };

    // Given a dst bitmap (with pixels already allocated) and a src-config,
    // prepares iterator to process the src colors and write them into dst.
    // Returns false if the request cannot be fulfulled.
    bool begin(SkBitmap* dst, SrcConfig sc, const SkImageDecoder& decoder,
               const SkPMColor* = NULL);
    bool begin(SkBitmap* dst, SrcConfig sc, const Options& opts,
               const SkPMColor* = NULL);
    // call with row of src pixels, for y = 0...scaledHeight-1.
    // returns true if the row had non-opaque alpha in it
    bool next(const uint8_t* SK_RESTRICT src);

    // Like next(), but specifies the y value of the source row, so the
    // rows can come in any order. If the row is not part of the output
    // sample, it will be skipped. Only sampleInterlaced OR next should
    // be called for one SkScaledBitmapSampler.
    bool sampleInterlaced(const uint8_t* SK_RESTRICT src, int srcY);

    typedef bool (*RowProc)(void* SK_RESTRICT dstRow,
                            const uint8_t* SK_RESTRICT src,
                            int width, int deltaSrc, int y,
                            const SkPMColor[]);

private:
    int fScaledWidth;
    int fScaledHeight;

    int fX0;    // first X coord to sample
    int fY0;    // first Y coord (scanline) to sample
    int fDX;    // step between X samples
    int fDY;    // step between Y samples

#ifdef SK_DEBUG
    // Keep track of whether the caller is using next or sampleInterlaced.
    // Only one can be used per sampler.
    enum SampleMode {
        kUninitialized_SampleMode,
        kConsecutive_SampleMode,
        kInterlaced_SampleMode,
    };

    SampleMode fSampleMode;
#endif

    // setup state
    char*   fDstRow; // points into bitmap's pixels
    size_t  fDstRowBytes;
    int     fCurrY; // used for dithering
    int     fSrcPixelSize;  // 1, 3, 4
    RowProc fRowProc;

    // optional reference to the src colors if the src is a palette model
    const SkPMColor* fCTable;

#ifdef SK_DEBUG
    // Helper class allowing a test to have access to fRowProc.
    friend class RowProcTester;
#endif
};

#endif
