Cleanup composite builders and some "0.1/0.01" magic numbers (#2362)

This commit is contained in:
Belleve 2024-06-02 01:37:37 -10:00 committed by GitHub
parent d4ba6b6b1a
commit a4c674c220
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
49 changed files with 268 additions and 324 deletions

View file

@ -24,9 +24,6 @@ export class GeometryBase {
getDependencies() {
throw new Error("Unimplemented");
}
unlinkReferences() {
return this;
}
filterTag(fn) {
return this;
}
@ -224,7 +221,7 @@ export class ReferenceGeometry extends GeometryBase {
this.m_y = y || 0;
}
unwrap() {
return new TransformedGeometry(
return TransformedGeometry.create(
Transform.Translate(this.m_x, this.m_y),
this.m_glyph.geometry,
);
@ -249,16 +246,8 @@ export class ReferenceGeometry extends GeometryBase {
measureComplexity() {
return this.m_glyph.geometry.measureComplexity();
}
unlinkReferences() {
return this.unwrap().unlinkReferences();
}
hash(h) {
h.beginStruct("ReferenceGeometry");
h.embed(this.m_glyph.geometry);
h.f64(this.m_x);
h.f64(this.m_y);
h.endStruct();
this.unwrap().hash(h);
}
}
@ -284,24 +273,30 @@ export class TaggedGeometry extends GeometryBase {
measureComplexity() {
return this.m_geom.measureComplexity();
}
unlinkReferences() {
return this.m_geom.unlinkReferences();
}
hash(h) {
this.m_geom.hash(h);
}
}
export class TransformedGeometry extends GeometryBase {
// PRIVATE
constructor(tfm, g) {
super();
this.m_transform = tfm;
this.m_geom = g;
}
withTransform(tfm) {
return new TransformedGeometry(Transform.Combine(this.m_transform, tfm), this.m_geom);
static create(tfm, g) {
if (Transform.isIdentity(tfm)) {
return g;
} else if (g instanceof TransformedGeometry) {
const tCombined = Transform.Combine(g.m_transform, tfm);
return TransformedGeometry.create(tCombined, g.m_geom);
} else if (g instanceof CombineGeometry || g instanceof BooleanGeometry) {
return g.map(x => TransformedGeometry.create(tfm, x));
} else {
return new TransformedGeometry(tfm, g);
}
}
toContours(ctx) {
@ -328,7 +323,7 @@ export class TransformedGeometry extends GeometryBase {
filterTag(fn) {
const e = this.m_geom.filterTag(fn);
if (!e) return null;
return new TransformedGeometry(this.m_transform, e);
return TransformedGeometry.create(this.m_transform, e);
}
measureComplexity() {
return (
@ -336,17 +331,6 @@ export class TransformedGeometry extends GeometryBase {
this.m_geom.measureComplexity()
);
}
unlinkReferences() {
const unwrapped = this.m_geom.unlinkReferences();
if (Transform.isIdentity(this.m_transform)) {
return unwrapped;
} else if (unwrapped instanceof TransformedGeometry) {
return unwrapped.withTransform(this.m_transform);
} else {
return new TransformedGeometry(this.m_transform, unwrapped);
}
}
hash(h) {
h.beginStruct("TransformedGeometry");
h.gizmo(this.m_transform);
@ -378,10 +362,6 @@ export class RadicalGeometry extends GeometryBase {
measureComplexity() {
return this.m_geom.measureComplexity();
}
unlinkReferences() {
return this.m_geom.unlinkReferences();
}
hash(h) {
this.m_geom.hash(h);
}
@ -399,6 +379,9 @@ export class CombineGeometry extends GeometryBase {
return new CombineGeometry([...this.m_parts, g]);
}
}
map(f) {
return new CombineGeometry(this.m_parts.map(f));
}
toContours(ctx) {
let results = [];
for (const part of this.m_parts) {
@ -441,19 +424,6 @@ export class CombineGeometry extends GeometryBase {
for (const part of this.m_parts) s |= part.measureComplexity();
return s;
}
unlinkReferences() {
let parts = [];
for (const part of this.m_parts) {
const unwrapped = part.unlinkReferences();
if (unwrapped instanceof CombineGeometry) {
for (const p of unwrapped.m_parts) parts.push(p);
} else {
parts.push(unwrapped);
}
}
return new CombineGeometry(parts);
}
hash(h) {
h.beginStruct("CombineGeometry");
h.beginArray(this.m_parts.length);
@ -470,6 +440,10 @@ export class BooleanGeometry extends CachedGeometry {
this.m_operands = operands;
}
map(f) {
return new BooleanGeometry(this.m_operator, this.m_operands.map(f));
}
toContoursImpl() {
if (this.m_operands.length === 0) return [];
@ -530,16 +504,6 @@ export class BooleanGeometry extends CachedGeometry {
for (const operand of this.m_operands) s |= operand.measureComplexity();
return s;
}
unlinkReferences() {
if (this.m_operands.length === 0) return new CombineGeometry([]);
if (this.m_operands.length === 1) return this.m_operands[0].unlinkReferences();
let operands = [];
for (const operand of this.m_operands) {
operands.push(operand.unlinkReferences());
}
return new BooleanGeometry(this.m_operator, operands);
}
hash(h) {
h.beginStruct("BooleanGeometry");
h.u32(this.m_operator);
@ -562,7 +526,10 @@ export class StrokeGeometry extends CachedGeometry {
toContoursImpl(ctx) {
// Produce simplified arcs
const nonTransformedGeometry = new TransformedGeometry(this.m_gizmo.inverse(), this.m_geom);
const nonTransformedGeometry = TransformedGeometry.create(
this.m_gizmo.inverse(),
this.m_geom,
);
let arcs = TypoGeom.Boolean.removeOverlap(
CurveUtil.convertShapeToArcs(nonTransformedGeometry.toContours(ctx)),
TypoGeom.Boolean.PolyFillType.pftNonZero,
@ -592,15 +559,6 @@ export class StrokeGeometry extends CachedGeometry {
getDependencies() {
return this.m_geom.getDependencies();
}
unlinkReferences() {
return new StrokeGeometry(
this.m_geom.unlinkReferences(),
this.m_gizmo,
this.m_radius,
this.m_contrast,
this.m_fInside,
);
}
filterTag(fn) {
return new StrokeGeometry(
this.m_geom.filterTag(fn),
@ -634,7 +592,10 @@ export class RemoveHolesGeometry extends CachedGeometry {
toContoursImpl(ctx) {
// Produce simplified arcs
const nonTransformedGeometry = new TransformedGeometry(this.m_gizmo.inverse(), this.m_geom);
const nonTransformedGeometry = TransformedGeometry.create(
this.m_gizmo.inverse(),
this.m_geom,
);
let arcs = TypoGeom.Boolean.removeOverlap(
CurveUtil.convertShapeToArcs(nonTransformedGeometry.toContours(ctx)),
TypoGeom.Boolean.PolyFillType.pftNonZero,
@ -673,9 +634,6 @@ export class RemoveHolesGeometry extends CachedGeometry {
getDependencies() {
return this.m_geom.getDependencies();
}
unlinkReferences() {
return new RemoveHolesGeometry(this.m_geom.unlinkReferences(), this.m_gizmo);
}
filterTag(fn) {
return new RemoveHolesGeometry(this.m_geom.filterTag(fn), this.m_gizmo);
}
@ -723,9 +681,6 @@ export class SimplifyGeometry extends CachedGeometry {
getDependencies() {
return this.m_geom.getDependencies();
}
unlinkReferences() {
return new SimplifyGeometry(this.m_geom.unlinkReferences());
}
filterTag(fn) {
return new SimplifyGeometry(this.m_geom.filterTag(fn));
}