Make outline simplification a kind of geometry, as well as skew correction (#961).
This commit is contained in:
parent
340d3096c3
commit
902722a1a1
3 changed files with 50 additions and 21 deletions
|
@ -3,7 +3,7 @@
|
||||||
const fs = require("fs-extra");
|
const fs = require("fs-extra");
|
||||||
const zlib = require("zlib");
|
const zlib = require("zlib");
|
||||||
|
|
||||||
const Edition = 1;
|
const Edition = 2;
|
||||||
|
|
||||||
class Cache {
|
class Cache {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
const TypoGeom = require("typo-geom");
|
const TypoGeom = require("typo-geom");
|
||||||
const Geom = require("../../support/geometry");
|
const Geom = require("../../support/geometry");
|
||||||
const Point = require("../../support/point");
|
const Point = require("../../support/point");
|
||||||
|
const Transform = require("../../support/transform");
|
||||||
const CurveUtil = require("../../support/curve-util");
|
const CurveUtil = require("../../support/curve-util");
|
||||||
const util = require("util");
|
const util = require("util");
|
||||||
|
|
||||||
|
@ -42,11 +43,13 @@ function flattenSimpleGlyph(cache, skew, g) {
|
||||||
g.includeContours(CurveUtil.repToShape(cached), 0, 0);
|
g.includeContours(CurveUtil.repToShape(cached), 0, 0);
|
||||||
cache.saveGF(ck, cached);
|
cache.saveGF(ck, cached);
|
||||||
} else {
|
} else {
|
||||||
let cs = g.geometry.asContours();
|
const tfBack = new Transform(1, -skew, 0, 1, 0, 0);
|
||||||
for (const contour of cs) for (const z of contour) z.x -= z.y * skew;
|
const tfForward = new Transform(1, +skew, 0, 1, 0, 0);
|
||||||
cs = simplifyContours(cs);
|
const g1 = new Geom.TransformedGeometry(
|
||||||
for (const contour of cs) for (const z of contour) z.x += z.y * skew;
|
new SimplifyGeometry(new Geom.TransformedGeometry(g.geometry, tfBack)),
|
||||||
|
tfForward
|
||||||
|
);
|
||||||
|
const cs = g1.asContours();
|
||||||
g.clearGeometry();
|
g.clearGeometry();
|
||||||
g.includeContours(cs, 0, 0);
|
g.includeContours(cs, 0, 0);
|
||||||
if (ck) cache.saveGF(ck, CurveUtil.shapeToRep(cs));
|
if (ck) cache.saveGF(ck, CurveUtil.shapeToRep(cs));
|
||||||
|
@ -55,7 +58,13 @@ function flattenSimpleGlyph(cache, skew, g) {
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
function simplifyContours(source) {
|
class SimplifyGeometry extends Geom.GeometryBase {
|
||||||
|
constructor(g) {
|
||||||
|
super();
|
||||||
|
this.m_geom = g;
|
||||||
|
}
|
||||||
|
asContours() {
|
||||||
|
const source = this.m_geom.asContours();
|
||||||
const sink = new FairizedShapeSink();
|
const sink = new FairizedShapeSink();
|
||||||
TypoGeom.ShapeConv.transferGenericShape(
|
TypoGeom.ShapeConv.transferGenericShape(
|
||||||
TypoGeom.Fairize.fairizeBezierShape(
|
TypoGeom.Fairize.fairizeBezierShape(
|
||||||
|
@ -69,6 +78,24 @@ function simplifyContours(source) {
|
||||||
CurveUtil.GEOMETRY_PRECISION
|
CurveUtil.GEOMETRY_PRECISION
|
||||||
);
|
);
|
||||||
return sink.contours;
|
return sink.contours;
|
||||||
|
}
|
||||||
|
asReferences() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
filterTag(fn) {
|
||||||
|
return this.m_geom.filterTag(fn);
|
||||||
|
}
|
||||||
|
isEmpty() {
|
||||||
|
return this.m_geom.isEmpty();
|
||||||
|
}
|
||||||
|
measureComplexity() {
|
||||||
|
return this.m_geom.measureComplexity();
|
||||||
|
}
|
||||||
|
toShapeStringOrNull() {
|
||||||
|
const sTarget = this.m_geom.toShapeStringOrNull();
|
||||||
|
if (!sTarget) return null;
|
||||||
|
return `SimplifyGeometry{${sTarget}}`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FairizedShapeSink {
|
class FairizedShapeSink {
|
||||||
|
|
|
@ -38,7 +38,9 @@ class ContourGeometry extends GeometryBase {
|
||||||
}
|
}
|
||||||
asContours() {
|
asContours() {
|
||||||
if (this.isEmpty()) return [];
|
if (this.isEmpty()) return [];
|
||||||
else return [this.m_points];
|
let c1 = [];
|
||||||
|
for (const z of this.m_points) c1.push(Point.from(z.type, z));
|
||||||
|
return [c1];
|
||||||
}
|
}
|
||||||
asReferences() {
|
asReferences() {
|
||||||
return null;
|
return null;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue