From: vandebo@chromium.org Date: Thu, 28 Jun 2012 21:37:20 +0000 (+0000) Subject: [PDF] Fix PDF code to not crash on SkComposeShader. X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~15753 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=da6c569334b5971e55dc95cb9bf85853d068e999;p=platform%2Fupstream%2FlibSkiaSharp.git [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 --- 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);