Chromium Code Reviews| 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 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1008 canvas.drawBitmap(*image, 0, 0); | 1008 canvas.drawBitmap(*image, 0, 0); |
| 1009 | 1009 |
| 1010 SkScalar width = SkIntToScalar(image->width()); | 1010 SkScalar width = SkIntToScalar(image->width()); |
| 1011 SkScalar height = SkIntToScalar(image->height()); | 1011 SkScalar height = SkIntToScalar(image->height()); |
| 1012 | 1012 |
| 1013 // Tiling is implied. First we handle mirroring. | 1013 // Tiling is implied. First we handle mirroring. |
| 1014 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1014 if (tileModes[0] == SkShader::kMirror_TileMode) { |
| 1015 SkMatrix xMirror; | 1015 SkMatrix xMirror; |
| 1016 xMirror.setScale(-1, 1); | 1016 xMirror.setScale(-1, 1); |
| 1017 xMirror.postTranslate(2 * width, 0); | 1017 xMirror.postTranslate(2 * width, 0); |
| 1018 canvas.drawBitmapMatrix(*image, xMirror); | 1018 |
|
mtklein
2014/12/10 14:48:09
Seems like this file uses drawBitmapMatrix often e
f(malita)
2014/12/10 15:33:56
Done.
| |
| 1019 SkAutoCanvasRestore acr(&canvas, true); | |
| 1020 canvas.concat(xMirror); | |
| 1021 canvas.drawBitmap(*image, 0, 0); | |
| 1022 | |
| 1019 patternBBox.fRight += width; | 1023 patternBBox.fRight += width; |
| 1020 } | 1024 } |
| 1021 if (tileModes[1] == SkShader::kMirror_TileMode) { | 1025 if (tileModes[1] == SkShader::kMirror_TileMode) { |
| 1022 SkMatrix yMirror; | 1026 SkMatrix yMirror; |
| 1023 yMirror.setScale(SK_Scalar1, -SK_Scalar1); | 1027 yMirror.setScale(SK_Scalar1, -SK_Scalar1); |
| 1024 yMirror.postTranslate(0, 2 * height); | 1028 yMirror.postTranslate(0, 2 * height); |
| 1025 canvas.drawBitmapMatrix(*image, yMirror); | 1029 |
| 1030 SkAutoCanvasRestore acr(&canvas, true); | |
| 1031 canvas.concat(yMirror); | |
| 1032 canvas.drawBitmap(*image, 0, 0); | |
| 1033 | |
| 1026 patternBBox.fBottom += height; | 1034 patternBBox.fBottom += height; |
| 1027 } | 1035 } |
| 1028 if (tileModes[0] == SkShader::kMirror_TileMode && | 1036 if (tileModes[0] == SkShader::kMirror_TileMode && |
| 1029 tileModes[1] == SkShader::kMirror_TileMode) { | 1037 tileModes[1] == SkShader::kMirror_TileMode) { |
| 1030 SkMatrix mirror; | 1038 SkMatrix mirror; |
| 1031 mirror.setScale(-1, -1); | 1039 mirror.setScale(-1, -1); |
| 1032 mirror.postTranslate(2 * width, 2 * height); | 1040 mirror.postTranslate(2 * width, 2 * height); |
| 1033 canvas.drawBitmapMatrix(*image, mirror); | 1041 |
| 1042 SkAutoCanvasRestore acr(&canvas, true); | |
| 1043 canvas.concat(mirror); | |
| 1044 canvas.drawBitmap(*image, 0, 0); | |
| 1034 } | 1045 } |
| 1035 | 1046 |
| 1036 // Then handle Clamping, which requires expanding the pattern canvas to | 1047 // Then handle Clamping, which requires expanding the pattern canvas to |
| 1037 // cover the entire surfaceBBox. | 1048 // cover the entire surfaceBBox. |
| 1038 | 1049 |
| 1039 // If both x and y are in clamp mode, we start by filling in the corners. | 1050 // 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.) | 1051 // (Which are just a rectangles of the corner colors.) |
| 1041 if (tileModes[0] == SkShader::kClamp_TileMode && | 1052 if (tileModes[0] == SkShader::kClamp_TileMode && |
| 1042 tileModes[1] == SkShader::kClamp_TileMode) { | 1053 tileModes[1] == SkShader::kClamp_TileMode) { |
| 1043 SkPaint paint; | 1054 SkPaint paint; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1074 // Then expand the left, right, top, then bottom. | 1085 // Then expand the left, right, top, then bottom. |
| 1075 if (tileModes[0] == SkShader::kClamp_TileMode) { | 1086 if (tileModes[0] == SkShader::kClamp_TileMode) { |
| 1076 SkIRect subset = SkIRect::MakeXYWH(0, 0, 1, image->height()); | 1087 SkIRect subset = SkIRect::MakeXYWH(0, 0, 1, image->height()); |
| 1077 if (deviceBounds.left() < 0) { | 1088 if (deviceBounds.left() < 0) { |
| 1078 SkBitmap left; | 1089 SkBitmap left; |
| 1079 SkAssertResult(image->extractSubset(&left, subset)); | 1090 SkAssertResult(image->extractSubset(&left, subset)); |
| 1080 | 1091 |
| 1081 SkMatrix leftMatrix; | 1092 SkMatrix leftMatrix; |
| 1082 leftMatrix.setScale(-deviceBounds.left(), 1); | 1093 leftMatrix.setScale(-deviceBounds.left(), 1); |
| 1083 leftMatrix.postTranslate(deviceBounds.left(), 0); | 1094 leftMatrix.postTranslate(deviceBounds.left(), 0); |
| 1084 canvas.drawBitmapMatrix(left, leftMatrix); | 1095 |
| 1096 { | |
| 1097 SkAutoCanvasRestore acr(&canvas, true); | |
| 1098 canvas.concat(leftMatrix); | |
| 1099 canvas.drawBitmap(left, 0, 0); | |
| 1100 } | |
| 1085 | 1101 |
| 1086 if (tileModes[1] == SkShader::kMirror_TileMode) { | 1102 if (tileModes[1] == SkShader::kMirror_TileMode) { |
| 1087 leftMatrix.postScale(SK_Scalar1, -SK_Scalar1); | 1103 leftMatrix.postScale(SK_Scalar1, -SK_Scalar1); |
| 1088 leftMatrix.postTranslate(0, 2 * height); | 1104 leftMatrix.postTranslate(0, 2 * height); |
| 1089 canvas.drawBitmapMatrix(left, leftMatrix); | 1105 |
| 1106 SkAutoCanvasRestore acr(&canvas, true); | |
| 1107 canvas.concat(leftMatrix); | |
| 1108 canvas.drawBitmap(left, 0, 0); | |
| 1090 } | 1109 } |
| 1091 patternBBox.fLeft = 0; | 1110 patternBBox.fLeft = 0; |
| 1092 } | 1111 } |
| 1093 | 1112 |
| 1094 if (deviceBounds.right() > width) { | 1113 if (deviceBounds.right() > width) { |
| 1095 SkBitmap right; | 1114 SkBitmap right; |
| 1096 subset.offset(image->width() - 1, 0); | 1115 subset.offset(image->width() - 1, 0); |
| 1097 SkAssertResult(image->extractSubset(&right, subset)); | 1116 SkAssertResult(image->extractSubset(&right, subset)); |
| 1098 | 1117 |
| 1099 SkMatrix rightMatrix; | 1118 SkMatrix rightMatrix; |
| 1100 rightMatrix.setScale(deviceBounds.right() - width, 1); | 1119 rightMatrix.setScale(deviceBounds.right() - width, 1); |
| 1101 rightMatrix.postTranslate(width, 0); | 1120 rightMatrix.postTranslate(width, 0); |
| 1102 canvas.drawBitmapMatrix(right, rightMatrix); | 1121 |
| 1122 { | |
| 1123 SkAutoCanvasRestore acr(&canvas, true); | |
| 1124 canvas.concat(rightMatrix); | |
| 1125 canvas.drawBitmap(right, 0, 0); | |
| 1126 } | |
| 1103 | 1127 |
| 1104 if (tileModes[1] == SkShader::kMirror_TileMode) { | 1128 if (tileModes[1] == SkShader::kMirror_TileMode) { |
| 1105 rightMatrix.postScale(SK_Scalar1, -SK_Scalar1); | 1129 rightMatrix.postScale(SK_Scalar1, -SK_Scalar1); |
| 1106 rightMatrix.postTranslate(0, 2 * height); | 1130 rightMatrix.postTranslate(0, 2 * height); |
| 1107 canvas.drawBitmapMatrix(right, rightMatrix); | 1131 |
| 1132 SkAutoCanvasRestore acr(&canvas, true); | |
| 1133 canvas.concat(rightMatrix); | |
| 1134 canvas.drawBitmap(right, 0, 0); | |
| 1108 } | 1135 } |
| 1109 patternBBox.fRight = deviceBounds.width(); | 1136 patternBBox.fRight = deviceBounds.width(); |
| 1110 } | 1137 } |
| 1111 } | 1138 } |
| 1112 | 1139 |
| 1113 if (tileModes[1] == SkShader::kClamp_TileMode) { | 1140 if (tileModes[1] == SkShader::kClamp_TileMode) { |
| 1114 SkIRect subset = SkIRect::MakeXYWH(0, 0, image->width(), 1); | 1141 SkIRect subset = SkIRect::MakeXYWH(0, 0, image->width(), 1); |
| 1115 if (deviceBounds.top() < 0) { | 1142 if (deviceBounds.top() < 0) { |
| 1116 SkBitmap top; | 1143 SkBitmap top; |
| 1117 SkAssertResult(image->extractSubset(&top, subset)); | 1144 SkAssertResult(image->extractSubset(&top, subset)); |
| 1118 | 1145 |
| 1119 SkMatrix topMatrix; | 1146 SkMatrix topMatrix; |
| 1120 topMatrix.setScale(SK_Scalar1, -deviceBounds.top()); | 1147 topMatrix.setScale(SK_Scalar1, -deviceBounds.top()); |
| 1121 topMatrix.postTranslate(0, deviceBounds.top()); | 1148 topMatrix.postTranslate(0, deviceBounds.top()); |
| 1122 canvas.drawBitmapMatrix(top, topMatrix); | 1149 |
| 1150 { | |
| 1151 SkAutoCanvasRestore acr(&canvas, true); | |
| 1152 canvas.concat(topMatrix); | |
| 1153 canvas.drawBitmap(top, 0, 0); | |
| 1154 } | |
| 1123 | 1155 |
| 1124 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1156 if (tileModes[0] == SkShader::kMirror_TileMode) { |
| 1125 topMatrix.postScale(-1, 1); | 1157 topMatrix.postScale(-1, 1); |
| 1126 topMatrix.postTranslate(2 * width, 0); | 1158 topMatrix.postTranslate(2 * width, 0); |
| 1127 canvas.drawBitmapMatrix(top, topMatrix); | 1159 |
| 1160 SkAutoCanvasRestore acr(&canvas, true); | |
| 1161 canvas.concat(topMatrix); | |
| 1162 canvas.drawBitmap(top, 0, 0); | |
| 1128 } | 1163 } |
| 1129 patternBBox.fTop = 0; | 1164 patternBBox.fTop = 0; |
| 1130 } | 1165 } |
| 1131 | 1166 |
| 1132 if (deviceBounds.bottom() > height) { | 1167 if (deviceBounds.bottom() > height) { |
| 1133 SkBitmap bottom; | 1168 SkBitmap bottom; |
| 1134 subset.offset(0, image->height() - 1); | 1169 subset.offset(0, image->height() - 1); |
| 1135 SkAssertResult(image->extractSubset(&bottom, subset)); | 1170 SkAssertResult(image->extractSubset(&bottom, subset)); |
| 1136 | 1171 |
| 1137 SkMatrix bottomMatrix; | 1172 SkMatrix bottomMatrix; |
| 1138 bottomMatrix.setScale(SK_Scalar1, deviceBounds.bottom() - height); | 1173 bottomMatrix.setScale(SK_Scalar1, deviceBounds.bottom() - height); |
| 1139 bottomMatrix.postTranslate(0, height); | 1174 bottomMatrix.postTranslate(0, height); |
| 1140 canvas.drawBitmapMatrix(bottom, bottomMatrix); | 1175 |
| 1176 { | |
| 1177 SkAutoCanvasRestore acr(&canvas, true); | |
| 1178 canvas.concat(bottomMatrix); | |
| 1179 canvas.drawBitmap(bottom, 0, 0); | |
| 1180 } | |
| 1141 | 1181 |
| 1142 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1182 if (tileModes[0] == SkShader::kMirror_TileMode) { |
| 1143 bottomMatrix.postScale(-1, 1); | 1183 bottomMatrix.postScale(-1, 1); |
| 1144 bottomMatrix.postTranslate(2 * width, 0); | 1184 bottomMatrix.postTranslate(2 * width, 0); |
| 1145 canvas.drawBitmapMatrix(bottom, bottomMatrix); | 1185 |
| 1186 SkAutoCanvasRestore acr(&canvas, true); | |
| 1187 canvas.concat(bottomMatrix); | |
| 1188 canvas.drawBitmap(bottom, 0, 0); | |
| 1146 } | 1189 } |
| 1147 patternBBox.fBottom = deviceBounds.height(); | 1190 patternBBox.fBottom = deviceBounds.height(); |
| 1148 } | 1191 } |
| 1149 } | 1192 } |
| 1150 | 1193 |
| 1151 // Put the canvas into the pattern stream (fContent). | 1194 // Put the canvas into the pattern stream (fContent). |
| 1152 SkAutoTUnref<SkStream> content(pattern.content()); | 1195 SkAutoTUnref<SkStream> content(pattern.content()); |
| 1153 setData(content.get()); | 1196 setData(content.get()); |
| 1154 SkPDFResourceDict* resourceDict = pattern.getResourceDict(); | 1197 SkPDFResourceDict* resourceDict = pattern.getResourceDict(); |
| 1155 resourceDict->getReferencedResources(fResources, &fResources, false); | 1198 resourceDict->getReferencedResources(fResources, &fResources, false); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 return false; | 1376 return false; |
| 1334 } | 1377 } |
| 1335 | 1378 |
| 1336 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1379 void SkPDFShader::State::AllocateGradientInfoStorage() { |
| 1337 fColorData.set(sk_malloc_throw( | 1380 fColorData.set(sk_malloc_throw( |
| 1338 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1381 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
| 1339 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1382 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
| 1340 fInfo.fColorOffsets = | 1383 fInfo.fColorOffsets = |
| 1341 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1384 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
| 1342 } | 1385 } |
| OLD | NEW |