diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pdf/SkPDFDevice.cpp | 6 | ||||
-rw-r--r-- | src/pdf/SkPDFDocument.cpp | 2 | ||||
-rwxr-xr-x | src/pdf/SkPDFFont.cpp | 114 | ||||
-rw-r--r-- | src/pdf/SkPDFGraphicState.cpp | 27 | ||||
-rw-r--r-- | src/pdf/SkPDFShader.cpp | 48 | ||||
-rw-r--r-- | src/pdf/SkPDFStream.cpp | 2 | ||||
-rw-r--r-- | src/pdf/SkPDFTypes.cpp | 35 | ||||
-rw-r--r-- | src/pdf/SkPDFUtils.cpp | 2 |
8 files changed, 130 insertions, 106 deletions
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 81cfdaa094..c9143865e6 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -1045,7 +1045,7 @@ const SkRefPtr<SkPDFDict>& SkPDFDevice::getResourceDict() { procSets->unref(); // SkRefPtr and new both took a reference. procSets->reserve(SK_ARRAY_COUNT(procs)); for (size_t i = 0; i < SK_ARRAY_COUNT(procs); i++) - procSets->append(new SkPDFName(procs[i]))->unref(); + procSets->appendName(procs[i]); fResourceDict->insert("ProcSet", procSets.get()); } return fResourceDict; @@ -1092,8 +1092,8 @@ SkRefPtr<SkPDFArray> SkPDFDevice::getMediaBox() const { mediaBox->reserve(4); mediaBox->append(zero.get()); mediaBox->append(zero.get()); - mediaBox->append(new SkPDFInt(fPageSize.fWidth))->unref(); - mediaBox->append(new SkPDFInt(fPageSize.fHeight))->unref(); + mediaBox->appendInt(fPageSize.fWidth); + mediaBox->appendInt(fPageSize.fHeight); return mediaBox; } diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp index 3b7609fe95..fa8a028249 100644 --- a/src/pdf/SkPDFDocument.cpp +++ b/src/pdf/SkPDFDocument.cpp @@ -211,7 +211,7 @@ void SkPDFDocument::emitFooter(SkWStream* stream, int64_t objCount) { // TODO(vandebo) Linearized format will take a Prev entry too. // TODO(vandebo) PDF/A requires an ID entry. - fTrailerDict->insert("Size", new SkPDFInt(objCount))->unref(); + fTrailerDict->insertInt("Size", objCount); fTrailerDict->insert("Root", new SkPDFObjRef(fDocCatalog.get()))->unref(); } diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index d0d31e3265..e9f8450509 100755 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp @@ -261,20 +261,16 @@ void setGlyphWidthAndBoundingBox(SkScalar width, SkIRect box, SkPDFArray* makeFontBBox(SkIRect glyphBBox, uint16_t emSize) { SkPDFArray* bbox = new SkPDFArray; bbox->reserve(4); - bbox->append(new SkPDFScalar(scaleFromFontUnits(glyphBBox.fLeft, - emSize)))->unref(); - bbox->append(new SkPDFScalar(scaleFromFontUnits(glyphBBox.fBottom, - emSize)))->unref(); - bbox->append(new SkPDFScalar(scaleFromFontUnits(glyphBBox.fRight, - emSize)))->unref(); - bbox->append(new SkPDFScalar(scaleFromFontUnits(glyphBBox.fTop, - emSize)))->unref(); + bbox->appendScalar(scaleFromFontUnits(glyphBBox.fLeft, emSize)); + bbox->appendScalar(scaleFromFontUnits(glyphBBox.fBottom, emSize)); + bbox->appendScalar(scaleFromFontUnits(glyphBBox.fRight, emSize)); + bbox->appendScalar(scaleFromFontUnits(glyphBBox.fTop, emSize)); return bbox; } SkPDFArray* appendWidth(const int16_t& width, uint16_t emSize, SkPDFArray* array) { - array->append(new SkPDFScalar(scaleFromFontUnits(width, emSize)))->unref(); + array->appendScalar(scaleFromFontUnits(width, emSize)); return array; } @@ -308,14 +304,14 @@ SkPDFArray* composeAdvanceData( for (int j = 0; j < advanceInfo->fAdvance.count(); j++) appendAdvance(advanceInfo->fAdvance[j], emSize, advanceArray.get()); - result->append(new SkPDFInt(advanceInfo->fStartId))->unref(); + result->appendInt(advanceInfo->fStartId); result->append(advanceArray.get()); break; } case SkAdvancedTypefaceMetrics::WidthRange::kRun: { SkASSERT(advanceInfo->fAdvance.count() == 1); - result->append(new SkPDFInt(advanceInfo->fStartId))->unref(); - result->append(new SkPDFInt(advanceInfo->fEndId))->unref(); + result->appendInt(advanceInfo->fStartId); + result->appendInt(advanceInfo->fEndId); appendAdvance(advanceInfo->fAdvance[0], emSize, result); break; } @@ -594,9 +590,9 @@ SkPDFFont::SkPDFFont(class SkAdvancedTypefaceMetrics* fontInfo, void SkPDFFont::populateType0Font() { fMultiByteGlyphs = true; - insert("Subtype", new SkPDFName("Type0"))->unref(); - insert("BaseFont", new SkPDFName(fFontInfo->fFontName))->unref(); - insert("Encoding", new SkPDFName("Identity-H"))->unref(); + insertName("Subtype", "Type0"); + insertName("BaseFont", fFontInfo->fFontName); + insertName("Encoding", "Identity-H"); SkRefPtr<SkPDFArray> descendantFonts = new SkPDFArray(); descendantFonts->unref(); // SkRefPtr and new took a reference. @@ -630,13 +626,13 @@ void SkPDFFont::populateToUnicodeTable() { void SkPDFFont::populateCIDFont() { fMultiByteGlyphs = true; - insert("BaseFont", new SkPDFName(fFontInfo->fFontName))->unref(); + insertName("BaseFont", fFontInfo->fFontName); if (fFontInfo->fType == SkAdvancedTypefaceMetrics::kType1CID_Font) { - insert("Subtype", new SkPDFName("CIDFontType0"))->unref(); + insertName("Subtype", "CIDFontType0"); } else if (fFontInfo->fType == SkAdvancedTypefaceMetrics::kTrueType_Font) { - insert("Subtype", new SkPDFName("CIDFontType2"))->unref(); - insert("CIDToGIDMap", new SkPDFName("Identity"))->unref(); + insertName("Subtype", "CIDFontType2"); + insertName("CIDToGIDMap", "Identity"); } else { SkASSERT(false); } @@ -645,7 +641,7 @@ void SkPDFFont::populateCIDFont() { sysInfo->unref(); // SkRefPtr and new both took a reference. sysInfo->insert("Registry", new SkPDFString("Adobe"))->unref(); sysInfo->insert("Ordering", new SkPDFString("Identity"))->unref(); - sysInfo->insert("Supplement", new SkPDFInt(0))->unref(); + sysInfo->insertInt("Supplement", 0); insert("CIDSystemInfo", sysInfo.get()); addFontDescriptor(0); @@ -659,8 +655,8 @@ void SkPDFFont::populateCIDFont() { if (widths->size()) insert("W", widths.get()); if (defaultWidth != 0) { - insert("DW", new SkPDFScalar(scaleFromFontUnits( - defaultWidth, fFontInfo->fEmSize)))->unref(); + insertScalar("DW", scaleFromFontUnits(defaultWidth, + fFontInfo->fEmSize)); } } if (fFontInfo->fVerticalMetrics.get()) { @@ -714,8 +710,8 @@ bool SkPDFFont::populateType1Font(int16_t glyphID) { if (!addFontDescriptor(defaultWidth)) return false; - insert("Subtype", new SkPDFName("Type1"))->unref(); - insert("BaseFont", new SkPDFName(fFontInfo->fFontName))->unref(); + insertName("Subtype", "Type1"); + insertName("BaseFont", fFontInfo->fFontName); addWidthInfoFromRange(defaultWidth, widthRangeEntry); @@ -728,10 +724,9 @@ bool SkPDFFont::populateType1Font(int16_t glyphID) { encoding->insert("Differences", encDiffs.get()); encDiffs->reserve(fLastGlyphID - fFirstGlyphID + 2); - encDiffs->append(new SkPDFInt(1))->unref(); + encDiffs->appendInt(1); for (int gID = fFirstGlyphID; gID <= fLastGlyphID; gID++) { - encDiffs->append( - new SkPDFName(fFontInfo->fGlyphNames->get()[gID]))->unref(); + encDiffs->appendName(fFontInfo->fGlyphNames->get()[gID].c_str()); } if (fFontInfo->fLastGlyphID <= 255) @@ -752,7 +747,7 @@ void SkPDFFont::populateType3Font(int16_t glyphID) { adjustGlyphRangeForSingleByteEncoding(glyphID); - insert("Subtype", new SkPDFName("Type3"))->unref(); + insertName("Subtype", "Type3"); // Flip about the x-axis and scale by 1/1000. SkMatrix fontMatrix; fontMatrix.setScale(SkScalarInvert(1000), -SkScalarInvert(1000)); @@ -770,7 +765,7 @@ void SkPDFFont::populateType3Font(int16_t glyphID) { encDiffs->unref(); // SkRefPtr and new both took a reference. encoding->insert("Differences", encDiffs.get()); encDiffs->reserve(fLastGlyphID - fFirstGlyphID + 2); - encDiffs->append(new SkPDFInt(1))->unref(); + encDiffs->appendInt(1); SkRefPtr<SkPDFArray> widthArray = new SkPDFArray(); widthArray->unref(); // SkRefPtr and new both took a ref. @@ -779,10 +774,10 @@ void SkPDFFont::populateType3Font(int16_t glyphID) { for (int gID = fFirstGlyphID; gID <= fLastGlyphID; gID++) { SkString characterName; characterName.printf("gid%d", gID); - encDiffs->append(new SkPDFName(characterName))->unref(); + encDiffs->appendName(characterName.c_str()); const SkGlyph& glyph = cache->getGlyphIDMetrics(gID); - widthArray->append(new SkPDFScalar(SkFixedToScalar(glyph.fAdvanceX)))->unref(); + widthArray->appendScalar(SkFixedToScalar(glyph.fAdvanceX)); SkIRect glyphBBox = SkIRect::MakeXYWH(glyph.fLeft, glyph.fTop, glyph.fWidth, glyph.fHeight); bbox.join(glyphBBox); @@ -809,14 +804,14 @@ void SkPDFFont::populateType3Font(int16_t glyphID) { } insert("FontBBox", makeFontBBox(bbox, 1000))->unref(); - insert("FirstChar", new SkPDFInt(fFirstGlyphID))->unref(); - insert("LastChar", new SkPDFInt(fLastGlyphID))->unref(); + insertInt("FirstChar", fFirstGlyphID); + insertInt("LastChar", fLastGlyphID); insert("Widths", widthArray.get()); - insert("CIDToGIDMap", new SkPDFName("Identity"))->unref(); + insertName("CIDToGIDMap", "Identity"); - if (fFontInfo && fFontInfo->fLastGlyphID <= 255) + if (fFontInfo && fFontInfo->fLastGlyphID <= 255) { fFontInfo = NULL; - + } populateToUnicodeTable(); } @@ -846,9 +841,9 @@ bool SkPDFFont::addFontDescriptor(int16_t defaultWidth) { SkRefPtr<SkPDFStream> fontStream = new SkPDFStream(fontData); // SkRefPtr and new both ref()'d fontStream, pass one. fResources.push(fontStream.get()); - fontStream->insert("Length1", new SkPDFInt(header))->unref(); - fontStream->insert("Length2", new SkPDFInt(data))->unref(); - fontStream->insert("Length3", new SkPDFInt(trailer))->unref(); + fontStream->insertInt("Length1", header); + fontStream->insertInt("Length2", data); + fontStream->insertInt("Length3", trailer); fDescriptor->insert("FontFile", new SkPDFObjRef(fontStream.get()))->unref(); break; @@ -861,8 +856,7 @@ bool SkPDFFont::addFontDescriptor(int16_t defaultWidth) { // SkRefPtr and new both ref()'d fontStream, pass one. fResources.push(fontStream.get()); - fontStream->insert("Length1", - new SkPDFInt(fontData->getLength()))->unref(); + fontStream->insertInt("Length1", fontData->getLength()); fDescriptor->insert("FontFile2", new SkPDFObjRef(fontStream.get()))->unref(); break; @@ -877,10 +871,9 @@ bool SkPDFFont::addFontDescriptor(int16_t defaultWidth) { fResources.push(fontStream.get()); if (fFontInfo->fType == SkAdvancedTypefaceMetrics::kCFF_Font) { - fontStream->insert("Subtype", new SkPDFName("Type1C"))->unref(); + fontStream->insertName("Subtype", "Type1C"); } else { - fontStream->insert("Subtype", - new SkPDFName("CIDFontType0c"))->unref(); + fontStream->insertName("Subtype", "CIDFontType0c"); } fDescriptor->insert("FontFile3", new SkPDFObjRef(fontStream.get()))->unref(); @@ -895,25 +888,23 @@ bool SkPDFFont::addFontDescriptor(int16_t defaultWidth) { fDescriptor->ref(); insert("FontDescriptor", new SkPDFObjRef(fDescriptor.get()))->unref(); - fDescriptor->insert("FontName", new SkPDFName( - fFontInfo->fFontName))->unref(); - fDescriptor->insert("Flags", new SkPDFInt(fFontInfo->fStyle))->unref(); - fDescriptor->insert("Ascent", new SkPDFScalar( - scaleFromFontUnits(fFontInfo->fAscent, emSize)))->unref(); - fDescriptor->insert("Descent", new SkPDFScalar( - scaleFromFontUnits(fFontInfo->fDescent, emSize)))->unref(); - fDescriptor->insert("StemV", new SkPDFScalar( - scaleFromFontUnits(fFontInfo->fStemV, emSize)))->unref(); - fDescriptor->insert("CapHeight", new SkPDFScalar( - scaleFromFontUnits(fFontInfo->fCapHeight, emSize)))->unref(); - fDescriptor->insert("ItalicAngle", new SkPDFInt( - fFontInfo->fItalicAngle))->unref(); + fDescriptor->insertName("FontName", fFontInfo->fFontName); + fDescriptor->insertInt("Flags", fFontInfo->fStyle); + fDescriptor->insertScalar("Ascent", + scaleFromFontUnits(fFontInfo->fAscent, emSize)); + fDescriptor->insertScalar("Descent", + scaleFromFontUnits(fFontInfo->fDescent, emSize)); + fDescriptor->insertScalar("StemV", + scaleFromFontUnits(fFontInfo->fStemV, emSize)); + fDescriptor->insertScalar("CapHeight", + scaleFromFontUnits(fFontInfo->fCapHeight, emSize)); + fDescriptor->insertInt("ItalicAngle", fFontInfo->fItalicAngle); fDescriptor->insert("FontBBox", makeFontBBox(fFontInfo->fBBox, fFontInfo->fEmSize))->unref(); if (defaultWidth > 0) { - fDescriptor->insert("MissingWidth", new SkPDFScalar( - scaleFromFontUnits(defaultWidth, emSize)))->unref(); + fDescriptor->insertScalar("MissingWidth", + scaleFromFontUnits(defaultWidth, emSize)); } return true; } @@ -941,9 +932,8 @@ void SkPDFFont::addWidthInfoFromRange( } else { appendWidth(defaultWidth, 1000, widthArray.get()); } - insert("FirstChar", new SkPDFInt(firstChar))->unref(); - insert("LastChar", - new SkPDFInt(firstChar + widthArray->size() - 1))->unref(); + insertInt("FirstChar", firstChar); + insertInt("LastChar", firstChar + widthArray->size() - 1); insert("Widths", widthArray.get()); } diff --git a/src/pdf/SkPDFGraphicState.cpp b/src/pdf/SkPDFGraphicState.cpp index b08bf24c26..b560bb72c6 100644 --- a/src/pdf/SkPDFGraphicState.cpp +++ b/src/pdf/SkPDFGraphicState.cpp @@ -126,8 +126,8 @@ SkPDFObject* SkPDFGraphicState::GetInvertFunction() { SkRefPtr<SkPDFArray> 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(); + domainAndRange->appendInt(0); + domainAndRange->appendInt(1); static const char psInvert[] = "{1 exch sub}"; SkRefPtr<SkMemoryStream> psInvertStream = @@ -135,7 +135,7 @@ SkPDFObject* SkPDFGraphicState::GetInvertFunction() { psInvertStream->unref(); // SkRefPtr and new both took a reference. invertFunction = new SkPDFStream(psInvertStream.get()); - invertFunction->insert("FunctionType", new SkPDFInt(4))->unref(); + invertFunction->insertInt("FunctionType", 4); invertFunction->insert("Domain", domainAndRange.get()); invertFunction->insert("Range", domainAndRange.get()); } @@ -151,13 +151,13 @@ SkPDFGraphicState* SkPDFGraphicState::getSMaskGraphicState( SkRefPtr<SkPDFDict> sMaskDict = new SkPDFDict("Mask"); sMaskDict->unref(); // SkRefPtr and new both took a reference. - sMaskDict->insert("S", new SkPDFName("Alpha"))->unref(); + sMaskDict->insertName("S", "Alpha"); sMaskDict->insert("G", new SkPDFObjRef(sMask))->unref(); SkPDFGraphicState* result = new SkPDFGraphicState; result->fPopulated = true; result->fSMask = true; - result->insert("Type", new SkPDFName("ExtGState"))->unref(); + result->insertName("Type", "ExtGState"); result->insert("SMask", sMaskDict.get()); result->fResources.push(sMask); sMask->ref(); @@ -180,8 +180,8 @@ SkPDFGraphicState* SkPDFGraphicState::getNoSMaskGraphicState() { noSMaskGS = new SkPDFGraphicState; noSMaskGS->fPopulated = true; noSMaskGS->fSMask = true; - noSMaskGS->insert("Type", new SkPDFName("ExtGState"))->unref(); - noSMaskGS->insert("SMask", new SkPDFName("None"))->unref(); + noSMaskGS->insertName("Type", "ExtGState"); + noSMaskGS->insertName("SMask", "None"); } noSMaskGS->ref(); return noSMaskGS; @@ -208,7 +208,7 @@ SkPDFGraphicState::SkPDFGraphicState(const SkPaint& paint) void SkPDFGraphicState::populateDict() { if (!fPopulated) { fPopulated = true; - insert("Type", new SkPDFName("ExtGState"))->unref(); + insertName("Type", "ExtGState"); SkRefPtr<SkPDFScalar> alpha = new SkPDFScalar(fPaint.getAlpha() * SkScalarInvert(0xFF)); @@ -221,17 +221,17 @@ void SkPDFGraphicState::populateDict() { SK_COMPILE_ASSERT(SkPaint::kSquare_Cap == 2, paint_cap_mismatch); SK_COMPILE_ASSERT(SkPaint::kCapCount == 3, paint_cap_mismatch); SkASSERT(fPaint.getStrokeCap() >= 0 && fPaint.getStrokeCap() <= 2); - insert("LC", new SkPDFInt(fPaint.getStrokeCap()))->unref(); + insertInt("LC", fPaint.getStrokeCap()); SK_COMPILE_ASSERT(SkPaint::kMiter_Join == 0, paint_join_mismatch); SK_COMPILE_ASSERT(SkPaint::kRound_Join == 1, paint_join_mismatch); SK_COMPILE_ASSERT(SkPaint::kBevel_Join == 2, paint_join_mismatch); SK_COMPILE_ASSERT(SkPaint::kJoinCount == 3, paint_join_mismatch); SkASSERT(fPaint.getStrokeJoin() >= 0 && fPaint.getStrokeJoin() <= 2); - insert("LJ", new SkPDFInt(fPaint.getStrokeJoin()))->unref(); + insertInt("LJ", fPaint.getStrokeJoin()); - insert("LW", new SkPDFScalar(fPaint.getStrokeWidth()))->unref(); - insert("ML", new SkPDFScalar(fPaint.getStrokeMiter()))->unref(); + insertScalar("LW", fPaint.getStrokeWidth()); + insertScalar("ML", fPaint.getStrokeMiter()); insert("SA", new SkPDFBool(true))->unref(); // Auto stroke adjustment. SkXfermode::Mode xfermode = SkXfermode::kSrcOver_Mode; @@ -244,8 +244,7 @@ void SkPDFGraphicState::populateDict() { xfermode = SkXfermode::kSrcOver_Mode; NOT_IMPLEMENTED("unsupported xfermode", false); } - insert("BM", - new SkPDFName(blend_mode_from_xfermode(xfermode)))->unref(); + insertName("BM", blend_mode_from_xfermode(xfermode)); } } diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp index 92b0429f90..e9fa4c2310 100644 --- a/src/pdf/SkPDFShader.cpp +++ b/src/pdf/SkPDFShader.cpp @@ -370,12 +370,12 @@ SkPDFObject* SkPDFShader::rangeObject() { if (range == NULL) { range = new SkPDFArray; range->reserve(6); - range->append(new SkPDFInt(0))->unref(); - range->append(new SkPDFInt(1))->unref(); - range->append(new SkPDFInt(0))->unref(); - range->append(new SkPDFInt(1))->unref(); - range->append(new SkPDFInt(0))->unref(); - range->append(new SkPDFInt(1))->unref(); + range->appendInt(0); + range->appendInt(1); + range->appendInt(0); + range->appendInt(1); + range->appendInt(0); + range->appendInt(1); } return range; } @@ -445,10 +445,10 @@ void SkPDFShader::doFunctionShader() { SkRefPtr<SkPDFArray> domain = new SkPDFArray; domain->unref(); // SkRefPtr and new both took a reference. domain->reserve(4); - domain->append(new SkPDFScalar(bbox.fLeft))->unref(); - domain->append(new SkPDFScalar(bbox.fRight))->unref(); - domain->append(new SkPDFScalar(bbox.fTop))->unref(); - domain->append(new SkPDFScalar(bbox.fBottom))->unref(); + domain->appendScalar(bbox.fLeft); + domain->appendScalar(bbox.fRight); + domain->appendScalar(bbox.fTop); + domain->appendScalar(bbox.fBottom); SkString functionCode; // The two point radial gradient further references fState.get()->fInfo @@ -474,14 +474,14 @@ void SkPDFShader::doFunctionShader() { SkRefPtr<SkPDFDict> pdfShader = new SkPDFDict; pdfShader->unref(); // SkRefPtr and new both took a reference. - pdfShader->insert("ShadingType", new SkPDFInt(1))->unref(); - pdfShader->insert("ColorSpace", new SkPDFName("DeviceRGB"))->unref(); + pdfShader->insertInt("ShadingType", 1); + pdfShader->insertName("ColorSpace", "DeviceRGB"); pdfShader->insert("Domain", domain.get()); pdfShader->insert("Function", new SkPDFObjRef(function.get()))->unref(); fContent = new SkPDFDict("Pattern"); fContent->unref(); // SkRefPtr and new both took a reference. - fContent->insert("PatternType", new SkPDFInt(2))->unref(); + fContent->insertInt("PatternType", 2); fContent->insert("Matrix", SkPDFUtils::MatrixToArray(finalMatrix))->unref(); fContent->insert("Shading", pdfShader.get()); } @@ -656,10 +656,10 @@ void SkPDFShader::doImageShader() { SkRefPtr<SkPDFArray> patternBBoxArray = new SkPDFArray; patternBBoxArray->unref(); // SkRefPtr and new both took a reference. patternBBoxArray->reserve(4); - patternBBoxArray->append(new SkPDFScalar(patternBBox.fLeft))->unref(); - patternBBoxArray->append(new SkPDFScalar(patternBBox.fTop))->unref(); - patternBBoxArray->append(new SkPDFScalar(patternBBox.fRight))->unref(); - patternBBoxArray->append(new SkPDFScalar(patternBBox.fBottom))->unref(); + patternBBoxArray->appendScalar(patternBBox.fLeft); + patternBBoxArray->appendScalar(patternBBox.fTop); + patternBBoxArray->appendScalar(patternBBox.fRight); + patternBBoxArray->appendScalar(patternBBox.fBottom); // Put the canvas into the pattern stream (fContent). SkRefPtr<SkStream> content = pattern.content(); @@ -668,13 +668,13 @@ void SkPDFShader::doImageShader() { fContent = new SkPDFStream(content.get()); fContent->unref(); // SkRefPtr and new both took a reference. - fContent->insert("Type", new SkPDFName("Pattern"))->unref(); - fContent->insert("PatternType", new SkPDFInt(1))->unref(); - fContent->insert("PaintType", new SkPDFInt(1))->unref(); - fContent->insert("TilingType", new SkPDFInt(1))->unref(); + fContent->insertName("Type", "Pattern"); + fContent->insertInt("PatternType", 1); + fContent->insertInt("PaintType", 1); + fContent->insertInt("TilingType", 1); fContent->insert("BBox", patternBBoxArray.get()); - fContent->insert("XStep", new SkPDFScalar(patternBBox.width()))->unref(); - fContent->insert("YStep", new SkPDFScalar(patternBBox.height()))->unref(); + fContent->insertScalar("XStep", patternBBox.width()); + fContent->insertScalar("YStep", patternBBox.height()); fContent->insert("Resources", pattern.getResourceDict().get()); fContent->insert("Matrix", SkPDFUtils::MatrixToArray(finalMatrix))->unref(); @@ -688,7 +688,7 @@ SkPDFStream* SkPDFShader::makePSFunction(const SkString& psCode, funcStream->unref(); // SkRefPtr and new both took a reference. SkPDFStream* result = new SkPDFStream(funcStream.get()); - result->insert("FunctionType", new SkPDFInt(4))->unref(); + result->insertInt("FunctionType", 4); result->insert("Domain", domain); result->insert("Range", rangeObject()); return result; diff --git a/src/pdf/SkPDFStream.cpp b/src/pdf/SkPDFStream.cpp index 11afa32321..790cfaec3d 100644 --- a/src/pdf/SkPDFStream.cpp +++ b/src/pdf/SkPDFStream.cpp @@ -33,7 +33,7 @@ SkPDFStream::SkPDFStream(SkStream* stream) { fPlainData = stream; fLength = fPlainData->getLength(); } - insert("Length", new SkPDFInt(fLength))->unref(); + insertInt("Length", fLength); } SkPDFStream::~SkPDFStream() { diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp index 7de6d682ec..780ecf8e59 100644 --- a/src/pdf/SkPDFTypes.cpp +++ b/src/pdf/SkPDFTypes.cpp @@ -337,6 +337,23 @@ SkPDFObject* SkPDFArray::append(SkPDFObject* value) { return value; } +void SkPDFArray::appendInt(int32_t value) { + SkASSERT(fValue.count() < kMaxLen); + fValue.push(new SkPDFInt(value)); +} + +void SkPDFArray::appendScalar(SkScalar value) { + SkASSERT(fValue.count() < kMaxLen); + fValue.push(new SkPDFScalar(value)); +} + +void SkPDFArray::appendName(const char name[]) { + SkASSERT(fValue.count() < kMaxLen); + fValue.push(new SkPDFName(name)); +} + +/////////////////////////////////////////////////////////////////////////////// + SkPDFDict::SkPDFDict() {} SkPDFDict::SkPDFDict(const char type[]) { @@ -391,6 +408,24 @@ SkPDFObject* SkPDFDict::insert(const char key[], SkPDFObject* value) { return value; } +void SkPDFDict::insertInt(const char key[], int32_t value) { + struct Rec* newEntry = fValue.append(); + newEntry->key = new SkPDFName(key); + newEntry->value = new SkPDFInt(value); +} + +void SkPDFDict::insertScalar(const char key[], SkScalar value) { + struct Rec* newEntry = fValue.append(); + newEntry->key = new SkPDFName(key); + newEntry->value = new SkPDFScalar(value); +} + +void SkPDFDict::insertName(const char key[], const char name[]) { + struct Rec* newEntry = fValue.append(); + newEntry->key = new SkPDFName(key); + newEntry->value = new SkPDFName(name); +} + void SkPDFDict::clear() { for (int i = 0; i < fValue.count(); i++) { fValue[i].key->unref(); diff --git a/src/pdf/SkPDFUtils.cpp b/src/pdf/SkPDFUtils.cpp index 6c78a8ef57..56271bc9d5 100644 --- a/src/pdf/SkPDFUtils.cpp +++ b/src/pdf/SkPDFUtils.cpp @@ -31,7 +31,7 @@ SkPDFArray* SkPDFUtils::MatrixToArray(const SkMatrix& matrix) { SkPDFArray* result = new SkPDFArray; result->reserve(6); for (size_t i = 0; i < SK_ARRAY_COUNT(values); i++) { - result->append(new SkPDFScalar(values[i]))->unref(); + result->appendScalar(values[i]); } return result; } |