
/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */



class SkSPRITE_CLASSNAME : public SkSpriteBlitter {
public:
    SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS)
        : SkSpriteBlitter(source) {
        SkSPRITE_INIT
    }

    virtual void blitRect(int x, int y, int width, int height) {
        SkASSERT(width > 0 && height > 0);
        int srcX = x - fLeft;
        int srcY = y - fTop;
        SkSPRITE_DST_TYPE* SK_RESTRICT dst =fDevice->SkSPRITE_DST_GETADDR(x, y);
        const SkSPRITE_SRC_TYPE* SK_RESTRICT src =
                                      fSource->SkSPRITE_SRC_GETADDR(srcX, srcY);
        size_t dstRB = fDevice->rowBytes();
        size_t srcRB = fSource->rowBytes();

        SkDEBUGCODE((void)fDevice->SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);)
        SkDEBUGCODE((void)fSource->SkSPRITE_SRC_GETADDR(srcX + width  - 1, srcY + height - 1);)

        SkSPRITE_PREAMBLE((*fSource), srcX, srcY);

        do {
            SkSPRITE_DST_TYPE* d = dst;
            const SkSPRITE_SRC_TYPE* s = src;
#ifdef SkSPRITE_BEGIN_ROW
            SkSPRITE_BEGIN_ROW
#endif

#ifdef SkSPRITE_ROW_PROC
            SkSPRITE_ROW_PROC(d, s, width, x, y);
#else
            int w = width;
            do {
                SkSPRITE_SRC_TYPE sc = *s++;
                SkSPRITE_BLIT_PIXEL(d, sc);
                d += 1;
            } while (--w != 0);
#endif
            dst = (SkSPRITE_DST_TYPE* SK_RESTRICT)((char*)dst + dstRB);
            src = (const SkSPRITE_SRC_TYPE* SK_RESTRICT)
                                            ((const char*)src + srcRB);
            SkSPRITE_NEXT_ROW
#ifdef SkSPRITE_ROW_PROC
            y += 1;
#endif
        } while (--height != 0);

        SkSPRITE_POSTAMBLE((*fSource));
    }

private:
    SkSPRITE_FIELDS
};

#undef SkSPRITE_BLIT_PIXEL
#undef SkSPRITE_CLASSNAME
#undef SkSPRITE_DST_TYPE
#undef SkSPRITE_SRC_TYPE
#undef SkSPRITE_DST_GETADDR
#undef SkSPRITE_SRC_GETADDR
#undef SkSPRITE_PREAMBLE
#undef SkSPRITE_POSTAMBLE
#undef SkSPRITE_ARGS
#undef SkSPRITE_FIELDS
#undef SkSPRITE_INIT
#undef SkSPRITE_NEXT_ROW
#undef SkSPRITE_BEGIN_ROW

#ifdef SkSPRITE_ROW_PROC
    #undef SkSPRITE_ROW_PROC
#endif
