aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2014-09-10 10:20:24 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-09-10 10:20:24 -0700
commitcc0e3110bde60201882a2c512a5cdd73c838f351 (patch)
tree88b3a026fb8d6a38da6b63c853e2ae8a4f4db0df /src
parentd0af38793e4c4598eac7b4fd2e1db39692dcbfb1 (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.h2
-rw-r--r--src/core/SkBlitter.cpp20
-rw-r--r--src/core/SkFilterShader.h5
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;