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