| 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 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 | 462 |
| 463 static SkString sweepCode(const SkShader::GradientInfo& info, | 463 static SkString sweepCode(const SkShader::GradientInfo& info, |
| 464 const SkMatrix& perspectiveRemover) { | 464 const SkMatrix& perspectiveRemover) { |
| 465 SkString function("{exch atan 360 div\n"); | 465 SkString function("{exch atan 360 div\n"); |
| 466 tileModeCode(info.fTileMode, &function); | 466 tileModeCode(info.fTileMode, &function); |
| 467 gradientFunctionCode(info, &function); | 467 gradientFunctionCode(info, &function); |
| 468 function.append("}"); | 468 function.append("}"); |
| 469 return function; | 469 return function; |
| 470 } | 470 } |
| 471 | 471 |
| 472 static void drawBitmapMatrix(SkCanvas* canvas, const SkBitmap& bm, const SkMatri
x& matrix) { |
| 473 SkAutoCanvasRestore acr(canvas, true); |
| 474 canvas->concat(matrix); |
| 475 canvas->drawBitmap(bm, 0, 0); |
| 476 } |
| 477 |
| 472 class SkPDFShader::State { | 478 class SkPDFShader::State { |
| 473 public: | 479 public: |
| 474 SkShader::GradientType fType; | 480 SkShader::GradientType fType; |
| 475 SkShader::GradientInfo fInfo; | 481 SkShader::GradientInfo fInfo; |
| 476 SkAutoFree fColorData; // This provides storage for arrays in fInfo. | 482 SkAutoFree fColorData; // This provides storage for arrays in fInfo. |
| 477 SkMatrix fCanvasTransform; | 483 SkMatrix fCanvasTransform; |
| 478 SkMatrix fShaderTransform; | 484 SkMatrix fShaderTransform; |
| 479 SkIRect fBBox; | 485 SkIRect fBBox; |
| 480 | 486 |
| 481 SkBitmap fImage; | 487 SkBitmap fImage; |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 canvas.drawBitmap(*image, 0, 0); | 1014 canvas.drawBitmap(*image, 0, 0); |
| 1009 | 1015 |
| 1010 SkScalar width = SkIntToScalar(image->width()); | 1016 SkScalar width = SkIntToScalar(image->width()); |
| 1011 SkScalar height = SkIntToScalar(image->height()); | 1017 SkScalar height = SkIntToScalar(image->height()); |
| 1012 | 1018 |
| 1013 // Tiling is implied. First we handle mirroring. | 1019 // Tiling is implied. First we handle mirroring. |
| 1014 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1020 if (tileModes[0] == SkShader::kMirror_TileMode) { |
| 1015 SkMatrix xMirror; | 1021 SkMatrix xMirror; |
| 1016 xMirror.setScale(-1, 1); | 1022 xMirror.setScale(-1, 1); |
| 1017 xMirror.postTranslate(2 * width, 0); | 1023 xMirror.postTranslate(2 * width, 0); |
| 1018 canvas.drawBitmapMatrix(*image, xMirror); | 1024 drawBitmapMatrix(&canvas, *image, xMirror); |
| 1019 patternBBox.fRight += width; | 1025 patternBBox.fRight += width; |
| 1020 } | 1026 } |
| 1021 if (tileModes[1] == SkShader::kMirror_TileMode) { | 1027 if (tileModes[1] == SkShader::kMirror_TileMode) { |
| 1022 SkMatrix yMirror; | 1028 SkMatrix yMirror; |
| 1023 yMirror.setScale(SK_Scalar1, -SK_Scalar1); | 1029 yMirror.setScale(SK_Scalar1, -SK_Scalar1); |
| 1024 yMirror.postTranslate(0, 2 * height); | 1030 yMirror.postTranslate(0, 2 * height); |
| 1025 canvas.drawBitmapMatrix(*image, yMirror); | 1031 drawBitmapMatrix(&canvas, *image, yMirror); |
| 1026 patternBBox.fBottom += height; | 1032 patternBBox.fBottom += height; |
| 1027 } | 1033 } |
| 1028 if (tileModes[0] == SkShader::kMirror_TileMode && | 1034 if (tileModes[0] == SkShader::kMirror_TileMode && |
| 1029 tileModes[1] == SkShader::kMirror_TileMode) { | 1035 tileModes[1] == SkShader::kMirror_TileMode) { |
| 1030 SkMatrix mirror; | 1036 SkMatrix mirror; |
| 1031 mirror.setScale(-1, -1); | 1037 mirror.setScale(-1, -1); |
| 1032 mirror.postTranslate(2 * width, 2 * height); | 1038 mirror.postTranslate(2 * width, 2 * height); |
| 1033 canvas.drawBitmapMatrix(*image, mirror); | 1039 drawBitmapMatrix(&canvas, *image, mirror); |
| 1034 } | 1040 } |
| 1035 | 1041 |
| 1036 // Then handle Clamping, which requires expanding the pattern canvas to | 1042 // Then handle Clamping, which requires expanding the pattern canvas to |
| 1037 // cover the entire surfaceBBox. | 1043 // cover the entire surfaceBBox. |
| 1038 | 1044 |
| 1039 // If both x and y are in clamp mode, we start by filling in the corners. | 1045 // If both x and y are in clamp mode, we start by filling in the corners. |
| 1040 // (Which are just a rectangles of the corner colors.) | 1046 // (Which are just a rectangles of the corner colors.) |
| 1041 if (tileModes[0] == SkShader::kClamp_TileMode && | 1047 if (tileModes[0] == SkShader::kClamp_TileMode && |
| 1042 tileModes[1] == SkShader::kClamp_TileMode) { | 1048 tileModes[1] == SkShader::kClamp_TileMode) { |
| 1043 SkPaint paint; | 1049 SkPaint paint; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1074 // Then expand the left, right, top, then bottom. | 1080 // Then expand the left, right, top, then bottom. |
| 1075 if (tileModes[0] == SkShader::kClamp_TileMode) { | 1081 if (tileModes[0] == SkShader::kClamp_TileMode) { |
| 1076 SkIRect subset = SkIRect::MakeXYWH(0, 0, 1, image->height()); | 1082 SkIRect subset = SkIRect::MakeXYWH(0, 0, 1, image->height()); |
| 1077 if (deviceBounds.left() < 0) { | 1083 if (deviceBounds.left() < 0) { |
| 1078 SkBitmap left; | 1084 SkBitmap left; |
| 1079 SkAssertResult(image->extractSubset(&left, subset)); | 1085 SkAssertResult(image->extractSubset(&left, subset)); |
| 1080 | 1086 |
| 1081 SkMatrix leftMatrix; | 1087 SkMatrix leftMatrix; |
| 1082 leftMatrix.setScale(-deviceBounds.left(), 1); | 1088 leftMatrix.setScale(-deviceBounds.left(), 1); |
| 1083 leftMatrix.postTranslate(deviceBounds.left(), 0); | 1089 leftMatrix.postTranslate(deviceBounds.left(), 0); |
| 1084 canvas.drawBitmapMatrix(left, leftMatrix); | 1090 drawBitmapMatrix(&canvas, left, leftMatrix); |
| 1085 | 1091 |
| 1086 if (tileModes[1] == SkShader::kMirror_TileMode) { | 1092 if (tileModes[1] == SkShader::kMirror_TileMode) { |
| 1087 leftMatrix.postScale(SK_Scalar1, -SK_Scalar1); | 1093 leftMatrix.postScale(SK_Scalar1, -SK_Scalar1); |
| 1088 leftMatrix.postTranslate(0, 2 * height); | 1094 leftMatrix.postTranslate(0, 2 * height); |
| 1089 canvas.drawBitmapMatrix(left, leftMatrix); | 1095 drawBitmapMatrix(&canvas, left, leftMatrix); |
| 1090 } | 1096 } |
| 1091 patternBBox.fLeft = 0; | 1097 patternBBox.fLeft = 0; |
| 1092 } | 1098 } |
| 1093 | 1099 |
| 1094 if (deviceBounds.right() > width) { | 1100 if (deviceBounds.right() > width) { |
| 1095 SkBitmap right; | 1101 SkBitmap right; |
| 1096 subset.offset(image->width() - 1, 0); | 1102 subset.offset(image->width() - 1, 0); |
| 1097 SkAssertResult(image->extractSubset(&right, subset)); | 1103 SkAssertResult(image->extractSubset(&right, subset)); |
| 1098 | 1104 |
| 1099 SkMatrix rightMatrix; | 1105 SkMatrix rightMatrix; |
| 1100 rightMatrix.setScale(deviceBounds.right() - width, 1); | 1106 rightMatrix.setScale(deviceBounds.right() - width, 1); |
| 1101 rightMatrix.postTranslate(width, 0); | 1107 rightMatrix.postTranslate(width, 0); |
| 1102 canvas.drawBitmapMatrix(right, rightMatrix); | 1108 drawBitmapMatrix(&canvas, right, rightMatrix); |
| 1103 | 1109 |
| 1104 if (tileModes[1] == SkShader::kMirror_TileMode) { | 1110 if (tileModes[1] == SkShader::kMirror_TileMode) { |
| 1105 rightMatrix.postScale(SK_Scalar1, -SK_Scalar1); | 1111 rightMatrix.postScale(SK_Scalar1, -SK_Scalar1); |
| 1106 rightMatrix.postTranslate(0, 2 * height); | 1112 rightMatrix.postTranslate(0, 2 * height); |
| 1107 canvas.drawBitmapMatrix(right, rightMatrix); | 1113 drawBitmapMatrix(&canvas, right, rightMatrix); |
| 1108 } | 1114 } |
| 1109 patternBBox.fRight = deviceBounds.width(); | 1115 patternBBox.fRight = deviceBounds.width(); |
| 1110 } | 1116 } |
| 1111 } | 1117 } |
| 1112 | 1118 |
| 1113 if (tileModes[1] == SkShader::kClamp_TileMode) { | 1119 if (tileModes[1] == SkShader::kClamp_TileMode) { |
| 1114 SkIRect subset = SkIRect::MakeXYWH(0, 0, image->width(), 1); | 1120 SkIRect subset = SkIRect::MakeXYWH(0, 0, image->width(), 1); |
| 1115 if (deviceBounds.top() < 0) { | 1121 if (deviceBounds.top() < 0) { |
| 1116 SkBitmap top; | 1122 SkBitmap top; |
| 1117 SkAssertResult(image->extractSubset(&top, subset)); | 1123 SkAssertResult(image->extractSubset(&top, subset)); |
| 1118 | 1124 |
| 1119 SkMatrix topMatrix; | 1125 SkMatrix topMatrix; |
| 1120 topMatrix.setScale(SK_Scalar1, -deviceBounds.top()); | 1126 topMatrix.setScale(SK_Scalar1, -deviceBounds.top()); |
| 1121 topMatrix.postTranslate(0, deviceBounds.top()); | 1127 topMatrix.postTranslate(0, deviceBounds.top()); |
| 1122 canvas.drawBitmapMatrix(top, topMatrix); | 1128 drawBitmapMatrix(&canvas, top, topMatrix); |
| 1123 | 1129 |
| 1124 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1130 if (tileModes[0] == SkShader::kMirror_TileMode) { |
| 1125 topMatrix.postScale(-1, 1); | 1131 topMatrix.postScale(-1, 1); |
| 1126 topMatrix.postTranslate(2 * width, 0); | 1132 topMatrix.postTranslate(2 * width, 0); |
| 1127 canvas.drawBitmapMatrix(top, topMatrix); | 1133 drawBitmapMatrix(&canvas, top, topMatrix); |
| 1128 } | 1134 } |
| 1129 patternBBox.fTop = 0; | 1135 patternBBox.fTop = 0; |
| 1130 } | 1136 } |
| 1131 | 1137 |
| 1132 if (deviceBounds.bottom() > height) { | 1138 if (deviceBounds.bottom() > height) { |
| 1133 SkBitmap bottom; | 1139 SkBitmap bottom; |
| 1134 subset.offset(0, image->height() - 1); | 1140 subset.offset(0, image->height() - 1); |
| 1135 SkAssertResult(image->extractSubset(&bottom, subset)); | 1141 SkAssertResult(image->extractSubset(&bottom, subset)); |
| 1136 | 1142 |
| 1137 SkMatrix bottomMatrix; | 1143 SkMatrix bottomMatrix; |
| 1138 bottomMatrix.setScale(SK_Scalar1, deviceBounds.bottom() - height); | 1144 bottomMatrix.setScale(SK_Scalar1, deviceBounds.bottom() - height); |
| 1139 bottomMatrix.postTranslate(0, height); | 1145 bottomMatrix.postTranslate(0, height); |
| 1140 canvas.drawBitmapMatrix(bottom, bottomMatrix); | 1146 drawBitmapMatrix(&canvas, bottom, bottomMatrix); |
| 1141 | 1147 |
| 1142 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1148 if (tileModes[0] == SkShader::kMirror_TileMode) { |
| 1143 bottomMatrix.postScale(-1, 1); | 1149 bottomMatrix.postScale(-1, 1); |
| 1144 bottomMatrix.postTranslate(2 * width, 0); | 1150 bottomMatrix.postTranslate(2 * width, 0); |
| 1145 canvas.drawBitmapMatrix(bottom, bottomMatrix); | 1151 drawBitmapMatrix(&canvas, bottom, bottomMatrix); |
| 1146 } | 1152 } |
| 1147 patternBBox.fBottom = deviceBounds.height(); | 1153 patternBBox.fBottom = deviceBounds.height(); |
| 1148 } | 1154 } |
| 1149 } | 1155 } |
| 1150 | 1156 |
| 1151 // Put the canvas into the pattern stream (fContent). | 1157 // Put the canvas into the pattern stream (fContent). |
| 1152 SkAutoTUnref<SkStream> content(pattern.content()); | 1158 SkAutoTUnref<SkStream> content(pattern.content()); |
| 1153 setData(content.get()); | 1159 setData(content.get()); |
| 1154 SkPDFResourceDict* resourceDict = pattern.getResourceDict(); | 1160 SkPDFResourceDict* resourceDict = pattern.getResourceDict(); |
| 1155 resourceDict->getReferencedResources(fResources, &fResources, false); | 1161 resourceDict->getReferencedResources(fResources, &fResources, false); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 return false; | 1339 return false; |
| 1334 } | 1340 } |
| 1335 | 1341 |
| 1336 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1342 void SkPDFShader::State::AllocateGradientInfoStorage() { |
| 1337 fColorData.set(sk_malloc_throw( | 1343 fColorData.set(sk_malloc_throw( |
| 1338 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1344 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
| 1339 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1345 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
| 1340 fInfo.fColorOffsets = | 1346 fInfo.fColorOffsets = |
| 1341 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1347 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
| 1342 } | 1348 } |
| OLD | NEW |