From da6c569334b5971e55dc95cb9bf85853d068e999 Mon Sep 17 00:00:00 2001 From: "vandebo@chromium.org" Date: Thu, 28 Jun 2012 21:37:20 +0000 Subject: [PATCH] [PDF] Fix PDF code to not crash on SkComposeShader. Review URL: https://codereview.appspot.com/6354053 git-svn-id: http://skia.googlecode.com/svn/trunk@4400 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/pdf/SkPDFDevice.cpp | 11 ++--------- src/pdf/SkPDFShader.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 8591728..68c210d 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -1401,6 +1401,8 @@ void SkPDFDevice::populateGraphicStateEntryFromPaint( entry->fMatrix = matrix; entry->fClipStack = clipStack; entry->fClipRegion = clipRegion; + entry->fColor = SkColorSetA(paint.getColor(), 0xFF); + entry->fShaderIndex = -1; // PDF treats a shader as a color, so we only set one or the other. SkRefPtr pdfShader; @@ -1439,11 +1441,6 @@ void SkPDFDevice::populateGraphicStateEntryFromPaint( } else { // A color shader is treated as an invalid shader so we don't have // to set a shader just for a color. - entry->fShaderIndex = -1; - entry->fColor = 0; - color = 0; - - // Check for a color shader. SkShader::GradientInfo gradientInfo; SkColor gradientColor; gradientInfo.fColors = &gradientColor; @@ -1455,10 +1452,6 @@ void SkPDFDevice::populateGraphicStateEntryFromPaint( color = gradientColor; } } - } else { - entry->fShaderIndex = -1; - entry->fColor = SkColorSetA(paint.getColor(), 0xFF); - color = paint.getColor(); } SkRefPtr newGraphicState; diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp index fc9f8c0..22175cc 100644 --- a/src/pdf/SkPDFShader.cpp +++ b/src/pdf/SkPDFShader.cpp @@ -362,6 +362,14 @@ SkPDFObject* SkPDFShader::GetPDFShader(const SkShader& shader, SkPDFObject* result; SkAutoMutexAcquire lock(CanonicalShadersMutex()); SkAutoTDelete shaderState(new State(shader, matrix, surfaceBBox)); + if (shaderState.get()->fType == SkShader::kNone_GradientType && + shaderState.get()->fImage.isNull()) { + // TODO(vandebo) This drops SKComposeShader on the floor. We could + // handle compose shader by pulling things up to a layer, drawing with + // the first shader, applying the xfer mode and drawing again with the + // second shader, then applying the layer to the original drawing. + return NULL; + } ShaderCanonicalEntry entry(NULL, shaderState.get()); int index = CanonicalShaders().find(entry); -- 2.7.4