| Index: skia/sgl/SkBitmapProcShader.cpp
|
| ===================================================================
|
| --- skia/sgl/SkBitmapProcShader.cpp (revision 16859)
|
| +++ skia/sgl/SkBitmapProcShader.cpp (working copy)
|
| @@ -1,194 +0,0 @@
|
| -#include "SkBitmapProcShader.h"
|
| -#include "SkColorPriv.h"
|
| -#include "SkPixelRef.h"
|
| -
|
| -bool SkBitmapProcShader::CanDo(const SkBitmap& bm, TileMode tx, TileMode ty) {
|
| - switch (bm.config()) {
|
| - case SkBitmap::kA8_Config:
|
| - case SkBitmap::kRGB_565_Config:
|
| - case SkBitmap::kIndex8_Config:
|
| - case SkBitmap::kARGB_8888_Config:
|
| - // if (tx == ty && (kClamp_TileMode == tx || kRepeat_TileMode == tx))
|
| - return true;
|
| - default:
|
| - break;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -SkBitmapProcShader::SkBitmapProcShader(const SkBitmap& src,
|
| - TileMode tmx, TileMode tmy) {
|
| - fRawBitmap = src;
|
| - fState.fTileModeX = (uint8_t)tmx;
|
| - fState.fTileModeY = (uint8_t)tmy;
|
| -}
|
| -
|
| -SkBitmapProcShader::SkBitmapProcShader(SkFlattenableReadBuffer& buffer)
|
| - : INHERITED(buffer) {
|
| - fRawBitmap.unflatten(buffer);
|
| - fState.fTileModeX = buffer.readU8();
|
| - fState.fTileModeY = buffer.readU8();
|
| -}
|
| -
|
| -void SkBitmapProcShader::beginSession() {
|
| - this->INHERITED::beginSession();
|
| -
|
| - fRawBitmap.lockPixels();
|
| -}
|
| -
|
| -void SkBitmapProcShader::endSession() {
|
| - fRawBitmap.unlockPixels();
|
| -
|
| - this->INHERITED::endSession();
|
| -}
|
| -
|
| -bool SkBitmapProcShader::asABitmap(SkBitmap* texture, SkMatrix* texM,
|
| - TileMode xy[]) {
|
| - if (texture) {
|
| - *texture = fRawBitmap;
|
| - }
|
| - if (texM) {
|
| - texM->reset();
|
| - }
|
| - if (xy) {
|
| - xy[0] = (TileMode)fState.fTileModeX;
|
| - xy[1] = (TileMode)fState.fTileModeY;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void SkBitmapProcShader::flatten(SkFlattenableWriteBuffer& buffer) {
|
| - this->INHERITED::flatten(buffer);
|
| -
|
| - fRawBitmap.flatten(buffer);
|
| - buffer.write8(fState.fTileModeX);
|
| - buffer.write8(fState.fTileModeY);
|
| -}
|
| -
|
| -bool SkBitmapProcShader::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;
|
| - }
|
| -
|
| - fState.fOrigBitmap = fRawBitmap;
|
| - fState.fOrigBitmap.lockPixels();
|
| - if (fState.fOrigBitmap.getPixels() == NULL) {
|
| - fState.fOrigBitmap.unlockPixels();
|
| - return false;
|
| - }
|
| -
|
| - if (!fState.chooseProcs(this->getTotalInverse(), paint)) {
|
| - return false;
|
| - }
|
| -
|
| - bool bitmapIsOpaque = fState.fBitmap->isOpaque();
|
| -
|
| - // filtering doesn't guarantee that opaque stays opaque (finite precision)
|
| - // so pretend we're not opaque if we're being asked to filter. If we had
|
| - // more blit-procs, we could specialize on opaque src, and just OR in 0xFF
|
| - // after the filter to be sure...
|
| - if (paint.isFilterBitmap()) {
|
| - bitmapIsOpaque = false;
|
| - }
|
| -
|
| - // update fFlags
|
| - fFlags = 0; // this should happen in SkShader.cpp
|
| -
|
| - if (bitmapIsOpaque && (255 == this->getPaintAlpha())) {
|
| - fFlags |= kOpaqueAlpha_Flag;
|
| - }
|
| -
|
| - switch (fState.fBitmap->config()) {
|
| - case SkBitmap::kRGB_565_Config:
|
| - fFlags |= (kHasSpan16_Flag | kIntrinsicly16_Flag);
|
| - break;
|
| - case SkBitmap::kIndex8_Config:
|
| - case SkBitmap::kARGB_8888_Config:
|
| - if (bitmapIsOpaque) {
|
| - fFlags |= kHasSpan16_Flag;
|
| - }
|
| - break;
|
| - case SkBitmap::kA8_Config:
|
| - break; // never set kHasSpan16_Flag
|
| - default:
|
| - break;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -#define BUF_MAX 128
|
| -
|
| -void SkBitmapProcShader::shadeSpan(int x, int y, SkPMColor dstC[], int count) {
|
| - uint32_t buffer[BUF_MAX];
|
| -
|
| - const SkBitmapProcState& state = fState;
|
| - SkBitmapProcState::MatrixProc mproc = state.fMatrixProc;
|
| - SkBitmapProcState::SampleProc32 sproc = state.fSampleProc32;
|
| - int max = fState.fDoFilter ? (BUF_MAX >> 1) : BUF_MAX;
|
| -
|
| - SkASSERT(state.fBitmap->getPixels());
|
| - SkASSERT(state.fBitmap->pixelRef() == NULL ||
|
| - state.fBitmap->pixelRef()->getLockCount());
|
| -
|
| - for (;;) {
|
| - int n = count;
|
| - if (n > max) {
|
| - n = max;
|
| - }
|
| - mproc(state, buffer, n, x, y);
|
| - sproc(state, buffer, n, dstC);
|
| -
|
| - if ((count -= n) == 0) {
|
| - break;
|
| - }
|
| - x += n;
|
| - dstC += n;
|
| - }
|
| -}
|
| -
|
| -void SkBitmapProcShader::shadeSpan16(int x, int y, uint16_t dstC[], int count) {
|
| - uint32_t buffer[BUF_MAX];
|
| -
|
| - const SkBitmapProcState& state = fState;
|
| - SkBitmapProcState::MatrixProc mproc = state.fMatrixProc;
|
| - SkBitmapProcState::SampleProc16 sproc = state.fSampleProc16;
|
| - int max = fState.fDoFilter ? (BUF_MAX >> 1) : BUF_MAX;
|
| -
|
| - SkASSERT(state.fBitmap->getPixels());
|
| - SkASSERT(state.fBitmap->pixelRef() == NULL ||
|
| - state.fBitmap->pixelRef()->getLockCount());
|
| -
|
| - for (;;) {
|
| - int n = count;
|
| - if (n > max) {
|
| - n = max;
|
| - }
|
| - mproc(state, buffer, n, x, y);
|
| - sproc(state, buffer, n, dstC);
|
| -
|
| - if ((count -= n) == 0) {
|
| - break;
|
| - }
|
| - x += n;
|
| - dstC += n;
|
| - }
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#include "SkTemplatesPriv.h"
|
| -
|
| -SkShader* SkShader::CreateBitmapShader(const SkBitmap& src,
|
| - TileMode tmx, TileMode tmy,
|
| - void* storage, size_t storageSize) {
|
| - SkShader* shader;
|
| - SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage,
|
| - storageSize, (src, tmx, tmy));
|
| - return shader;
|
| -}
|
| -
|
| -static SkFlattenable::Registrar gBitmapProcShaderReg("SkBitmapProcShader",
|
| - SkBitmapProcShader::CreateProc);
|
|
|