1
2/*
3 * Copyright 2006 The Android Open Source Project
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
9
10
11class SkSPRITE_CLASSNAME : public SkSpriteBlitter {
12public:
13    SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS)
14        : SkSpriteBlitter(source) {
15        SkSPRITE_INIT
16    }
17
18    virtual void blitRect(int x, int y, int width, int height) {
19        SkASSERT(width > 0 && height > 0);
20        int srcX = x - fLeft;
21        int srcY = y - fTop;
22        SkSPRITE_DST_TYPE* SK_RESTRICT dst =fDevice->SkSPRITE_DST_GETADDR(x, y);
23        const SkSPRITE_SRC_TYPE* SK_RESTRICT src =
24                                      fSource->SkSPRITE_SRC_GETADDR(srcX, srcY);
25        size_t dstRB = fDevice->rowBytes();
26        size_t srcRB = fSource->rowBytes();
27
28        SkDEBUGCODE((void)fDevice->SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);)
29        SkDEBUGCODE((void)fSource->SkSPRITE_SRC_GETADDR(srcX + width  - 1, srcY + height - 1);)
30
31        SkSPRITE_PREAMBLE((*fSource), srcX, srcY);
32
33        do {
34            SkSPRITE_DST_TYPE* d = dst;
35            const SkSPRITE_SRC_TYPE* s = src;
36#ifdef SkSPRITE_BEGIN_ROW
37            SkSPRITE_BEGIN_ROW
38#endif
39
40#ifdef SkSPRITE_ROW_PROC
41            SkSPRITE_ROW_PROC(d, s, width, x, y);
42#else
43            int w = width;
44            do {
45                SkSPRITE_SRC_TYPE sc = *s++;
46                SkSPRITE_BLIT_PIXEL(d, sc);
47                d += 1;
48            } while (--w != 0);
49#endif
50            dst = (SkSPRITE_DST_TYPE* SK_RESTRICT)((char*)dst + dstRB);
51            src = (const SkSPRITE_SRC_TYPE* SK_RESTRICT)
52                                            ((const char*)src + srcRB);
53            SkSPRITE_NEXT_ROW
54#ifdef SkSPRITE_ROW_PROC
55            y += 1;
56#endif
57        } while (--height != 0);
58
59        SkSPRITE_POSTAMBLE((*fSource));
60    }
61
62private:
63    SkSPRITE_FIELDS
64};
65
66#undef SkSPRITE_BLIT_PIXEL
67#undef SkSPRITE_CLASSNAME
68#undef SkSPRITE_DST_TYPE
69#undef SkSPRITE_SRC_TYPE
70#undef SkSPRITE_DST_GETADDR
71#undef SkSPRITE_SRC_GETADDR
72#undef SkSPRITE_PREAMBLE
73#undef SkSPRITE_POSTAMBLE
74#undef SkSPRITE_ARGS
75#undef SkSPRITE_FIELDS
76#undef SkSPRITE_INIT
77#undef SkSPRITE_NEXT_ROW
78#undef SkSPRITE_BEGIN_ROW
79
80#ifdef SkSPRITE_ROW_PROC
81    #undef SkSPRITE_ROW_PROC
82#endif
83