Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Functions
SkPDFMakeToUnicodeCmap.h File Reference
#include "include/core/SkStream.h"
#include "src/pdf/SkPDFFont.h"

Go to the source code of this file.

Functions

std::unique_ptr< SkStreamAssetSkPDFMakeToUnicodeCmap (const SkUnichar *glyphToUnicode, const SkPDFGlyphUse *subset, bool multiByteGlyphs, SkGlyphID firstGlyphID, SkGlyphID lastGlyphID)
 
void SkPDFAppendCmapSections (const SkUnichar *glyphToUnicode, const SkPDFGlyphUse *subset, SkDynamicMemoryWStream *cmap, bool multiByteGlyphs, SkGlyphID firstGlyphID, SkGlyphID lastGlyphID)
 

Function Documentation

◆ SkPDFAppendCmapSections()

void SkPDFAppendCmapSections ( const SkUnichar glyphToUnicode,
const SkPDFGlyphUse subset,
SkDynamicMemoryWStream cmap,
bool  multiByteGlyphs,
SkGlyphID  firstGlyphID,
SkGlyphID  lastGlyphID 
)

Definition at line 152 of file SkPDFMakeToUnicodeCmap.cpp.

157 {
158 int glyphOffset = 0;
159 if (!multiByteGlyphs) {
160 glyphOffset = firstGlyphID - 1;
161 }
162
163 std::vector<BFChar> bfcharEntries;
164 std::vector<BFRange> bfrangeEntries;
165
166 BFRange currentRangeEntry = {0, 0, 0};
167 bool rangeEmpty = true;
168 const int limit = (int)lastGlyphID + 1 - glyphOffset;
169
170 for (int i = firstGlyphID - glyphOffset; i < limit + 1; ++i) {
171 SkGlyphID gid = i + glyphOffset;
172 bool inSubset = i < limit && (subset == nullptr || subset->has(gid));
173 if (!rangeEmpty) {
174 // PDF spec requires bfrange not changing the higher byte,
175 // e.g. <1035> <10FF> <2222> is ok, but
176 // <1035> <1100> <2222> is no good
177 bool inRange =
178 i == currentRangeEntry.fEnd + 1 &&
179 i >> 8 == currentRangeEntry.fStart >> 8 &&
180 i < limit &&
181 glyphToUnicode[gid] ==
182 currentRangeEntry.fUnicode + i - currentRangeEntry.fStart;
183 if (!inSubset || !inRange) {
184 if (currentRangeEntry.fEnd > currentRangeEntry.fStart) {
185 bfrangeEntries.push_back(currentRangeEntry);
186 } else {
187 bfcharEntries.push_back({currentRangeEntry.fStart, currentRangeEntry.fUnicode});
188 }
189 rangeEmpty = true;
190 }
191 }
192 if (inSubset) {
193 currentRangeEntry.fEnd = i;
194 if (rangeEmpty) {
195 currentRangeEntry.fStart = i;
196 currentRangeEntry.fUnicode = glyphToUnicode[gid];
197 rangeEmpty = false;
198 }
199 }
200 }
201
202 // The spec requires all bfchar entries for a font must come before bfrange
203 // entries.
204 append_bfchar_section(bfcharEntries, multiByteGlyphs, cmap);
205 append_bfrange_section(bfrangeEntries, multiByteGlyphs, cmap);
206}
static void append_bfrange_section(const std::vector< BFRange > &bfrange, bool multiByte, SkDynamicMemoryWStream *cmap)
static void append_bfchar_section(const std::vector< BFChar > &bfchar, bool multiByte, SkDynamicMemoryWStream *cmap)
uint16_t SkGlyphID
Definition SkTypes.h:179
Type::kYUV Type::kRGBA() int(0.7 *637)
bool has(SkGlyphID gid) const

◆ SkPDFMakeToUnicodeCmap()

std::unique_ptr< SkStreamAsset > SkPDFMakeToUnicodeCmap ( const SkUnichar glyphToUnicode,
const SkPDFGlyphUse subset,
bool  multiByteGlyphs,
SkGlyphID  firstGlyphID,
SkGlyphID  lastGlyphID 
)

Definition at line 208 of file SkPDFMakeToUnicodeCmap.cpp.

213 {
215 append_tounicode_header(&cmap, multiByteGlyphs);
216 SkPDFAppendCmapSections(glyphToUnicode, subset, &cmap, multiByteGlyphs,
217 firstGlyphID, lastGlyphID);
218 append_cmap_footer(&cmap);
219 return cmap.detachAsStream();
220}
static void append_cmap_footer(SkDynamicMemoryWStream *cmap)
static void append_tounicode_header(SkDynamicMemoryWStream *cmap, bool multibyte)
void SkPDFAppendCmapSections(const SkUnichar *glyphToUnicode, const SkPDFGlyphUse *subset, SkDynamicMemoryWStream *cmap, bool multiByteGlyphs, SkGlyphID firstGlyphID, SkGlyphID lastGlyphID)
std::unique_ptr< SkStreamAsset > detachAsStream()
Definition SkStream.cpp:876