Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(949)

Unified Diff: src/pdf/SkPDFFont.cpp

Issue 340783013: Switch SkPDFStream's internal storage from SkStream to SkData (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: AnotherPatchSet Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/pdf/SkPDFFont.cpp
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
index 014b328030c4e0baa0eacff09150fe510f583264..50330451b52924aa2130d099e5c5411f11f2ace4 100644
--- a/src/pdf/SkPDFFont.cpp
+++ b/src/pdf/SkPDFFont.cpp
@@ -150,8 +150,8 @@ int8_t hexToBin(uint8_t c) {
return -1;
}
-SkStream* handleType1Stream(SkStream* srcStream, size_t* headerLen,
- size_t* dataLen, size_t* trailerLen) {
+static SkData* handle_type1_stream(SkStream* srcStream, size_t* headerLen,
+ size_t* dataLen, size_t* trailerLen) {
// srcStream may be backed by a file or a unseekable fd, so we may not be
// able to use skip(), rewind(), or getMemoryBase(). read()ing through
// the input only once is doable, but very ugly. Furthermore, it'd be nice
@@ -199,26 +199,40 @@ SkStream* handleType1Stream(SkStream* srcStream, size_t* headerLen,
SkAutoDataUnref aud(data);
if (parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) {
- SkMemoryStream* result =
- new SkMemoryStream(*headerLen + *dataLen + *trailerLen);
- memcpy((char*)result->getAtPos(), src + 6, *headerLen);
- result->seek(*headerLen);
- memcpy((char*)result->getAtPos(), src + 6 + *headerLen + 6, *dataLen);
- result->seek(*headerLen + *dataLen);
- memcpy((char*)result->getAtPos(), src + 6 + *headerLen + 6 + *dataLen,
- *trailerLen);
- result->rewind();
- return result;
+ static const int pfbSectionHeaderLength = 6;
mtklein 2014/06/26 13:21:59 kPFBSectionHeaderLength? I started panicking that
hal.canary 2014/06/26 18:42:02 On 2014/06/26 13:21:59, mtklein wrote: > kPFBSecti
+ const size_t length = *headerLen + *dataLen + *trailerLen;
+ SkASSERT(length > 0);
+ SkASSERT(length + (2 * pfbSectionHeaderLength) <= srcLen);
+ SkAutoMalloc buffer(length);
+
+ const uint8_t* const srcHeader = src + pfbSectionHeaderLength;
mtklein 2014/06/26 13:21:59 I admire your attention to constness, but it's pro
mtklein 2014/06/26 13:21:59 // There is a six-byte section header before heade
hal.canary 2014/06/26 18:42:02 Done.
hal.canary 2014/06/26 18:42:02 Done.
+ const uint8_t* const srcData
+ = srcHeader + *headerLen + pfbSectionHeaderLength;
+ const uint8_t* const srcTrailer = srcData + *headerLen;
+
+ uint8_t* const resultHeader = static_cast<uint8_t*>(buffer.get());
+ uint8_t* const resultData = resultHeader + *headerLen;
+ uint8_t* const resultTrailer = resultData + *dataLen;
+
+ SkASSERT(resultTrailer + *trailerLen == resultHeader + length);
+
+ memcpy(resultHeader, srcHeader, *headerLen);
+ memcpy(resultData, srcData, *dataLen);
+ memcpy(resultTrailer, srcTrailer, *trailerLen);
+
+ return SkData::NewFromMalloc(buffer.detach(), length);
}
// A PFA has to be converted for PDF.
size_t hexDataLen;
if (parsePFA((const char*)src, srcLen, headerLen, &hexDataLen, dataLen,
trailerLen)) {
- SkMemoryStream* result =
- new SkMemoryStream(*headerLen + *dataLen + *trailerLen);
- memcpy((char*)result->getAtPos(), src, *headerLen);
- result->seek(*headerLen);
+ const size_t length = *headerLen + *dataLen + *trailerLen;
+ SkASSERT(length > 0);
+ SkAutoMalloc buffer(length);
+ char* const result = static_cast<char*>(buffer.get());
+ memcpy(result, src, *headerLen);
+ char* const resultData = &(result[*headerLen]);
const uint8_t* hexData = src + *headerLen;
const uint8_t* trailer = hexData + hexDataLen;
@@ -236,21 +250,19 @@ SkStream* handleType1Stream(SkStream* srcStream, size_t* headerLen,
} else {
dataByte |= curNibble;
highNibble = true;
- ((char *)result->getAtPos())[outputOffset++] = dataByte;
+ resultData[outputOffset++] = dataByte;
}
}
if (!highNibble) {
- ((char *)result->getAtPos())[outputOffset++] = dataByte;
+ resultData[outputOffset++] = dataByte;
}
SkASSERT(outputOffset == *dataLen);
- result->seek(*headerLen + outputOffset);
- memcpy((char *)result->getAtPos(), src + *headerLen + hexDataLen,
- *trailerLen);
- result->rewind();
- return result;
- }
+ char* const resultTrailer = &(result[*headerLen + outputOffset]);
+ memcpy(resultTrailer, src + *headerLen + hexDataLen, *trailerLen);
+ return SkData::NewFromMalloc(buffer.detach(), length);
+ }
return NULL;
}
@@ -556,9 +568,8 @@ static SkPDFStream* generate_tounicode_cmap(
append_cmap_sections(glyphToUnicode, subset, &cmap, multiByteGlyphs,
firstGlyphID, lastGlyphID);
append_cmap_footer(&cmap);
- SkAutoTUnref<SkMemoryStream> cmapStream(new SkMemoryStream());
- cmapStream->setData(cmap.copyToData())->unref();
- return new SkPDFStream(cmapStream.get());
+ SkAutoTUnref<SkData> cmapData(cmap.copyToData());
+ return new SkPDFStream(cmapData.get());
}
#if defined (SK_SFNTLY_SUBSETTER)
@@ -574,6 +585,7 @@ static size_t get_subset_font_stream(const char* fontName,
SkPDFStream** fontStream) {
int ttcIndex;
SkAutoTUnref<SkStream> fontData(typeface->openStream(&ttcIndex));
+ SkASSERT(fontData.get());
size_t fontSize = fontData->getLength();
@@ -1295,7 +1307,7 @@ bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) {
size_t data SK_INIT_TO_AVOID_WARNING;
size_t trailer SK_INIT_TO_AVOID_WARNING;
SkAutoTUnref<SkStream> rawFontData(typeface()->openStream(&ttcIndex));
- SkStream* fontData = handleType1Stream(rawFontData.get(), &header, &data,
+ SkData* fontData = handle_type1_stream(rawFontData.get(), &header, &data,
&trailer);
if (fontData == NULL) {
return false;
« no previous file with comments | « gyp/pdf.gyp ('k') | src/pdf/SkPDFGraphicState.cpp » ('j') | src/pdf/SkPDFGraphicState.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698