Chromium Code Reviews| 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; |
| } |