| Index: src/core/SkBitmapProcShader.cpp
|
| diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp
|
| index 5f5eb1866e4282ba2a6e6b12237d5ea5a13deb08..a397b78439d6f7854f986565b927f0325f0494db 100644
|
| --- a/src/core/SkBitmapProcShader.cpp
|
| +++ b/src/core/SkBitmapProcShader.cpp
|
| @@ -34,16 +34,18 @@
|
| SkBitmapProcShader::SkBitmapProcShader(const SkBitmap& src,
|
| TileMode tmx, TileMode tmy) {
|
| fRawBitmap = src;
|
| - fTileModeX = (uint8_t)tmx;
|
| - fTileModeY = (uint8_t)tmy;
|
| + fState.fTileModeX = (uint8_t)tmx;
|
| + fState.fTileModeY = (uint8_t)tmy;
|
| + fFlags = 0; // computed in setContext
|
| }
|
|
|
| SkBitmapProcShader::SkBitmapProcShader(SkReadBuffer& buffer)
|
| : INHERITED(buffer) {
|
| buffer.readBitmap(&fRawBitmap);
|
| fRawBitmap.setImmutable();
|
| - fTileModeX = buffer.readUInt();
|
| - fTileModeY = buffer.readUInt();
|
| + fState.fTileModeX = buffer.readUInt();
|
| + fState.fTileModeY = buffer.readUInt();
|
| + fFlags = 0; // computed in setContext
|
| }
|
|
|
| SkShader::BitmapType SkBitmapProcShader::asABitmap(SkBitmap* texture,
|
| @@ -56,8 +58,8 @@
|
| texM->reset();
|
| }
|
| if (xy) {
|
| - xy[0] = (TileMode)fTileModeX;
|
| - xy[1] = (TileMode)fTileModeY;
|
| + xy[0] = (TileMode)fState.fTileModeX;
|
| + xy[1] = (TileMode)fState.fTileModeY;
|
| }
|
| return kDefault_BitmapType;
|
| }
|
| @@ -66,8 +68,8 @@
|
| this->INHERITED::flatten(buffer);
|
|
|
| buffer.writeBitmap(fRawBitmap);
|
| - buffer.writeUInt(fTileModeX);
|
| - buffer.writeUInt(fTileModeY);
|
| + buffer.writeUInt(fState.fTileModeX);
|
| + buffer.writeUInt(fState.fTileModeY);
|
| }
|
|
|
| static bool only_scale_and_translate(const SkMatrix& matrix) {
|
| @@ -96,67 +98,25 @@
|
| return true;
|
| }
|
|
|
| -bool SkBitmapProcShader::validInternal(const SkBitmap& device,
|
| - const SkPaint& paint,
|
| - const SkMatrix& matrix,
|
| - SkMatrix* totalInverse,
|
| - SkBitmapProcState* state) const {
|
| +bool SkBitmapProcShader::setContext(const SkBitmap& device,
|
| + const SkPaint& paint,
|
| + const SkMatrix& matrix) {
|
| if (!fRawBitmap.getTexture() && !valid_for_drawing(fRawBitmap)) {
|
| return false;
|
| }
|
|
|
| - // Make sure we can use totalInverse as a cache.
|
| - SkMatrix totalInverseLocal;
|
| - if (NULL == totalInverse) {
|
| - totalInverse = &totalInverseLocal;
|
| - }
|
| -
|
| - // Do this first, so we know the matrix can be inverted.
|
| - if (!this->INHERITED::validContext(device, paint, matrix, totalInverse)) {
|
| + // do this first, so we have a correct inverse matrix
|
| + if (!this->INHERITED::setContext(device, paint, matrix)) {
|
| return false;
|
| }
|
|
|
| - SkASSERT(state);
|
| - state->fTileModeX = fTileModeX;
|
| - state->fTileModeY = fTileModeY;
|
| - state->fOrigBitmap = fRawBitmap;
|
| - return state->chooseProcs(*totalInverse, paint);
|
| -}
|
| -
|
| -bool SkBitmapProcShader::validContext(const SkBitmap& device,
|
| - const SkPaint& paint,
|
| - const SkMatrix& matrix,
|
| - SkMatrix* totalInverse) const {
|
| - SkBitmapProcState state;
|
| - return this->validInternal(device, paint, matrix, totalInverse, &state);
|
| -}
|
| -
|
| -SkShader::Context* SkBitmapProcShader::createContext(const SkBitmap& device, const SkPaint& paint,
|
| - const SkMatrix& matrix, void* storage) const {
|
| - void* stateStorage = (char*)storage + sizeof(BitmapProcShaderContext);
|
| - SkBitmapProcState* state = SkNEW_PLACEMENT(stateStorage, SkBitmapProcState);
|
| - if (!this->validInternal(device, paint, matrix, NULL, state)) {
|
| - state->~SkBitmapProcState();
|
| - return NULL;
|
| - }
|
| -
|
| - return SkNEW_PLACEMENT_ARGS(storage, BitmapProcShaderContext,
|
| - (*this, device, paint, matrix, state));
|
| -}
|
| -
|
| -size_t SkBitmapProcShader::contextSize() const {
|
| - // The SkBitmapProcState is stored outside of the context object, with the context holding
|
| - // a pointer to it.
|
| - return sizeof(BitmapProcShaderContext) + sizeof(SkBitmapProcState);
|
| -}
|
| -
|
| -SkBitmapProcShader::BitmapProcShaderContext::BitmapProcShaderContext(
|
| - const SkBitmapProcShader& shader, const SkBitmap& device,
|
| - const SkPaint& paint, const SkMatrix& matrix, SkBitmapProcState* state)
|
| - : INHERITED(shader, device, paint, matrix)
|
| - , fState(state)
|
| -{
|
| - const SkBitmap& bitmap = *fState->fBitmap;
|
| + fState.fOrigBitmap = fRawBitmap;
|
| + if (!fState.chooseProcs(this->getTotalInverse(), paint)) {
|
| + this->INHERITED::endContext();
|
| + return false;
|
| + }
|
| +
|
| + const SkBitmap& bitmap = *fState.fBitmap;
|
| bool bitmapIsOpaque = bitmap.isOpaque();
|
|
|
| // update fFlags
|
| @@ -197,12 +157,12 @@
|
| }
|
|
|
| fFlags = flags;
|
| -}
|
| -
|
| -SkBitmapProcShader::BitmapProcShaderContext::~BitmapProcShaderContext() {
|
| - // The bitmap proc state has been created outside of the context on memory that will be freed
|
| - // elsewhere. Only call the destructor but leave the freeing of the memory to the caller.
|
| - fState->~SkBitmapProcState();
|
| + return true;
|
| +}
|
| +
|
| +void SkBitmapProcShader::endContext() {
|
| + fState.endContext();
|
| + this->INHERITED::endContext();
|
| }
|
|
|
| #define BUF_MAX 128
|
| @@ -216,9 +176,8 @@
|
| #define TEST_BUFFER_EXTRA 0
|
| #endif
|
|
|
| -void SkBitmapProcShader::BitmapProcShaderContext::shadeSpan(int x, int y, SkPMColor dstC[],
|
| - int count) {
|
| - const SkBitmapProcState& state = *fState;
|
| +void SkBitmapProcShader::shadeSpan(int x, int y, SkPMColor dstC[], int count) {
|
| + const SkBitmapProcState& state = fState;
|
| if (state.getShaderProc32()) {
|
| state.getShaderProc32()(state, x, y, dstC, count);
|
| return;
|
| @@ -227,7 +186,7 @@
|
| uint32_t buffer[BUF_MAX + TEST_BUFFER_EXTRA];
|
| SkBitmapProcState::MatrixProc mproc = state.getMatrixProc();
|
| SkBitmapProcState::SampleProc32 sproc = state.getSampleProc32();
|
| - int max = state.maxCountForBufferSize(sizeof(buffer[0]) * BUF_MAX);
|
| + int max = fState.maxCountForBufferSize(sizeof(buffer[0]) * BUF_MAX);
|
|
|
| SkASSERT(state.fBitmap->getPixels());
|
| SkASSERT(state.fBitmap->pixelRef() == NULL ||
|
| @@ -261,17 +220,16 @@
|
| }
|
| }
|
|
|
| -SkShader::Context::ShadeProc SkBitmapProcShader::BitmapProcShaderContext::asAShadeProc(void** ctx) {
|
| - if (fState->getShaderProc32()) {
|
| - *ctx = fState;
|
| - return (ShadeProc)fState->getShaderProc32();
|
| +SkShader::ShadeProc SkBitmapProcShader::asAShadeProc(void** ctx) {
|
| + if (fState.getShaderProc32()) {
|
| + *ctx = &fState;
|
| + return (ShadeProc)fState.getShaderProc32();
|
| }
|
| return NULL;
|
| }
|
|
|
| -void SkBitmapProcShader::BitmapProcShaderContext::shadeSpan16(int x, int y, uint16_t dstC[],
|
| - int count) {
|
| - const SkBitmapProcState& state = *fState;
|
| +void SkBitmapProcShader::shadeSpan16(int x, int y, uint16_t dstC[], int count) {
|
| + const SkBitmapProcState& state = fState;
|
| if (state.getShaderProc16()) {
|
| state.getShaderProc16()(state, x, y, dstC, count);
|
| return;
|
| @@ -280,7 +238,7 @@
|
| uint32_t buffer[BUF_MAX];
|
| SkBitmapProcState::MatrixProc mproc = state.getMatrixProc();
|
| SkBitmapProcState::SampleProc16 sproc = state.getSampleProc16();
|
| - int max = state.maxCountForBufferSize(sizeof(buffer));
|
| + int max = fState.maxCountForBufferSize(sizeof(buffer));
|
|
|
| SkASSERT(state.fBitmap->getPixels());
|
| SkASSERT(state.fBitmap->pixelRef() == NULL ||
|
| @@ -384,8 +342,8 @@
|
| str->append("BitmapShader: (");
|
|
|
| str->appendf("(%s, %s)",
|
| - gTileModeName[fTileModeX],
|
| - gTileModeName[fTileModeY]);
|
| + gTileModeName[fState.fTileModeX],
|
| + gTileModeName[fState.fTileModeY]);
|
|
|
| str->append(" ");
|
| fRawBitmap.toString(str);
|
| @@ -426,8 +384,8 @@
|
| matrix.preConcat(lmInverse);
|
|
|
| SkShader::TileMode tm[] = {
|
| - (TileMode)fTileModeX,
|
| - (TileMode)fTileModeY,
|
| + (TileMode)fState.fTileModeX,
|
| + (TileMode)fState.fTileModeY,
|
| };
|
|
|
| // Must set wrap and filter on the sampler before requesting a texture. In two places below
|
|
|