1/* 2 * Copyright 2006 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8class SkSPRITE_CLASSNAME : public SkSpriteBlitter { 9public: 10 SkSPRITE_CLASSNAME(const SkPixmap& source SkSPRITE_ARGS) : SkSpriteBlitter(source) { 11 SkSPRITE_INIT 12 } 13 14 virtual void blitRect(int x, int y, int width, int height) { 15 SkASSERT(width > 0 && height > 0); 16 int srcX = x - fLeft; 17 int srcY = y - fTop; 18 SkSPRITE_DST_TYPE* SK_RESTRICT dst =fDst.SkSPRITE_DST_GETADDR(x, y); 19 const SkSPRITE_SRC_TYPE* SK_RESTRICT src = fSource.SkSPRITE_SRC_GETADDR(srcX, srcY); 20 size_t dstRB = fDst.rowBytes(); 21 size_t srcRB = fSource.rowBytes(); 22 23 SkDEBUGCODE((void)fDst.SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);) 24 SkDEBUGCODE((void)fSource.SkSPRITE_SRC_GETADDR(srcX + width - 1, srcY + height - 1);) 25 26 SkSPRITE_PREAMBLE(fSource, srcX, srcY); 27 28 do { 29 SkSPRITE_DST_TYPE* d = dst; 30 const SkSPRITE_SRC_TYPE* s = src; 31#ifdef SkSPRITE_BEGIN_ROW 32 SkSPRITE_BEGIN_ROW 33#endif 34 35#ifdef SkSPRITE_ROW_PROC 36 SkSPRITE_ROW_PROC(d, s, width, x, y); 37#else 38 int w = width; 39 do { 40 SkSPRITE_SRC_TYPE sc = *s++; 41 SkSPRITE_BLIT_PIXEL(d, sc); 42 d += 1; 43 } while (--w != 0); 44#endif 45 dst = (SkSPRITE_DST_TYPE* SK_RESTRICT)((char*)dst + dstRB); 46 src = (const SkSPRITE_SRC_TYPE* SK_RESTRICT)((const char*)src + srcRB); 47 SkSPRITE_NEXT_ROW 48#ifdef SkSPRITE_ROW_PROC 49 y += 1; 50#endif 51 } while (--height != 0); 52 53 SkSPRITE_POSTAMBLE((*fSource)); 54 } 55 56private: 57 SkSPRITE_FIELDS 58}; 59 60#undef SkSPRITE_BLIT_PIXEL 61#undef SkSPRITE_CLASSNAME 62#undef SkSPRITE_DST_TYPE 63#undef SkSPRITE_SRC_TYPE 64#undef SkSPRITE_DST_GETADDR 65#undef SkSPRITE_SRC_GETADDR 66#undef SkSPRITE_PREAMBLE 67#undef SkSPRITE_POSTAMBLE 68#undef SkSPRITE_ARGS 69#undef SkSPRITE_FIELDS 70#undef SkSPRITE_INIT 71#undef SkSPRITE_NEXT_ROW 72#undef SkSPRITE_BEGIN_ROW 73 74#ifdef SkSPRITE_ROW_PROC 75 #undef SkSPRITE_ROW_PROC 76#endif 77