OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkPDFShader.h" | 10 #include "SkPDFShader.h" |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 SkShader::GradientInfo fInfo; | 427 SkShader::GradientInfo fInfo; |
428 SkAutoFree fColorData; // This provides storage for arrays in fInfo. | 428 SkAutoFree fColorData; // This provides storage for arrays in fInfo. |
429 SkMatrix fCanvasTransform; | 429 SkMatrix fCanvasTransform; |
430 SkMatrix fShaderTransform; | 430 SkMatrix fShaderTransform; |
431 SkIRect fBBox; | 431 SkIRect fBBox; |
432 | 432 |
433 SkBitmap fImage; | 433 SkBitmap fImage; |
434 uint32_t fPixelGeneration; | 434 uint32_t fPixelGeneration; |
435 SkShader::TileMode fImageTileModes[2]; | 435 SkShader::TileMode fImageTileModes[2]; |
436 | 436 |
437 State(const SkShader& shader, const SkMatrix& canvasTransform, | 437 State(SkShader* shader, const SkMatrix& canvasTransform, |
tomhudson
2016/03/25 14:28:07
Changing PDF to raw pointers instead of sk_sp<>?
reed1
2016/03/25 15:04:31
There are lots of changes we could do internally t
tomhudson
2016/03/25 15:39:50
Acknowledged.
| |
438 const SkIRect& bbox, SkScalar rasterScale); | 438 const SkIRect& bbox, SkScalar rasterScale); |
439 | 439 |
440 bool operator==(const State& b) const; | 440 bool operator==(const State& b) const; |
441 | 441 |
442 SkPDFShader::State* CreateAlphaToLuminosityState() const; | 442 SkPDFShader::State* CreateAlphaToLuminosityState() const; |
443 SkPDFShader::State* CreateOpaqueState() const; | 443 SkPDFShader::State* CreateOpaqueState() const; |
444 | 444 |
445 bool GradientHasAlpha() const; | 445 bool GradientHasAlpha() const; |
446 | 446 |
447 private: | 447 private: |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
508 } else { | 508 } else { |
509 SkPDFObject* shader = canon->findFunctionShader(state); | 509 SkPDFObject* shader = canon->findFunctionShader(state); |
510 return shader ? SkRef(shader) | 510 return shader ? SkRef(shader) |
511 : SkPDFFunctionShader::Create(canon, autoState); | 511 : SkPDFFunctionShader::Create(canon, autoState); |
512 } | 512 } |
513 } | 513 } |
514 | 514 |
515 // static | 515 // static |
516 SkPDFObject* SkPDFShader::GetPDFShader(SkPDFDocument* doc, | 516 SkPDFObject* SkPDFShader::GetPDFShader(SkPDFDocument* doc, |
517 SkScalar dpi, | 517 SkScalar dpi, |
518 const SkShader& shader, | 518 SkShader* shader, |
519 const SkMatrix& matrix, | 519 const SkMatrix& matrix, |
520 const SkIRect& surfaceBBox, | 520 const SkIRect& surfaceBBox, |
521 SkScalar rasterScale) { | 521 SkScalar rasterScale) { |
522 SkAutoTDelete<SkPDFShader::State> state(new State(shader, matrix, surfaceBBo x, rasterScale)); | 522 SkAutoTDelete<SkPDFShader::State> state(new State(shader, matrix, surfaceBBo x, rasterScale)); |
523 return get_pdf_shader_by_state(doc, dpi, &state); | 523 return get_pdf_shader_by_state(doc, dpi, &state); |
524 } | 524 } |
525 | 525 |
526 static sk_sp<SkPDFDict> get_gradient_resource_dict( | 526 static sk_sp<SkPDFDict> get_gradient_resource_dict( |
527 SkPDFObject* functionShader, | 527 SkPDFObject* functionShader, |
528 SkPDFObject* gState) { | 528 SkPDFObject* gState) { |
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1082 break; | 1082 break; |
1083 case SkShader::kSweep_GradientType: | 1083 case SkShader::kSweep_GradientType: |
1084 case SkShader::kNone_GradientType: | 1084 case SkShader::kNone_GradientType: |
1085 case SkShader::kColor_GradientType: | 1085 case SkShader::kColor_GradientType: |
1086 break; | 1086 break; |
1087 } | 1087 } |
1088 } | 1088 } |
1089 return true; | 1089 return true; |
1090 } | 1090 } |
1091 | 1091 |
1092 SkPDFShader::State::State(const SkShader& shader, const SkMatrix& canvasTransfor m, | 1092 SkPDFShader::State::State(SkShader* shader, const SkMatrix& canvasTransform, |
1093 const SkIRect& bbox, SkScalar rasterScale) | 1093 const SkIRect& bbox, SkScalar rasterScale) |
1094 : fCanvasTransform(canvasTransform), | 1094 : fCanvasTransform(canvasTransform), |
1095 fBBox(bbox), | 1095 fBBox(bbox), |
1096 fPixelGeneration(0) { | 1096 fPixelGeneration(0) { |
1097 fInfo.fColorCount = 0; | 1097 fInfo.fColorCount = 0; |
1098 fInfo.fColors = nullptr; | 1098 fInfo.fColors = nullptr; |
1099 fInfo.fColorOffsets = nullptr; | 1099 fInfo.fColorOffsets = nullptr; |
1100 fShaderTransform = shader.getLocalMatrix(); | 1100 fShaderTransform = shader->getLocalMatrix(); |
1101 fImageTileModes[0] = fImageTileModes[1] = SkShader::kClamp_TileMode; | 1101 fImageTileModes[0] = fImageTileModes[1] = SkShader::kClamp_TileMode; |
1102 | 1102 |
1103 fType = shader.asAGradient(&fInfo); | 1103 fType = shader->asAGradient(&fInfo); |
1104 | 1104 |
1105 if (fType == SkShader::kNone_GradientType) { | 1105 if (fType == SkShader::kNone_GradientType) { |
1106 SkMatrix matrix; | 1106 SkMatrix matrix; |
1107 if (shader.isABitmap(&fImage, &matrix, fImageTileModes)) { | 1107 if (shader->isABitmap(&fImage, &matrix, fImageTileModes)) { |
1108 SkASSERT(matrix.isIdentity()); | 1108 SkASSERT(matrix.isIdentity()); |
1109 } else { | 1109 } else { |
1110 // Generic fallback for unsupported shaders: | 1110 // Generic fallback for unsupported shaders: |
1111 // * allocate a bbox-sized bitmap | 1111 // * allocate a bbox-sized bitmap |
1112 // * shade the whole area | 1112 // * shade the whole area |
1113 // * use the result as a bitmap shader | 1113 // * use the result as a bitmap shader |
1114 | 1114 |
1115 // bbox is in device space. While that's exactly what we want for si zing our bitmap, | 1115 // bbox is in device space. While that's exactly what we want for si zing our bitmap, |
1116 // we need to map it into shader space for adjustments (to match | 1116 // we need to map it into shader space for adjustments (to match |
1117 // SkPDFImageShader::Create's behavior). | 1117 // SkPDFImageShader::Create's behavior). |
(...skipping 12 matching lines...) Expand all Loading... | |
1130 | 1130 |
1131 SkISize size = SkISize::Make(SkScalarRoundToInt(rasterScale * bbox.w idth()), | 1131 SkISize size = SkISize::Make(SkScalarRoundToInt(rasterScale * bbox.w idth()), |
1132 SkScalarRoundToInt(rasterScale * bbox.h eight())); | 1132 SkScalarRoundToInt(rasterScale * bbox.h eight())); |
1133 SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / shaderRect .width(), | 1133 SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / shaderRect .width(), |
1134 SkIntToScalar(size.height()) / shaderRec t.height()); | 1134 SkIntToScalar(size.height()) / shaderRec t.height()); |
1135 | 1135 |
1136 fImage.allocN32Pixels(size.width(), size.height()); | 1136 fImage.allocN32Pixels(size.width(), size.height()); |
1137 fImage.eraseColor(SK_ColorTRANSPARENT); | 1137 fImage.eraseColor(SK_ColorTRANSPARENT); |
1138 | 1138 |
1139 SkPaint p; | 1139 SkPaint p; |
1140 p.setShader(const_cast<SkShader*>(&shader)); | 1140 p.setShader(sk_ref_sp(shader)); |
1141 | 1141 |
1142 SkCanvas canvas(fImage); | 1142 SkCanvas canvas(fImage); |
1143 canvas.scale(scale.width(), scale.height()); | 1143 canvas.scale(scale.width(), scale.height()); |
1144 canvas.translate(-shaderRect.x(), -shaderRect.y()); | 1144 canvas.translate(-shaderRect.x(), -shaderRect.y()); |
1145 canvas.drawPaint(p); | 1145 canvas.drawPaint(p); |
1146 | 1146 |
1147 fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y()); | 1147 fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y()); |
1148 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); | 1148 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); |
1149 } | 1149 } |
1150 fPixelGeneration = fImage.getGenerationID(); | 1150 fPixelGeneration = fImage.getGenerationID(); |
1151 } else { | 1151 } else { |
1152 AllocateGradientInfoStorage(); | 1152 AllocateGradientInfoStorage(); |
1153 shader.asAGradient(&fInfo); | 1153 shader->asAGradient(&fInfo); |
1154 } | 1154 } |
1155 } | 1155 } |
1156 | 1156 |
1157 SkPDFShader::State::State(const SkPDFShader::State& other) | 1157 SkPDFShader::State::State(const SkPDFShader::State& other) |
1158 : fType(other.fType), | 1158 : fType(other.fType), |
1159 fCanvasTransform(other.fCanvasTransform), | 1159 fCanvasTransform(other.fCanvasTransform), |
1160 fShaderTransform(other.fShaderTransform), | 1160 fShaderTransform(other.fShaderTransform), |
1161 fBBox(other.fBBox) | 1161 fBBox(other.fBBox) |
1162 { | 1162 { |
1163 // Only gradients supported for now, since that is all that is used. | 1163 // Only gradients supported for now, since that is all that is used. |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1225 return false; | 1225 return false; |
1226 } | 1226 } |
1227 | 1227 |
1228 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1228 void SkPDFShader::State::AllocateGradientInfoStorage() { |
1229 fColorData.set(sk_malloc_throw( | 1229 fColorData.set(sk_malloc_throw( |
1230 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1230 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
1231 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1231 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
1232 fInfo.fColorOffsets = | 1232 fInfo.fColorOffsets = |
1233 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1233 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
1234 } | 1234 } |
OLD | NEW |