| Index: skia/sgl/SkBitmapShader.cpp
|
| ===================================================================
|
| --- skia/sgl/SkBitmapShader.cpp (revision 16859)
|
| +++ skia/sgl/SkBitmapShader.cpp (working copy)
|
| @@ -1,822 +0,0 @@
|
| -/* 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.
|
| -*/
|
| -
|
| -#if 0
|
| -
|
| -#include "SkBitmapShader.h"
|
| -#include "SkBitmapSampler.h"
|
| -
|
| -#ifdef SK_SUPPORT_MIPMAP
|
| -static SkFixed find_mip_level(SkFixed dx, SkFixed dy)
|
| -{
|
| - dx = SkAbs32(dx);
|
| - dy = SkAbs32(dy);
|
| - if (dx < dy)
|
| - dx = dy;
|
| -
|
| - if (dx < SK_Fixed1)
|
| - return 0;
|
| -
|
| - int clz = SkCLZ(dx);
|
| - SkASSERT(clz >= 1 && clz <= 15);
|
| - return SkIntToFixed(15 - clz) + ((unsigned)(dx << (clz + 1)) >> 16);
|
| -}
|
| -#endif
|
| -
|
| -SkBitmapShader::SkBitmapShader(const SkBitmap& src, bool doFilter,
|
| - TileMode tmx, TileMode tmy)
|
| - :
|
| -#ifdef SK_SUPPORT_MIPMAP
|
| - fMipLevel(0), fMipSrcBitmap(src),
|
| -#endif
|
| - fOrigSrcBitmap(src)
|
| -
|
| -{
|
| - fFilterBitmap = doFilter;
|
| - fTileModeX = SkToU8(tmx);
|
| - fTileModeY = SkToU8(tmy);
|
| -}
|
| -
|
| -SkBitmapShader::SkBitmapShader(SkFlattenableReadBuffer& buffer) :
|
| - INHERITED(buffer)
|
| -{
|
| - Bitmap src;
|
| - buffer.readBitmap(&src);
|
| -#ifdef SK_SUPPORT_MIPMAP
|
| - fMipLevel = 0;
|
| - fMipSrcBitmap = src;
|
| -#endif
|
| - fOrigSrcBitmap = src;
|
| - fFilterBitmap = buffer.readU8();
|
| - fTileModeX = buffer.readU8();
|
| - fTileModeY = buffer.readU8();
|
| -}
|
| -
|
| -void SkBitmapShader::flatten(SkFlattenableWriteBuffer& buffer)
|
| -{
|
| - this->INHERITED::flatten(buffer);
|
| - buffer.writeBitmap(&fOrigSrcBitmap);
|
| - buffer.write8(fFilterBitmap);
|
| - buffer.write8(fTileModeX);
|
| - buffer.write8(fTileModeY);
|
| -}
|
| -
|
| -bool SkBitmapShader::setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix)
|
| -{
|
| - // do this first, so we have a correct inverse matrix
|
| - if (!this->INHERITED::setContext(device, paint, matrix))
|
| - return false;
|
| -
|
| - if (fOrigSrcBitmap.getConfig() == SkBitmap::kNo_Config ||
|
| - fOrigSrcBitmap.width() == 0 ||
|
| - fOrigSrcBitmap.height() == 0)
|
| - return false;
|
| -
|
| - SkBitmap& bm = fOrigSrcBitmap;
|
| -
|
| -#ifdef SK_SUPPORT_MIPMAP
|
| - if (fOrigSrcBitmap.countMipLevels())
|
| - {
|
| - const SkMatrix& inv = this->getTotalInverse();
|
| -
|
| - fMipLevel = SkMin32(find_mip_level( SkScalarToFixed(inv.getScaleX()),
|
| - SkScalarToFixed(inv.getSkewY())),
|
| - SkIntToFixed(fOrigSrcBitmap.countMipLevels() - 1));
|
| -
|
| -// SkDEBUGF(("BitmapShader miplevel=%x\n", fMipLevel));
|
| -
|
| - const SkBitmap::MipLevel* mm = fOrigSrcBitmap.getMipLevel(fMipLevel >> 16);
|
| -
|
| - fMipSrcBitmap.setConfig(fOrigSrcBitmap.getConfig(),
|
| - mm->fWidth,
|
| - mm->fHeight,
|
| - mm->fRowBytes);
|
| - fMipSrcBitmap.setPixels(mm->fPixels);
|
| - bm = fMipSrcBitmap;
|
| - }
|
| - else
|
| - {
|
| - fMipLevel = 0;
|
| - fMipSrcBitmap = fOrigSrcBitmap;
|
| - }
|
| -#endif
|
| -
|
| - fFlags = 0;
|
| - if (paint.getAlpha() == 255 && bm.isOpaque())
|
| - fFlags |= kOpaqueAlpha_Flag;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkColorPriv.h"
|
| -#include "SkBitmapSampler.h"
|
| -#include "SkPerspIter.h"
|
| -
|
| -class Sampler_BitmapShader : public SkBitmapShader {
|
| -public:
|
| - Sampler_BitmapShader(const SkBitmap& src, bool doFilter,
|
| - TileMode tmx, TileMode tmy)
|
| - : SkBitmapShader(src, doFilter, tmx, tmy)
|
| - {
|
| - // make sure to pass our copy of the src bitmap to the sampler, and not the
|
| - // original parameter (which might go away).
|
| - fSampler = NULL;
|
| - }
|
| -
|
| - virtual ~Sampler_BitmapShader()
|
| - {
|
| - SkDELETE(fSampler);
|
| - }
|
| -
|
| - virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix)
|
| - {
|
| - if (this->INHERITED::setContext(device, paint, matrix))
|
| - {
|
| - SkDELETE(fSampler);
|
| - fSampler = SkBitmapSampler::Create(this->getSrcBitmap(), this->getFilterBitmap(),
|
| - this->getTileModeX(), this->getTileModeY());
|
| - fSampler->setPaint(paint);
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - enum {
|
| - kMaxPointStorageCount = 32
|
| - };
|
| -
|
| - virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count)
|
| - {
|
| - unsigned scale = SkAlpha255To256(this->getPaintAlpha());
|
| - const SkMatrix& inv = this->getTotalInverse();
|
| - SkMatrix::MapPtProc proc = this->getInverseMapPtProc();
|
| - SkBitmapSampler* sampler = fSampler;
|
| - MatrixClass mc = this->getInverseClass();
|
| -
|
| - SkPoint srcPt;
|
| -
|
| - if (mc != kPerspective_MatrixClass)
|
| - {
|
| - proc(inv, SkIntToScalar(x) + SK_ScalarHalf,
|
| - SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
|
| -
|
| - SkFixed fx = SkScalarToFixed(srcPt.fX);
|
| - SkFixed fy = SkScalarToFixed(srcPt.fY);
|
| - SkFixed dx, dy;
|
| -
|
| - if (mc == kLinear_MatrixClass)
|
| - {
|
| - dx = SkScalarToFixed(inv.getScaleX());
|
| - dy = SkScalarToFixed(inv.getSkewY());
|
| - }
|
| - else
|
| - (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy);
|
| -
|
| -#if defined(SK_SUPPORT_MIPMAP)
|
| - { int level = this->getMipLevel() >> 16;
|
| - fx >>= level;
|
| - fy >>= level;
|
| - dx >>= level;
|
| - dy >>= level;
|
| - }
|
| -#endif
|
| - if (scale == 256)
|
| - {
|
| - for (int i = 0; i < count; i++)
|
| - {
|
| - dstC[i] = sampler->sample(fx, fy);
|
| - fx += dx;
|
| - fy += dy;
|
| - }
|
| - }
|
| - else
|
| - {
|
| - for (int i = 0; i < count; i++)
|
| - {
|
| - uint32_t c = sampler->sample(fx, fy);
|
| - dstC[i] = SkAlphaMulQ(c, scale);
|
| - fx += dx;
|
| - fy += dy;
|
| - }
|
| - }
|
| - }
|
| - else
|
| - {
|
| - SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf,
|
| - SkIntToScalar(y) + SK_ScalarHalf, count);
|
| - if (scale == 256)
|
| - {
|
| - while ((count = iter.next()) != 0)
|
| - {
|
| - const SkFixed* src = iter.getXY();
|
| - for (int i = 0; i < count; i++)
|
| - {
|
| - *dstC++ = sampler->sample(src[0], src[1]);
|
| - src += 2;
|
| - }
|
| - }
|
| - }
|
| - else
|
| - {
|
| - while ((count = iter.next()) != 0)
|
| - {
|
| - const SkFixed* src = iter.getXY();
|
| - for (int i = 0; i < count; i++)
|
| - {
|
| - uint32_t c = sampler->sample(src[0] - SK_FixedHalf, src[1] - SK_FixedHalf);
|
| - *dstC++ = SkAlphaMulQ(c, scale);
|
| - src += 2;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| -protected:
|
| -
|
| - const SkMatrix& getUnitInverse() const { return fUnitInverse; }
|
| - SkMatrix::MapPtProc getUnitInverseProc() const { return fUnitInverseProc; }
|
| -
|
| - /* takes computed inverse (from setContext) and computes fUnitInverse,
|
| - taking srcBitmap width/height into account, so that fUnitInverse
|
| - walks 0...1, allowing the tile modes to all operate in a fast 16bit
|
| - space (no need for mod). The resulting coords need to be scaled by
|
| - width/height to get back into src space (coord * width >> 16).
|
| - */
|
| - void computeUnitInverse()
|
| - {
|
| - const SkBitmap& src = getSrcBitmap();
|
| - fUnitInverse = this->getTotalInverse();
|
| - fUnitInverse.postIDiv(src.width(), src.height());
|
| - fUnitInverseProc = fUnitInverse.getMapPtProc();
|
| - }
|
| -
|
| -private:
|
| - SkBitmapSampler* fSampler;
|
| - SkMatrix fUnitInverse;
|
| - SkMatrix::MapPtProc fUnitInverseProc;
|
| -
|
| - typedef SkBitmapShader INHERITED;
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////
|
| -
|
| -class HasSpan16_Sampler_BitmapShader : public Sampler_BitmapShader {
|
| -public:
|
| - HasSpan16_Sampler_BitmapShader(const SkBitmap& src, bool doFilter,
|
| - TileMode tmx, TileMode tmy)
|
| - : Sampler_BitmapShader(src, doFilter, tmx, tmy)
|
| - {
|
| - }
|
| -
|
| - virtual uint32_t getFlags()
|
| - {
|
| - uint32_t flags = this->INHERITED::getFlags();
|
| -
|
| - switch (this->getSrcBitmap().getConfig()) {
|
| - case SkBitmap::kRGB_565_Config:
|
| - flags |= kHasSpan16_Flag;
|
| - break;
|
| - case SkBitmap::kIndex8_Config:
|
| - case SkBitmap::kARGB_8888_Config:
|
| - if (this->getSrcBitmap().isOpaque())
|
| - flags |= kHasSpan16_Flag;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return flags;
|
| - }
|
| -
|
| - const SkBitmap& revealSrcBitmap() const { return this->getSrcBitmap(); }
|
| - uint8_t revealPaintAlpha() const { return this->getPaintAlpha(); }
|
| - const SkMatrix& revealTotalInverse() const { return this->getTotalInverse(); }
|
| -
|
| -private:
|
| - typedef Sampler_BitmapShader INHERITED;
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////
|
| -
|
| -static void Index8_RepeatTile_Sprite16(HasSpan16_Sampler_BitmapShader* shader,
|
| - int x, int y, uint16_t dstC[], int count)
|
| -{
|
| - const SkMatrix& inv = shader->revealTotalInverse();
|
| - const SkBitmap& srcBitmap = shader->revealSrcBitmap();
|
| - int width = srcBitmap.width();
|
| - int height = srcBitmap.height();
|
| -
|
| - SkColorTable* ctable = srcBitmap.getColorTable();
|
| - const uint16_t* colors = ctable->lock16BitCache();
|
| -
|
| - x += SkScalarRound(inv[SkMatrix::kMTransX]);
|
| - y += SkScalarRound(inv[SkMatrix::kMTransY]);
|
| -
|
| - x = do_repeat_mod(x, width - 1);
|
| - y = do_repeat_mod(y, height - 1);
|
| - const uint8_t* row = srcBitmap.getAddr8(0, y);
|
| - const uint8_t* src = row + x;
|
| -
|
| - // do the first partial run
|
| - int n = width - x;
|
| - if (n > count) n = count;
|
| - count -= n;
|
| - SkASSERT(n > 0);
|
| - do {
|
| - *dstC++ = colors[*src++];
|
| - } while (--n > 0);
|
| -
|
| - // do 1 complete run
|
| - if (count >= width)
|
| - {
|
| - uint16_t* baseDstC = dstC; // remember the first complete run start
|
| - n = width;
|
| - count -= width;
|
| - src = row;
|
| - do {
|
| - *dstC++ = colors[*src++];
|
| - } while (--n > 0);
|
| -
|
| - // do the rest of the complete runs
|
| - while (count >= width)
|
| - {
|
| - count -= width;
|
| - memcpy(dstC, baseDstC, width << 1);
|
| - dstC += width;
|
| - }
|
| - // do final partial run
|
| - if (count > 0)
|
| - memcpy(dstC, baseDstC, count << 1);
|
| - }
|
| - else // do final partial
|
| - {
|
| - if (count > 0)
|
| - {
|
| - src = row;
|
| - do {
|
| - *dstC++ = colors[*src++];
|
| - } while (--count > 0);
|
| - }
|
| - }
|
| -
|
| - ctable->unlock16BitCache();
|
| -}
|
| -
|
| -static void Index8_RepeatTile_Sprite32(HasSpan16_Sampler_BitmapShader* shader,
|
| - int x, int y, SkPMColor dstC[], int count)
|
| -{
|
| - const SkMatrix& inv = shader->revealTotalInverse();
|
| - const SkBitmap& srcBitmap = shader->revealSrcBitmap();
|
| - int width = srcBitmap.width();
|
| - int height = srcBitmap.height();
|
| -
|
| - SkColorTable* ctable = srcBitmap.getColorTable();
|
| - const SkPMColor* colors = ctable->lockColors();
|
| -
|
| - x += SkScalarRound(inv[SkMatrix::kMTransX]);
|
| - y += SkScalarRound(inv[SkMatrix::kMTransY]);
|
| -
|
| - x = do_repeat_mod(x, width - 1);
|
| - y = do_repeat_mod(y, height - 1);
|
| -
|
| - const uint8_t* row = srcBitmap.getAddr8(0, y);
|
| - const uint8_t* src = row + x;
|
| -
|
| - // do the first partial run
|
| - int n = width - x;
|
| - if (n > count) n = count;
|
| - count -= n;
|
| - SkASSERT(n > 0);
|
| - do {
|
| - *dstC++ = colors[*src++];
|
| - } while (--n > 0);
|
| -
|
| - // do 1 complete run
|
| - if (count >= width)
|
| - {
|
| - SkPMColor* baseDstC = dstC; // remember the first complete run start
|
| - n = width;
|
| - count -= width;
|
| - src = row;
|
| - do {
|
| - *dstC++ = colors[*src++];
|
| - } while (--n > 0);
|
| -
|
| - // do the rest of the complete runs
|
| - while (count >= width)
|
| - {
|
| - count -= width;
|
| - memcpy(dstC, baseDstC, width << 2);
|
| - dstC += width;
|
| - }
|
| - // do final partial run
|
| - if (count > 0)
|
| - memcpy(dstC, baseDstC, count << 2);
|
| - }
|
| - else // do final partial
|
| - {
|
| - if (count > 0)
|
| - {
|
| - src = row;
|
| - do {
|
| - *dstC++ = colors[*src++];
|
| - } while (--count > 0);
|
| - }
|
| - }
|
| -
|
| - ctable->unlockColors(false);
|
| -}
|
| -
|
| -static void RGB16_RepeatTile_Sprite16(HasSpan16_Sampler_BitmapShader* shader,
|
| - int x, int y, uint16_t dstC[], int count)
|
| -{
|
| - SkASSERT(count > 0);
|
| -
|
| - const SkMatrix& inv = shader->revealTotalInverse();
|
| - const SkBitmap& srcBitmap = shader->revealSrcBitmap();
|
| - int width = srcBitmap.width();
|
| - int height = srcBitmap.height();
|
| -
|
| - SkASSERT(width > 0 && height > 0);
|
| -
|
| - x += SkScalarRound(inv[SkMatrix::kMTransX]);
|
| - y += SkScalarRound(inv[SkMatrix::kMTransY]);
|
| -
|
| - x = do_repeat_mod(x, width - 1);
|
| - y = do_repeat_mod(y, height - 1);
|
| -
|
| - const uint16_t* row = srcBitmap.getAddr16(0, y);
|
| - const uint16_t* src = row + x;
|
| -
|
| - int n = SkMin32(width - x, count);
|
| -
|
| - for (;;)
|
| - {
|
| - SkASSERT(n > 0 && count >= n);
|
| - memcpy(dstC, src, n << 1);
|
| - count -= n;
|
| - if (count == 0)
|
| - break;
|
| - dstC += n;
|
| - src = row;
|
| - n = SkMin32(width, count);
|
| - }
|
| -}
|
| -
|
| -static void RGB16_RepeatTile_Sprite32(HasSpan16_Sampler_BitmapShader* shader,
|
| - int x, int y, SkPMColor dstC[], int count)
|
| -{
|
| - SkASSERT(count > 0);
|
| -
|
| - const SkMatrix& inv = shader->revealTotalInverse();
|
| - const SkBitmap& srcBitmap = shader->revealSrcBitmap();
|
| - int width = srcBitmap.width();
|
| - int height = srcBitmap.height();
|
| -
|
| - SkASSERT(width > 0 && height > 0);
|
| -
|
| - x += SkScalarRound(inv[SkMatrix::kMTransX]);
|
| - y += SkScalarRound(inv[SkMatrix::kMTransY]);
|
| -
|
| - x = do_repeat_mod(x, width - 1);
|
| - y = do_repeat_mod(y, height - 1);
|
| -
|
| - const uint16_t* row = srcBitmap.getAddr16(0, y);
|
| - const uint16_t* src = row + x;
|
| -
|
| - int n = SkMin32(width - x, count);
|
| -
|
| - // do the first partial run
|
| - count -= n;
|
| - SkASSERT(n > 0);
|
| - do {
|
| - *dstC++ = SkPixel16ToPixel32(*src++);
|
| - } while (--n > 0);
|
| -
|
| - // do 1 complete run
|
| - if (count >= width)
|
| - {
|
| - SkPMColor* baseDstC = dstC; // remember the first complete run start
|
| - n = width;
|
| - count -= width;
|
| - src = row;
|
| - do {
|
| - *dstC++ = SkPixel16ToPixel32(*src++);
|
| - } while (--n > 0);
|
| -
|
| - // do the rest of the complete runs
|
| - while (count >= width)
|
| - {
|
| - count -= width;
|
| - memcpy(dstC, baseDstC, width << 2);
|
| - dstC += width;
|
| - }
|
| - // do final partial run
|
| - if (count > 0)
|
| - memcpy(dstC, baseDstC, count << 2);
|
| - }
|
| - else // do final partial
|
| - {
|
| - if (count > 0)
|
| - {
|
| - src = row;
|
| - do {
|
| - *dstC++ = SkPixel16ToPixel32(*src++);;
|
| - } while (--count > 0);
|
| - }
|
| - }
|
| -}
|
| -
|
| -static void ARGB32_RepeatTile_Sprite16(HasSpan16_Sampler_BitmapShader* shader,
|
| - int x, int y, uint16_t dstC[], int count)
|
| -{
|
| - SkASSERT(count > 0);
|
| -
|
| - const SkMatrix& inv = shader->revealTotalInverse();
|
| - const SkBitmap& srcBitmap = shader->revealSrcBitmap();
|
| - int width = srcBitmap.width();
|
| - int height = srcBitmap.height();
|
| -
|
| - SkASSERT(width > 0 && height > 0);
|
| -
|
| - x += SkScalarRound(inv[SkMatrix::kMTransX]);
|
| - y += SkScalarRound(inv[SkMatrix::kMTransY]);
|
| -
|
| - x = do_repeat_mod(x, width - 1);
|
| - y = do_repeat_mod(y, height - 1);
|
| -
|
| - const SkPMColor* row = srcBitmap.getAddr32(0, y);
|
| - const SkPMColor* src = row + x;
|
| -
|
| - int n = SkMin32(width - x, count);
|
| -
|
| - // do the first partial run
|
| - count -= n;
|
| - SkASSERT(n > 0);
|
| - do {
|
| - *dstC++ = SkPixel32ToPixel16(*src++);
|
| - } while (--n > 0);
|
| -
|
| - // do 1 complete run
|
| - if (count >= width)
|
| - {
|
| - uint16_t* baseDstC = dstC; // remember the first complete run start
|
| - n = width;
|
| - count -= width;
|
| - src = row;
|
| - do {
|
| - *dstC++ = SkPixel32ToPixel16(*src++);
|
| - } while (--n > 0);
|
| -
|
| - // do the rest of the complete runs
|
| - while (count >= width)
|
| - {
|
| - count -= width;
|
| - memcpy(dstC, baseDstC, width << 1);
|
| - dstC += width;
|
| - }
|
| - // do final partial run
|
| - if (count > 0)
|
| - memcpy(dstC, baseDstC, count << 1);
|
| - }
|
| - else // do final partial
|
| - {
|
| - if (count > 0)
|
| - {
|
| - src = row;
|
| - do {
|
| - *dstC++ = SkPixel32ToPixel16(*src++);;
|
| - } while (--count > 0);
|
| - }
|
| - }
|
| -}
|
| -
|
| -static void ARGB32_RepeatTile_Sprite32(HasSpan16_Sampler_BitmapShader* shader,
|
| - int x, int y, SkPMColor dstC[], int count)
|
| -{
|
| - SkASSERT(count > 0);
|
| -
|
| - const SkMatrix& inv = shader->revealTotalInverse();
|
| - const SkBitmap& srcBitmap = shader->revealSrcBitmap();
|
| - int width = srcBitmap.width();
|
| - int height = srcBitmap.height();
|
| -
|
| - SkASSERT(width > 0 && height > 0);
|
| -
|
| - x += SkScalarRound(inv[SkMatrix::kMTransX]);
|
| - y += SkScalarRound(inv[SkMatrix::kMTransY]);
|
| -
|
| - x = do_repeat_mod(x, width - 1);
|
| - y = do_repeat_mod(y, height - 1);
|
| -
|
| - const SkPMColor* row = srcBitmap.getAddr32(0, y);
|
| - const SkPMColor* src = row + x;
|
| -
|
| - int n = SkMin32(width - x, count);
|
| -
|
| - for (;;)
|
| - {
|
| - SkASSERT(n > 0 && count >= n);
|
| - memcpy(dstC, src, n << 2);
|
| - count -= n;
|
| - if (count == 0)
|
| - break;
|
| - dstC += n;
|
| - src = row;
|
| - n = SkMin32(width, count);
|
| - }
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////
|
| -
|
| -#define NOFILTER_BITMAP_SHADER_CLASS Index8_NoFilter_RepeatTile_BitmapShader
|
| -#define NOFILTER_BITMAP_SHADER_TILEMODE SkShader::kRepeat_TileMode
|
| -#define NOFILTER_BITMAP_SHADER_TILEPROC(x, max) (fixed_repeat(x) * (max + 1) >> 16)
|
| -#define NOFILTER_BITMAP_SHADER_TYPE uint8_t
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_X(p, x) colors32[p[x]]
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_XY(p, x, y, rb) colors32[p[x + y * rb]]
|
| -#define NOFILTER_BITMAP_SHADER_PREAMBLE(bitmap, rb) const SkPMColor* colors32 = bitmap.getColorTable()->lockColors()
|
| -#define NOFILTER_BITMAP_SHADER_POSTAMBLE(bitmap) bitmap.getColorTable()->unlockColors(false)
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_X16(p, x) colors16[p[x]]
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_XY16(p, x, y, rb) colors16[p[x + y * rb]]
|
| -#define NOFILTER_BITMAP_SHADER_PREAMBLE16(bitmap, rb) const uint16_t* colors16 = bitmap.getColorTable()->lock16BitCache()
|
| -#define NOFILTER_BITMAP_SHADER_POSTAMBLE16(bitmap) bitmap.getColorTable()->unlock16BitCache()
|
| -#define NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
|
| -#define NOFILTER_BITMAP_SHADER_SPRITEPROC16 Index8_RepeatTile_Sprite16
|
| -#define NOFILTER_BITMAP_SHADER_SPRITEPROC32 Index8_RepeatTile_Sprite32
|
| -#include "SkBitmapShaderTemplate.h"
|
| -
|
| -#define NOFILTER_BITMAP_SHADER_CLASS U16_NoFilter_RepeatTile_BitmapShader
|
| -#define NOFILTER_BITMAP_SHADER_TILEMODE SkShader::kRepeat_TileMode
|
| -#define NOFILTER_BITMAP_SHADER_TILEPROC(x, max) (fixed_repeat(x) * (max + 1) >> 16)
|
| -#define NOFILTER_BITMAP_SHADER_TYPE uint16_t
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_X(p, x) SkPixel16ToPixel32(p[x])
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_XY(p, x, y, rb) SkPixel16ToPixel32(*(const uint16_t*)((const char*)p + y * rb + (x << 1)))
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_X16(p, x) p[x]
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_XY16(p, x, y, rb) *(const uint16_t*)((const char*)p + y * rb + (x << 1))
|
| -#define NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
|
| -#define NOFILTER_BITMAP_SHADER_SPRITEPROC16 RGB16_RepeatTile_Sprite16
|
| -#define NOFILTER_BITMAP_SHADER_SPRITEPROC32 RGB16_RepeatTile_Sprite32
|
| -#include "SkBitmapShaderTemplate.h"
|
| -
|
| -#define NOFILTER_BITMAP_SHADER_CLASS U32_NoFilter_RepeatTile_BitmapShader
|
| -#define NOFILTER_BITMAP_SHADER_TILEMODE SkShader::kRepeat_TileMode
|
| -#define NOFILTER_BITMAP_SHADER_TILEPROC(x, max) (fixed_repeat(x) * (max + 1) >> 16)
|
| -#define NOFILTER_BITMAP_SHADER_TYPE uint32_t
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_X(p, x) p[x]
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_XY(p, x, y, rb) *(const uint32_t*)((const char*)p + y * rb + (x << 2))
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_X16(p, x) SkPixel32ToPixel16_ToU16(p[x])
|
| -#define NOFILTER_BITMAP_SHADER_SAMPLE_XY16(p, x, y, rb) SkPixel32ToPixel16_ToU16(*(const uint32_t*)((const char*)p + y * rb + (x << 2)))
|
| -#define NOFILTER_BITMAP_SHADER_USE_UNITINVERSE
|
| -#define NOFILTER_BITMAP_SHADER_SPRITEPROC16 ARGB32_RepeatTile_Sprite16
|
| -#define NOFILTER_BITMAP_SHADER_SPRITEPROC32 ARGB32_RepeatTile_Sprite32
|
| -#include "SkBitmapShaderTemplate.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static inline SkPMColor expanded_rgb16_to_8888(uint32_t c, U8CPU alpha)
|
| -{
|
| -// GGGG Gggg gggR RRRR rrrr r|BB BBBb bbbb
|
| - SkASSERT(alpha <= 255);
|
| -
|
| -#if 1
|
| - int scale = SkAlpha255To256(alpha);
|
| - int r = (c & 0xF800) * scale >> 16;
|
| - int g = ((c >> 21) & 0x3F) * scale >> 6;
|
| - int b = (c & 0x1F) * scale >> 5;
|
| - return SkPackARGB32(alpha, r, g, b);
|
| -#else
|
| - int scale = SkAlpha255To256(alpha) >> 3;
|
| - c &= 0x07E0F81F;
|
| - c = c * scale;
|
| - int r = (c >> 13) & 0xFF;
|
| - int g = (c >> 24) & 0xFF;
|
| - int b = (c >> 2) & 0xFF;
|
| - return SkPackARGB32(alpha, r, g, b);
|
| -#endif
|
| -}
|
| -
|
| -#define BILERP_BITMAP16_SHADER_CLASS U16_Bilerp_BitmapShader
|
| -#define BILERP_BITMAP16_SHADER_TYPE uint16_t
|
| -#define BILERP_BITMAP16_SHADER_PREAMBLE(bm)
|
| -#define BILERP_BITMAP16_SHADER_PIXEL(c) (c)
|
| -#define BILERP_BITMAP16_SHADER_POSTAMBLE(bm)
|
| -#include "SkBitmapShader16BilerpTemplate.h"
|
| -
|
| -#define BILERP_BITMAP16_SHADER_CLASS Index8_Bilerp_BitmapShader
|
| -#define BILERP_BITMAP16_SHADER_TYPE uint8_t
|
| -#define BILERP_BITMAP16_SHADER_PREAMBLE(bm) SkColorTable* ctable = (bm).getColorTable(); const uint16_t* colors16 = ctable->lock16BitCache()
|
| -#define BILERP_BITMAP16_SHADER_PIXEL(c) colors16[c]
|
| -#define BILERP_BITMAP16_SHADER_POSTAMBLE(bm) ctable->unlock16BitCache()
|
| -#include "SkBitmapShader16BilerpTemplate.h"
|
| -
|
| -#include "ARGB32_Clamp_Bilinear_BitmapShader.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////
|
| -///////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkBitmapProcShader.h"
|
| -
|
| -///////////////////////////////////////////////////////////////////////////
|
| -///////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkTemplatesPriv.h"
|
| -
|
| -SkShader* SkShader::CreateBitmapShader(const SkBitmap& src,
|
| - bool doFilter,
|
| - TileMode tmx, TileMode tmy,
|
| - void* storage, size_t storageSize)
|
| -{
|
| -#if 1
|
| -
|
| - SkShader* shader;
|
| - SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage,
|
| - storageSize, (src, doFilter, tmx, tmy));
|
| - return shader;
|
| -#else
|
| -
|
| - if (!doFilter)
|
| - {
|
| - if (kClamp_TileMode == tmx && kClamp_TileMode == tmy)
|
| - {
|
| - SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage,
|
| - storageSize, (src, doFilter, tmx, tmy));
|
| - }
|
| - else if (kRepeat_TileMode == tmx && kRepeat_TileMode == tmy)
|
| - {
|
| - #if 1
|
| - SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage,
|
| - storageSize, (src, doFilter, tmx, tmy));
|
| - #else
|
| - switch (src.getConfig()) {
|
| - case SkBitmap::kIndex8_Config:
|
| - SK_PLACEMENT_NEW_ARGS(shader, Index8_NoFilter_RepeatTile_BitmapShader, storage, storageSize, (src));
|
| - break;
|
| - case SkBitmap::kRGB_565_Config:
|
| - SK_PLACEMENT_NEW_ARGS(shader, U16_NoFilter_RepeatTile_BitmapShader, storage, storageSize, (src));
|
| - break;
|
| - case SkBitmap::kARGB_8888_Config:
|
| - SK_PLACEMENT_NEW_ARGS(shader, U32_NoFilter_RepeatTile_BitmapShader, storage, storageSize, (src));
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - #endif
|
| - }
|
| - }
|
| - else if (kClamp_TileMode == tmx && kClamp_TileMode == tmy)
|
| - {
|
| -#if 1
|
| - if (SkBitmapProcShader::CanDo(src, tmx, tmy))
|
| - {
|
| - SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage,
|
| - storageSize, (src, doFilter, tmx, tmy));
|
| - }
|
| -#else
|
| - switch (src.getConfig()) {
|
| - case SkBitmap::kIndex8_Config:
|
| - if (src.isOpaque())
|
| - SK_PLACEMENT_NEW_ARGS(shader, Index8_Bilerp_BitmapShader, storage, storageSize, (src));
|
| - break;
|
| - case SkBitmap::kRGB_565_Config:
|
| - SK_PLACEMENT_NEW_ARGS(shader, U16_Bilerp_BitmapShader, storage, storageSize, (src));
|
| - break;
|
| - case SkBitmap::kARGB_8888_Config:
|
| - SK_PLACEMENT_NEW_ARGS(shader, ARGB32_Clamp_Bilinear_BitmapShader, storage, storageSize, (src));
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -#endif
|
| - }
|
| -
|
| - // if shader is null, then none of the special cases could handle the request
|
| - // so fall through to our slow-general case
|
| - if (shader == NULL)
|
| - SK_PLACEMENT_NEW_ARGS(shader, Sampler_BitmapShader, storage, storageSize,
|
| - (src, doFilter, tmx, tmy));
|
| - return shader;
|
| -#endif
|
| -}
|
| -
|
| -SkShader* SkShader::CreateBitmapShader(const SkBitmap& src, bool doFilter,
|
| - TileMode tmx, TileMode tmy)
|
| -{
|
| - return SkShader::CreateBitmapShader(src, doFilter, tmx, tmy, NULL, 0);
|
| -}
|
| -
|
| -#endif
|
|
|