CFF hflex and hflex1: second curve doesn't return to the starting y

Aperta Adatta ai principianti
#437 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
1/5
Tempo stimato
Meno di un'ora
Idoneità per principianti
88/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
javascript, node.js

Direzione di ricerca

Inizia in src/glyph/CFFGlyph.js ed esamina la gestione degli operatori hflex e hflex1. Conferma le regole degli endpoint consultando la specifica Type 2 charstring citata nell’issue. Confronta i comandi del tracciato dei glifi interessati con l’output di fontTools' RecordingPen per un file CFF OTF che riproduce il problema. Il lavoro è completato quando entrambi gli operatori tornano alla y iniziale e i tracciati risultanti corrispondono al riferimento.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

In src/glyph/CFFGlyph.js (still on master, and in 2.0.4), the hflex (12 34) and hflex1 (12 36) operators leave the second curve at the raised y. The Type 2 charstring spec (Adobe TN #5177) says both end at the y they started from. Every point after the flex is shifted by the flex's dy, which shows up as steps or misplaced contours when drawing the path.

hflex dx1 dx2 dy2 dx3 dx4 dx5 dx6: the second curve is (dx4, 0) (dx5, -dy2) (dx6, 0), so c5y should drop back to the start. Currently:

c5y = c4y;   // should be: c5y = y;
c6y = c5y;

hflex1 dx1 dy1 dx2 dy2 dx3 dx4 dx5 dy5 dx6: dy6 is implied so the curve ends at the starting y. Currently:

c5y = c4y + stack.shift();
c6x = c5x + stack.shift();
c6y = c5y;   // should be: c6y = y;

(y is still the start point here because it's only updated after c6y.)

Repro: any CFF OTF whose charstrings use hflex/hflex1. Compare font.glyphForCodePoint(cp).path.commands with fontTools' RecordingPen output for the same glyph. In one font, a glyph whose contour should close at (415, -10) ends at (415, 0) in fontkit (hflex with dy2 = 10). In another, an hflex1 glyph's last point comes out at y 147 where fontTools gives 171. With the two one-line changes above, fontkit matches fontTools.

flex (12 35) and flex1 (12 37) look correct.

Lingua principale
JavaScript
Stelle
1.7k
Fork
254
Merge medio
1g 13h
PR unite (30g)
22

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di foliojs/fontkit

Tutte le issue di foliojs/fontkit

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.