1/* libs/graphics/sgl/SkSpriteBlitterTemplate.h
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18
19class SkSPRITE_CLASSNAME : public SkSpriteBlitter {
20public:
21    SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS)
22        : SkSpriteBlitter(source) {
23        SkSPRITE_INIT
24    }
25
26    virtual void blitRect(int x, int y, int width, int height) {
27        SkASSERT(width > 0 && height > 0);
28        int srcX = x - fLeft;
29        int srcY = y - fTop;
30        SK_RESTRICT SkSPRITE_DST_TYPE* dst =fDevice->SkSPRITE_DST_GETADDR(x, y);
31        const SK_RESTRICT SkSPRITE_SRC_TYPE* src =
32                                      fSource->SkSPRITE_SRC_GETADDR(srcX, srcY);
33        unsigned dstRB = fDevice->rowBytes();
34        unsigned srcRB = fSource->rowBytes();
35
36        SkDEBUGCODE((void)fDevice->SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);)
37        SkDEBUGCODE((void)fSource->SkSPRITE_SRC_GETADDR(srcX + width  - 1, srcY + height - 1);)
38
39        SkSPRITE_PREAMBLE((*fSource), srcX, srcY);
40
41        do {
42            SkSPRITE_DST_TYPE* d = dst;
43            const SkSPRITE_SRC_TYPE* s = src;
44#ifdef SkSPRITE_BEGIN_ROW
45            SkSPRITE_BEGIN_ROW
46#endif
47
48#ifdef SkSPRITE_ROW_PROC
49            SkSPRITE_ROW_PROC(d, s, width, x, y);
50#else
51            int w = width;
52            do {
53                SkSPRITE_SRC_TYPE sc = *s++;
54                SkSPRITE_BLIT_PIXEL(d, sc);
55                d += 1;
56            } while (--w != 0);
57#endif
58            dst = (SK_RESTRICT SkSPRITE_DST_TYPE*)((char*)dst + dstRB);
59            src = (const SK_RESTRICT SkSPRITE_SRC_TYPE*)
60                                            ((const char*)src + srcRB);
61            SkSPRITE_NEXT_ROW
62#ifdef SkSPRITE_ROW_PROC
63            y += 1;
64#endif
65        } while (--height != 0);
66
67        SkSPRITE_POSTAMBLE((*fSource));
68    }
69
70private:
71    SkSPRITE_FIELDS
72};
73
74#undef SkSPRITE_BLIT_PIXEL
75#undef SkSPRITE_CLASSNAME
76#undef SkSPRITE_DST_TYPE
77#undef SkSPRITE_SRC_TYPE
78#undef SkSPRITE_DST_GETADDR
79#undef SkSPRITE_SRC_GETADDR
80#undef SkSPRITE_PREAMBLE
81#undef SkSPRITE_POSTAMBLE
82#undef SkSPRITE_ARGS
83#undef SkSPRITE_FIELDS
84#undef SkSPRITE_INIT
85#undef SkSPRITE_NEXT_ROW
86#undef SkSPRITE_BEGIN_ROW
87
88#ifdef SkSPRITE_ROW_PROC
89    #undef SkSPRITE_ROW_PROC
90#endif
91
92