diff options
author | halcanary <halcanary@google.com> | 2016-07-15 13:35:45 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-07-15 13:35:45 -0700 |
commit | f0c30f55665eb3555ca438855d4995baed182e97 (patch) | |
tree | 896acac41e9120759e191354d3476df9450ccfd7 /src/pdf/SkPDFUtils.h | |
parent | 39f988eb415bd697ce11933ca2a341ae6fbf9030 (diff) |
SkPDF: Join Positioned Text
When N sequential positioned glyphs differ in positions by exactly the
advances of the first (N-1) glyphs, join the glyphs into a string
rather than changing the text matrix between each glyph draw.
Decreases PDF output size by about ~1.4%. Potentially more on
text-heavy pages.
A single-typeface PDF of an 27kB ASCII document shaped with harfbuzz:
before: 187743 Bytes
after: 65513 Bytes
difference: -65.1%
Before:
BT
/F0 13 Tf
1 0 0 -1 143.5 61 Tm
<0029> Tj
1 0 0 -1 150.634765 61 Tm
<004C> Tj
1 0 0 -1 154.602050 61 Tm
<0055> Tj
1 0 0 -1 160.245117 61 Tm
<0048> Tj
1 0 0 -1 167.925781 61 Tm
<004B> Tj
1 0 0 -1 176.469726 61 Tm
<0052> Tj
1 0 0 -1 184.518554 61 Tm
<0056> Tj
1 0 0 -1 190.980468 61 Tm
<0048> Tj
ET
After:
BT
/F0 13 Tf
1 0 0 -1 0 0 Tm
143.5 -61 Td <0029004C0055> Tj
16.7451171 0 Td <0048004B005200560048> Tj
ET
Also: update the Text matrix with the `Td` operator, instead of
overwriting it with the the `Tm` operator. In the worst case, when
every glyph is positioned differently than it's advance, this still
makes the command stream smaller:
Before:
...
1 0 0 -1 58.328125 660 Tm <0055> Tj
1 0 0 -1 61.609375 660 Tm <004C> Tj
1 0 0 -1 63.828125 660 Tm <0056> Tj
...
After:
...
3.140625 0 Td <0055> Tj
3.28125 0 Td <004C> Tj
2.21875 0 Td <0056> Tj
...
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2150393002
Review-Url: https://codereview.chromium.org/2150393002
Diffstat (limited to 'src/pdf/SkPDFUtils.h')
-rw-r--r-- | src/pdf/SkPDFUtils.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/pdf/SkPDFUtils.h b/src/pdf/SkPDFUtils.h index 124e199614..3ddd3d0933 100644 --- a/src/pdf/SkPDFUtils.h +++ b/src/pdf/SkPDFUtils.h @@ -76,6 +76,13 @@ inline void WriteUInt16BE(SkDynamicMemoryWStream* wStream, uint16_t value) { result[3] = gHex[0xF & (value )]; wStream->write(result, 4); } +inline void WriteUInt8(SkDynamicMemoryWStream* wStream, uint8_t value) { + static const char gHex[] = "0123456789ABCDEF"; + char result[2]; + result[0] = gHex[value >> 4 ]; + result[1] = gHex[0xF & value]; + wStream->write(result, 2); +} } // namespace SkPDFUtils |