Enable glyph block filtering and dependency tracker.

This commit is contained in:
be5invis 2023-10-30 23:00:38 -07:00
parent 183b02d652
commit 0a74f44f0f
10 changed files with 75 additions and 42 deletions

View file

@ -107,6 +107,9 @@ class SimplifyGeometry extends Geom.GeometryBase {
asReferences() { asReferences() {
return null; return null;
} }
getDependencies() {
return this.m_geom.getDependencies();
}
filterTag(fn) { filterTag(fn) {
return this.m_geom.filterTag(fn); return this.m_geom.filterTag(fn);
} }

View file

@ -65,12 +65,6 @@ glyph-block Common-Derivatives : begin
if [not goal] : throw : new Error "Cannot find glyph '\(id)'" if [not goal] : throw : new Error "Cannot find glyph '\(id)'"
this.includeGlyph goal copyAnchors copyWidth this.includeGlyph goal copyAnchors copyWidth
glyph-block-export add-glyph-dependency
define [add-glyph-dependency id] : lambda [copyAnchors copyWidth] : begin
local goal : query-glyph id
if [not goal] : throw : new Error "Cannot find glyph '\(id)'"
this.dependsOn goal
glyph-block-export DeriveMeshT glyph-block-export DeriveMeshT
define [DeriveMeshT gnSources Query Fn FnLink] : begin define [DeriveMeshT gnSources Query Fn FnLink] : begin
local linksGnMap : new Map local linksGnMap : new Map

View file

@ -82,11 +82,6 @@ glyph-block Letter-Latin-Upper-AA-AO : begin
define topSerifGap : Math.max (0.1 * (df.rightSB - df.leftSB)) [AdviceStroke 6] define topSerifGap : Math.max (0.1 * (df.rightSB - df.leftSB)) [AdviceStroke 6]
define { left leftMask right rightMask } srcs define { left leftMask right rightMask } srcs
include : add-glyph-dependency left
include : add-glyph-dependency leftMask
include : add-glyph-dependency right
include : add-glyph-dependency rightMask
include [refer-glyph left] AS_BASE ALSO_METRICS include [refer-glyph left] AS_BASE ALSO_METRICS
include : difference include : difference
refer-glyph right refer-glyph right

View file

@ -471,7 +471,6 @@ glyph-block Letter-Shared-Shapes : begin
glyph-block-export ConnectedCedilla glyph-block-export ConnectedCedilla
define [ConnectedCedilla src sel] : glyph-proc define [ConnectedCedilla src sel] : glyph-proc
include [refer-glyph src] AS_BASE ALSO_METRICS include [refer-glyph src] AS_BASE ALSO_METRICS
include : add-glyph-dependency 'cedillaExtShapeBelow'
local mk : currentGlyph.baseAnchors.leaningBelow || currentGlyph.baseAnchors.below local mk : currentGlyph.baseAnchors.leaningBelow || currentGlyph.baseAnchors.below
local tfm : ApparentTranslate (mk.x - markMiddle) (mk.y - 0) local tfm : ApparentTranslate (mk.x - markMiddle) (mk.y - 0)
include : difference include : difference

View file

@ -7,8 +7,6 @@ import [maskBit maskBits popCountByte] from"../../support/util/mask-bit.mjs"
glyph-module glyph-module
glyph-block Symbol-Braille : begin glyph-block Symbol-Braille : begin
if recursive : return nothing
glyph-block-import CommonShapes glyph-block-import CommonShapes
glyph-block-import Common-Derivatives glyph-block-import Common-Derivatives

View file

@ -6,8 +6,6 @@ import [mix linreg clamp fallback] from"../../support/utils.mjs"
glyph-module glyph-module
glyph-block Symbol-Mosaic : begin glyph-block Symbol-Mosaic : begin
if recursive : return nothing
glyph-block-import CommonShapes glyph-block-import CommonShapes
glyph-block-import Common-Derivatives glyph-block-import Common-Derivatives

View file

@ -165,7 +165,7 @@ define-macro glyph-block-import : syntax-rules
Common-Derivatives `[select-variant orthographic-italic orthographic-slanted Common-Derivatives `[select-variant orthographic-italic orthographic-slanted
refer-glyph query-glyph alias turned HDual HCombine VDual VCombine derive-glyphs refer-glyph query-glyph alias turned HDual HCombine VDual VCombine derive-glyphs
derive-composites link-reduced-variant alias-reduced-variant HalfAdvance TurnMarks derive-composites link-reduced-variant alias-reduced-variant HalfAdvance TurnMarks
derive-multi-part-glyphs DeriveMeshT add-glyph-dependency] derive-multi-part-glyphs DeriveMeshT]
CommonShapes `[no-shape tagged KnotAdj Rect SquareAt Ring RingAt DotAt RingStroke CommonShapes `[no-shape tagged KnotAdj Rect SquareAt Ring RingAt DotAt RingStroke
RingStrokeAt DotStrokeAt CircleRing CircleRingAt CircleDotAt RoundStrokeTerminalAt RingStrokeAt DotStrokeAt CircleRing CircleRingAt CircleDotAt RoundStrokeTerminalAt

View file

@ -17,6 +17,9 @@ export class GeometryBase {
asReferences() { asReferences() {
throw new Error("Unimplemented"); throw new Error("Unimplemented");
} }
getDependencies() {
throw new Error("Unimplemented");
}
unlinkReferences() { unlinkReferences() {
return this; return this;
} }
@ -51,6 +54,9 @@ export class ContourGeometry extends GeometryBase {
asReferences() { asReferences() {
return null; return null;
} }
getDependencies() {
return null;
}
filterTag(fn) { filterTag(fn) {
return this; return this;
} }
@ -89,6 +95,9 @@ export class SpiroGeometry extends GeometryBase {
asReferences() { asReferences() {
return null; return null;
} }
getDependencies() {
return null;
}
filterTag(fn) { filterTag(fn) {
return this; return this;
} }
@ -161,6 +170,9 @@ export class DiSpiroGeometry extends GeometryBase {
asReferences() { asReferences() {
return null; return null;
} }
getDependencies() {
return null;
}
filterTag(fn) { filterTag(fn) {
return this; return this;
} }
@ -206,6 +218,9 @@ export class ReferenceGeometry extends GeometryBase {
if (this.isEmpty()) return []; if (this.isEmpty()) return [];
return [{ glyph: this.m_glyph, x: this.m_x, y: this.m_y }]; return [{ glyph: this.m_glyph, x: this.m_x, y: this.m_y }];
} }
getDependencies() {
return [this.m_glyph];
}
filterTag(fn) { filterTag(fn) {
if (this.isEmpty()) return null; if (this.isEmpty()) return null;
return this.unwrap().filterTag(fn); return this.unwrap().filterTag(fn);
@ -239,6 +254,9 @@ export class TaggedGeometry extends GeometryBase {
asReferences() { asReferences() {
return this.m_geom.asReferences(); return this.m_geom.asReferences();
} }
getDependencies() {
return this.m_geom.getDependencies();
}
filterTag(fn) { filterTag(fn) {
if (!fn(this.m_tag)) return null; if (!fn(this.m_tag)) return null;
else return new TaggedGeometry(this.m_geom.filterTag(fn), this.m_tag); else return new TaggedGeometry(this.m_geom.filterTag(fn), this.m_tag);
@ -281,6 +299,9 @@ export class TransformedGeometry extends GeometryBase {
result.push({ glyph, x: x + this.m_transform.x, y: y + this.m_transform.y }); result.push({ glyph, x: x + this.m_transform.x, y: y + this.m_transform.y });
return result; return result;
} }
getDependencies() {
return this.m_geom.getDependencies();
}
filterTag(fn) { filterTag(fn) {
const e = this.m_geom.filterTag(fn); const e = this.m_geom.filterTag(fn);
if (!e) return null; if (!e) return null;
@ -330,6 +351,9 @@ export class RadicalGeometry extends GeometryBase {
asReferences() { asReferences() {
return null; return null;
} }
getDependencies() {
return this.m_geom.getDependencies();
}
filterTag(fn) { filterTag(fn) {
const e = this.m_geom.filterTag(fn); const e = this.m_geom.filterTag(fn);
if (!e) return null; if (!e) return null;
@ -383,6 +407,15 @@ export class CombineGeometry extends GeometryBase {
} }
return results; return results;
} }
getDependencies() {
let results = [];
for (const part of this.m_parts) {
const rs = part.getDependencies();
if (!rs) continue;
for (const c of rs) results.push(c);
}
return results;
}
filterTag(fn) { filterTag(fn) {
let filtered = []; let filtered = [];
for (const part of this.m_parts) { for (const part of this.m_parts) {
@ -454,6 +487,15 @@ export class BooleanGeometry extends GeometryBase {
asReferences() { asReferences() {
return null; return null;
} }
getDependencies() {
let results = [];
for (const part of this.m_operands) {
const rs = part.getDependencies();
if (!rs) continue;
for (const c of rs) results.push(c);
}
return results;
}
filterTag(fn) { filterTag(fn) {
let filtered = []; let filtered = [];
for (const operand of this.m_operands) { for (const operand of this.m_operands) {

View file

@ -19,12 +19,12 @@ export class GlyphBuildExecutor {
} }
} }
executePendingBlocks() { executePendingBlocks() {
// if (!this.recursiveBuildFilter) { if (!this.recursiveBuildFilter) {
for (const block of this.pendingGlyphBlocks) block.resolve(); for (const block of this.pendingGlyphBlocks) block.resolve();
// } else { } else {
// for (const block of this.pendingGlyphBlocks) for (const block of this.pendingGlyphBlocks)
// if (this.recursiveBuildFilter.blockIsNeeded(block.id)) block.resolve(); if (this.recursiveBuildFilter.blockIsNeeded(block.id)) block.resolve();
// } }
} }
defineGlyphBlock(capture, id, body) { defineGlyphBlock(capture, id, body) {
const block = new GlyphBlock(capture, this, id, body); const block = new GlyphBlock(capture, this, id, body);

View file

@ -6,8 +6,8 @@ import { Point, Vec2 } from "../geometry/point.mjs";
import { Transform } from "../geometry/transform.mjs"; import { Transform } from "../geometry/transform.mjs";
export class Glyph { export class Glyph {
constructor(_identifier) { constructor(identifier) {
this._m_identifier = _identifier; this._m_identifier = identifier;
// Ranks // Ranks
this.glyphRank = 0; this.glyphRank = 0;
this.grRank = 0; this.grRank = 0;
@ -65,6 +65,21 @@ export class Glyph {
if (!this._m_dependencyManager) return; if (!this._m_dependencyManager) return;
this._m_dependencyManager.addDependency(this, glyph); this._m_dependencyManager.addDependency(this, glyph);
} }
// Copying
cloneFromGlyph(g) {
this.includeGlyph(g, true, true);
this.cloneRelationFromGlyph(g);
this.cloneRankFromGlyph(g);
}
cloneRelationFromGlyph(g) {
this.related = g.related;
}
cloneRankFromGlyph(g) {
this.glyphRank = g.glyphRank;
this.avoidBeingComposite = g.avoidBeingComposite;
}
// Inclusion // Inclusion
include(component, copyAnchors, copyWidth) { include(component, copyAnchors, copyWidth) {
if (!component) { if (!component) {
@ -92,23 +107,6 @@ export class Glyph {
if (g.isMarkSet) throw new Error("Invalid component to be introduced."); if (g.isMarkSet) throw new Error("Invalid component to be introduced.");
if (copyAnchors) this.copyAnchors(g); if (copyAnchors) this.copyAnchors(g);
if (copyWidth && g.advanceWidth >= 0) this.advanceWidth = g.advanceWidth; if (copyWidth && g.advanceWidth >= 0) this.advanceWidth = g.advanceWidth;
this.dependsOn(g);
}
cloneFromGlyph(g) {
this.includeGlyph(g, true, true);
this.cloneRelationFromGlyph(g);
this.cloneRankFromGlyph(g);
}
cloneRelationFromGlyph(g) {
this.related = g.related;
}
cloneRankFromGlyph(g) {
this.glyphRank = g.glyphRank;
this.avoidBeingComposite = g.avoidBeingComposite;
}
includeGeometry(g) {
if (this.ctxTag) g = new Geom.TaggedGeometry(g, this.ctxTag);
this.geometry = Geom.combineWith(this.geometry, g);
} }
includeGlyphImpl(g, shiftX, shiftY) { includeGlyphImpl(g, shiftX, shiftY) {
if (g._m_identifier) { if (g._m_identifier) {
@ -119,6 +117,12 @@ export class Glyph {
); );
} }
} }
includeGeometry(g) {
let deps = g.getDependencies();
if (deps && deps.length) for (const dep of deps) this.dependsOn(dep);
if (this.ctxTag) g = new Geom.TaggedGeometry(g, this.ctxTag);
this.geometry = Geom.combineWith(this.geometry, g);
}
includeContours(cs, shiftX, shiftY) { includeContours(cs, shiftX, shiftY) {
let parts = []; let parts = [];
for (const contour of cs) { for (const contour of cs) {