[PDF] Fix PDF code to not crash on SkComposeShader.
authorvandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 28 Jun 2012 21:37:20 +0000 (21:37 +0000)
committervandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 28 Jun 2012 21:37:20 +0000 (21:37 +0000)
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
src/pdf/SkPDFShader.cpp

index 8591728..68c210d 100644 (file)
@@ -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<SkPDFObject> 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<SkPDFGraphicState> newGraphicState;
index fc9f8c0..22175cc 100644 (file)
@@ -362,6 +362,14 @@ SkPDFObject* SkPDFShader::GetPDFShader(const SkShader& shader,
     SkPDFObject* result;
     SkAutoMutexAcquire lock(CanonicalShadersMutex());
     SkAutoTDelete<State> 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);