diff options
Diffstat (limited to 'src/core/SkSpriteBlitterTemplate.h')
-rw-r--r-- | src/core/SkSpriteBlitterTemplate.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/core/SkSpriteBlitterTemplate.h b/src/core/SkSpriteBlitterTemplate.h new file mode 100644 index 0000000..2ab2b3a --- /dev/null +++ b/src/core/SkSpriteBlitterTemplate.h @@ -0,0 +1,91 @@ +/* libs/graphics/sgl/SkSpriteBlitterTemplate.h +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + + +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; + SK_RESTRICT SkSPRITE_DST_TYPE* dst =fDevice->SkSPRITE_DST_GETADDR(x, y); + const SK_RESTRICT SkSPRITE_SRC_TYPE* 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 = (SK_RESTRICT SkSPRITE_DST_TYPE*)((char*)dst + dstRB); + src = (const SK_RESTRICT SkSPRITE_SRC_TYPE*) + ((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 + |