From 19e3c1ed1b20ce93cc092d25c3637b62f90c5bc5 Mon Sep 17 00:00:00 2001 From: "vandebo@chromium.org" Date: Wed, 25 May 2011 00:41:30 +0000 Subject: [PATCH] [PDF] Reuse the invert function object for xform object masks. Review URL: http://codereview.appspot.com/4557046 git-svn-id: http://skia.googlecode.com/svn/trunk@1417 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/pdf/SkPDFGraphicState.h | 2 ++ src/pdf/SkPDFGraphicState.cpp | 51 +++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/include/pdf/SkPDFGraphicState.h b/include/pdf/SkPDFGraphicState.h index b43c1076c..49809a4c0 100644 --- a/include/pdf/SkPDFGraphicState.h +++ b/include/pdf/SkPDFGraphicState.h @@ -98,6 +98,8 @@ private: void populateDict(); + static SkPDFObject* GetInvertFunction(); + static int find(const SkPaint& paint); }; diff --git a/src/pdf/SkPDFGraphicState.cpp b/src/pdf/SkPDFGraphicState.cpp index 48203f6ca..b08bf24c2 100644 --- a/src/pdf/SkPDFGraphicState.cpp +++ b/src/pdf/SkPDFGraphicState.cpp @@ -116,6 +116,32 @@ SkPDFGraphicState* SkPDFGraphicState::getGraphicStateForPaint( return newEntry.fGraphicState; } +// static +SkPDFObject* SkPDFGraphicState::GetInvertFunction() { + // This assumes that canonicalPaintsMutex is held. + static SkPDFStream* invertFunction = NULL; + if (!invertFunction) { + // Acrobat crashes if we use a type 0 function, kpdf crashes if we use + // a type 2 function, so we use a type 4 function. + SkRefPtr domainAndRange = new SkPDFArray; + domainAndRange->unref(); // SkRefPtr and new both took a reference. + domainAndRange->reserve(2); + domainAndRange->append(new SkPDFInt(0))->unref(); + domainAndRange->append(new SkPDFInt(1))->unref(); + + static const char psInvert[] = "{1 exch sub}"; + SkRefPtr psInvertStream = + new SkMemoryStream(&psInvert, strlen(psInvert), true); + psInvertStream->unref(); // SkRefPtr and new both took a reference. + + invertFunction = new SkPDFStream(psInvertStream.get()); + invertFunction->insert("FunctionType", new SkPDFInt(4))->unref(); + invertFunction->insert("Domain", domainAndRange.get()); + invertFunction->insert("Range", domainAndRange.get()); + } + return invertFunction; +} + // static SkPDFGraphicState* SkPDFGraphicState::getSMaskGraphicState( SkPDFFormXObject* sMask, bool invert) { @@ -137,27 +163,10 @@ SkPDFGraphicState* SkPDFGraphicState::getSMaskGraphicState( sMask->ref(); if (invert) { - // Acrobat crashes if we use a type 0 function, kpdf crashes if we use - // a type 2 function, so we use a type 4 function. - SkRefPtr domainAndRange = new SkPDFArray; - domainAndRange->unref(); // SkRefPtr and new both took a reference. - domainAndRange->reserve(2); - domainAndRange->append(new SkPDFInt(0))->unref(); - domainAndRange->append(new SkPDFInt(1))->unref(); - - static const char psInvert[] = "{1 exch sub}"; - SkRefPtr psInvertStream = - new SkMemoryStream(&psInvert, strlen(psInvert), true); - psInvertStream->unref(); // SkRefPtr and new both took a reference. - - SkRefPtr invertFunc = - new SkPDFStream(psInvertStream.get()); - result->fResources.push(invertFunc.get()); // Pass the ref from new. - invertFunc->insert("FunctionType", new SkPDFInt(4))->unref(); - invertFunc->insert("Domain", domainAndRange.get()); - invertFunc->insert("Range", domainAndRange.get()); - - sMaskDict->insert("TR", new SkPDFObjRef(invertFunc.get()))->unref(); + SkPDFObject* invertFunction = GetInvertFunction(); + result->fResources.push(invertFunction); + invertFunction->ref(); + sMaskDict->insert("TR", new SkPDFObjRef(invertFunction))->unref(); } return result;