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

Unified Diff: src/core/SkShader.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 | « src/core/SkComposeShader.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkShader.cpp
diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp
index bebfc59912f51310b9305ca578959387bbed2816..bc3eb081620be8cb428821175e992bf2123c3b65 100644
--- a/src/core/SkShader.cpp
+++ b/src/core/SkShader.cpp
@@ -42,30 +42,50 @@ void SkShader::flatten(SkWriteBuffer& buffer) const {
}
}
-bool SkShader::setContext(const SkBitmap& device,
- const SkPaint& paint,
- const SkMatrix& matrix) {
+SkShader::Context::Context(const SkMatrix& matrix, uint8_t paintAlpha,
+ SkBitmap::Config deviceConfig)
+ : fTotalInverse(matrix)
+ , fPaintAlpha(paintAlpha)
+ , fDeviceConfig(SkToU8(deviceConfig))
+ , fTotalInverseClass((uint8_t) ComputeMatrixClass(fTotalInverse))
+ , fExtraStorage(NULL)
+{
+ // debugcode...
+ fStorageAllocated = false;
+}
+
+SkShader::Context* SkShader::setContext(const SkBitmap& device,
+ const SkPaint& paint,
+ const SkMatrix& matrix) {
SkASSERT(!this->setContextHasBeenCalled());
const SkMatrix* m = &matrix;
SkMatrix total;
- fDeviceConfig = SkToU8(device.config());
- fPaintAlpha = paint.getAlpha();
+ // FIXME: Store localMatrix on paint.
if (this->hasLocalMatrix()) {
total.setConcat(matrix, this->getLocalMatrix());
m = &total;
}
- if (m->invert(&fTotalInverse)) {
- fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse);
+ SkMatrix totalInverse;
+ if (m->invert(&totalInverse)) {
+ Context* context = SkNEW_ARGS(Context, (totalInverse, paint.getAlpha(), device.config()));
+ // Initialize the subclass storage space.
+ context->reset(this);
+ // Now call into subclasses.
+ if (!this->onSetContext(context, device, paint, matrix)) {
+ SkDELETE(context);
+ return NULL;
+ }
SkDEBUGCODE(fInSetContext = true;)
- return true;
+ return context;
}
- return false;
+ return NULL;
}
-void SkShader::endContext() {
+void SkShader::endContext(Context* c) {
SkASSERT(fInSetContext);
+ SkDELETE(c);
SkDEBUGCODE(fInSetContext = false;)
}
@@ -75,7 +95,7 @@ SkShader::ShadeProc SkShader::asAShadeProc(void** ctx) {
#include "SkColorPriv.h"
-void SkShader::shadeSpan16(int x, int y, uint16_t span16[], int count) {
+void SkShader::shadeSpan16(Context* c, int x, int y, uint16_t span16[], int count) {
SkASSERT(span16);
SkASSERT(count > 0);
SkASSERT(this->canCallShadeSpan16());
@@ -93,13 +113,13 @@ void SkShader::shadeSpan16(int x, int y, uint16_t span16[], int count) {
#define SkU32BitShiftToByteOffset(shift) ((shift) >> 3)
#endif
-void SkShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
+void SkShader::shadeSpanAlpha(Context* context, int x, int y, uint8_t alpha[], int count) {
SkASSERT(count > 0);
SkPMColor colors[kTempColorCount];
while ((count -= kTempColorCount) >= 0) {
- this->shadeSpan(x, y, colors, kTempColorCount);
+ this->shadeSpan(context, x, y, colors, kTempColorCount);
x += kTempColorCount;
const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT);
@@ -119,7 +139,7 @@ void SkShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
SkASSERT(count < 0);
SkASSERT(count + kTempColorCount >= 0);
if (count += kTempColorCount) {
- this->shadeSpan(x, y, colors, count);
+ this->shadeSpan(context, x, y, colors, count);
const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT);
do {
@@ -237,13 +257,13 @@ uint32_t SkColorShader::getFlags() {
return fFlags;
}
-uint8_t SkColorShader::getSpan16Alpha() const {
+uint8_t SkColorShader::getSpan16Alpha(Context* c) const {
return SkGetPackedA32(fPMColor);
}
-bool SkColorShader::setContext(const SkBitmap& device, const SkPaint& paint,
- const SkMatrix& matrix) {
- if (!this->INHERITED::setContext(device, paint, matrix)) {
+bool SkColorShader::onSetContext(Context* context, const SkBitmap& device,
+ const SkPaint& paint, const SkMatrix& matrix) {
+ if (!this->INHERITED::onSetContext(context, device, paint, matrix)) {
return false;
}
@@ -281,15 +301,15 @@ bool SkColorShader::setContext(const SkBitmap& device, const SkPaint& paint,
return true;
}
-void SkColorShader::shadeSpan(int x, int y, SkPMColor span[], int count) {
+void SkColorShader::shadeSpan(Context* c, int x, int y, SkPMColor span[], int count) {
sk_memset32(span, fPMColor, count);
}
-void SkColorShader::shadeSpan16(int x, int y, uint16_t span[], int count) {
+void SkColorShader::shadeSpan16(Context* c, int x, int y, uint16_t span[], int count) {
sk_memset16(span, fColor16, count);
}
-void SkColorShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
+void SkColorShader::shadeSpanAlpha(Context* c, int x, int y, uint8_t alpha[], int count) {
memset(alpha, SkGetPackedA32(fPMColor), count);
}
@@ -332,20 +352,20 @@ void SkColorShader::toString(SkString* str) const {
#include "SkEmptyShader.h"
uint32_t SkEmptyShader::getFlags() { return 0; }
-uint8_t SkEmptyShader::getSpan16Alpha() const { return 0; }
+uint8_t SkEmptyShader::getSpan16Alpha(Context* c) const { return 0; }
-bool SkEmptyShader::setContext(const SkBitmap&, const SkPaint&,
- const SkMatrix&) { return false; }
+bool SkEmptyShader::onSetContext(Context*, const SkBitmap&, const SkPaint&,
+ const SkMatrix&) { return false; }
-void SkEmptyShader::shadeSpan(int x, int y, SkPMColor span[], int count) {
+void SkEmptyShader::shadeSpan(Context *c, int x, int y, SkPMColor span[], int count) {
SkDEBUGFAIL("should never get called, since setContext() returned false");
}
-void SkEmptyShader::shadeSpan16(int x, int y, uint16_t span[], int count) {
+void SkEmptyShader::shadeSpan16(Context *c, int x, int y, uint16_t span[], int count) {
SkDEBUGFAIL("should never get called, since setContext() returned false");
}
-void SkEmptyShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
+void SkEmptyShader::shadeSpanAlpha(Context *c, int x, int y, uint8_t alpha[], int count) {
SkDEBUGFAIL("should never get called, since setContext() returned false");
}
« no previous file with comments | « src/core/SkComposeShader.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698