Cleanup composite builders and some "0.1/0.01" magic numbers (#2362)
This commit is contained in:
parent
d4ba6b6b1a
commit
a4c674c220
49 changed files with 268 additions and 324 deletions
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue