2009-03-05 8 views
6

Ich befasse mich derzeit mit einer beschädigten TrueType-Schriftart. Programme, die mir zur Verfügung stehen, sagen mir, dass es ein Problem mit der maxp Tabelle gibt - das maxContours Mitglied hat einen Wert, der zu groß ist. Gibt es einen sicheren Weg zu erkennen, wenn ein maxContours Wert zu hoch oder zu niedrig ist (ja, das kann auch ein Problem sein)? (Fonts sind Programme, also ist eine Möglichkeit, eine Fontdatei zu finden, sie auszuführen, aber das ist keine akzeptable Lösung für mich.)Beschädigte TrueType-Font-Erkennung

Ich brauche keine Font-Bibliothek, weil ich keine hinzufügen kann. Ich habe bereits meinen eigenen TrueType-Font-Parser gerollt. Was bleibt, ist zu überprüfen, ob ein bestimmter Wert der oben genannten Tabelle falsch ist. Ich werde dann meinen Parser und die Checks zu meinem Produkt hinzufügen.

Ich habe nicht die Möglichkeit, die Schriftart neu zu erstellen. Ich bin ein Konsument - ich muss feststellen, ob die eingehende Schriftart beschädigt ist oder nicht, und ob sie mit so wenig Aufwand wie möglich aus der Datenbank entfernt wird.

Falls es hilft - ich bin auf Windows XP/Vista sowohl 32 & 64 Bit und ihre Server-Versionen!

Antwort

0

Welche Plattform verwenden Sie? Ich habe in der Lage gewesen, ganz Truetype-Dateien zu hacken angenehm die FontTools Bibliothek für Python:

font= fontTools.ttLib.TTFont("suspect.ttf") 
font['maxp'].maxContours 

ETA re q edit: Die Frage ist also nur „welche Werte von maxContours sind zu niedrig/zu hoch“? Soweit ich weiß, gibt es kein dokumentiertes Limit, aber ich weiß, dass es ziemlich üblich ist, MaxContours ein paar hinzuzufügen, falls ein Glyph mehr Konturen enthält, als es angibt.

(Was ist maxContours in der lästigen Schrift, und wie es um die Anzahl von Konturen bezogen sie tatsächlich in Glyphen verwendet?)

+0

Danke!Aber nein, ich brauche keinen Parser. Ich werde meine Frage bearbeiten, um Klarheit zu schaffen. – dirkgently

2

Anstatt zu versuchen, Fehler zu erkennen, ich habe es am bequemsten gefunden, nur der Umbau Störungs-Schriftart mit FontForge. Dies kann vollständig automatisiert werden, da es eine reichhaltige Befehlszeilen- und Skript-API bereitstellt. Außerdem können Sie die Schriftart bei Bedarf in ein komfortableres Format oder eine bessere Codierung umwandeln.

+0

Ich verzehre die Eingabe und ich muss so schnell wie möglich retten - also funktioniert das nicht. Ich werde das zu der Frage hinzufügen :) – dirkgently

+0

Danke für die Idee, Sie lösten [ein verwandtes Problem] (https://stackoverflow.com/questions/44622656/), die ich hatte. – Pikamander2

3

Gibt es einen sicheren Weg zu erkennen, wenn ein maxContours-Wert zu hoch oder zu niedrig ist (ja, das kann auch ein Problem sein)?

Ja. Wenn Sie bereits eine TrueType/OpenType-Parsing-Bibliothek erstellt haben/haben, wie Sie angegeben haben, ist dieser bestimmte Wert relativ einfach zu überprüfen. Sie müssen alle Glyphen analysieren (aus der 'glyf' table, indem Sie die Tabelle 'loca' als Index verwenden), die Anzahl der Konturen jeder Glyphe eins nach der anderen ermitteln und das maximale Zeichenweite mit dem Zeichen vergleichen in der 'maxp' gespeichert.

Beachten Sie, dass einige andere Werte in der 'maxp' sind nicht dies einfach zu testen; Beispielsweise erfordern maxZones, maxTwilightPoints, maxStorage, maxFunctionDefs, maxInstructionDefs, maxStackElements, maxSizeOfInstructions alle das Parsen zusätzlicher Tabellen und für einige von diesen den Zugriff auf einen TrueType-Scaler und einen Interpreter.

Ein kleiner Hintergrund: Die Tabelle 'maxp' (maximum profile) sollte eine Abkürzung/Zusammenfassung von potenziell nützlichen, zeichenweiten Maxima sein, als Hilfe bei der Speicherzuweisung. Wenn also ein Wert in 'maxp' höher ist als der tatsächliche Fontwert, ist das Schlimmste, das passiert, dass Sie zu viel Speicher zuweisen ... das heißt, wenn Sie auf einer Plattform sind, die tatsächlich alle verwendet die 'maxp' Werte für diesen Zweck.