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

Unified Diff: src/pdf/SkPDFDevice.cpp

Issue 2099463002: SkPDF: alloc less memory for strings (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2016-06-23 (Thursday) 16:23:34 EDT Created 4 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/SkPDFDevice.cpp
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 5b4ae93504c859d6ad37c673682663be19edc93e..b9e310d84650dc18d1439384202ba2bc4243d574 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1067,30 +1067,32 @@ void SkPDFDevice::drawImageRect(const SkDraw& draw,
// discarded. If true, the upper byte is encoded
// first. Otherwise, we assert the upper byte is
// zero.
-static SkString format_wide_string(const uint16_t* input,
- size_t len,
- bool wideChars) {
+static void write_wide_string(SkDynamicMemoryWStream* wStream,
+ const uint16_t* input,
+ size_t len,
+ bool wideChars) {
if (wideChars) {
SkASSERT(2 * len < 65535);
static const char gHex[] = "0123456789ABCDEF";
- SkString result(4 * len + 2);
- result[0] = '<';
+ wStream->writeText("<");
for (size_t i = 0; i < len; i++) {
- result[4 * i + 1] = gHex[(input[i] >> 12) & 0xF];
- result[4 * i + 2] = gHex[(input[i] >> 8) & 0xF];
- result[4 * i + 3] = gHex[(input[i] >> 4) & 0xF];
- result[4 * i + 4] = gHex[(input[i] ) & 0xF];
+ char result[4]; // Big-endian
+ result[0] = gHex[(input[i] >> 12) & 0xF];
+ result[1] = gHex[(input[i] >> 8) & 0xF];
+ result[2] = gHex[(input[i] >> 4) & 0xF];
+ result[3] = gHex[(input[i]) & 0xF];
+ wStream->write(result, 4);
}
- result[4 * len + 1] = '>';
- return result;
+ wStream->writeText(">");
} else {
SkASSERT(len <= 65535);
- SkString tmp(len);
+ SkAutoMalloc buffer(len); // Remove every other byte.
tomhudson 2016/06/23 20:39:11 Seems like you haven't gotten rid of the allocatio
hal.canary 2016/06/23 20:57:12 Before, I had TWO allocations. Can you see an eas
tomhudson 2016/06/23 21:03:51 The wideChars section avoids it, but I'd suggest w
+ uint8_t* ptr = (uint8_t*)buffer.get();
for (size_t i = 0; i < len; i++) {
SkASSERT(0 == input[i] >> 8);
- tmp[i] = static_cast<uint8_t>(input[i]);
+ ptr[i] = static_cast<uint8_t>(input[i]);
}
- return SkPDFUtils::FormatString(tmp.c_str(), tmp.size());
+ SkPDFUtils::WriteString(wStream, (char*)buffer.get(), len);
}
}
@@ -1184,10 +1186,9 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len,
fFontGlyphUsage->noteGlyphUsage(
font, glyphIDsCopy.begin() + consumedGlyphCount,
availableGlyphs);
- SkString encodedString =
- format_wide_string(glyphIDsCopy.begin() + consumedGlyphCount,
- availableGlyphs, font->multiByteGlyphs());
- content.entry()->fContent.writeText(encodedString.c_str());
+ write_wide_string(&content.entry()->fContent,
+ glyphIDsCopy.begin() + consumedGlyphCount,
+ availableGlyphs, font->multiByteGlyphs());
consumedGlyphCount += availableGlyphs;
content.entry()->fContent.writeText(" Tj\n");
}
@@ -1264,9 +1265,8 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len,
align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y);
set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fContent);
- SkString encodedString =
- format_wide_string(&encodedValue, 1, font->multiByteGlyphs());
- content.entry()->fContent.writeText(encodedString.c_str());
+ write_wide_string(&content.entry()->fContent, &encodedValue, 1,
+ font->multiByteGlyphs());
content.entry()->fContent.writeText(" Tj\n");
}
content.entry()->fContent.writeText("ET\n");
« bench/PDFBench.cpp ('K') | « bench/PDFBench.cpp ('k') | src/pdf/SkPDFTypes.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698