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

Unified Diff: src/pdf/SkPDFShader.cpp

Issue 2151863003: SkPdf: smaller color serialization (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: SkFixed - 2016-07-15 (Friday) 15:45:32 EDT Created 4 years, 5 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/pdf/SkPDFDevice.cpp ('k') | src/pdf/SkPDFTypes.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pdf/SkPDFShader.cpp
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp
index 942fe65d2651b9705e39ddc90b221c7d0ab1b96c..37df2962803afed87160a4dc2e0f5f71e5f9a9f3 100644
--- a/src/pdf/SkPDFShader.cpp
+++ b/src/pdf/SkPDFShader.cpp
@@ -40,6 +40,9 @@ static void unitToPointsMatrix(const SkPoint pts[2], SkMatrix* matrix) {
matrix->postTranslate(pts[0].fX, pts[0].fY);
}
+static const int kColorComponents = 3;
+typedef uint8_t ColorTuple[kColorComponents];
+
/* Assumes t + startOffset is on the stack and does a linear interpolation on t
between startOffset and endOffset from prevColor to curColor (for each color
component), leaving the result in component order on the stack. It assumes
@@ -49,16 +52,16 @@ static void unitToPointsMatrix(const SkPoint pts[2], SkMatrix* matrix) {
@param prevColor[components] The previous color components.
@param result The result ps function.
*/
-static void interpolateColorCode(SkScalar range, SkScalar* curColor,
- SkScalar* prevColor,
+static void interpolateColorCode(SkScalar range, const ColorTuple& curColor,
+ const ColorTuple& prevColor,
SkDynamicMemoryWStream* result) {
SkASSERT(range != SkIntToScalar(0));
- static const int kColorComponents = 3;
// Figure out how to scale each color component.
SkScalar multiplier[kColorComponents];
for (int i = 0; i < kColorComponents; i++) {
- multiplier[i] = (curColor[i] - prevColor[i]) / range;
+ static const SkScalar kColorScale = SkScalarInvert(255);
+ multiplier[i] = kColorScale * (curColor[i] - prevColor[i]) / range;
}
// Calculate when we no longer need to keep a copy of the input parameter t.
@@ -82,7 +85,7 @@ static void interpolateColorCode(SkScalar range, SkScalar* curColor,
}
if (multiplier[i] == 0) {
- SkPDFUtils::AppendScalar(prevColor[i], result);
+ SkPDFUtils::AppendColorComponent(prevColor[i], result);
result->writeText(" ");
} else {
if (multiplier[i] != 1) {
@@ -90,7 +93,7 @@ static void interpolateColorCode(SkScalar range, SkScalar* curColor,
result->writeText(" mul ");
}
if (prevColor[i] != 0) {
- SkPDFUtils::AppendScalar(prevColor[i], result);
+ SkPDFUtils::AppendColorComponent(prevColor[i], result);
result->writeText(" add ");
}
}
@@ -122,8 +125,6 @@ static void interpolateColorCode(SkScalar range, SkScalar* curColor,
}
}
*/
-static const int kColorComponents = 3;
-typedef SkScalar ColorTuple[kColorComponents];
static void gradientFunctionCode(const SkShader::GradientInfo& info,
SkDynamicMemoryWStream* result) {
/* We want to linearly interpolate from the previous color to the next.
@@ -134,20 +135,19 @@ static void gradientFunctionCode(const SkShader::GradientInfo& info,
SkAutoSTMalloc<4, ColorTuple> colorDataAlloc(info.fColorCount);
ColorTuple *colorData = colorDataAlloc.get();
- const SkScalar scale = SkScalarInvert(SkIntToScalar(255));
for (int i = 0; i < info.fColorCount; i++) {
- colorData[i][0] = SkScalarMul(SkColorGetR(info.fColors[i]), scale);
- colorData[i][1] = SkScalarMul(SkColorGetG(info.fColors[i]), scale);
- colorData[i][2] = SkScalarMul(SkColorGetB(info.fColors[i]), scale);
+ colorData[i][0] = SkColorGetR(info.fColors[i]);
+ colorData[i][1] = SkColorGetG(info.fColors[i]);
+ colorData[i][2] = SkColorGetB(info.fColors[i]);
}
// Clamp the initial color.
result->writeText("dup 0 le {pop ");
- SkPDFUtils::AppendScalar(colorData[0][0], result);
+ SkPDFUtils::AppendColorComponent(colorData[0][0], result);
result->writeText(" ");
- SkPDFUtils::AppendScalar(colorData[0][1], result);
+ SkPDFUtils::AppendColorComponent(colorData[0][1], result);
result->writeText(" ");
- SkPDFUtils::AppendScalar(colorData[0][2], result);
+ SkPDFUtils::AppendColorComponent(colorData[0][2], result);
result->writeText(" }\n");
// The gradient colors.
@@ -173,11 +173,11 @@ static void gradientFunctionCode(const SkShader::GradientInfo& info,
// Clamp the final color.
result->writeText("{pop ");
- SkPDFUtils::AppendScalar(colorData[info.fColorCount - 1][0], result);
+ SkPDFUtils::AppendColorComponent(colorData[info.fColorCount - 1][0], result);
result->writeText(" ");
- SkPDFUtils::AppendScalar(colorData[info.fColorCount - 1][1], result);
+ SkPDFUtils::AppendColorComponent(colorData[info.fColorCount - 1][1], result);
result->writeText(" ");
- SkPDFUtils::AppendScalar(colorData[info.fColorCount - 1][2], result);
+ SkPDFUtils::AppendColorComponent(colorData[info.fColorCount - 1][2], result);
for (int i = 0 ; i < gradients + 1; i++) {
result->writeText("} ifelse\n");
@@ -189,15 +189,15 @@ static sk_sp<SkPDFDict> createInterpolationFunction(const ColorTuple& color1,
auto retval = sk_make_sp<SkPDFDict>();
auto c0 = sk_make_sp<SkPDFArray>();
- c0->appendScalar(color1[0]);
- c0->appendScalar(color1[1]);
- c0->appendScalar(color1[2]);
+ c0->appendColorComponent(color1[0]);
+ c0->appendColorComponent(color1[1]);
+ c0->appendColorComponent(color1[2]);
retval->insertObject("C0", std::move(c0));
auto c1 = sk_make_sp<SkPDFArray>();
- c1->appendScalar(color2[0]);
- c1->appendScalar(color2[1]);
- c1->appendScalar(color2[2]);
+ c1->appendColorComponent(color2[0]);
+ c1->appendColorComponent(color2[1]);
+ c1->appendColorComponent(color2[2]);
retval->insertObject("C1", std::move(c1));
auto domain = sk_make_sp<SkPDFArray>();
@@ -248,11 +248,10 @@ static sk_sp<SkPDFDict> gradientStitchCode(const SkShader::GradientInfo& info) {
SkAutoSTMalloc<4, ColorTuple> colorDataAlloc(colorCount);
ColorTuple *colorData = colorDataAlloc.get();
- const SkScalar scale = SkScalarInvert(SkIntToScalar(255));
for (int i = 0; i < colorCount; i++) {
- colorData[i][0] = SkScalarMul(SkColorGetR(colors[i]), scale);
- colorData[i][1] = SkScalarMul(SkColorGetG(colors[i]), scale);
- colorData[i][2] = SkScalarMul(SkColorGetB(colors[i]), scale);
+ colorData[i][0] = SkColorGetR(colors[i]);
+ colorData[i][1] = SkColorGetG(colors[i]);
+ colorData[i][2] = SkColorGetB(colors[i]);
}
// no need for a stitch function if there are only 2 stops.
« no previous file with comments | « src/pdf/SkPDFDevice.cpp ('k') | src/pdf/SkPDFTypes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698