Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(444)

Side by Side Diff: src/pdf/SkPDFShader.cpp

Issue 841763005: Generic PDF shader fallback (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: win build fix Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pdf/SkPDFShader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 SkAutoFree fColorData; // This provides storage for arrays in fInfo. 482 SkAutoFree fColorData; // This provides storage for arrays in fInfo.
483 SkMatrix fCanvasTransform; 483 SkMatrix fCanvasTransform;
484 SkMatrix fShaderTransform; 484 SkMatrix fShaderTransform;
485 SkIRect fBBox; 485 SkIRect fBBox;
486 486
487 SkBitmap fImage; 487 SkBitmap fImage;
488 uint32_t fPixelGeneration; 488 uint32_t fPixelGeneration;
489 SkShader::TileMode fImageTileModes[2]; 489 SkShader::TileMode fImageTileModes[2];
490 490
491 State(const SkShader& shader, const SkMatrix& canvasTransform, 491 State(const SkShader& shader, const SkMatrix& canvasTransform,
492 const SkIRect& bbox); 492 const SkIRect& bbox, SkScalar rasterScale);
493 493
494 bool operator==(const State& b) const; 494 bool operator==(const State& b) const;
495 495
496 SkPDFShader::State* CreateAlphaToLuminosityState() const; 496 SkPDFShader::State* CreateAlphaToLuminosityState() const;
497 SkPDFShader::State* CreateOpaqueState() const; 497 SkPDFShader::State* CreateOpaqueState() const;
498 498
499 bool GradientHasAlpha() const; 499 bool GradientHasAlpha() const;
500 500
501 private: 501 private:
502 State(const State& other); 502 State(const State& other);
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 SkAutoMutexAcquire lock(CanonicalShadersMutex()); 650 SkAutoMutexAcquire lock(CanonicalShadersMutex());
651 ShaderCanonicalEntry entry(shader, NULL); 651 ShaderCanonicalEntry entry(shader, NULL);
652 int index = CanonicalShaders().find(entry); 652 int index = CanonicalShaders().find(entry);
653 SkASSERT(index >= 0); 653 SkASSERT(index >= 0);
654 CanonicalShaders().removeShuffle(index); 654 CanonicalShaders().removeShuffle(index);
655 } 655 }
656 656
657 // static 657 // static
658 SkPDFObject* SkPDFShader::GetPDFShader(const SkShader& shader, 658 SkPDFObject* SkPDFShader::GetPDFShader(const SkShader& shader,
659 const SkMatrix& matrix, 659 const SkMatrix& matrix,
660 const SkIRect& surfaceBBox) { 660 const SkIRect& surfaceBBox,
661 SkScalar rasterScale) {
661 SkAutoMutexAcquire lock(CanonicalShadersMutex()); 662 SkAutoMutexAcquire lock(CanonicalShadersMutex());
662 return GetPDFShaderByState( 663 return GetPDFShaderByState(
663 SkNEW_ARGS(State, (shader, matrix, surfaceBBox))); 664 SkNEW_ARGS(State, (shader, matrix, surfaceBBox, rasterScale)));
664 } 665 }
665 666
666 // static 667 // static
667 SkTDArray<SkPDFShader::ShaderCanonicalEntry>& SkPDFShader::CanonicalShaders() { 668 SkTDArray<SkPDFShader::ShaderCanonicalEntry>& SkPDFShader::CanonicalShaders() {
668 SkPDFShader::CanonicalShadersMutex().assertHeld(); 669 SkPDFShader::CanonicalShadersMutex().assertHeld();
669 static SkTDArray<ShaderCanonicalEntry> gCanonicalShaders; 670 static SkTDArray<ShaderCanonicalEntry> gCanonicalShaders;
670 return gCanonicalShaders; 671 return gCanonicalShaders;
671 } 672 }
672 673
673 SK_DECLARE_STATIC_MUTEX(gCanonicalShadersMutex); 674 SK_DECLARE_STATIC_MUTEX(gCanonicalShadersMutex);
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1232 break; 1233 break;
1233 case SkShader::kSweep_GradientType: 1234 case SkShader::kSweep_GradientType:
1234 case SkShader::kNone_GradientType: 1235 case SkShader::kNone_GradientType:
1235 case SkShader::kColor_GradientType: 1236 case SkShader::kColor_GradientType:
1236 break; 1237 break;
1237 } 1238 }
1238 } 1239 }
1239 return true; 1240 return true;
1240 } 1241 }
1241 1242
1242 SkPDFShader::State::State(const SkShader& shader, 1243 SkPDFShader::State::State(const SkShader& shader, const SkMatrix& canvasTransfor m,
1243 const SkMatrix& canvasTransform, const SkIRect& bbox) 1244 const SkIRect& bbox, SkScalar rasterScale)
1244 : fCanvasTransform(canvasTransform), 1245 : fCanvasTransform(canvasTransform),
1245 fBBox(bbox), 1246 fBBox(bbox),
1246 fPixelGeneration(0) { 1247 fPixelGeneration(0) {
1247 fInfo.fColorCount = 0; 1248 fInfo.fColorCount = 0;
1248 fInfo.fColors = NULL; 1249 fInfo.fColors = NULL;
1249 fInfo.fColorOffsets = NULL; 1250 fInfo.fColorOffsets = NULL;
1250 fShaderTransform = shader.getLocalMatrix(); 1251 fShaderTransform = shader.getLocalMatrix();
1251 fImageTileModes[0] = fImageTileModes[1] = SkShader::kClamp_TileMode; 1252 fImageTileModes[0] = fImageTileModes[1] = SkShader::kClamp_TileMode;
1252 1253
1253 fType = shader.asAGradient(&fInfo); 1254 fType = shader.asAGradient(&fInfo);
1254 1255
1255 if (fType == SkShader::kNone_GradientType) { 1256 if (fType == SkShader::kNone_GradientType) {
1256 SkShader::BitmapType bitmapType; 1257 SkShader::BitmapType bitmapType;
1257 SkMatrix matrix; 1258 SkMatrix matrix;
1258 bitmapType = shader.asABitmap(&fImage, &matrix, fImageTileModes); 1259 bitmapType = shader.asABitmap(&fImage, &matrix, fImageTileModes);
1259 if (bitmapType != SkShader::kDefault_BitmapType) { 1260 if (bitmapType != SkShader::kDefault_BitmapType) {
1260 fImage.reset(); 1261 // Generic fallback for unsupported shaders:
1261 return; 1262 // * allocate a bbox-sized bitmap
1263 // * shade the whole area
1264 // * use the result as a bitmap shader
1265
1266 // Clamp the bitmap size to about 1M pixels
1267 static const SkScalar kMaxBitmapArea = 1024 * 1024;
1268 SkScalar bitmapArea = rasterScale * bbox.width() * rasterScale * bbo x.height();
1269 if (bitmapArea > kMaxBitmapArea) {
1270 rasterScale *= SkScalarSqrt(SkScalarDiv(kMaxBitmapArea, bitmapAr ea));
1271 }
1272
1273 SkISize size = SkISize::Make(SkScalarRoundToInt(rasterScale * bbox.w idth()),
1274 SkScalarRoundToInt(rasterScale * bbox.h eight()));
1275 SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / SkIntToSca lar(bbox.width()),
1276 SkIntToScalar(size.height()) / SkIntToSc alar(bbox.height()));
1277
1278 fImage.allocN32Pixels(size.width(), size.height());
1279 fImage.eraseColor(SK_ColorTRANSPARENT);
1280
1281 SkPaint p;
1282 p.setShader(const_cast<SkShader*>(&shader));
1283
1284 SkCanvas canvas(fImage);
1285 canvas.scale(scale.width(), scale.height());
1286 canvas.translate(-SkIntToScalar(bbox.x()), -SkIntToScalar(bbox.y())) ;
1287 canvas.drawPaint(p);
1288
1289 fShaderTransform.setTranslate(SkIntToScalar(bbox.x()), SkIntToScalar (bbox.y()));
1290 fShaderTransform.preScale(1 / scale.width(), 1 / scale.height());
1291 } else {
1292 SkASSERT(matrix.isIdentity());
1262 } 1293 }
1263 SkASSERT(matrix.isIdentity());
1264 fPixelGeneration = fImage.getGenerationID(); 1294 fPixelGeneration = fImage.getGenerationID();
1265 } else { 1295 } else {
1266 AllocateGradientInfoStorage(); 1296 AllocateGradientInfoStorage();
1267 shader.asAGradient(&fInfo); 1297 shader.asAGradient(&fInfo);
1268 } 1298 }
1269 } 1299 }
1270 1300
1271 SkPDFShader::State::State(const SkPDFShader::State& other) 1301 SkPDFShader::State::State(const SkPDFShader::State& other)
1272 : fType(other.fType), 1302 : fType(other.fType),
1273 fCanvasTransform(other.fCanvasTransform), 1303 fCanvasTransform(other.fCanvasTransform),
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 return false; 1369 return false;
1340 } 1370 }
1341 1371
1342 void SkPDFShader::State::AllocateGradientInfoStorage() { 1372 void SkPDFShader::State::AllocateGradientInfoStorage() {
1343 fColorData.set(sk_malloc_throw( 1373 fColorData.set(sk_malloc_throw(
1344 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); 1374 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar))));
1345 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); 1375 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get());
1346 fInfo.fColorOffsets = 1376 fInfo.fColorOffsets =
1347 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); 1377 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount);
1348 } 1378 }
OLDNEW
« no previous file with comments | « src/pdf/SkPDFShader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698