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 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1212 if (fType == SkShader::kNone_GradientType) { | 1212 if (fType == SkShader::kNone_GradientType) { |
| 1213 SkShader::BitmapType bitmapType; | 1213 SkShader::BitmapType bitmapType; |
| 1214 SkMatrix matrix; | 1214 SkMatrix matrix; |
| 1215 bitmapType = shader.asABitmap(&fImage, &matrix, fImageTileModes); | 1215 bitmapType = shader.asABitmap(&fImage, &matrix, fImageTileModes); |
| 1216 if (bitmapType != SkShader::kDefault_BitmapType) { | 1216 if (bitmapType != SkShader::kDefault_BitmapType) { |
| 1217 // Generic fallback for unsupported shaders: | 1217 // Generic fallback for unsupported shaders: |
| 1218 // * allocate a bbox-sized bitmap | 1218 // * allocate a bbox-sized bitmap |
| 1219 // * shade the whole area | 1219 // * shade the whole area |
| 1220 // * use the result as a bitmap shader | 1220 // * use the result as a bitmap shader |
| 1221 | 1221 |
| 1222 // bbox is in device space. While that's exactly what we want for si zing our bitmap, | |
| 1223 // we need to map it into shader space for adjustments (to match | |
| 1224 // SkPDFImageShader::Create's behavior). | |
| 1225 SkRect shaderRect = SkRect::Make(bbox); | |
|
robertphillips
2015/02/12 21:12:59
inverse_transform_bbox ?
f(malita)
2015/02/12 21:28:33
Done.
| |
| 1226 if (!inverseTransformBBox(canvasTransform, &shaderRect)) { | |
| 1227 fImage.reset(); | |
| 1228 return; | |
| 1229 } | |
| 1230 | |
| 1222 // Clamp the bitmap size to about 1M pixels | 1231 // Clamp the bitmap size to about 1M pixels |
| 1223 static const SkScalar kMaxBitmapArea = 1024 * 1024; | 1232 static const SkScalar kMaxBitmapArea = 1024 * 1024; |
| 1224 SkScalar bitmapArea = rasterScale * bbox.width() * rasterScale * bbo x.height(); | 1233 SkScalar bitmapArea = rasterScale * bbox.width() * rasterScale * bbo x.height(); |
| 1225 if (bitmapArea > kMaxBitmapArea) { | 1234 if (bitmapArea > kMaxBitmapArea) { |
| 1226 rasterScale *= SkScalarSqrt(SkScalarDiv(kMaxBitmapArea, bitmapAr ea)); | 1235 rasterScale *= SkScalarSqrt(SkScalarDiv(kMaxBitmapArea, bitmapAr ea)); |
| 1227 } | 1236 } |
| 1228 | 1237 |
| 1229 SkISize size = SkISize::Make(SkScalarRoundToInt(rasterScale * bbox.w idth()), | 1238 SkISize size = SkISize::Make(SkScalarRoundToInt(rasterScale * bbox.w idth()), |
| 1230 SkScalarRoundToInt(rasterScale * bbox.h eight())); | 1239 SkScalarRoundToInt(rasterScale * bbox.h eight())); |
| 1231 SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / SkIntToSca lar(bbox.width()), | 1240 SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / shaderRect .width(), |
| 1232 SkIntToScalar(size.height()) / SkIntToSc alar(bbox.height())); | 1241 SkIntToScalar(size.height()) / shaderRec t.height()); |
| 1233 | 1242 |
| 1234 fImage.allocN32Pixels(size.width(), size.height()); | 1243 fImage.allocN32Pixels(size.width(), size.height()); |
| 1235 fImage.eraseColor(SK_ColorTRANSPARENT); | 1244 fImage.eraseColor(SK_ColorTRANSPARENT); |
| 1236 | 1245 |
| 1237 SkPaint p; | 1246 SkPaint p; |
| 1238 p.setShader(const_cast<SkShader*>(&shader)); | 1247 p.setShader(const_cast<SkShader*>(&shader)); |
| 1239 | 1248 |
| 1240 SkCanvas canvas(fImage); | 1249 SkCanvas canvas(fImage); |
| 1241 canvas.scale(scale.width(), scale.height()); | 1250 canvas.scale(scale.width(), scale.height()); |
| 1242 canvas.translate(-SkIntToScalar(bbox.x()), -SkIntToScalar(bbox.y())) ; | 1251 canvas.translate(-shaderRect.x(), -shaderRect.y()); |
| 1243 canvas.drawPaint(p); | 1252 canvas.drawPaint(p); |
| 1244 | 1253 |
| 1245 fShaderTransform.setTranslate(SkIntToScalar(bbox.x()), SkIntToScalar (bbox.y())); | 1254 fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y()); |
| 1246 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); | 1255 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); |
| 1247 } else { | 1256 } else { |
| 1248 SkASSERT(matrix.isIdentity()); | 1257 SkASSERT(matrix.isIdentity()); |
| 1249 } | 1258 } |
| 1250 fPixelGeneration = fImage.getGenerationID(); | 1259 fPixelGeneration = fImage.getGenerationID(); |
| 1251 } else { | 1260 } else { |
| 1252 AllocateGradientInfoStorage(); | 1261 AllocateGradientInfoStorage(); |
| 1253 shader.asAGradient(&fInfo); | 1262 shader.asAGradient(&fInfo); |
| 1254 } | 1263 } |
| 1255 } | 1264 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1325 return false; | 1334 return false; |
| 1326 } | 1335 } |
| 1327 | 1336 |
| 1328 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1337 void SkPDFShader::State::AllocateGradientInfoStorage() { |
| 1329 fColorData.set(sk_malloc_throw( | 1338 fColorData.set(sk_malloc_throw( |
| 1330 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1339 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
| 1331 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1340 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
| 1332 fInfo.fColorOffsets = | 1341 fInfo.fColorOffsets = |
| 1333 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1342 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
| 1334 } | 1343 } |
| OLD | NEW |