180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkSPRITE_CLASSNAME : public SkSpriteBlitter { 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_CLASSNAME(const SkBitmap& source SkSPRITE_ARGS) 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : SkSpriteBlitter(source) { 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_INIT 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void blitRect(int x, int y, int width, int height) { 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(width > 0 && height > 0); 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int srcX = x - fLeft; 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int srcY = y - fTop; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_DST_TYPE* SK_RESTRICT dst =fDevice->SkSPRITE_DST_GETADDR(x, y); 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkSPRITE_SRC_TYPE* SK_RESTRICT src = 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fSource->SkSPRITE_SRC_GETADDR(srcX, srcY); 25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t dstRB = fDevice->rowBytes(); 26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t srcRB = fSource->rowBytes(); 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE((void)fDevice->SkSPRITE_DST_GETADDR(x + width - 1, y + height - 1);) 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE((void)fSource->SkSPRITE_SRC_GETADDR(srcX + width - 1, srcY + height - 1);) 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_PREAMBLE((*fSource), srcX, srcY); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru do { 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_DST_TYPE* d = dst; 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkSPRITE_SRC_TYPE* s = src; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_BEGIN_ROW 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_BEGIN_ROW 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_ROW_PROC 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_ROW_PROC(d, s, width, x, y); 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int w = width; 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru do { 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_SRC_TYPE sc = *s++; 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_BLIT_PIXEL(d, sc); 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru d += 1; 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } while (--w != 0); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst = (SkSPRITE_DST_TYPE* SK_RESTRICT)((char*)dst + dstRB); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru src = (const SkSPRITE_SRC_TYPE* SK_RESTRICT) 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ((const char*)src + srcRB); 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_NEXT_ROW 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_ROW_PROC 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru y += 1; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } while (--height != 0); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_POSTAMBLE((*fSource)); 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSPRITE_FIELDS 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_BLIT_PIXEL 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_CLASSNAME 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_DST_TYPE 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_SRC_TYPE 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_DST_GETADDR 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_SRC_GETADDR 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_PREAMBLE 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_POSTAMBLE 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_ARGS 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_FIELDS 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_INIT 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_NEXT_ROW 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#undef SkSPRITE_BEGIN_ROW 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SkSPRITE_ROW_PROC 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #undef SkSPRITE_ROW_PROC 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 83