gecko-dev/gfx/ots/ots-graphite.patch

132 lines
4.6 KiB
Diff
Raw Normal View History

diff --git a/gfx/ots/include/opentype-sanitiser.h b/gfx/ots/include/opentype-sanitiser.h
--- a/gfx/ots/include/opentype-sanitiser.h
+++ b/gfx/ots/include/opentype-sanitiser.h
@@ -176,18 +176,20 @@ class OTSStream {
// -----------------------------------------------------------------------------
// Process a given OpenType file and write out a sanitised version
// output: a pointer to an object implementing the OTSStream interface. The
// sanitisied output will be written to this. In the even of a failure,
// partial output may have been written.
// input: the OpenType file
// length: the size, in bytes, of |input|
+// preserve_graphite_tables: whether to preserve Graphite Layout tables
// -----------------------------------------------------------------------------
-bool Process(OTSStream *output, const uint8_t *input, size_t length);
+bool Process(OTSStream *output, const uint8_t *input, size_t length,
+ bool preserve_graphite_tables = false);
// Force to disable debug output even when the library is compiled with
// -DOTS_DEBUG.
void DisableDebugOutput();
} // namespace ots
#endif // OPENTYPE_SANITISER_H_
diff --git a/gfx/ots/src/ots.cc b/gfx/ots/src/ots.cc
--- a/gfx/ots/src/ots.cc
+++ b/gfx/ots/src/ots.cc
@@ -138,16 +138,27 @@ const struct {
{ "GPOS", ots::ots_gpos_parse, ots::ots_gpos_serialise,
ots::ots_gpos_should_serialise, ots::ots_gpos_free, false },
{ "GSUB", ots::ots_gsub_parse, ots::ots_gsub_serialise,
ots::ots_gsub_should_serialise, ots::ots_gsub_free, false },
{ "vhea", ots::ots_vhea_parse, ots::ots_vhea_serialise,
ots::ots_vhea_should_serialise, ots::ots_vhea_free, false },
{ "vmtx", ots::ots_vmtx_parse, ots::ots_vmtx_serialise,
ots::ots_vmtx_should_serialise, ots::ots_vmtx_free, false },
+ // SILGraphite layout tables - not actually parsed, just copied
+ { "Silf", ots::ots_silf_parse, ots::ots_silf_serialise,
+ ots::ots_silf_should_serialise, ots::ots_silf_free, false },
+ { "Sill", ots::ots_sill_parse, ots::ots_sill_serialise,
+ ots::ots_sill_should_serialise, ots::ots_sill_free, false },
+ { "Gloc", ots::ots_gloc_parse, ots::ots_gloc_serialise,
+ ots::ots_gloc_should_serialise, ots::ots_gloc_free, false },
+ { "Glat", ots::ots_glat_parse, ots::ots_glat_serialise,
+ ots::ots_glat_should_serialise, ots::ots_glat_free, false },
+ { "Feat", ots::ots_feat_parse, ots::ots_feat_serialise,
+ ots::ots_feat_should_serialise, ots::ots_feat_free, false },
// TODO(bashi): Support mort, base, and jstf tables.
{ 0, NULL, NULL, NULL, NULL, false },
};
bool IsValidVersionTag(uint32_t tag) {
return tag == Tag("\x00\x01\x00\x00") ||
// OpenType fonts with CFF data have 'OTTO' tag.
tag == Tag("OTTO") ||
@@ -581,22 +592,25 @@ bool ProcessGeneric(ots::OpenTypeFile *h
} // namespace
namespace ots {
void DisableDebugOutput() {
g_debug_output = false;
}
-bool Process(OTSStream *output, const uint8_t *data, size_t length) {
+bool Process(OTSStream *output, const uint8_t *data, size_t length,
+ bool preserveGraphite) {
OpenTypeFile header;
if (length < 4) {
return OTS_FAILURE();
}
+ header.preserve_graphite = preserveGraphite;
+
bool result;
if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == 'F') {
result = ProcessWOFF(&header, output, data, length);
} else {
result = ProcessTTF(&header, output, data, length);
}
for (unsigned i = 0; ; ++i) {
diff --git a/gfx/ots/src/ots.h b/gfx/ots/src/ots.h
--- a/gfx/ots/src/ots.h
+++ b/gfx/ots/src/ots.h
@@ -178,17 +178,22 @@ class Buffer {
F(maxp, MAXP) \
F(name, NAME) \
F(os2, OS2) \
F(post, POST) \
F(prep, PREP) \
F(vdmx, VDMX) \
F(vorg, VORG) \
F(vhea, VHEA) \
- F(vmtx, VMTX)
+ F(vmtx, VMTX) \
+ F(silf, SILF) \
+ F(sill, SILL) \
+ F(glat, GLAT) \
+ F(gloc, GLOC) \
+ F(feat, FEAT)
#define F(name, capname) struct OpenType##capname;
FOR_EACH_TABLE_TYPE
#undef F
struct OpenTypeFile {
OpenTypeFile() {
#define F(name, capname) name = NULL;
@@ -197,16 +202,20 @@ struct OpenTypeFile {
}
uint32_t version;
uint16_t num_tables;
uint16_t search_range;
uint16_t entry_selector;
uint16_t range_shift;
+ // This is used to tell the relevant parsers whether to preserve the
+ // Graphite layout tables (currently _without_ any checking)
+ bool preserve_graphite;
+
#define F(name, capname) OpenType##capname *name;
FOR_EACH_TABLE_TYPE
#undef F
};
#define F(name, capname) \
bool ots_##name##_parse(OpenTypeFile *f, const uint8_t *d, size_t l); \
bool ots_##name##_should_serialise(OpenTypeFile *f); \