summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/table/otl/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/table/otl/dump.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/table/otl/dump.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/table/otl/dump.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/table/otl/dump.c
new file mode 100644
index 00000000000..60d5f99b282
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/table/otl/dump.c
@@ -0,0 +1,87 @@
+#include "private.h"
+
+static void _declare_lookup_dumper(otl_LookupType llt, const char *lt, json_value *(*dumper)(const otl_Subtable *st),
+ otl_Lookup *lookup, json_value *dump) {
+ if (lookup->type == llt) {
+ json_object_push(dump, "type", json_string_new(lt));
+ json_object_push(dump, "flags", otfcc_dump_flags(lookup->flags, lookupFlagsLabels));
+ if (lookup->flags >> 8) { json_object_push(dump, "markAttachmentType", json_integer_new(lookup->flags >> 8)); }
+ json_value *subtables = json_array_new(lookup->subtables.length);
+ for (tableid_t j = 0; j < lookup->subtables.length; j++)
+ if (lookup->subtables.items[j]) { json_array_push(subtables, dumper(lookup->subtables.items[j])); }
+ json_object_push(dump, "subtables", subtables);
+ }
+}
+
+#define LOOKUP_DUMPER(llt, fn) _declare_lookup_dumper(llt, tableNames[llt], fn, lookup, dump);
+
+static void _dump_lookup(otl_Lookup *lookup, json_value *dump) {
+ LOOKUP_DUMPER(otl_type_gsub_single, otl_gsub_dump_single);
+ LOOKUP_DUMPER(otl_type_gsub_multiple, otl_gsub_dump_multi);
+ LOOKUP_DUMPER(otl_type_gsub_alternate, otl_gsub_dump_multi);
+ LOOKUP_DUMPER(otl_type_gsub_ligature, otl_gsub_dump_ligature);
+ LOOKUP_DUMPER(otl_type_gsub_chaining, otl_dump_chaining);
+ LOOKUP_DUMPER(otl_type_gsub_reverse, otl_gsub_dump_reverse);
+ LOOKUP_DUMPER(otl_type_gpos_chaining, otl_dump_chaining);
+ LOOKUP_DUMPER(otl_type_gpos_single, otl_gpos_dump_single);
+ LOOKUP_DUMPER(otl_type_gpos_pair, otl_gpos_dump_pair);
+ LOOKUP_DUMPER(otl_type_gpos_cursive, otl_gpos_dump_cursive);
+ LOOKUP_DUMPER(otl_type_gpos_markToBase, otl_gpos_dump_markToSingle);
+ LOOKUP_DUMPER(otl_type_gpos_markToMark, otl_gpos_dump_markToSingle);
+ LOOKUP_DUMPER(otl_type_gpos_markToLigature, otl_gpos_dump_markToLigature);
+}
+
+void otfcc_dumpOtl(const table_OTL *table, json_value *root, const otfcc_Options *options, const char *tag) {
+ if (!table || !table->languages.length || !table->lookups.length || !table->features.length) return;
+ loggedStep("%s", tag) {
+ json_value *otl = json_object_new(3);
+ loggedStep("Languages") {
+ // dump script list
+ json_value *languages = json_object_new(table->languages.length);
+ for (tableid_t j = 0; j < table->languages.length; j++) {
+ json_value *_lang = json_object_new(5);
+ otl_LanguageSystem *lang = table->languages.items[j];
+ if (lang->requiredFeature) {
+ json_object_push(_lang, "requiredFeature", json_string_new(lang->requiredFeature->name));
+ }
+ json_value *features = json_array_new(lang->features.length);
+ for (tableid_t k = 0; k < lang->features.length; k++)
+ if (lang->features.items[k]) {
+ json_array_push(features, json_string_new(lang->features.items[k]->name));
+ }
+ json_object_push(_lang, "features", preserialize(features));
+ json_object_push(languages, lang->name, _lang);
+ }
+ json_object_push(otl, "languages", languages);
+ }
+ loggedStep("Features") {
+ // dump feature list
+ json_value *features = json_object_new(table->features.length);
+ for (tableid_t j = 0; j < table->features.length; j++) {
+ otl_Feature *feature = table->features.items[j];
+ json_value *_feature = json_array_new(feature->lookups.length);
+ for (tableid_t k = 0; k < feature->lookups.length; k++)
+ if (feature->lookups.items[k]) {
+ json_array_push(_feature, json_string_new(feature->lookups.items[k]->name));
+ }
+ json_object_push(features, feature->name, preserialize(_feature));
+ }
+ json_object_push(otl, "features", features);
+ }
+ loggedStep("Lookups") {
+ // dump lookups
+ json_value *lookups = json_object_new(table->lookups.length);
+ json_value *lookupOrder = json_array_new(table->lookups.length);
+ for (tableid_t j = 0; j < table->lookups.length; j++) {
+ json_value *_lookup = json_object_new(5);
+ otl_Lookup *lookup = table->lookups.items[j];
+ _dump_lookup(lookup, _lookup);
+ json_object_push(lookups, lookup->name, _lookup);
+ json_array_push(lookupOrder, json_string_new(lookup->name));
+ }
+ json_object_push(otl, "lookups", lookups);
+ json_object_push(otl, "lookupOrder", lookupOrder);
+ }
+ json_object_push(root, tag, otl);
+ }
+}