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