Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2137)

Unified Diff: src/core/SkBlitter.cpp

Issue 160103002: Work in progress to make SkShader immutable. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/core/SkShader.h ('k') | src/core/SkBlitter_ARGB32.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkBlitter.cpp
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
index 31a3edea769a3f68de7e4978a2e8d36bfb870c49..1786d30f2b1628d4fa86f1a40583c8f0ac19b537 100644
--- a/src/core/SkBlitter.cpp
+++ b/src/core/SkBlitter.cpp
@@ -577,15 +577,13 @@ public:
void setMask(const SkMask* mask) { fMask = mask; }
- virtual bool setContext(const SkBitmap& device, const SkPaint& paint,
- const SkMatrix& matrix) SK_OVERRIDE {
- if (!this->INHERITED::setContext(device, paint, matrix)) {
+ virtual bool onSetContext(Context* c, const SkBitmap& device, const SkPaint& paint,
+ const SkMatrix& matrix) SK_OVERRIDE {
+ if (!this->INHERITED::onSetContext(c, device, paint, matrix)) {
return false;
}
if (fProxy) {
- if (!fProxy->setContext(device, paint, matrix)) {
- // must keep our set/end context calls balanced
- this->INHERITED::endContext();
+ if (!fProxy->onSetContext(c, device, paint, matrix)) {
return false;
}
} else {
@@ -601,9 +599,9 @@ public:
this->INHERITED::endContext();
}
- virtual void shadeSpan(int x, int y, SkPMColor span[], int count) SK_OVERRIDE {
+ virtual void shadeSpan(Context* c, int x, int y, SkPMColor span[], int count) SK_OVERRIDE {
if (fProxy) {
- fProxy->shadeSpan(x, y, span, count);
+ fProxy->shadeSpan(c, x, y, span, count);
}
if (fMask == NULL) {
@@ -703,6 +701,8 @@ private:
typedef SkShader INHERITED;
};
+// Remember, this class is going to hang onto another blitter. I think it's okay for
+// him to just let that blitter handle the Context.
class Sk3DBlitter : public SkBlitter {
public:
Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader, void (*killProc)(void*))
@@ -939,9 +939,13 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
* The endContext() call is made by the blitter (assuming setContext did
* not fail) in its destructor.
*/
- if (shader && !shader->setContext(device, *paint, matrix)) {
- SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
- return blitter;
+ SkShader::Context* context = NULL;
+ if (shader) {
+ context = shader->setContext(device, *paint, matrix);
+ if (!context) {
+ SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
+ return blitter;
+ }
}
@@ -949,12 +953,16 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
case SkBitmap::kA8_Config:
if (drawCoverage) {
SkASSERT(NULL == shader);
+ SkASSERT(NULL == context);
SkASSERT(NULL == paint->getXfermode());
SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter,
storage, storageSize, (device, *paint));
} else if (shader) {
+ // I've just made the blitters slightly larger. Make sure they're still
+ // small enough to fit in storage
+ SkASSERT(sizeof(SkA8_Shader_Blitter) <= storageSize);
SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter,
- storage, storageSize, (device, *paint));
+ storage, storageSize, (device, *paint, context));
} else {
SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter,
storage, storageSize, (device, *paint));
@@ -962,13 +970,14 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
break;
case SkBitmap::kRGB_565_Config:
- blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize);
+ blitter = SkBlitter_ChooseD565(device, *paint, context, storage, storageSize);
break;
case SkBitmap::kARGB_8888_Config:
if (shader) {
+ SkASSERT(sizeof(SkARGB32_Shader_Blitter) <= storageSize);
SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Shader_Blitter,
- storage, storageSize, (device, *paint));
+ storage, storageSize, (device, *paint, context));
} else if (paint->getColor() == SK_ColorBLACK) {
SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter,
storage, storageSize, (device, *paint));
@@ -1004,7 +1013,8 @@ const uint32_t gMask_00FF00FF = 0xFF00FF;
///////////////////////////////////////////////////////////////////////////////
-SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint)
+SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint,
+ SkShader::Context* context)
: INHERITED(device) {
fShader = paint.getShader();
SkASSERT(fShader);
@@ -1012,10 +1022,13 @@ SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint)
fShader->ref();
fShaderFlags = fShader->getFlags();
+
+ fContext = context;
+ SkASSERT(fContext);
}
SkShaderBlitter::~SkShaderBlitter() {
SkASSERT(fShader->setContextHasBeenCalled());
- fShader->endContext();
+ fShader->endContext(fContext);
fShader->unref();
}
« no previous file with comments | « include/core/SkShader.h ('k') | src/core/SkBlitter_ARGB32.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698