michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: michael@0: class SkSPRITE_CLASSNAME : public SkSpriteBlitter { michael@0: public: michael@0: SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS) michael@0: : SkSpriteBlitter(source) { michael@0: SkSPRITE_INIT michael@0: } michael@0: michael@0: virtual void blitRect(int x, int y, int width, int height) { michael@0: SkASSERT(width > 0 && height > 0); michael@0: int srcX = x - fLeft; michael@0: int srcY = y - fTop; michael@0: SkSPRITE_DST_TYPE* SK_RESTRICT dst =fDevice->SkSPRITE_DST_GETADDR(x, y); michael@0: const SkSPRITE_SRC_TYPE* SK_RESTRICT src = michael@0: fSource->SkSPRITE_SRC_GETADDR(srcX, srcY); michael@0: size_t dstRB = fDevice->rowBytes(); michael@0: size_t srcRB = fSource->rowBytes(); michael@0: michael@0: SkDEBUGCODE((void)fDevice->SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);) michael@0: SkDEBUGCODE((void)fSource->SkSPRITE_SRC_GETADDR(srcX + width - 1, srcY + height - 1);) michael@0: michael@0: SkSPRITE_PREAMBLE((*fSource), srcX, srcY); michael@0: michael@0: do { michael@0: SkSPRITE_DST_TYPE* d = dst; michael@0: const SkSPRITE_SRC_TYPE* s = src; michael@0: #ifdef SkSPRITE_BEGIN_ROW michael@0: SkSPRITE_BEGIN_ROW michael@0: #endif michael@0: michael@0: #ifdef SkSPRITE_ROW_PROC michael@0: SkSPRITE_ROW_PROC(d, s, width, x, y); michael@0: #else michael@0: int w = width; michael@0: do { michael@0: SkSPRITE_SRC_TYPE sc = *s++; michael@0: SkSPRITE_BLIT_PIXEL(d, sc); michael@0: d += 1; michael@0: } while (--w != 0); michael@0: #endif michael@0: dst = (SkSPRITE_DST_TYPE* SK_RESTRICT)((char*)dst + dstRB); michael@0: src = (const SkSPRITE_SRC_TYPE* SK_RESTRICT) michael@0: ((const char*)src + srcRB); michael@0: SkSPRITE_NEXT_ROW michael@0: #ifdef SkSPRITE_ROW_PROC michael@0: y += 1; michael@0: #endif michael@0: } while (--height != 0); michael@0: michael@0: SkSPRITE_POSTAMBLE((*fSource)); michael@0: } michael@0: michael@0: private: michael@0: SkSPRITE_FIELDS michael@0: }; michael@0: michael@0: #undef SkSPRITE_BLIT_PIXEL michael@0: #undef SkSPRITE_CLASSNAME michael@0: #undef SkSPRITE_DST_TYPE michael@0: #undef SkSPRITE_SRC_TYPE michael@0: #undef SkSPRITE_DST_GETADDR michael@0: #undef SkSPRITE_SRC_GETADDR michael@0: #undef SkSPRITE_PREAMBLE michael@0: #undef SkSPRITE_POSTAMBLE michael@0: #undef SkSPRITE_ARGS michael@0: #undef SkSPRITE_FIELDS michael@0: #undef SkSPRITE_INIT michael@0: #undef SkSPRITE_NEXT_ROW michael@0: #undef SkSPRITE_BEGIN_ROW michael@0: michael@0: #ifdef SkSPRITE_ROW_PROC michael@0: #undef SkSPRITE_ROW_PROC michael@0: #endif