| Index: skia/sgl/SkSpriteBlitter_RGB16.cpp
|
| ===================================================================
|
| --- skia/sgl/SkSpriteBlitter_RGB16.cpp (revision 16859)
|
| +++ skia/sgl/SkSpriteBlitter_RGB16.cpp (working copy)
|
| @@ -1,320 +0,0 @@
|
| -/* libs/graphics/sgl/SkSpriteBlitter_RGB16.cpp
|
| -**
|
| -** 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.
|
| -*/
|
| -
|
| -#include "SkSpriteBlitter.h"
|
| -#include "SkBlitRow.h"
|
| -#include "SkTemplates.h"
|
| -#include "SkUtils.h"
|
| -#include "SkColorPriv.h"
|
| -
|
| -#define D16_S32A_Opaque_Pixel(dst, sc) \
|
| -do { \
|
| - if (sc) { \
|
| - *dst = SkSrcOver32To16(sc, *dst); \
|
| - } \
|
| -} while (0)
|
| -
|
| -static inline void D16_S32A_Blend_Pixel_helper(uint16_t* dst, SkPMColor sc,
|
| - unsigned src_scale) {
|
| - uint16_t dc = *dst;
|
| - unsigned sa = SkGetPackedA32(sc);
|
| - unsigned dr, dg, db;
|
| -
|
| - if (255 == sa) {
|
| - dr = SkAlphaBlend(SkPacked32ToR16(sc), SkGetPackedR16(dc), src_scale);
|
| - dg = SkAlphaBlend(SkPacked32ToG16(sc), SkGetPackedG16(dc), src_scale);
|
| - db = SkAlphaBlend(SkPacked32ToB16(sc), SkGetPackedB16(dc), src_scale);
|
| - } else {
|
| - unsigned dst_scale = 255 - SkAlphaMul(sa, src_scale);
|
| - dr = (SkPacked32ToR16(sc) * src_scale +
|
| - SkGetPackedR16(dc) * dst_scale) >> 8;
|
| - dg = (SkPacked32ToG16(sc) * src_scale +
|
| - SkGetPackedG16(dc) * dst_scale) >> 8;
|
| - db = (SkPacked32ToB16(sc) * src_scale +
|
| - SkGetPackedB16(dc) * dst_scale) >> 8;
|
| - }
|
| - *dst = SkPackRGB16(dr, dg, db);
|
| -}
|
| -
|
| -#define D16_S32A_Blend_Pixel(dst, sc, src_scale) \
|
| - do { if (sc) D16_S32A_Blend_Pixel_helper(dst, sc, src_scale); } while (0)
|
| -
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class Sprite_D16_S16_Opaque : public SkSpriteBlitter {
|
| -public:
|
| - Sprite_D16_S16_Opaque(const SkBitmap& source)
|
| - : SkSpriteBlitter(source) {}
|
| -
|
| - // overrides
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SK_RESTRICT uint16_t* dst = fDevice->getAddr16(x, y);
|
| - const SK_RESTRICT uint16_t* src = fSource->getAddr16(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| -
|
| - while (--height >= 0) {
|
| - memcpy(dst, src, width << 1);
|
| - dst = (uint16_t*)((char*)dst + dstRB);
|
| - src = (const uint16_t*)((const char*)src + srcRB);
|
| - }
|
| - }
|
| -};
|
| -
|
| -#define D16_S16_Blend_Pixel(dst, sc, scale) \
|
| - do { \
|
| - uint16_t dc = *dst; \
|
| - *dst = SkBlendRGB16(sc, dc, scale); \
|
| - } while (0)
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend
|
| -#define SkSPRITE_ARGS , uint8_t alpha
|
| -#define SkSPRITE_FIELDS uint8_t fSrcAlpha;
|
| -#define SkSPRITE_INIT fSrcAlpha = alpha;
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE uint16_t
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr16
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlpha);
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale)
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM)
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#define D16_S4444_Opaque(dst, sc) \
|
| - do { \
|
| - uint16_t dc = *dst; \
|
| - *dst = SkSrcOver4444To16(sc, dc); \
|
| - } while (0)
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque
|
| -#define SkSPRITE_ARGS
|
| -#define SkSPRITE_FIELDS
|
| -#define SkSPRITE_INIT
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE SkPMColor16
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr16
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y)
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src)
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM)
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -#define D16_S4444_Blend(dst, sc, scale16) \
|
| - do { \
|
| - uint16_t dc = *dst; \
|
| - *dst = SkBlend4444To16(sc, dc, scale16); \
|
| - } while (0)
|
| -
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend
|
| -#define SkSPRITE_ARGS , uint8_t alpha
|
| -#define SkSPRITE_FIELDS uint8_t fSrcAlpha;
|
| -#define SkSPRITE_INIT fSrcAlpha = alpha;
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE uint16_t
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr16
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha);
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale)
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM)
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque
|
| -#define SkSPRITE_ARGS
|
| -#define SkSPRITE_FIELDS
|
| -#define SkSPRITE_INIT
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE uint8_t
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr8
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->lockColors()
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[src])
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlockColors(false)
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend
|
| -#define SkSPRITE_ARGS , uint8_t alpha
|
| -#define SkSPRITE_FIELDS uint8_t fSrcAlpha;
|
| -#define SkSPRITE_INIT fSrcAlpha = alpha;
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE uint8_t
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr8
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->lockColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src], src_scale)
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlockColors(false);
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque
|
| -#define SkSPRITE_ARGS
|
| -#define SkSPRITE_FIELDS
|
| -#define SkSPRITE_INIT
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE uint8_t
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr8
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->lock16BitCache()
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src]
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlock16BitCache()
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend
|
| -#define SkSPRITE_ARGS , uint8_t alpha
|
| -#define SkSPRITE_FIELDS uint8_t fSrcAlpha;
|
| -#define SkSPRITE_INIT fSrcAlpha = alpha;
|
| -#define SkSPRITE_DST_TYPE uint16_t
|
| -#define SkSPRITE_SRC_TYPE uint8_t
|
| -#define SkSPRITE_DST_GETADDR getAddr16
|
| -#define SkSPRITE_SRC_GETADDR getAddr8
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->lock16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src], src_scale)
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlock16BitCache();
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter {
|
| -public:
|
| - Sprite_D16_S32_BlitRowProc(const SkBitmap& source)
|
| - : SkSpriteBlitter(source) {}
|
| -
|
| - // overrides
|
| -
|
| - virtual void setup(const SkBitmap& device, int left, int top,
|
| - const SkPaint& paint) {
|
| - this->INHERITED::setup(device, left, top, paint);
|
| -
|
| - unsigned flags = 0;
|
| -
|
| - if (paint.getAlpha() < 0xFF) {
|
| - flags |= SkBlitRow::kGlobalAlpha_Flag;
|
| - }
|
| - if (!fSource->isOpaque()) {
|
| - flags |= SkBlitRow::kSrcPixelAlpha_Flag;
|
| - }
|
| - if (paint.isDither()) {
|
| - flags |= SkBlitRow::kDither_Flag;
|
| - }
|
| - fProc = SkBlitRow::Factory(flags, SkBitmap::kRGB_565_Config);
|
| - }
|
| -
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SK_RESTRICT uint16_t* dst = fDevice->getAddr16(x, y);
|
| - const SK_RESTRICT SkPMColor* src = fSource->getAddr32(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| - SkBlitRow::Proc proc = fProc;
|
| - U8CPU alpha = fPaint->getAlpha();
|
| -
|
| - while (--height >= 0) {
|
| - proc(dst, src, width, alpha, x, y);
|
| - y += 1;
|
| - dst = (SK_RESTRICT uint16_t*)((char*)dst + dstRB);
|
| - src = (const SK_RESTRICT SkPMColor*)((const char*)src + srcRB);
|
| - }
|
| - }
|
| -
|
| -private:
|
| - SkBlitRow::Proc fProc;
|
| -
|
| - typedef SkSpriteBlitter INHERITED;
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkTemplatesPriv.h"
|
| -
|
| -SkSpriteBlitter* SkSpriteBlitter::ChooseD16(const SkBitmap& source,
|
| - const SkPaint& paint,
|
| - void* storage, size_t storageSize) {
|
| - if (paint.getMaskFilter() != NULL) { // may add cases for this
|
| - return NULL;
|
| - }
|
| - if (paint.getXfermode() != NULL) { // may add cases for this
|
| - return NULL;
|
| - }
|
| - if (paint.getColorFilter() != NULL) { // may add cases for this
|
| - return NULL;
|
| - }
|
| -
|
| - SkSpriteBlitter* blitter = NULL;
|
| - unsigned alpha = paint.getAlpha();
|
| -
|
| - switch (source.getConfig()) {
|
| - case SkBitmap::kARGB_8888_Config:
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S32_BlitRowProc,
|
| - storage, storageSize, (source));
|
| - break;
|
| - case SkBitmap::kARGB_4444_Config:
|
| - if (255 == alpha) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S4444_Opaque,
|
| - storage, storageSize, (source));
|
| - } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S4444_Blend,
|
| - storage, storageSize, (source, alpha >> 4));
|
| - }
|
| - break;
|
| - case SkBitmap::kRGB_565_Config:
|
| - if (255 == alpha) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S16_Opaque,
|
| - storage, storageSize, (source));
|
| - } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_S16_Blend,
|
| - storage, storageSize, (source, alpha));
|
| - }
|
| - break;
|
| - case SkBitmap::kIndex8_Config:
|
| - if (source.isOpaque()) {
|
| - if (255 == alpha) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8_Opaque,
|
| - storage, storageSize, (source));
|
| - } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8_Blend,
|
| - storage, storageSize, (source, alpha));
|
| - }
|
| - } else {
|
| - if (255 == alpha) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8A_Opaque,
|
| - storage, storageSize, (source));
|
| - } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D16_SIndex8A_Blend,
|
| - storage, storageSize, (source, alpha));
|
| - }
|
| - }
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return blitter;
|
| -}
|
| -
|
|
|