| Index: skia/sgl/SkSpriteBlitter_ARGB32.cpp
|
| ===================================================================
|
| --- skia/sgl/SkSpriteBlitter_ARGB32.cpp (revision 16859)
|
| +++ skia/sgl/SkSpriteBlitter_ARGB32.cpp (working copy)
|
| @@ -1,314 +0,0 @@
|
| -/* libs/graphics/sgl/SkSpriteBlitter_ARGB32.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 "SkTemplates.h"
|
| -#include "SkUtils.h"
|
| -#include "SkColorPriv.h"
|
| -
|
| -#define D32_S32A_Opaque_Pixel(dst, sc) \
|
| -do { \
|
| - if (sc) { \
|
| - unsigned srcA = SkGetPackedA32(sc); \
|
| - uint32_t result = sc; \
|
| - if (srcA != 0xFF) { \
|
| - result += SkAlphaMulQ(*dst, SkAlpha255To256(255 - srcA)); \
|
| - } \
|
| - *dst = result; \
|
| - } \
|
| -} while (0)
|
| -
|
| -#define SkSPRITE_CLASSNAME Sprite_D32_S32A_Opaque
|
| -#define SkSPRITE_ARGS
|
| -#define SkSPRITE_FIELDS
|
| -#define SkSPRITE_INIT
|
| -#define SkSPRITE_DST_TYPE uint32_t
|
| -#define SkSPRITE_SRC_TYPE uint32_t
|
| -#define SkSPRITE_DST_GETADDR getAddr32
|
| -#define SkSPRITE_SRC_GETADDR getAddr32
|
| -#define SkSPRITE_PREAMBLE(srcBM, x, y)
|
| -#define SkSPRITE_BLIT_PIXEL(dst, src) D32_S32A_Opaque_Pixel(dst, src)
|
| -#define SkSPRITE_NEXT_ROW
|
| -#define SkSPRITE_POSTAMBLE(srcBM)
|
| -#include "SkSpriteBlitterTemplate.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class Sprite_D32_S32_Opaque : public SkSpriteBlitter {
|
| -public:
|
| - Sprite_D32_S32_Opaque(const SkBitmap& source) : SkSpriteBlitter(source) {}
|
| -
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SkASSERT(width > 0 && height > 0);
|
| - SK_RESTRICT uint32_t* dst = fDevice->getAddr32(x, y);
|
| - const SK_RESTRICT uint32_t* src = fSource->getAddr32(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| - size_t size = width * sizeof(uint32_t);
|
| -
|
| - do {
|
| - memcpy(dst, src, size);
|
| - dst = (SK_RESTRICT uint32_t*)((char*)dst + dstRB);
|
| - src = (const SK_RESTRICT uint32_t*)((const char*)src + srcRB);
|
| - } while (--height != 0);
|
| - }
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkColorFilter.h"
|
| -#include "SkXfermode.h"
|
| -
|
| -class Sprite_D32_XferFilter : public SkSpriteBlitter {
|
| -public:
|
| - Sprite_D32_XferFilter(const SkBitmap& source, const SkPaint& paint)
|
| - : SkSpriteBlitter(source) {
|
| - fColorFilter = paint.getColorFilter();
|
| - fColorFilter->safeRef();
|
| -
|
| - fXfermode = paint.getXfermode();
|
| - fXfermode->safeRef();
|
| -
|
| - fBufferSize = 0;
|
| - fBuffer = NULL;
|
| - }
|
| -
|
| - virtual ~Sprite_D32_XferFilter() {
|
| - delete[] fBuffer;
|
| - fXfermode->safeUnref();
|
| - fColorFilter->safeUnref();
|
| - }
|
| -
|
| - virtual void setup(const SkBitmap& device, int left, int top,
|
| - const SkPaint& paint) {
|
| - this->INHERITED::setup(device, left, top, paint);
|
| -
|
| - int width = device.width();
|
| - if (width > fBufferSize) {
|
| - fBufferSize = width;
|
| - delete[] fBuffer;
|
| - fBuffer = new SkPMColor[width];
|
| - }
|
| - }
|
| -
|
| -protected:
|
| - SkColorFilter* fColorFilter;
|
| - SkXfermode* fXfermode;
|
| - int fBufferSize;
|
| - SkPMColor* fBuffer;
|
| -
|
| -private:
|
| - typedef SkSpriteBlitter INHERITED;
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class Sprite_D32_S32A_XferFilter : public Sprite_D32_XferFilter {
|
| -public:
|
| - Sprite_D32_S32A_XferFilter(const SkBitmap& source, const SkPaint& paint)
|
| - : Sprite_D32_XferFilter(source, paint) {}
|
| -
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SkASSERT(width > 0 && height > 0);
|
| - SK_RESTRICT uint32_t* dst = fDevice->getAddr32(x, y);
|
| - const SK_RESTRICT uint32_t* src = fSource->getAddr32(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| - SkColorFilter* colorFilter = fColorFilter;
|
| - SkXfermode* xfermode = fXfermode;
|
| -
|
| - do {
|
| - const SkPMColor* tmp = src;
|
| -
|
| - if (NULL != colorFilter) {
|
| - colorFilter->filterSpan(src, width, fBuffer);
|
| - tmp = fBuffer;
|
| - }
|
| -
|
| - if (NULL != xfermode) {
|
| - xfermode->xfer32(dst, tmp, width, NULL);
|
| - } else {
|
| - for (int i = 0; i < width; i++) {
|
| - dst[i] = SkPMSrcOver(tmp[i], dst[i]);
|
| - }
|
| - }
|
| -
|
| - dst = (SK_RESTRICT uint32_t*)((char*)dst + dstRB);
|
| - src = (const SK_RESTRICT uint32_t*)((const char*)src + srcRB);
|
| - } while (--height != 0);
|
| - }
|
| -
|
| -private:
|
| - typedef Sprite_D32_XferFilter INHERITED;
|
| -};
|
| -
|
| -static void fillbuffer(SK_RESTRICT SkPMColor dst[],
|
| - const SK_RESTRICT SkPMColor16 src[], int count) {
|
| - SkASSERT(count > 0);
|
| -
|
| - do {
|
| - *dst++ = SkPixel4444ToPixel32(*src++);
|
| - } while (--count != 0);
|
| -}
|
| -
|
| -class Sprite_D32_S4444_XferFilter : public Sprite_D32_XferFilter {
|
| -public:
|
| - Sprite_D32_S4444_XferFilter(const SkBitmap& source, const SkPaint& paint)
|
| - : Sprite_D32_XferFilter(source, paint) {}
|
| -
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SkASSERT(width > 0 && height > 0);
|
| - SK_RESTRICT SkPMColor* dst = fDevice->getAddr32(x, y);
|
| - const SK_RESTRICT SkPMColor16* src = fSource->getAddr16(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| - SK_RESTRICT SkPMColor* buffer = fBuffer;
|
| - SkColorFilter* colorFilter = fColorFilter;
|
| - SkXfermode* xfermode = fXfermode;
|
| -
|
| - do {
|
| - fillbuffer(buffer, src, width);
|
| -
|
| - if (NULL != colorFilter) {
|
| - colorFilter->filterSpan(buffer, width, buffer);
|
| - }
|
| - if (NULL != xfermode) {
|
| - xfermode->xfer32(dst, buffer, width, NULL);
|
| - } else {
|
| - for (int i = 0; i < width; i++) {
|
| - dst[i] = SkPMSrcOver(buffer[i], dst[i]);
|
| - }
|
| - }
|
| -
|
| - dst = (SK_RESTRICT SkPMColor*)((char*)dst + dstRB);
|
| - src = (const SK_RESTRICT SkPMColor16*)((const char*)src + srcRB);
|
| - } while (--height != 0);
|
| - }
|
| -
|
| -private:
|
| - typedef Sprite_D32_XferFilter INHERITED;
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static void src_row(SK_RESTRICT SkPMColor dst[],
|
| - const SK_RESTRICT SkPMColor16 src[], int count) {
|
| - do {
|
| - *dst = SkPixel4444ToPixel32(*src);
|
| - src += 1;
|
| - dst += 1;
|
| - } while (--count != 0);
|
| -}
|
| -
|
| -class Sprite_D32_S4444_Opaque : public SkSpriteBlitter {
|
| -public:
|
| - Sprite_D32_S4444_Opaque(const SkBitmap& source) : SkSpriteBlitter(source) {}
|
| -
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SkASSERT(width > 0 && height > 0);
|
| - SK_RESTRICT SkPMColor* dst = fDevice->getAddr32(x, y);
|
| - const SK_RESTRICT SkPMColor16* src = fSource->getAddr16(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| -
|
| - do {
|
| - src_row(dst, src, width);
|
| - dst = (SK_RESTRICT SkPMColor*)((char*)dst + dstRB);
|
| - src = (const SK_RESTRICT SkPMColor16*)((const char*)src + srcRB);
|
| - } while (--height != 0);
|
| - }
|
| -};
|
| -
|
| -static void srcover_row(SK_RESTRICT SkPMColor dst[],
|
| - const SK_RESTRICT SkPMColor16 src[], int count) {
|
| - do {
|
| - *dst = SkPMSrcOver(SkPixel4444ToPixel32(*src), *dst);
|
| - src += 1;
|
| - dst += 1;
|
| - } while (--count != 0);
|
| -}
|
| -
|
| -class Sprite_D32_S4444 : public SkSpriteBlitter {
|
| -public:
|
| - Sprite_D32_S4444(const SkBitmap& source) : SkSpriteBlitter(source) {}
|
| -
|
| - virtual void blitRect(int x, int y, int width, int height) {
|
| - SkASSERT(width > 0 && height > 0);
|
| - SK_RESTRICT SkPMColor* dst = fDevice->getAddr32(x, y);
|
| - const SK_RESTRICT SkPMColor16* src = fSource->getAddr16(x - fLeft,
|
| - y - fTop);
|
| - unsigned dstRB = fDevice->rowBytes();
|
| - unsigned srcRB = fSource->rowBytes();
|
| -
|
| - do {
|
| - srcover_row(dst, src, width);
|
| - dst = (SK_RESTRICT SkPMColor*)((char*)dst + dstRB);
|
| - src = (const SK_RESTRICT SkPMColor16*)((const char*)src + srcRB);
|
| - } while (--height != 0);
|
| - }
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkTemplatesPriv.h"
|
| -
|
| -SkSpriteBlitter* SkSpriteBlitter::ChooseD32(const SkBitmap& source,
|
| - const SkPaint& paint,
|
| - void* storage, size_t storageSize) {
|
| - if (paint.getMaskFilter() != NULL || paint.getAlpha() != 0xFF) {
|
| - return NULL;
|
| - }
|
| -
|
| - SkXfermode* xfermode = paint.getXfermode();
|
| - SkColorFilter* filter = paint.getColorFilter();
|
| - SkSpriteBlitter* blitter = NULL;
|
| -
|
| - switch (source.getConfig()) {
|
| - case SkBitmap::kARGB_4444_Config:
|
| - if (xfermode || filter) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S4444_XferFilter,
|
| - storage, storageSize, (source, paint));
|
| - } else if (source.isOpaque()) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S4444_Opaque,
|
| - storage, storageSize, (source));
|
| - } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S4444,
|
| - storage, storageSize, (source));
|
| - }
|
| - break;
|
| - case SkBitmap::kARGB_8888_Config:
|
| - if (xfermode || filter) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S32A_XferFilter,
|
| - storage, storageSize, (source, paint));
|
| - } else if (source.isOpaque()) {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S32_Opaque,
|
| - storage, storageSize, (source));
|
| - } else {
|
| - SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S32A_Opaque,
|
| - storage, storageSize, (source));
|
| - }
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return blitter;
|
| -}
|
| -
|
|
|