180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkSPRITE_CLASSNAME : public SkSpriteBlitter {
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS)
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        : SkSpriteBlitter(source) {
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkSPRITE_INIT
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void blitRect(int x, int y, int width, int height) {
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(width > 0 && height > 0);
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int srcX = x - fLeft;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int srcY = y - fTop;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkSPRITE_DST_TYPE* SK_RESTRICT dst =fDevice->SkSPRITE_DST_GETADDR(x, y);
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkSPRITE_SRC_TYPE* SK_RESTRICT src =
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                      fSource->SkSPRITE_SRC_GETADDR(srcX, srcY);
25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        size_t dstRB = fDevice->rowBytes();
26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        size_t srcRB = fSource->rowBytes();
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGCODE((void)fDevice->SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);)
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGCODE((void)fSource->SkSPRITE_SRC_GETADDR(srcX + width  - 1, srcY + height - 1);)
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkSPRITE_PREAMBLE((*fSource), srcX, srcY);
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        do {
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkSPRITE_DST_TYPE* d = dst;
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const SkSPRITE_SRC_TYPE* s = src;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_BEGIN_ROW
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkSPRITE_BEGIN_ROW
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_ROW_PROC
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkSPRITE_ROW_PROC(d, s, width, x, y);
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int w = width;
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            do {
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkSPRITE_SRC_TYPE sc = *s++;
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkSPRITE_BLIT_PIXEL(d, sc);
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                d += 1;
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } while (--w != 0);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            dst = (SkSPRITE_DST_TYPE* SK_RESTRICT)((char*)dst + dstRB);
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            src = (const SkSPRITE_SRC_TYPE* SK_RESTRICT)
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                            ((const char*)src + srcRB);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkSPRITE_NEXT_ROW
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_ROW_PROC
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            y += 1;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } while (--height != 0);
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkSPRITE_POSTAMBLE((*fSource));
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSPRITE_FIELDS
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_BLIT_PIXEL
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_CLASSNAME
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_DST_TYPE
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_SRC_TYPE
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_DST_GETADDR
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_SRC_GETADDR
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_PREAMBLE
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_POSTAMBLE
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_ARGS
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_FIELDS
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_INIT
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_NEXT_ROW
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_BEGIN_ROW
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_ROW_PROC
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    #undef SkSPRITE_ROW_PROC
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
83