diff options
author | reed <reed@google.com> | 2014-09-10 10:20:24 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-10 10:20:24 -0700 |
commit | cc0e3110bde60201882a2c512a5cdd73c838f351 (patch) | |
tree | 88b3a026fb8d6a38da6b63c853e2ae8a4f4db0df /src | |
parent | d0af38793e4c4598eac7b4fd2e1db39692dcbfb1 (diff) |
make set3DMask virtual, so we can safely notify the shadercontext
also boost preallocated storage to account for this combo of bitmapshader + emboss + colorfilter
BUG=skia:
R=djsollen@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/563563002
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkBitmapProcShader.h | 2 | ||||
-rw-r--r-- | src/core/SkBlitter.cpp | 20 | ||||
-rw-r--r-- | src/core/SkFilterShader.h | 5 |
3 files changed, 16 insertions, 11 deletions
diff --git a/src/core/SkBitmapProcShader.h b/src/core/SkBitmapProcShader.h index d445f56f14..d293c50303 100644 --- a/src/core/SkBitmapProcShader.h +++ b/src/core/SkBitmapProcShader.h @@ -73,7 +73,7 @@ private: // an Sk3DBlitter in SkDraw.cpp // Note that some contexts may contain other contexts (e.g. for compose shaders), but we've not // yet found a situation where the size below isn't big enough. -typedef SkSmallAllocator<3, 768> SkTBlitterAllocator; +typedef SkSmallAllocator<3, 1024> SkTBlitterAllocator; // If alloc is non-NULL, it will be used to allocate the returned SkShader, and MUST outlive // the SkShader. diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp index b9e9917891..f4669d5959 100644 --- a/src/core/SkBlitter.cpp +++ b/src/core/SkBlitter.cpp @@ -620,7 +620,7 @@ public: } } - void setMask(const SkMask* mask) { fMask = mask; } + virtual void set3DMask(const SkMask* mask) SK_OVERRIDE { fMask = mask; } virtual void shadeSpan(int x, int y, SkPMColor span[], int count) SK_OVERRIDE { if (fProxyContext) { @@ -740,9 +740,9 @@ SkFlattenable* Sk3DShader::CreateProc(SkReadBuffer& buffer) { class Sk3DBlitter : public SkBlitter { public: - Sk3DBlitter(SkBlitter* proxy, Sk3DShader::Sk3DShaderContext* shaderContext) + Sk3DBlitter(SkBlitter* proxy, SkShader::Context* shaderContext) : fProxy(proxy) - , f3DShaderContext(shaderContext) + , fShaderContext(shaderContext) {} virtual void blitH(int x, int y, int width) { @@ -764,13 +764,13 @@ public: virtual void blitMask(const SkMask& mask, const SkIRect& clip) { if (mask.fFormat == SkMask::k3D_Format) { - f3DShaderContext->setMask(&mask); + fShaderContext->set3DMask(&mask); ((SkMask*)&mask)->fFormat = SkMask::kA8_Format; fProxy->blitMask(mask, clip); ((SkMask*)&mask)->fFormat = SkMask::k3D_Format; - f3DShaderContext->setMask(NULL); + fShaderContext->set3DMask(NULL); } else { fProxy->blitMask(mask, clip); } @@ -778,8 +778,8 @@ public: private: // Both pointers are unowned. They will be deleted by SkSmallAllocator. - SkBlitter* fProxy; - Sk3DShader::Sk3DShaderContext* f3DShaderContext; + SkBlitter* fProxy; + SkShader::Context* fShaderContext; }; /////////////////////////////////////////////////////////////////////////////// @@ -987,9 +987,9 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, if (shader3D) { SkBlitter* innerBlitter = blitter; // innerBlitter was allocated by allocator, which will delete it. - // We know shaderContext is of type Sk3DShaderContext because it belongs to shader3D. - blitter = allocator->createT<Sk3DBlitter>(innerBlitter, - static_cast<Sk3DShader::Sk3DShaderContext*>(shaderContext)); + // We know shaderContext or its proxies is of type Sk3DShaderContext, so we need to + // wrapper the blitter to notify it when we see an emboss mask. + blitter = allocator->createT<Sk3DBlitter>(innerBlitter, shaderContext); } return blitter; } diff --git a/src/core/SkFilterShader.h b/src/core/SkFilterShader.h index 2ff6cdaf63..b98fc839a6 100644 --- a/src/core/SkFilterShader.h +++ b/src/core/SkFilterShader.h @@ -30,6 +30,11 @@ public: virtual void shadeSpan(int x, int y, SkPMColor[], int count) SK_OVERRIDE; virtual void shadeSpan16(int x, int y, uint16_t[], int count) SK_OVERRIDE; + virtual void set3DMask(const SkMask* mask) SK_OVERRIDE { + // forward to our proxy + fShaderContext->set3DMask(mask); + } + private: SkShader::Context* fShaderContext; |