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