Chromium Code Reviews| Index: src/pdf/SkPDFFont.cpp |
| diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp |
| index 014b328030c4e0baa0eacff09150fe510f583264..33b4cff5e8f921282643935d99dfc4fe80bd490d 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* handleType1Stream(SkStream* srcStream, size_t* headerLen, |
|
mtklein
2014/06/25 18:12:31
-> handle_type1_stream
hal.canary
2014/06/25 18:56:26
Done.
|
| + 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,28 @@ 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, |
| + const size_t length = *headerLen + *dataLen + *trailerLen; |
| + SkASSERT(length > 0); |
| + SkAutoMalloc buffer(length); |
| + char* const result = static_cast<char*>(buffer.get()); |
| + memcpy(result, src + 6, *headerLen); |
|
mtklein
2014/06/25 18:12:31
Just pass buffer.get() into each of these?
|
| + memcpy(result + *headerLen, src + 6 + *headerLen + 6, *dataLen); |
| + memcpy(result + (*headerLen + *dataLen), |
|
mtklein
2014/06/25 18:12:31
This whole area is really hard to follow. Diagra
|
| + src + 6 + *headerLen + 6 + *dataLen, |
| *trailerLen); |
| - result->rewind(); |
| - return result; |
| + 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); |
|
mtklein
2014/06/25 18:12:31
Just start with SkAutoTMalloc<char> if you want ch
hal.canary
2014/06/25 18:56:26
SkAutoTMalloc uses SK_MALLOC_TEMP, which is not wh
mtklein
2014/06/26 13:21:59
Let's ignore that. SK_MALLOC_TEMP doesn't do anyt
|
| + 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 +238,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 +556,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()); |
|
mtklein
2014/06/25 18:12:31
Remind me why this is not
return new SkPDFStream(
hal.canary
2014/06/25 18:56:26
The SkPDFStream constructor refs the data.
mtklein
2014/06/26 13:21:59
Add a comment?
|
| } |
| #if defined (SK_SFNTLY_SUBSETTER) |
| @@ -574,6 +573,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,8 +1295,8 @@ 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, |
| - &trailer); |
| + SkData* fontData = handleType1Stream(rawFontData.get(), &header, &data, |
| + &trailer); |
| if (fontData == NULL) { |
| return false; |
| } |