Remove SkRefPtr
(resubmit of https://codereview.appspot.com/7030059/)
TBR=junov@google.com
Review URL: https://codereview.appspot.com/7030065
git-svn-id: http://skia.googlecode.com/svn/trunk@7030 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
index 9a8f136..f2b3f53 100644
--- a/src/pdf/SkPDFFont.cpp
+++ b/src/pdf/SkPDFFont.cpp
@@ -155,13 +155,12 @@
// if the data was NUL terminated so that we can use strstr() to search it.
// Make as few copies as possible given these constraints.
SkDynamicMemoryWStream dynamicStream;
- SkRefPtr<SkMemoryStream> staticStream;
+ SkAutoTUnref<SkMemoryStream> staticStream;
SkData* data = NULL;
const uint8_t* src;
size_t srcLen;
if ((srcLen = srcStream->getLength()) > 0) {
- staticStream = new SkMemoryStream(srcLen + 1);
- staticStream->unref(); // new and SkRefPtr both took a ref.
+ staticStream.reset(new SkMemoryStream(srcLen + 1));
src = (const uint8_t*)staticStream->getMemoryBase();
if (srcStream->getMemoryBase() != NULL) {
memcpy((void *)src, srcStream->getMemoryBase(), srcLen);
@@ -318,8 +317,7 @@
break;
}
case SkAdvancedTypefaceMetrics::WidthRange::kRange: {
- SkRefPtr<SkPDFArray> advanceArray = new SkPDFArray();
- advanceArray->unref(); // SkRefPtr and new both took a ref.
+ SkAutoTUnref<SkPDFArray> advanceArray(new SkPDFArray());
for (int j = 0; j < advanceInfo->fAdvance.count(); j++)
appendAdvance(advanceInfo->fAdvance[j], emSize,
advanceArray.get());
@@ -530,8 +528,7 @@
append_tounicode_header(&cmap);
append_cmap_sections(glyphToUnicode, subset, &cmap);
append_cmap_footer(&cmap);
- SkRefPtr<SkMemoryStream> cmapStream = new SkMemoryStream();
- cmapStream->unref(); // SkRefPtr and new took a reference.
+ SkAutoTUnref<SkMemoryStream> cmapStream(new SkMemoryStream());
cmapStream->setData(cmap.copyToData())->unref();
return new SkPDFStream(cmapStream.get());
}
@@ -547,9 +544,8 @@
const SkTypeface* typeface,
const SkTDArray<uint32_t>& subset,
SkPDFStream** fontStream) {
- SkRefPtr<SkStream> fontData =
- SkFontHost::OpenStream(SkTypeface::UniqueID(typeface));
- fontData->unref(); // SkRefPtr and OpenStream both took a ref.
+ SkAutoTUnref<SkStream> fontData(
+ SkFontHost::OpenStream(SkTypeface::UniqueID(typeface)));
int fontSize = fontData->getLength();
@@ -766,11 +762,12 @@
return CanonicalFonts()[relatedFontIndex].fFont;
}
- SkRefPtr<SkAdvancedTypefaceMetrics> fontMetrics;
+ SkAutoTUnref<SkAdvancedTypefaceMetrics> fontMetrics;
SkPDFDict* relatedFontDescriptor = NULL;
if (relatedFontIndex >= 0) {
SkPDFFont* relatedFont = CanonicalFonts()[relatedFontIndex].fFont;
- fontMetrics = relatedFont->fontInfo();
+ fontMetrics.reset(relatedFont->fontInfo());
+ SkSafeRef(fontMetrics.get());
relatedFontDescriptor = relatedFont->getFontDescriptor();
// This only is to catch callers who pass invalid glyph ids.
@@ -794,18 +791,16 @@
info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
#endif
- fontMetrics =
- SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0);
- SkSafeUnref(fontMetrics.get()); // SkRefPtr and Get both took a ref.
+ fontMetrics.reset(
+ SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0));
#if defined (SK_SFNTLY_SUBSETTER)
- if (fontMetrics &&
+ if (fontMetrics.get() &&
fontMetrics->fType != SkAdvancedTypefaceMetrics::kTrueType_Font) {
// Font does not support subsetting, get new info with advance.
info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
- fontMetrics =
- SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0);
- SkSafeUnref(fontMetrics.get()); // SkRefPtr and Get both took a ref
+ fontMetrics.reset(
+ SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0));
}
#endif
}
@@ -856,6 +851,8 @@
fFirstGlyphID(1),
fLastGlyphID(info ? info->fLastGlyphID : 0),
fFontInfo(info) {
+ SkSafeRef(typeface);
+ SkSafeRef(info);
if (info == NULL) {
fFontType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font;
} else if (info->fMultiMaster) {
@@ -906,7 +903,8 @@
if (info == NULL || info == fFontInfo.get()) {
return;
}
- fFontInfo = info;
+ fFontInfo.reset(info);
+ SkSafeRef(info);
}
uint16_t SkPDFFont::firstGlyphID() const {
@@ -924,6 +922,7 @@
void SkPDFFont::addResource(SkPDFObject* object) {
SkASSERT(object != NULL);
fResources.push(object);
+ object->ref();
}
SkPDFDict* SkPDFFont::getFontDescriptor() {
@@ -931,7 +930,8 @@
}
void SkPDFFont::setFontDescriptor(SkPDFDict* descriptor) {
- fDescriptor = descriptor;
+ fDescriptor.reset(descriptor);
+ SkSafeRef(descriptor);
}
bool SkPDFFont::addCommonFontDescriptorEntries(int16_t defaultWidth) {
@@ -1002,9 +1002,9 @@
if (fFontInfo == NULL || fFontInfo->fGlyphToUnicode.begin() == NULL) {
return;
}
- SkRefPtr<SkPDFStream> pdfCmap =
- generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, subset);
- addResource(pdfCmap.get()); // Pass reference from new.
+ SkAutoTUnref<SkPDFStream> pdfCmap(
+ generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, subset));
+ addResource(pdfCmap.get());
insert("ToUnicode", new SkPDFObjRef(pdfCmap.get()))->unref();
}
@@ -1039,14 +1039,11 @@
insertName("BaseFont", fontInfo()->fFontName);
insertName("Encoding", "Identity-H");
- SkPDFCIDFont* newCIDFont;
- newCIDFont = new SkPDFCIDFont(fontInfo(), typeface(), subset);
-
- // Pass ref new created to fResources.
- addResource(newCIDFont);
- SkRefPtr<SkPDFArray> descendantFonts = new SkPDFArray();
- descendantFonts->unref(); // SkRefPtr and new took a reference.
- descendantFonts->append(new SkPDFObjRef(newCIDFont))->unref();
+ SkAutoTUnref<SkPDFCIDFont> newCIDFont(
+ new SkPDFCIDFont(fontInfo(), typeface(), subset));
+ addResource(newCIDFont.get());
+ SkAutoTUnref<SkPDFArray> descendantFonts(new SkPDFArray());
+ descendantFonts->append(new SkPDFObjRef(newCIDFont.get()))->unref();
insert("DescendantFonts", descendantFonts.get());
populateToUnicodeTable(subset);
@@ -1069,9 +1066,9 @@
bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth,
const SkTDArray<uint32_t>* subset) {
- SkRefPtr<SkPDFDict> descriptor = new SkPDFDict("FontDescriptor");
- descriptor->unref(); // SkRefPtr and new both took a ref.
+ SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor"));
setFontDescriptor(descriptor.get());
+ addResource(descriptor.get());
switch (getType()) {
case SkAdvancedTypefaceMetrics::kTrueType_Font: {
@@ -1084,22 +1081,20 @@
&rawStream);
SkASSERT(fontSize);
SkASSERT(rawStream);
- SkRefPtr<SkPDFStream> fontStream = rawStream;
- // SkRefPtr and new both ref()'d fontStream, pass one.
+ SkAutoTUnref<SkPDFStream> fontStream(rawStream);
addResource(fontStream.get());
fontStream->insertInt("Length1", fontSize);
descriptor->insert("FontFile2",
- new SkPDFObjRef(fontStream.get()))->unref();
+ new SkPDFObjRef(fontStream.get()))->unref();
break;
}
case SkAdvancedTypefaceMetrics::kCFF_Font:
case SkAdvancedTypefaceMetrics::kType1CID_Font: {
- SkRefPtr<SkStream> fontData =
- SkFontHost::OpenStream(SkTypeface::UniqueID(typeface()));
- fontData->unref(); // SkRefPtr and OpenStream both took a ref.
- SkRefPtr<SkPDFStream> fontStream = new SkPDFStream(fontData.get());
- // SkRefPtr and new both ref()'d fontStream, pass one.
+ SkAutoTUnref<SkStream> fontData(
+ SkFontHost::OpenStream(SkTypeface::UniqueID(typeface())));
+ SkAutoTUnref<SkPDFStream> fontStream(
+ new SkPDFStream(fontData.get()));
addResource(fontStream.get());
if (getType() == SkAdvancedTypefaceMetrics::kCFF_Font) {
@@ -1115,9 +1110,6 @@
SkASSERT(false);
}
- addResource(descriptor.get());
- descriptor->ref();
-
insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref();
return addCommonFontDescriptorEntries(defaultWidth);
}
@@ -1132,20 +1124,18 @@
subset->exportTo(&glyphIDs);
}
- SkRefPtr<SkAdvancedTypefaceMetrics> fontMetrics;
SkAdvancedTypefaceMetrics::PerGlyphInfo info;
info = SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo;
info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
uint32_t* glyphs = (glyphIDs.count() == 1) ? NULL : glyphIDs.begin();
uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0;
- fontMetrics =
+ SkAutoTUnref<SkAdvancedTypefaceMetrics> fontMetrics(
SkFontHost::GetAdvancedTypefaceMetrics(
SkTypeface::UniqueID(typeface()),
info,
glyphs,
- glyphsCount);
- SkSafeUnref(fontMetrics.get()); // SkRefPtr and Get both took a ref
+ glyphsCount));
setFontInfo(fontMetrics.get());
addFontDescriptor(0, &glyphIDs);
} else {
@@ -1164,8 +1154,7 @@
SkASSERT(false);
}
- SkRefPtr<SkPDFDict> sysInfo = new SkPDFDict;
- sysInfo->unref(); // SkRefPtr and new both took a reference.
+ SkAutoTUnref<SkPDFDict> sysInfo(new SkPDFDict);
sysInfo->insert("Registry", new SkPDFString("Adobe"))->unref();
sysInfo->insert("Ordering", new SkPDFString("Identity"))->unref();
sysInfo->insertInt("Supplement", 0);
@@ -1173,11 +1162,10 @@
if (fontInfo()->fGlyphWidths.get()) {
int16_t defaultWidth = 0;
- SkRefPtr<SkPDFArray> widths =
+ SkAutoTUnref<SkPDFArray> widths(
composeAdvanceData(fontInfo()->fGlyphWidths.get(),
fontInfo()->fEmSize, &appendWidth,
- &defaultWidth);
- widths->unref(); // SkRefPtr and compose both took a reference.
+ &defaultWidth));
if (widths->size())
insert("W", widths.get());
if (defaultWidth != 0) {
@@ -1190,11 +1178,10 @@
defaultAdvance.fVerticalAdvance = 0;
defaultAdvance.fOriginXDisp = 0;
defaultAdvance.fOriginYDisp = 0;
- SkRefPtr<SkPDFArray> advances =
+ SkAutoTUnref<SkPDFArray> advances(
composeAdvanceData(fontInfo()->fVerticalMetrics.get(),
fontInfo()->fEmSize, &appendVerticalAdvance,
- &defaultAdvance);
- advances->unref(); // SkRefPtr and compose both took a ref.
+ &defaultAdvance));
if (advances->size())
insert("W2", advances.get());
if (defaultAdvance.fVerticalAdvance ||
@@ -1224,31 +1211,27 @@
SkPDFType1Font::~SkPDFType1Font() {}
bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) {
- SkRefPtr<SkPDFDict> descriptor = getFontDescriptor();
- if (descriptor.get() != NULL) {
- addResource(descriptor.get());
- descriptor->ref();
- insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref();
+ if (getFontDescriptor() != NULL) {
+ SkPDFDict* descriptor = getFontDescriptor();
+ addResource(descriptor);
+ insert("FontDescriptor", new SkPDFObjRef(descriptor))->unref();
return true;
}
- descriptor = new SkPDFDict("FontDescriptor");
- descriptor->unref(); // SkRefPtr and new both took a ref.
+ SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor"));
setFontDescriptor(descriptor.get());
size_t header SK_INIT_TO_AVOID_WARNING;
size_t data SK_INIT_TO_AVOID_WARNING;
size_t trailer SK_INIT_TO_AVOID_WARNING;
- SkRefPtr<SkStream> rawFontData =
- SkFontHost::OpenStream(SkTypeface::UniqueID(typeface()));
- rawFontData->unref(); // SkRefPtr and OpenStream both took a ref.
+ SkAutoTUnref<SkStream> rawFontData(
+ SkFontHost::OpenStream(SkTypeface::UniqueID(typeface())));
SkStream* fontData = handleType1Stream(rawFontData.get(), &header, &data,
&trailer);
if (fontData == NULL) {
return false;
}
- SkRefPtr<SkPDFStream> fontStream = new SkPDFStream(fontData);
- // SkRefPtr and new both ref()'d fontStream, pass one.
+ SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData));
addResource(fontStream.get());
fontStream->insertInt("Length1", header);
fontStream->insertInt("Length2", data);
@@ -1256,7 +1239,6 @@
descriptor->insert("FontFile", new SkPDFObjRef(fontStream.get()))->unref();
addResource(descriptor.get());
- descriptor->ref();
insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref();
return addCommonFontDescriptorEntries(defaultWidth);
@@ -1297,12 +1279,10 @@
addWidthInfoFromRange(defaultWidth, widthRangeEntry);
- SkRefPtr<SkPDFDict> encoding = new SkPDFDict("Encoding");
- encoding->unref(); // SkRefPtr and new both took a reference.
+ SkAutoTUnref<SkPDFDict> encoding(new SkPDFDict("Encoding"));
insert("Encoding", encoding.get());
- SkRefPtr<SkPDFArray> encDiffs = new SkPDFArray;
- encDiffs->unref(); // SkRefPtr and new both took a reference.
+ SkAutoTUnref<SkPDFArray> encDiffs(new SkPDFArray);
encoding->insert("Differences", encDiffs.get());
encDiffs->reserve(lastGlyphID() - firstGlyphID() + 2);
@@ -1317,8 +1297,7 @@
void SkPDFType1Font::addWidthInfoFromRange(
int16_t defaultWidth,
const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry) {
- SkRefPtr<SkPDFArray> widthArray = new SkPDFArray();
- widthArray->unref(); // SkRefPtr and new both took a ref.
+ SkAutoTUnref<SkPDFArray> widthArray(new SkPDFArray());
int firstChar = 0;
if (widthRangeEntry) {
const uint16_t emSize = fontInfo()->fEmSize;
@@ -1377,22 +1356,18 @@
fontMatrix.setScale(SkScalarInvert(1000), -SkScalarInvert(1000));
insert("FontMatrix", SkPDFUtils::MatrixToArray(fontMatrix))->unref();
- SkRefPtr<SkPDFDict> charProcs = new SkPDFDict;
- charProcs->unref(); // SkRefPtr and new both took a reference.
+ SkAutoTUnref<SkPDFDict> charProcs(new SkPDFDict);
insert("CharProcs", charProcs.get());
- SkRefPtr<SkPDFDict> encoding = new SkPDFDict("Encoding");
- encoding->unref(); // SkRefPtr and new both took a reference.
+ SkAutoTUnref<SkPDFDict> encoding(new SkPDFDict("Encoding"));
insert("Encoding", encoding.get());
- SkRefPtr<SkPDFArray> encDiffs = new SkPDFArray;
- encDiffs->unref(); // SkRefPtr and new both took a reference.
+ SkAutoTUnref<SkPDFArray> encDiffs(new SkPDFArray);
encoding->insert("Differences", encDiffs.get());
encDiffs->reserve(lastGlyphID() - firstGlyphID() + 2);
encDiffs->appendInt(1);
- SkRefPtr<SkPDFArray> widthArray = new SkPDFArray();
- widthArray->unref(); // SkRefPtr and new both took a ref.
+ SkAutoTUnref<SkPDFArray> widthArray(new SkPDFArray());
SkIRect bbox = SkIRect::MakeEmpty();
for (int gID = firstGlyphID(); gID <= lastGlyphID(); gID++) {
@@ -1415,13 +1390,11 @@
SkPDFUtils::PaintPath(paint.getStyle(), path->getFillType(),
&content);
}
- SkRefPtr<SkMemoryStream> glyphStream = new SkMemoryStream();
- glyphStream->unref(); // SkRefPtr and new both took a ref.
+ SkAutoTUnref<SkMemoryStream> glyphStream(new SkMemoryStream());
glyphStream->setData(content.copyToData())->unref();
- SkRefPtr<SkPDFStream> glyphDescription =
- new SkPDFStream(glyphStream.get());
- // SkRefPtr and new both ref()'d charProcs, pass one.
+ SkAutoTUnref<SkPDFStream> glyphDescription(
+ new SkPDFStream(glyphStream.get()));
addResource(glyphDescription.get());
charProcs->insert(characterName.c_str(),
new SkPDFObjRef(glyphDescription.get()))->unref();