Merge pull request #14882 from Snuffleupagus/issue-14881
Add support for TrueType format 12 `cmap`s (issue 14881)
This commit is contained in:
commit
f8838eb794
@ -1499,14 +1499,14 @@ class Font {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const format = file.getUint16();
|
const format = file.getUint16();
|
||||||
file.skip(2 + 2); // length + language
|
|
||||||
|
|
||||||
let hasShortCmap = false;
|
let hasShortCmap = false;
|
||||||
const mappings = [];
|
const mappings = [];
|
||||||
let j, glyphId;
|
let j, glyphId;
|
||||||
|
|
||||||
// TODO(mack): refactor this cmap subtable reading logic out
|
// TODO(mack): refactor this cmap subtable reading logic out
|
||||||
if (format === 0) {
|
if (format === 0) {
|
||||||
|
file.skip(2 + 2); // length + language
|
||||||
|
|
||||||
for (j = 0; j < 256; j++) {
|
for (j = 0; j < 256; j++) {
|
||||||
const index = file.getByte();
|
const index = file.getByte();
|
||||||
if (!index) {
|
if (!index) {
|
||||||
@ -1519,6 +1519,8 @@ class Font {
|
|||||||
}
|
}
|
||||||
hasShortCmap = true;
|
hasShortCmap = true;
|
||||||
} else if (format === 2) {
|
} else if (format === 2) {
|
||||||
|
file.skip(2 + 2); // length + language
|
||||||
|
|
||||||
const subHeaderKeys = [];
|
const subHeaderKeys = [];
|
||||||
let maxSubHeaderKey = 0;
|
let maxSubHeaderKey = 0;
|
||||||
// Read subHeaderKeys. If subHeaderKeys[i] === 0, then i is a
|
// Read subHeaderKeys. If subHeaderKeys[i] === 0, then i is a
|
||||||
@ -1568,6 +1570,8 @@ class Font {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (format === 4) {
|
} else if (format === 4) {
|
||||||
|
file.skip(2 + 2); // length + language
|
||||||
|
|
||||||
// re-creating the table in format 4 since the encoding
|
// re-creating the table in format 4 since the encoding
|
||||||
// might be changed
|
// might be changed
|
||||||
const segCount = file.getUint16() >> 1;
|
const segCount = file.getUint16() >> 1;
|
||||||
@ -1630,6 +1634,8 @@ class Font {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (format === 6) {
|
} else if (format === 6) {
|
||||||
|
file.skip(2 + 2); // length + language
|
||||||
|
|
||||||
// Format 6 is a 2-bytes dense mapping, which means the font data
|
// Format 6 is a 2-bytes dense mapping, which means the font data
|
||||||
// lives glue together even if they are pretty far in the unicode
|
// lives glue together even if they are pretty far in the unicode
|
||||||
// table. (This looks weird, so I can have missed something), this
|
// table. (This looks weird, so I can have missed something), this
|
||||||
@ -1647,6 +1653,26 @@ class Font {
|
|||||||
glyphId,
|
glyphId,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
} else if (format === 12) {
|
||||||
|
file.skip(2 + 4 + 4); // reserved + length + language
|
||||||
|
|
||||||
|
const nGroups = file.getInt32() >>> 0;
|
||||||
|
for (j = 0; j < nGroups; j++) {
|
||||||
|
const startCharCode = file.getInt32() >>> 0;
|
||||||
|
const endCharCode = file.getInt32() >>> 0;
|
||||||
|
let glyphCode = file.getInt32() >>> 0;
|
||||||
|
|
||||||
|
for (
|
||||||
|
let charCode = startCharCode;
|
||||||
|
charCode <= endCharCode;
|
||||||
|
charCode++
|
||||||
|
) {
|
||||||
|
mappings.push({
|
||||||
|
charCode,
|
||||||
|
glyphId: glyphCode++,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
warn("cmap table has unsupported format: " + format);
|
warn("cmap table has unsupported format: " + format);
|
||||||
return {
|
return {
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -18,6 +18,7 @@
|
|||||||
!issue2391-2.pdf
|
!issue2391-2.pdf
|
||||||
!issue14046.pdf
|
!issue14046.pdf
|
||||||
!issue7891_bc1.pdf
|
!issue7891_bc1.pdf
|
||||||
|
!issue14881.pdf
|
||||||
!issue3214.pdf
|
!issue3214.pdf
|
||||||
!issue4665.pdf
|
!issue4665.pdf
|
||||||
!issue4684.pdf
|
!issue4684.pdf
|
||||||
|
BIN
test/pdfs/issue14881.pdf
Normal file
BIN
test/pdfs/issue14881.pdf
Normal file
Binary file not shown.
@ -4630,6 +4630,12 @@
|
|||||||
"password": "\u00E6\u00F8\u00E5",
|
"password": "\u00E6\u00F8\u00E5",
|
||||||
"about": "The password (æøå) is UTF8 encoded."
|
"about": "The password (æøå) is UTF8 encoded."
|
||||||
},
|
},
|
||||||
|
{ "id": "issue14881",
|
||||||
|
"file": "pdfs/issue14881.pdf",
|
||||||
|
"md5": "1aa3f2c7929eaf4502fcf6488ff31b5f",
|
||||||
|
"rounds": 1,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "High-Pressure-Measurement-WP-001287",
|
{ "id": "High-Pressure-Measurement-WP-001287",
|
||||||
"file": "pdfs/High-Pressure-Measurement-WP-001287.pdf",
|
"file": "pdfs/High-Pressure-Measurement-WP-001287.pdf",
|
||||||
"md5": "aeba7e47bbe50cbf08bb8bdff78fec8c",
|
"md5": "aeba7e47bbe50cbf08bb8bdff78fec8c",
|
||||||
|
Loading…
Reference in New Issue
Block a user