10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* libs/graphics/sgl/SkSpriteBlitter_RGB16.cpp 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Copyright 2006, The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** you may not use this file except in compliance with the License. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** You may obtain a copy of the License at 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** See the License for the specific language governing permissions and 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** limitations under the License. 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitter.h" 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBlitRow.h" 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTemplates.h" 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkUtils.h" 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColorPriv.h" 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define D16_S32A_Opaque_Pixel(dst, sc) \ 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectdo { \ 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (sc) { \ 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dst = SkSrcOver32To16(sc, *dst); \ 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } \ 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} while (0) 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline void D16_S32A_Blend_Pixel_helper(uint16_t* dst, SkPMColor sc, 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned src_scale) { 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t dc = *dst; 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned sa = SkGetPackedA32(sc); 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned dr, dg, db; 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (255 == sa) { 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dr = SkAlphaBlend(SkPacked32ToR16(sc), SkGetPackedR16(dc), src_scale); 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dg = SkAlphaBlend(SkPacked32ToG16(sc), SkGetPackedG16(dc), src_scale); 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project db = SkAlphaBlend(SkPacked32ToB16(sc), SkGetPackedB16(dc), src_scale); 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned dst_scale = 255 - SkAlphaMul(sa, src_scale); 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dr = (SkPacked32ToR16(sc) * src_scale + 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkGetPackedR16(dc) * dst_scale) >> 8; 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dg = (SkPacked32ToG16(sc) * src_scale + 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkGetPackedG16(dc) * dst_scale) >> 8; 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project db = (SkPacked32ToB16(sc) * src_scale + 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkGetPackedB16(dc) * dst_scale) >> 8; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dst = SkPackRGB16(dr, dg, db); 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define D16_S32A_Blend_Pixel(dst, sc, src_scale) \ 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { if (sc) D16_S32A_Blend_Pixel_helper(dst, sc, src_scale); } while (0) 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass Sprite_D16_S16_Opaque : public SkSpriteBlitter { 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sprite_D16_S16_Opaque(const SkBitmap& source) 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : SkSpriteBlitter(source) {} 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // overrides 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void blitRect(int x, int y, int width, int height) { 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_RESTRICT uint16_t* dst = fDevice->getAddr16(x, y); 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SK_RESTRICT uint16_t* src = fSource->getAddr16(x - fLeft, 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project y - fTop); 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned dstRB = fDevice->rowBytes(); 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcRB = fSource->rowBytes(); 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--height >= 0) { 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(dst, src, width << 1); 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst = (uint16_t*)((char*)dst + dstRB); 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project src = (const uint16_t*)((const char*)src + srcRB); 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define D16_S16_Blend_Pixel(dst, sc, scale) \ 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { \ 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t dc = *dst; \ 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dst = SkBlendRGB16(sc, dc, scale); \ 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (0) 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS , uint8_t alpha 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS uint8_t fSrcAlpha; 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT fSrcAlpha = alpha; 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE uint16_t 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr16 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlpha); 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale) 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define D16_S4444_Opaque(dst, sc) \ 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { \ 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t dc = *dst; \ 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dst = SkSrcOver4444To16(sc, dc); \ 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (0) 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE SkPMColor16 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr16 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src) 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define D16_S4444_Blend(dst, sc, scale16) \ 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { \ 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t dc = *dst; \ 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dst = SkBlend4444To16(sc, dc, scale16); \ 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (0) 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS , uint8_t alpha 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS uint8_t fSrcAlpha; 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT fSrcAlpha = alpha; 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE uint16_t 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr16 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha); 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale) 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE uint8_t 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr8 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->lockColors() 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[src]) 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlockColors(false) 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS , uint8_t alpha 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS uint8_t fSrcAlpha; 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT fSrcAlpha = alpha; 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE uint8_t 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr8 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->lockColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src], src_scale) 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlockColors(false); 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 175fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reedstatic intptr_t asint(const void* ptr) { 176fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed return reinterpret_cast<const char*>(ptr) - (const char*)0; 177fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed} 178fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed 179fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reedstatic void blitrow_d16_si8(SK_RESTRICT uint16_t* dst, 180fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed SK_RESTRICT const uint8_t* src, int count, 181fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed SK_RESTRICT const uint16_t* ctable) { 182fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed if (count <= 8) { 183fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed do { 184fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[*src++]; 185fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } while (--count); 186fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed return; 187fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } 188fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed 189fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed // eat src until we're on a 4byte boundary 190fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed while (asint(src) & 3) { 191fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[*src++]; 192fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed count -= 1; 193fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } 194fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed 195fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed int qcount = count >> 2; 196fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed SkASSERT(qcount > 0); 197fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed const uint32_t* qsrc = reinterpret_cast<const uint32_t*>(src); 198fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed if (asint(dst) & 2) { 199fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed do { 200fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed uint32_t s4 = *qsrc++; 201fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#ifdef SK_CPU_LENDIAN 202fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[s4 & 0xFF]; 203fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[(s4 >> 8) & 0xFF]; 204fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[(s4 >> 16) & 0xFF]; 205fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[s4 >> 24]; 206fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#else // BENDIAN 207fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[s4 >> 24]; 208fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[(s4 >> 16) & 0xFF]; 209fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[(s4 >> 8) & 0xFF]; 210fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[s4 & 0xFF]; 211fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#endif 212fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } while (--qcount); 213fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } else { // dst is on a 4byte boundary 214fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed uint32_t* ddst = reinterpret_cast<uint32_t*>(dst); 215fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed do { 216fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed uint32_t s4 = *qsrc++; 217fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#ifdef SK_CPU_LENDIAN 218fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *ddst++ = (ctable[(s4 >> 8) & 0xFF] << 16) | ctable[s4 & 0xFF]; 219fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *ddst++ = (ctable[s4 >> 24] << 16) | ctable[(s4 >> 16) & 0xFF]; 220fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#else // BENDIAN 221fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *ddst++ = (ctable[s4 >> 24] << 16) | ctable[(s4 >> 16) & 0xFF]; 222fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *ddst++ = (ctable[(s4 >> 8) & 0xFF] << 16) | ctable[s4 & 0xFF]; 223fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#endif 224fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } while (--qcount); 225fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed dst = reinterpret_cast<uint16_t*>(ddst); 226fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } 227fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed src = reinterpret_cast<const uint8_t*>(qsrc); 228fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed count &= 3; 229fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed // catch any remaining (will be < 4) 230fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed while (--count >= 0) { 231fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed *dst++ = ctable[*src++]; 232fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed } 233fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed} 234fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed 235fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed#define SkSPRITE_ROW_PROC(d, s, n, x, y) blitrow_d16_si8(d, s, n, ctable) 236fadb93e0b43c7451032c46f3c58a1effa9d681b3Mike Reed 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE uint8_t 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr8 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->lock16BitCache() 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src] 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlock16BitCache() 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_ARGS , uint8_t alpha 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_FIELDS uint8_t fSrcAlpha; 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_INIT fSrcAlpha = alpha; 2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_TYPE uint16_t 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_TYPE uint8_t 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_DST_GETADDR getAddr16 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_SRC_GETADDR getAddr8 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->lock16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src], src_scale) 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_NEXT_ROW 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlock16BitCache(); 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSpriteBlitterTemplate.h" 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter { 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sprite_D16_S32_BlitRowProc(const SkBitmap& source) 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : SkSpriteBlitter(source) {} 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // overrides 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void setup(const SkBitmap& device, int left, int top, 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint) { 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->INHERITED::setup(device, left, top, paint); 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned flags = 0; 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint.getAlpha() < 0xFF) { 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project flags |= SkBlitRow::kGlobalAlpha_Flag; 2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!fSource->isOpaque()) { 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project flags |= SkBlitRow::kSrcPixelAlpha_Flag; 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint.isDither()) { 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project flags |= SkBlitRow::kDither_Flag; 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fProc = SkBlitRow::Factory(flags, SkBitmap::kRGB_565_Config); 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void blitRect(int x, int y, int width, int height) { 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_RESTRICT uint16_t* dst = fDevice->getAddr16(x, y); 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SK_RESTRICT SkPMColor* src = fSource->getAddr32(x - fLeft, 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project y - fTop); 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned dstRB = fDevice->rowBytes(); 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcRB = fSource->rowBytes(); 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlitRow::Proc proc = fProc; 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project U8CPU alpha = fPaint->getAlpha(); 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--height >= 0) { 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project proc(dst, src, width, alpha, x, y); 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project y += 1; 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst = (SK_RESTRICT uint16_t*)((char*)dst + dstRB); 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project src = (const SK_RESTRICT SkPMColor*)((const char*)src + srcRB); 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlitRow::Proc fProc; 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef SkSpriteBlitter INHERITED; 3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTemplatesPriv.h" 3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkSpriteBlitter* SkSpriteBlitter::ChooseD16(const SkBitmap& source, 3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint, 3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* storage, size_t storageSize) { 3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint.getMaskFilter() != NULL) { // may add cases for this 3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint.getXfermode() != NULL) { // may add cases for this 3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint.getColorFilter() != NULL) { // may add cases for this 3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkSpriteBlitter* blitter = NULL; 3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned alpha = paint.getAlpha(); 3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project switch (source.getConfig()) { 3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kARGB_8888_Config: 3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S32_BlitRowProc, 3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source)); 3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kARGB_4444_Config: 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (255 == alpha) { 3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S4444_Opaque, 3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source)); 3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S4444_Blend, 3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source, alpha >> 4)); 3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kRGB_565_Config: 3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (255 == alpha) { 3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S16_Opaque, 3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source)); 3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S16_Blend, 3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source, alpha)); 3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kIndex8_Config: 3593026a9ec59b285412941d278a570e382088f8adaMike Reed if (paint.isDither()) { 3603026a9ec59b285412941d278a570e382088f8adaMike Reed // we don't support dither yet in these special cases 3613026a9ec59b285412941d278a570e382088f8adaMike Reed break; 3623026a9ec59b285412941d278a570e382088f8adaMike Reed } 3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (source.isOpaque()) { 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (255 == alpha) { 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8_Opaque, 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source)); 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8_Blend, 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source, alpha)); 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (255 == alpha) { 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8A_Opaque, 3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source)); 3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8A_Blend, 3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project storage, storageSize, (source, alpha)); 3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project default: 3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return blitter; 3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 387