Index: src/pdf/SkPDFShader.cpp |
=================================================================== |
--- src/pdf/SkPDFShader.cpp (revision 10235) |
+++ src/pdf/SkPDFShader.cpp (working copy) |
@@ -444,11 +444,13 @@ |
public: |
explicit SkPDFImageShader(SkPDFShader::State* state); |
virtual ~SkPDFImageShader() { |
- RemoveShader(this); |
- fResources.unrefAll(); |
+ if (!fFailedConstructor) { |
+ RemoveShader(this); |
+ fResources.unrefAll(); |
+ } |
} |
- virtual bool isValid() { return size() > 0; } |
+ virtual bool isValid() { return !fFailedConstructor && size() > 0; } |
void getResources(const SkTSet<SkPDFObject*>& knownResourceObjects, |
SkTSet<SkPDFObject*>* newResourceObjects) { |
@@ -460,6 +462,7 @@ |
private: |
SkTSet<SkPDFObject*> fResources; |
SkAutoTDelete<const SkPDFShader::State> fState; |
+ bool fFailedConstructor; |
vandebo (ex-Chrome)
2013/07/23 15:09:50
I don't think you need this field. Just adding th
edisonn
2013/07/23 15:34:18
Done.
|
}; |
SkPDFShader::SkPDFShader() {} |
@@ -511,6 +514,9 @@ |
result = functionShader; |
} |
if (!valid) { |
+ // Release the lock, otherwise we end up calling RemoveShader that locks again, |
vandebo (ex-Chrome)
2013/07/23 15:09:50
nit: please wrap at 80 cols; the rest of the file
edisonn
2013/07/23 15:34:18
Done.
|
+ // and we end up with a freeze. |
+ lock.release(); |
delete result; |
return NULL; |
} |
@@ -659,7 +665,8 @@ |
insert("Shading", pdfShader.get()); |
} |
-SkPDFImageShader::SkPDFImageShader(SkPDFShader::State* state) : fState(state) { |
+SkPDFImageShader::SkPDFImageShader(SkPDFShader::State* state) : fState(state) |
+ , fFailedConstructor(false) { |
fState.get()->fImage.lockPixels(); |
SkMatrix finalMatrix = fState.get()->fCanvasTransform; |
@@ -667,6 +674,7 @@ |
SkRect surfaceBBox; |
surfaceBBox.set(fState.get()->fBBox); |
if (!transformBBox(finalMatrix, &surfaceBBox)) { |
+ fFailedConstructor = true; |
return; |
} |