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 19 class SkSPRITE_CLASSNAME : public SkSpriteBlitter { 20 public: SkSPRITE_CLASSNAME(const SkBitmap & source SkSPRITE_ARGS)21 SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS) 22 : SkSpriteBlitter(source) { 23 SkSPRITE_INIT 24 } 25 blitRect(int x,int y,int width,int height)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 70 private: 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