From e1c55869f37bf7c5f365fddc38207dc3ec336b6c Mon Sep 17 00:00:00 2001 From: rmistry Date: Thu, 26 Jun 2014 14:31:06 -0700 Subject: Revert of Switch SkPDFStream's internal storage from SkStream to SkData (https://codereview.chromium.org/340783013/) Reason for revert: Causes canary failures Original issue's description: > Switch SkPDFStream's internal storage from SkStream to SkData > > Motivation: This makes SkPDFStream thread-safe for two threads > serializing it at once, since a SkStream has an internal position. > > Updated SkPDFFont, SkPDFGraphicState, and SkPDFPage's use of > SkPDFStream to use the SkData constructor rather than the SkStream > constructor (saving a memcpy). > > BUG=skia:2683 > > Committed: https://skia.googlesource.com/skia/+/c1dfa14b645ae274780f026dd86c9b633fbdad06 R=mtklein@google.com, djsollen@google.com, halcanary@google.com TBR=djsollen@google.com, halcanary@google.com, mtklein@google.com NOTREECHECKS=true NOTRY=true BUG=skia:2683 Author: rmistry@google.com Review URL: https://codereview.chromium.org/354043005 --- src/pdf/SkPDFFont.cpp | 71 ++++++++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 43 deletions(-) (limited to 'src/pdf/SkPDFFont.cpp') diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index aa4b4b5534..014b328030 100644 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp @@ -150,8 +150,8 @@ int8_t hexToBin(uint8_t c) { return -1; } -static SkData* handle_type1_stream(SkStream* srcStream, size_t* headerLen, - size_t* dataLen, size_t* trailerLen) { +SkStream* handleType1Stream(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,43 +199,26 @@ static SkData* handle_type1_stream(SkStream* srcStream, size_t* headerLen, SkAutoDataUnref aud(data); if (parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) { - static const int kPFBSectionHeaderLength = 6; - const size_t length = *headerLen + *dataLen + *trailerLen; - SkASSERT(length > 0); - SkASSERT(length + (2 * kPFBSectionHeaderLength) <= srcLen); - - SkAutoTMalloc buffer(length); - - const uint8_t* const srcHeader = src + kPFBSectionHeaderLength; - // There is a six-byte section header before header and data - // (but not trailer) that we're not going to copy. - const uint8_t* const srcData - = srcHeader + *headerLen + kPFBSectionHeaderLength; - const uint8_t* const srcTrailer = srcData + *headerLen; - - uint8_t* const resultHeader = 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); + 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; } // A PFA has to be converted for PDF. size_t hexDataLen; if (parsePFA((const char*)src, srcLen, headerLen, &hexDataLen, dataLen, trailerLen)) { - const size_t length = *headerLen + *dataLen + *trailerLen; - SkASSERT(length > 0); - SkAutoTMalloc buffer(length); - - memcpy(buffer.get(), src, *headerLen); - uint8_t* const resultData = &(buffer[*headerLen]); + SkMemoryStream* result = + new SkMemoryStream(*headerLen + *dataLen + *trailerLen); + memcpy((char*)result->getAtPos(), src, *headerLen); + result->seek(*headerLen); const uint8_t* hexData = src + *headerLen; const uint8_t* trailer = hexData + hexDataLen; @@ -253,19 +236,21 @@ static SkData* handle_type1_stream(SkStream* srcStream, size_t* headerLen, } else { dataByte |= curNibble; highNibble = true; - resultData[outputOffset++] = dataByte; + ((char *)result->getAtPos())[outputOffset++] = dataByte; } } if (!highNibble) { - resultData[outputOffset++] = dataByte; + ((char *)result->getAtPos())[outputOffset++] = dataByte; } SkASSERT(outputOffset == *dataLen); + result->seek(*headerLen + outputOffset); - uint8_t* const resultTrailer = &(buffer[*headerLen + outputOffset]); - memcpy(resultTrailer, src + *headerLen + hexDataLen, *trailerLen); - - return SkData::NewFromMalloc(buffer.detach(), length); + memcpy((char *)result->getAtPos(), src + *headerLen + hexDataLen, + *trailerLen); + result->rewind(); + return result; } + return NULL; } @@ -571,8 +556,9 @@ static SkPDFStream* generate_tounicode_cmap( append_cmap_sections(glyphToUnicode, subset, &cmap, multiByteGlyphs, firstGlyphID, lastGlyphID); append_cmap_footer(&cmap); - SkAutoTUnref cmapData(cmap.copyToData()); - return new SkPDFStream(cmapData.get()); + SkAutoTUnref cmapStream(new SkMemoryStream()); + cmapStream->setData(cmap.copyToData())->unref(); + return new SkPDFStream(cmapStream.get()); } #if defined (SK_SFNTLY_SUBSETTER) @@ -588,7 +574,6 @@ static size_t get_subset_font_stream(const char* fontName, SkPDFStream** fontStream) { int ttcIndex; SkAutoTUnref fontData(typeface->openStream(&ttcIndex)); - SkASSERT(fontData.get()); size_t fontSize = fontData->getLength(); @@ -1310,7 +1295,7 @@ bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { size_t data SK_INIT_TO_AVOID_WARNING; size_t trailer SK_INIT_TO_AVOID_WARNING; SkAutoTUnref rawFontData(typeface()->openStream(&ttcIndex)); - SkData* fontData = handle_type1_stream(rawFontData.get(), &header, &data, + SkStream* fontData = handleType1Stream(rawFontData.get(), &header, &data, &trailer); if (fontData == NULL) { return false; -- cgit v1.2.3