OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "SkPDFShader.h" | 9 #include "SkPDFShader.h" |
10 | 10 |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 class SkPDFShader::State { | 423 class SkPDFShader::State { |
424 public: | 424 public: |
425 SkShader::GradientType fType; | 425 SkShader::GradientType fType; |
426 SkShader::GradientInfo fInfo; | 426 SkShader::GradientInfo fInfo; |
427 SkAutoFree fColorData; // This provides storage for arrays in fInfo. | 427 SkAutoFree fColorData; // This provides storage for arrays in fInfo. |
428 SkMatrix fCanvasTransform; | 428 SkMatrix fCanvasTransform; |
429 SkMatrix fShaderTransform; | 429 SkMatrix fShaderTransform; |
430 SkIRect fBBox; | 430 SkIRect fBBox; |
431 | 431 |
432 SkBitmap fImage; | 432 SkBitmap fImage; |
433 uint32_t fPixelGeneration; | 433 SkBitmapKey fBitmapKey; |
434 SkShader::TileMode fImageTileModes[2]; | 434 SkShader::TileMode fImageTileModes[2]; |
435 | 435 |
436 State(SkShader* shader, const SkMatrix& canvasTransform, | 436 State(SkShader* shader, const SkMatrix& canvasTransform, |
437 const SkIRect& bbox, SkScalar rasterScale); | 437 const SkIRect& bbox, SkScalar rasterScale); |
438 | 438 |
439 bool operator==(const State& b) const; | 439 bool operator==(const State& b) const; |
440 | 440 |
441 SkPDFShader::State* CreateAlphaToLuminosityState() const; | 441 SkPDFShader::State* CreateAlphaToLuminosityState() const; |
442 SkPDFShader::State* CreateOpaqueState() const; | 442 SkPDFShader::State* CreateOpaqueState() const; |
443 | 443 |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 | 1039 |
1040 bool SkPDFShader::State::operator==(const SkPDFShader::State& b) const { | 1040 bool SkPDFShader::State::operator==(const SkPDFShader::State& b) const { |
1041 if (fType != b.fType || | 1041 if (fType != b.fType || |
1042 fCanvasTransform != b.fCanvasTransform || | 1042 fCanvasTransform != b.fCanvasTransform || |
1043 fShaderTransform != b.fShaderTransform || | 1043 fShaderTransform != b.fShaderTransform || |
1044 fBBox != b.fBBox) { | 1044 fBBox != b.fBBox) { |
1045 return false; | 1045 return false; |
1046 } | 1046 } |
1047 | 1047 |
1048 if (fType == SkShader::kNone_GradientType) { | 1048 if (fType == SkShader::kNone_GradientType) { |
1049 if (fPixelGeneration != b.fPixelGeneration || | 1049 if (fBitmapKey != b.fBitmapKey || |
1050 fPixelGeneration == 0 || | 1050 fBitmapKey.id() == 0 || |
1051 fImageTileModes[0] != b.fImageTileModes[0] || | 1051 fImageTileModes[0] != b.fImageTileModes[0] || |
1052 fImageTileModes[1] != b.fImageTileModes[1]) { | 1052 fImageTileModes[1] != b.fImageTileModes[1]) { |
1053 return false; | 1053 return false; |
1054 } | 1054 } |
1055 } else { | 1055 } else { |
1056 if (fInfo.fColorCount != b.fInfo.fColorCount || | 1056 if (fInfo.fColorCount != b.fInfo.fColorCount || |
1057 memcmp(fInfo.fColors, b.fInfo.fColors, | 1057 memcmp(fInfo.fColors, b.fInfo.fColors, |
1058 sizeof(SkColor) * fInfo.fColorCount) != 0 || | 1058 sizeof(SkColor) * fInfo.fColorCount) != 0 || |
1059 memcmp(fInfo.fColorOffsets, b.fInfo.fColorOffsets, | 1059 memcmp(fInfo.fColorOffsets, b.fInfo.fColorOffsets, |
1060 sizeof(SkScalar) * fInfo.fColorCount) != 0 || | 1060 sizeof(SkScalar) * fInfo.fColorCount) != 0 || |
(...skipping 25 matching lines...) Expand all Loading... |
1086 case SkShader::kColor_GradientType: | 1086 case SkShader::kColor_GradientType: |
1087 break; | 1087 break; |
1088 } | 1088 } |
1089 } | 1089 } |
1090 return true; | 1090 return true; |
1091 } | 1091 } |
1092 | 1092 |
1093 SkPDFShader::State::State(SkShader* shader, const SkMatrix& canvasTransform, | 1093 SkPDFShader::State::State(SkShader* shader, const SkMatrix& canvasTransform, |
1094 const SkIRect& bbox, SkScalar rasterScale) | 1094 const SkIRect& bbox, SkScalar rasterScale) |
1095 : fCanvasTransform(canvasTransform), | 1095 : fCanvasTransform(canvasTransform), |
1096 fBBox(bbox), | 1096 fBBox(bbox) { |
1097 fPixelGeneration(0) { | |
1098 fInfo.fColorCount = 0; | 1097 fInfo.fColorCount = 0; |
1099 fInfo.fColors = nullptr; | 1098 fInfo.fColors = nullptr; |
1100 fInfo.fColorOffsets = nullptr; | 1099 fInfo.fColorOffsets = nullptr; |
1101 fShaderTransform = shader->getLocalMatrix(); | 1100 fShaderTransform = shader->getLocalMatrix(); |
1102 fImageTileModes[0] = fImageTileModes[1] = SkShader::kClamp_TileMode; | 1101 fImageTileModes[0] = fImageTileModes[1] = SkShader::kClamp_TileMode; |
1103 | 1102 |
1104 fType = shader->asAGradient(&fInfo); | 1103 fType = shader->asAGradient(&fInfo); |
1105 | 1104 |
1106 if (fType == SkShader::kNone_GradientType) { | 1105 if (fType == SkShader::kNone_GradientType) { |
1107 SkMatrix matrix; | 1106 SkMatrix matrix; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1141 p.setShader(sk_ref_sp(shader)); | 1140 p.setShader(sk_ref_sp(shader)); |
1142 | 1141 |
1143 SkCanvas canvas(fImage); | 1142 SkCanvas canvas(fImage); |
1144 canvas.scale(scale.width(), scale.height()); | 1143 canvas.scale(scale.width(), scale.height()); |
1145 canvas.translate(-shaderRect.x(), -shaderRect.y()); | 1144 canvas.translate(-shaderRect.x(), -shaderRect.y()); |
1146 canvas.drawPaint(p); | 1145 canvas.drawPaint(p); |
1147 | 1146 |
1148 fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y()); | 1147 fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y()); |
1149 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); | 1148 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); |
1150 } | 1149 } |
1151 fPixelGeneration = fImage.getGenerationID(); | 1150 fBitmapKey = SkBitmapKey(fImage); |
1152 } else { | 1151 } else { |
1153 AllocateGradientInfoStorage(); | 1152 AllocateGradientInfoStorage(); |
1154 shader->asAGradient(&fInfo); | 1153 shader->asAGradient(&fInfo); |
1155 } | 1154 } |
1156 } | 1155 } |
1157 | 1156 |
1158 SkPDFShader::State::State(const SkPDFShader::State& other) | 1157 SkPDFShader::State::State(const SkPDFShader::State& other) |
1159 : fType(other.fType), | 1158 : fType(other.fType), |
1160 fCanvasTransform(other.fCanvasTransform), | 1159 fCanvasTransform(other.fCanvasTransform), |
1161 fShaderTransform(other.fShaderTransform), | 1160 fShaderTransform(other.fShaderTransform), |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1226 return false; | 1225 return false; |
1227 } | 1226 } |
1228 | 1227 |
1229 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1228 void SkPDFShader::State::AllocateGradientInfoStorage() { |
1230 fColorData.set(sk_malloc_throw( | 1229 fColorData.set(sk_malloc_throw( |
1231 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1230 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
1232 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1231 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
1233 fInfo.fColorOffsets = | 1232 fInfo.fColorOffsets = |
1234 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1233 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
1235 } | 1234 } |
OLD | NEW |