parent
a84b7c7cbd
commit
82be5d12d1
|
@ -183,6 +183,9 @@ button > svg path {
|
||||||
label.pf-disabled {
|
label.pf-disabled {
|
||||||
color: gray;
|
color: gray;
|
||||||
}
|
}
|
||||||
|
.btn-group input[type="radio"] {
|
||||||
|
-moz-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Arrow
|
* Arrow
|
||||||
|
|
|
@ -11,34 +11,34 @@
|
||||||
"license": "MIT OR Apache-2.0",
|
"license": "MIT OR Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/base64-js": "^1.2.5",
|
"@types/base64-js": "^1.2.5",
|
||||||
"@types/gl-matrix": "^2.3.0",
|
"@types/gl-matrix": "^2.4.0",
|
||||||
"@types/lodash": "^4.14.74",
|
"@types/lodash": "^4.14.104",
|
||||||
"@types/node": "^8.0.28",
|
"@types/node": "^8.9.4",
|
||||||
"@types/opentype.js": "0.0.0",
|
"@types/opentype.js": "0.0.0",
|
||||||
"@types/papaparse": "^4.1.31",
|
"@types/papaparse": "^4.1.33",
|
||||||
"@types/webgl-ext": "0.0.29",
|
"@types/webgl-ext": "0.0.29",
|
||||||
"base64-js": "^1.2.1",
|
"base64-js": "^1.2.3",
|
||||||
"bootstrap": "^4.0.0-beta",
|
"bootstrap": "^4.0.0",
|
||||||
"gl-matrix": "^2.4.0",
|
"gl-matrix": "^2.4.0",
|
||||||
"handlebars": "^4.0.10",
|
"handlebars": "^4.0.11",
|
||||||
"handlebars-loader": "^1.6.0",
|
"handlebars-loader": "^1.6.0",
|
||||||
"handlebars-webpack-plugin": "^1.2.0",
|
"handlebars-webpack-plugin": "^1.3.2",
|
||||||
"html-loader": "^0.5.1",
|
"html-loader": "^0.5.5",
|
||||||
"image-ssim": "^0.2.0",
|
"image-ssim": "^0.2.0",
|
||||||
"jquery": "^3.2.1",
|
"jquery": "^3.3.1",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.5",
|
||||||
"opentype.js": "^0.7.3",
|
"opentype.js": "^0.7.3",
|
||||||
"papaparse": "^4.3.6",
|
"papaparse": "^4.3.7",
|
||||||
"parse-color": "^1.0.0",
|
"parse-color": "^1.0.0",
|
||||||
"path-data-polyfill.js": "^1.0.2",
|
"path-data-polyfill.js": "^1.0.2",
|
||||||
"popper.js": "^1.12.5",
|
"popper.js": "^1.13.0",
|
||||||
"rustdoc-webpack-plugin": "file:./build/rustdoc-webpack-plugin",
|
"rustdoc-webpack-plugin": "file:./build/rustdoc-webpack-plugin",
|
||||||
"ts-loader": "^2.3.7",
|
"ts-loader": "^2.3.7",
|
||||||
"typescript": "^2.5.2",
|
"typescript": "^2.7.2",
|
||||||
"webpack": "^3.5.6"
|
"webpack": "^3.11.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"tslint": "^5.7.0",
|
"tslint": "^5.9.1",
|
||||||
"tslint-loader": "^3.5.3"
|
"tslint-loader": "^3.5.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,18 +125,18 @@ interface MeshDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ThreeDController extends DemoAppController<ThreeDView> {
|
class ThreeDController extends DemoAppController<ThreeDView> {
|
||||||
font: PathfinderFont;
|
font!: PathfinderFont;
|
||||||
textFrames: TextFrame[];
|
textFrames!: TextFrame[];
|
||||||
glyphStore: GlyphStore;
|
glyphStore!: GlyphStore;
|
||||||
meshDescriptors: MeshDescriptor[];
|
meshDescriptors!: MeshDescriptor[];
|
||||||
|
|
||||||
atlasGlyphs: AtlasGlyph[];
|
atlasGlyphs!: AtlasGlyph[];
|
||||||
atlas: Atlas;
|
atlas!: Atlas;
|
||||||
|
|
||||||
baseMeshes: PathfinderMeshData;
|
baseMeshes!: PathfinderMeshData;
|
||||||
private expandedMeshes: PathfinderMeshData[];
|
private expandedMeshes!: PathfinderMeshData[];
|
||||||
|
|
||||||
private monumentPromise: Promise<MonumentSide[]>;
|
private monumentPromise!: Promise<MonumentSide[]>;
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
super.start();
|
super.start();
|
||||||
|
@ -360,7 +360,7 @@ class ThreeDView extends DemoView implements TextRenderContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ThreeDRenderer extends Renderer {
|
class ThreeDRenderer extends Renderer {
|
||||||
renderContext: ThreeDView;
|
renderContext!: ThreeDView;
|
||||||
|
|
||||||
camera: PerspectiveCamera;
|
camera: PerspectiveCamera;
|
||||||
|
|
||||||
|
@ -412,7 +412,7 @@ class ThreeDRenderer extends Renderer {
|
||||||
private cubeVertexPositionBuffer: WebGLBuffer;
|
private cubeVertexPositionBuffer: WebGLBuffer;
|
||||||
private cubeIndexBuffer: WebGLBuffer;
|
private cubeIndexBuffer: WebGLBuffer;
|
||||||
|
|
||||||
private glyphPositionsBuffer: WebGLBuffer;
|
private glyphPositionsBuffer!: WebGLBuffer;
|
||||||
private glyphPositions: number[];
|
private glyphPositions: number[];
|
||||||
private glyphPositionRanges: Range[];
|
private glyphPositionRanges: Range[];
|
||||||
private glyphTexCoords: glmatrix.vec4[];
|
private glyphTexCoords: glmatrix.vec4[];
|
||||||
|
@ -425,6 +425,13 @@ class ThreeDRenderer extends Renderer {
|
||||||
|
|
||||||
const gl = renderContext.gl;
|
const gl = renderContext.gl;
|
||||||
|
|
||||||
|
this.glyphPositions = [];
|
||||||
|
this.glyphPositionRanges = [];
|
||||||
|
this.glyphTexCoords = [];
|
||||||
|
this.glyphSizes = [];
|
||||||
|
|
||||||
|
this.distantGlyphVAO = null;
|
||||||
|
|
||||||
this.camera = new PerspectiveCamera(renderContext.canvas, {
|
this.camera = new PerspectiveCamera(renderContext.canvas, {
|
||||||
innerCollisionExtent: MONUMENT_SCALE[0],
|
innerCollisionExtent: MONUMENT_SCALE[0],
|
||||||
});
|
});
|
||||||
|
@ -924,6 +931,8 @@ class ThreeDAtlasRenderer extends TextRenderer {
|
||||||
constructor(renderContext: ThreeDView, atlasGlyphs: AtlasGlyph[]) {
|
constructor(renderContext: ThreeDView, atlasGlyphs: AtlasGlyph[]) {
|
||||||
super(renderContext);
|
super(renderContext);
|
||||||
this.allAtlasGlyphs = atlasGlyphs;
|
this.allAtlasGlyphs = atlasGlyphs;
|
||||||
|
this.glyphTexCoords = [];
|
||||||
|
this.glyphSizes = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
renderAtlas(): void {
|
renderAtlas(): void {
|
||||||
|
|
|
@ -73,11 +73,9 @@ interface Switches {
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class AppController {
|
export abstract class AppController {
|
||||||
protected canvas: HTMLCanvasElement;
|
protected canvas!: HTMLCanvasElement;
|
||||||
|
protected selectFileElement: HTMLSelectElement | null = null;
|
||||||
protected selectFileElement: HTMLSelectElement | null;
|
protected screenshotButton: HTMLButtonElement | null = null;
|
||||||
|
|
||||||
protected screenshotButton: HTMLButtonElement | null;
|
|
||||||
|
|
||||||
start(): void {
|
start(): void {
|
||||||
this.selectFileElement = document.getElementById('pf-select-file') as HTMLSelectElement |
|
this.selectFileElement = document.getElementById('pf-select-file') as HTMLSelectElement |
|
||||||
|
@ -111,19 +109,19 @@ export abstract class AppController {
|
||||||
|
|
||||||
export abstract class DemoAppController<View extends DemoView> extends AppController
|
export abstract class DemoAppController<View extends DemoView> extends AppController
|
||||||
implements Switches {
|
implements Switches {
|
||||||
view: Promise<View>;
|
view!: Promise<View>;
|
||||||
|
|
||||||
subpixelAASwitchInputs: SwitchInputs | null;
|
subpixelAASwitchInputs: SwitchInputs | null = null;
|
||||||
gammaCorrectionSwitchInputs: SwitchInputs | null;
|
gammaCorrectionSwitchInputs: SwitchInputs | null = null;
|
||||||
stemDarkeningSwitchInputs: SwitchInputs | null;
|
stemDarkeningSwitchInputs: SwitchInputs | null = null;
|
||||||
|
|
||||||
protected abstract readonly builtinFileURI: string;
|
protected abstract readonly builtinFileURI: string;
|
||||||
|
|
||||||
protected filePickerView: FilePickerView | null;
|
protected filePickerView: FilePickerView | null = null;
|
||||||
|
|
||||||
protected aaLevelSelect: HTMLSelectElement | null;
|
protected aaLevelSelect: HTMLSelectElement | null = null;
|
||||||
|
|
||||||
private fpsLabel: HTMLElement | null;
|
private fpsLabel: HTMLElement | null = null;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
|
|
|
@ -77,12 +77,12 @@ const TEST_SIZES: BenchmarkModeMap<TestParameter> = {
|
||||||
};
|
};
|
||||||
|
|
||||||
class BenchmarkAppController extends DemoAppController<BenchmarkTestView> {
|
class BenchmarkAppController extends DemoAppController<BenchmarkTestView> {
|
||||||
font: PathfinderFont | null;
|
font: PathfinderFont | null = null;
|
||||||
textRun: TextRun | null;
|
textRun: TextRun | null = null;
|
||||||
|
|
||||||
svgLoader: SVGLoader;
|
svgLoader!: SVGLoader;
|
||||||
|
|
||||||
mode: BenchmarkMode;
|
mode!: BenchmarkMode;
|
||||||
|
|
||||||
protected get defaultFile(): string {
|
protected get defaultFile(): string {
|
||||||
if (this.mode === 'text')
|
if (this.mode === 'text')
|
||||||
|
@ -96,22 +96,22 @@ class BenchmarkAppController extends DemoAppController<BenchmarkTestView> {
|
||||||
return BUILTIN_SVG_URI;
|
return BUILTIN_SVG_URI;
|
||||||
}
|
}
|
||||||
|
|
||||||
private optionsModal: HTMLDivElement;
|
private optionsModal!: HTMLDivElement;
|
||||||
|
|
||||||
private resultsModal: HTMLDivElement;
|
private resultsModal!: HTMLDivElement;
|
||||||
private resultsTableHeader: HTMLTableSectionElement;
|
private resultsTableHeader!: HTMLTableSectionElement;
|
||||||
private resultsTableBody: HTMLTableSectionElement;
|
private resultsTableBody!: HTMLTableSectionElement;
|
||||||
private resultsPartitioningTimeLabel: HTMLSpanElement;
|
private resultsPartitioningTimeLabel!: HTMLSpanElement;
|
||||||
|
|
||||||
private glyphStore: GlyphStore;
|
private glyphStore!: GlyphStore;
|
||||||
private baseMeshes: PathfinderMeshData;
|
private baseMeshes!: PathfinderMeshData;
|
||||||
private expandedMeshes: ExpandedMeshData;
|
private expandedMeshes!: ExpandedMeshData;
|
||||||
|
|
||||||
private size: number;
|
private size!: number;
|
||||||
private currentRun: number;
|
private currentRun!: number;
|
||||||
private startTime: number;
|
private startTime!: number;
|
||||||
private elapsedTimes: ElapsedTime[];
|
private elapsedTimes!: ElapsedTime[];
|
||||||
private partitionTime: number;
|
private partitionTime!: number;
|
||||||
|
|
||||||
start(): void {
|
start(): void {
|
||||||
super.start();
|
super.start();
|
||||||
|
@ -360,11 +360,11 @@ class BenchmarkAppController extends DemoAppController<BenchmarkTestView> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class BenchmarkTestView extends DemoView {
|
class BenchmarkTestView extends DemoView {
|
||||||
renderer: BenchmarkTextRenderer | BenchmarkSVGRenderer;
|
renderer!: BenchmarkTextRenderer | BenchmarkSVGRenderer;
|
||||||
|
|
||||||
readonly appController: BenchmarkAppController;
|
readonly appController: BenchmarkAppController;
|
||||||
|
|
||||||
renderingPromiseCallback: ((time: number) => void) | null;
|
renderingPromiseCallback: ((time: number) => void) | null = null;
|
||||||
|
|
||||||
get camera(): OrthographicCamera {
|
get camera(): OrthographicCamera {
|
||||||
return this.renderer.camera;
|
return this.renderer.camera;
|
||||||
|
@ -419,7 +419,7 @@ class BenchmarkTestView extends DemoView {
|
||||||
}
|
}
|
||||||
|
|
||||||
class BenchmarkTextRenderer extends Renderer {
|
class BenchmarkTextRenderer extends Renderer {
|
||||||
renderContext: BenchmarkTestView;
|
renderContext!: BenchmarkTestView;
|
||||||
|
|
||||||
camera: OrthographicCamera;
|
camera: OrthographicCamera;
|
||||||
|
|
||||||
|
@ -600,7 +600,7 @@ class BenchmarkTextRenderer extends Renderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
class BenchmarkSVGRenderer extends SVGRenderer {
|
class BenchmarkSVGRenderer extends SVGRenderer {
|
||||||
renderContext: BenchmarkTestView;
|
renderContext!: BenchmarkTestView;
|
||||||
|
|
||||||
protected get loader(): SVGLoader {
|
protected get loader(): SVGLoader {
|
||||||
return this.renderContext.appController.svgLoader;
|
return this.renderContext.appController.svgLoader;
|
||||||
|
|
|
@ -98,9 +98,9 @@ export class OrthographicCamera extends Camera {
|
||||||
onZoom: (() => void) | null;
|
onZoom: (() => void) | null;
|
||||||
onRotate: (() => void) | null;
|
onRotate: (() => void) | null;
|
||||||
|
|
||||||
translation: glmatrix.vec2;
|
translation!: glmatrix.vec2;
|
||||||
scale: number;
|
scale!: number;
|
||||||
rotationAngle: number;
|
rotationAngle!: number;
|
||||||
|
|
||||||
private _bounds: glmatrix.vec4;
|
private _bounds: glmatrix.vec4;
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ export class OrthographicCamera extends Camera {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PerspectiveCamera extends Camera {
|
export class PerspectiveCamera extends Camera {
|
||||||
canvas: HTMLCanvasElement;
|
canvas!: HTMLCanvasElement;
|
||||||
|
|
||||||
get usesSTTransform(): boolean {
|
get usesSTTransform(): boolean {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -86,21 +86,21 @@ interface NormalsTable<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class MeshDebuggerAppController extends AppController {
|
class MeshDebuggerAppController extends AppController {
|
||||||
meshes: PathfinderMeshData | null;
|
meshes: PathfinderMeshData | null = null;
|
||||||
|
|
||||||
protected readonly defaultFile: string = FONT;
|
protected readonly defaultFile: string = FONT;
|
||||||
|
|
||||||
private file: PathfinderFont | SVGLoader | null;
|
private file: PathfinderFont | SVGLoader | null = null;
|
||||||
private fileType: FileType;
|
private fileType!: FileType;
|
||||||
private fileData: ArrayBuffer | null;
|
private fileData: ArrayBuffer | null = null;
|
||||||
|
|
||||||
private openModal: HTMLElement;
|
private openModal!: HTMLElement;
|
||||||
private openFileSelect: HTMLSelectElement;
|
private openFileSelect!: HTMLSelectElement;
|
||||||
private fontPathSelectGroup: HTMLElement;
|
private fontPathSelectGroup!: HTMLElement;
|
||||||
private fontPathSelect: HTMLSelectElement;
|
private fontPathSelect!: HTMLSelectElement;
|
||||||
|
|
||||||
private filePicker: FilePickerView;
|
private filePicker!: FilePickerView;
|
||||||
private view: MeshDebuggerView;
|
private view!: MeshDebuggerView;
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
super.start();
|
super.start();
|
||||||
|
|
|
@ -174,27 +174,27 @@ interface PathRanges {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PathfinderMeshData implements Meshes<ArrayBuffer>, MeshDataCounts, PathRanges {
|
export class PathfinderMeshData implements Meshes<ArrayBuffer>, MeshDataCounts, PathRanges {
|
||||||
readonly bQuadVertexPositions: ArrayBuffer;
|
readonly bQuadVertexPositions!: ArrayBuffer;
|
||||||
readonly bQuadVertexInteriorIndices: ArrayBuffer;
|
readonly bQuadVertexInteriorIndices!: ArrayBuffer;
|
||||||
readonly bBoxes: ArrayBuffer;
|
readonly bBoxes!: ArrayBuffer;
|
||||||
readonly bBoxSigns: ArrayBuffer;
|
readonly bBoxSigns!: ArrayBuffer;
|
||||||
readonly bBoxIndices: ArrayBuffer;
|
readonly bBoxIndices!: ArrayBuffer;
|
||||||
readonly stencilSegments: ArrayBuffer;
|
readonly stencilSegments!: ArrayBuffer;
|
||||||
readonly stencilNormals: ArrayBuffer;
|
readonly stencilNormals!: ArrayBuffer;
|
||||||
|
|
||||||
readonly bQuadVertexPositionCount: number;
|
readonly bQuadVertexPositionCount: number;
|
||||||
readonly bQuadVertexInteriorIndexCount: number;
|
readonly bQuadVertexInteriorIndexCount: number;
|
||||||
readonly bBoxCount: number;
|
readonly bBoxCount: number;
|
||||||
readonly stencilSegmentCount: number;
|
readonly stencilSegmentCount: number;
|
||||||
|
|
||||||
bQuadVertexPositionPathIDs: ArrayBuffer;
|
bQuadVertexPositionPathIDs!: ArrayBuffer;
|
||||||
bBoxPathIDs: ArrayBuffer;
|
bBoxPathIDs!: ArrayBuffer;
|
||||||
stencilSegmentPathIDs: ArrayBuffer;
|
stencilSegmentPathIDs!: ArrayBuffer;
|
||||||
|
|
||||||
bQuadVertexPositionPathRanges: Range[];
|
bQuadVertexPositionPathRanges!: Range[];
|
||||||
bQuadVertexInteriorIndexPathRanges: Range[];
|
bQuadVertexInteriorIndexPathRanges!: Range[];
|
||||||
bBoxPathRanges: Range[];
|
bBoxPathRanges!: Range[];
|
||||||
stencilSegmentPathRanges: Range[];
|
stencilSegmentPathRanges!: Range[];
|
||||||
|
|
||||||
constructor(meshes: ArrayBuffer | Meshes<ArrayBuffer>, optionalRanges?: PathRanges) {
|
constructor(meshes: ArrayBuffer | Meshes<ArrayBuffer>, optionalRanges?: PathRanges) {
|
||||||
if (meshes instanceof ArrayBuffer) {
|
if (meshes instanceof ArrayBuffer) {
|
||||||
|
@ -383,21 +383,21 @@ export class PathfinderMeshData implements Meshes<ArrayBuffer>, MeshDataCounts,
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PathfinderMeshBuffers implements Meshes<WebGLBuffer>, PathRanges {
|
export class PathfinderMeshBuffers implements Meshes<WebGLBuffer>, PathRanges {
|
||||||
readonly bQuadVertexPositions: WebGLBuffer;
|
readonly bQuadVertexPositions!: WebGLBuffer;
|
||||||
readonly bQuadVertexPositionPathIDs: WebGLBuffer;
|
readonly bQuadVertexPositionPathIDs!: WebGLBuffer;
|
||||||
readonly bQuadVertexInteriorIndices: WebGLBuffer;
|
readonly bQuadVertexInteriorIndices!: WebGLBuffer;
|
||||||
readonly bBoxes: WebGLBuffer;
|
readonly bBoxes!: WebGLBuffer;
|
||||||
readonly bBoxSigns: WebGLBuffer;
|
readonly bBoxSigns!: WebGLBuffer;
|
||||||
readonly bBoxIndices: WebGLBuffer;
|
readonly bBoxIndices!: WebGLBuffer;
|
||||||
readonly bBoxPathIDs: WebGLBuffer;
|
readonly bBoxPathIDs!: WebGLBuffer;
|
||||||
readonly stencilSegments: WebGLBuffer;
|
readonly stencilSegments!: WebGLBuffer;
|
||||||
readonly stencilSegmentPathIDs: WebGLBuffer;
|
readonly stencilSegmentPathIDs!: WebGLBuffer;
|
||||||
readonly stencilNormals: WebGLBuffer;
|
readonly stencilNormals!: WebGLBuffer;
|
||||||
|
|
||||||
readonly bQuadVertexPositionPathRanges: Range[];
|
readonly bQuadVertexPositionPathRanges!: Range[];
|
||||||
readonly bQuadVertexInteriorIndexPathRanges: Range[];
|
readonly bQuadVertexInteriorIndexPathRanges!: Range[];
|
||||||
readonly bBoxPathRanges: Range[];
|
readonly bBoxPathRanges!: Range[];
|
||||||
readonly stencilSegmentPathRanges: Range[];
|
readonly stencilSegmentPathRanges!: Range[];
|
||||||
|
|
||||||
constructor(gl: WebGLRenderingContext, meshData: PathfinderMeshData) {
|
constructor(gl: WebGLRenderingContext, meshData: PathfinderMeshData) {
|
||||||
for (const bufferName of Object.keys(BUFFER_TYPES) as Array<keyof Meshes<void>>) {
|
for (const bufferName of Object.keys(BUFFER_TYPES) as Array<keyof Meshes<void>>) {
|
||||||
|
|
|
@ -95,17 +95,17 @@ interface AntialiasingStrategyTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReferenceTestAppController extends DemoAppController<ReferenceTestView> {
|
class ReferenceTestAppController extends DemoAppController<ReferenceTestView> {
|
||||||
font: PathfinderFont | null;
|
font: PathfinderFont | null = null;
|
||||||
textRun: TextRun | null;
|
textRun: TextRun | null = null;
|
||||||
|
|
||||||
svgLoader: SVGLoader;
|
svgLoader!: SVGLoader;
|
||||||
builtinSvgName: string | null;
|
builtinSvgName: string | null = null;
|
||||||
|
|
||||||
referenceCanvas: HTMLCanvasElement;
|
referenceCanvas!: HTMLCanvasElement;
|
||||||
|
|
||||||
tests: Promise<ReferenceTestGroup[]>;
|
tests!: Promise<ReferenceTestGroup[]>;
|
||||||
|
|
||||||
currentTestType: 'font' | 'svg';
|
currentTestType!: 'font' | 'svg';
|
||||||
|
|
||||||
protected readonly defaultFile: string = FONT;
|
protected readonly defaultFile: string = FONT;
|
||||||
|
|
||||||
|
@ -115,29 +115,29 @@ class ReferenceTestAppController extends DemoAppController<ReferenceTestView> {
|
||||||
return BUILTIN_SVG_URI;
|
return BUILTIN_SVG_URI;
|
||||||
}
|
}
|
||||||
|
|
||||||
private glyphStore: GlyphStore;
|
private glyphStore!: GlyphStore;
|
||||||
private baseMeshes: PathfinderMeshData;
|
private baseMeshes!: PathfinderMeshData;
|
||||||
private expandedMeshes: ExpandedMeshData;
|
private expandedMeshes!: ExpandedMeshData;
|
||||||
|
|
||||||
private fontSizeInput: HTMLInputElement;
|
private fontSizeInput!: HTMLInputElement;
|
||||||
private characterInput: HTMLInputElement;
|
private characterInput!: HTMLInputElement;
|
||||||
private referenceRendererSelect: HTMLSelectElement;
|
private referenceRendererSelect!: HTMLSelectElement;
|
||||||
|
|
||||||
private differenceCanvas: HTMLCanvasElement;
|
private differenceCanvas!: HTMLCanvasElement;
|
||||||
|
|
||||||
private aaLevelGroup: HTMLElement;
|
private aaLevelGroup!: HTMLElement;
|
||||||
|
|
||||||
private customTabs: PerTestType<HTMLElement>;
|
private customTabs!: PerTestType<HTMLElement>;
|
||||||
private customTestForms: PerTestType<HTMLFormElement>;
|
private customTestForms!: PerTestType<HTMLFormElement>;
|
||||||
private selectFileGroups: PerTestType<HTMLElement>;
|
private selectFileGroups!: PerTestType<HTMLElement>;
|
||||||
private runTestsButtons: PerTestType<HTMLButtonElement>;
|
private runTestsButtons!: PerTestType<HTMLButtonElement>;
|
||||||
private ssimGroups: PerTestType<HTMLElement>;
|
private ssimGroups!: PerTestType<HTMLElement>;
|
||||||
private ssimLabels: PerTestType<HTMLElement>;
|
private ssimLabels!: PerTestType<HTMLElement>;
|
||||||
private resultsTables: PerTestType<HTMLTableElement>;
|
private resultsTables!: PerTestType<HTMLTableElement>;
|
||||||
|
|
||||||
private currentTestGroupIndex: number | null;
|
private currentTestGroupIndex: number | null = null;
|
||||||
private currentTestCaseIndex: number | null;
|
private currentTestCaseIndex: number | null = null;
|
||||||
private currentGlobalTestCaseIndex: number | null;
|
private currentGlobalTestCaseIndex: number | null = null;
|
||||||
|
|
||||||
get currentFontSize(): number {
|
get currentFontSize(): number {
|
||||||
return parseInt(this.fontSizeInput.value, 10);
|
return parseInt(this.fontSizeInput.value, 10);
|
||||||
|
@ -583,7 +583,7 @@ class ReferenceTestAppController extends DemoAppController<ReferenceTestView> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReferenceTestView extends DemoView {
|
class ReferenceTestView extends DemoView {
|
||||||
renderer: ReferenceTestTextRenderer | ReferenceTestSVGRenderer;
|
renderer!: ReferenceTestTextRenderer | ReferenceTestSVGRenderer;
|
||||||
readonly appController: ReferenceTestAppController;
|
readonly appController: ReferenceTestAppController;
|
||||||
|
|
||||||
get camera(): OrthographicCamera {
|
get camera(): OrthographicCamera {
|
||||||
|
@ -656,7 +656,7 @@ class ReferenceTestView extends DemoView {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReferenceTestTextRenderer extends Renderer {
|
class ReferenceTestTextRenderer extends Renderer {
|
||||||
renderContext: ReferenceTestView;
|
renderContext!: ReferenceTestView;
|
||||||
camera: OrthographicCamera;
|
camera: OrthographicCamera;
|
||||||
|
|
||||||
needsStencil: boolean = false;
|
needsStencil: boolean = false;
|
||||||
|
@ -823,7 +823,7 @@ class ReferenceTestTextRenderer extends Renderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReferenceTestSVGRenderer extends SVGRenderer {
|
class ReferenceTestSVGRenderer extends SVGRenderer {
|
||||||
renderContext: ReferenceTestView;
|
renderContext!: ReferenceTestView;
|
||||||
|
|
||||||
protected get loader(): SVGLoader {
|
protected get loader(): SVGLoader {
|
||||||
return this.renderContext.appController.svgLoader;
|
return this.renderContext.appController.svgLoader;
|
||||||
|
|
|
@ -90,14 +90,14 @@ export abstract class Renderer {
|
||||||
protected abstract get usedSizeFactor(): glmatrix.vec2;
|
protected abstract get usedSizeFactor(): glmatrix.vec2;
|
||||||
protected abstract get worldTransform(): glmatrix.mat4;
|
protected abstract get worldTransform(): glmatrix.mat4;
|
||||||
|
|
||||||
private implicitCoverInteriorVAO: WebGLVertexArrayObjectOES | null;
|
private implicitCoverInteriorVAO: WebGLVertexArrayObjectOES | null = null;
|
||||||
private implicitCoverCurveVAO: WebGLVertexArrayObjectOES | null;
|
private implicitCoverCurveVAO: WebGLVertexArrayObjectOES | null = null;
|
||||||
|
|
||||||
private gammaLUTTexture: WebGLTexture | null;
|
private gammaLUTTexture: WebGLTexture | null = null;
|
||||||
|
|
||||||
private instancedPathIDVBO: WebGLBuffer | null;
|
private instancedPathIDVBO: WebGLBuffer | null = null;
|
||||||
private vertexIDVBO: WebGLBuffer | null;
|
private vertexIDVBO: WebGLBuffer | null = null;
|
||||||
private timerQueryPollInterval: number | null;
|
private timerQueryPollInterval: number | null = null;
|
||||||
|
|
||||||
constructor(renderContext: RenderContext) {
|
constructor(renderContext: RenderContext) {
|
||||||
this.renderContext = renderContext;
|
this.renderContext = renderContext;
|
||||||
|
|
|
@ -122,8 +122,8 @@ interface ShaderProgramURLs {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ShaderLoader {
|
export class ShaderLoader {
|
||||||
common: Promise<string>;
|
common!: Promise<string>;
|
||||||
shaders: Promise<ShaderMap<ShaderProgramSource>>;
|
shaders!: Promise<ShaderMap<ShaderProgramSource>>;
|
||||||
|
|
||||||
load(): void {
|
load(): void {
|
||||||
this.common = window.fetch(COMMON_SHADER_URL).then(response => response.text());
|
this.common = window.fetch(COMMON_SHADER_URL).then(response => response.text());
|
||||||
|
|
|
@ -33,9 +33,9 @@ export default class SSAAStrategy extends AntialiasingStrategy {
|
||||||
|
|
||||||
private destFramebufferSize: glmatrix.vec2;
|
private destFramebufferSize: glmatrix.vec2;
|
||||||
private supersampledFramebufferSize: glmatrix.vec2;
|
private supersampledFramebufferSize: glmatrix.vec2;
|
||||||
private supersampledColorTexture: WebGLTexture;
|
private supersampledColorTexture!: WebGLTexture;
|
||||||
private supersampledDepthTexture: WebGLTexture;
|
private supersampledDepthTexture!: WebGLTexture;
|
||||||
private supersampledFramebuffer: WebGLFramebuffer;
|
private supersampledFramebuffer!: WebGLFramebuffer;
|
||||||
|
|
||||||
constructor(level: number, subpixelAA: SubpixelAAType) {
|
constructor(level: number, subpixelAA: SubpixelAAType) {
|
||||||
super();
|
super();
|
||||||
|
|
|
@ -26,11 +26,11 @@ const SVG_NS: string = "http://www.w3.org/2000/svg";
|
||||||
const DEFAULT_FILE: string = 'tiger';
|
const DEFAULT_FILE: string = 'tiger';
|
||||||
|
|
||||||
class SVGDemoController extends DemoAppController<SVGDemoView> {
|
class SVGDemoController extends DemoAppController<SVGDemoView> {
|
||||||
loader: SVGLoader;
|
loader!: SVGLoader;
|
||||||
|
|
||||||
protected readonly builtinFileURI: string = BUILTIN_SVG_URI;
|
protected readonly builtinFileURI: string = BUILTIN_SVG_URI;
|
||||||
|
|
||||||
private meshes: PathfinderMeshData;
|
private meshes!: PathfinderMeshData;
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
super.start();
|
super.start();
|
||||||
|
@ -93,7 +93,7 @@ class SVGDemoView extends DemoView {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SVGDemoRenderer extends SVGRenderer {
|
class SVGDemoRenderer extends SVGRenderer {
|
||||||
renderContext: SVGDemoView;
|
renderContext!: SVGDemoView;
|
||||||
|
|
||||||
needsStencil: boolean = false;
|
needsStencil: boolean = false;
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ export class SVGLoader {
|
||||||
isMonochrome: boolean;
|
isMonochrome: boolean;
|
||||||
|
|
||||||
private svg: SVGSVGElement;
|
private svg: SVGSVGElement;
|
||||||
private fileData: ArrayBuffer;
|
private fileData!: ArrayBuffer;
|
||||||
|
|
||||||
private paths: any[];
|
private paths: any[];
|
||||||
private clipPathIDs: ClipPathIDTable;
|
private clipPathIDs: ClipPathIDTable;
|
||||||
|
@ -108,7 +108,10 @@ export class SVGLoader {
|
||||||
this.scale = 1.0;
|
this.scale = 1.0;
|
||||||
this.pathInstances = [];
|
this.pathInstances = [];
|
||||||
this.pathBounds = [];
|
this.pathBounds = [];
|
||||||
|
this.paths = [];
|
||||||
|
this.clipPathIDs = {};
|
||||||
this.svgBounds = glmatrix.vec4.create();
|
this.svgBounds = glmatrix.vec4.create();
|
||||||
|
this.svgViewBox = glmatrix.vec4.create();
|
||||||
this.svg = unwrapNull(document.getElementById('pf-svg')) as Element as SVGSVGElement;
|
this.svg = unwrapNull(document.getElementById('pf-svg')) as Element as SVGSVGElement;
|
||||||
this.isMonochrome = false;
|
this.isMonochrome = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ export interface SVGRendererOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class SVGRenderer extends Renderer {
|
export abstract class SVGRenderer extends Renderer {
|
||||||
renderContext: RenderContext;
|
renderContext!: RenderContext;
|
||||||
|
|
||||||
camera: OrthographicCamera;
|
camera: OrthographicCamera;
|
||||||
|
|
||||||
|
@ -95,10 +95,12 @@ export abstract class SVGRenderer extends Renderer {
|
||||||
|
|
||||||
this.options = options;
|
this.options = options;
|
||||||
|
|
||||||
this.camera = new OrthographicCamera(this.canvas, {
|
// FIXME(pcwalton): Get the canvas a better way?
|
||||||
|
this.camera = new OrthographicCamera((this as any).canvas, {
|
||||||
fixed: !!this.options.fixed,
|
fixed: !!this.options.fixed,
|
||||||
scaleBounds: true,
|
scaleBounds: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.camera.onPan = () => this.renderContext.setDirty();
|
this.camera.onPan = () => this.renderContext.setDirty();
|
||||||
this.camera.onZoom = () => this.renderContext.setDirty();
|
this.camera.onZoom = () => this.renderContext.setDirty();
|
||||||
this.camera.onRotate = () => this.renderContext.setDirty();
|
this.camera.onRotate = () => this.renderContext.setDirty();
|
||||||
|
|
|
@ -120,24 +120,24 @@ declare module 'opentype.js' {
|
||||||
}
|
}
|
||||||
|
|
||||||
class TextDemoController extends DemoAppController<TextDemoView> {
|
class TextDemoController extends DemoAppController<TextDemoView> {
|
||||||
font: PathfinderFont;
|
font!: PathfinderFont;
|
||||||
layout: SimpleTextLayout;
|
layout!: SimpleTextLayout;
|
||||||
glyphStore: GlyphStore;
|
glyphStore!: GlyphStore;
|
||||||
atlasGlyphs: AtlasGlyph[];
|
atlasGlyphs!: AtlasGlyph[];
|
||||||
|
|
||||||
private hintingSelect: HTMLSelectElement;
|
private hintingSelect!: HTMLSelectElement;
|
||||||
private emboldenInput: HTMLInputElement;
|
private emboldenInput!: HTMLInputElement;
|
||||||
|
|
||||||
private editTextModal: HTMLElement;
|
private editTextModal!: HTMLElement;
|
||||||
private editTextArea: HTMLTextAreaElement;
|
private editTextArea!: HTMLTextAreaElement;
|
||||||
|
|
||||||
private _atlas: Atlas;
|
private _atlas: Atlas;
|
||||||
|
|
||||||
private meshes: PathfinderMeshData;
|
private meshes!: PathfinderMeshData;
|
||||||
|
|
||||||
private _fontSize: number;
|
private _fontSize!: number;
|
||||||
private _rotationAngle: number;
|
private _rotationAngle!: number;
|
||||||
private _emboldenAmount: number;
|
private _emboldenAmount!: number;
|
||||||
|
|
||||||
private text: string;
|
private text: string;
|
||||||
|
|
||||||
|
@ -440,13 +440,13 @@ class TextDemoView extends DemoView implements TextRenderContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
class TextDemoRenderer extends TextRenderer {
|
class TextDemoRenderer extends TextRenderer {
|
||||||
renderContext: TextDemoView;
|
renderContext!: TextDemoView;
|
||||||
|
|
||||||
glyphPositionsBuffer: WebGLBuffer;
|
glyphPositionsBuffer!: WebGLBuffer;
|
||||||
glyphTexCoordsBuffer: WebGLBuffer;
|
glyphTexCoordsBuffer!: WebGLBuffer;
|
||||||
glyphElementsBuffer: WebGLBuffer;
|
glyphElementsBuffer!: WebGLBuffer;
|
||||||
|
|
||||||
private glyphBounds: Float32Array;
|
private glyphBounds!: Float32Array;
|
||||||
|
|
||||||
get layout(): SimpleTextLayout {
|
get layout(): SimpleTextLayout {
|
||||||
return this.renderContext.appController.layout;
|
return this.renderContext.appController.layout;
|
||||||
|
|
|
@ -58,12 +58,12 @@ export interface TextRenderContext extends RenderContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class TextRenderer extends Renderer {
|
export abstract class TextRenderer extends Renderer {
|
||||||
renderContext: TextRenderContext;
|
renderContext!: TextRenderContext;
|
||||||
|
|
||||||
camera: OrthographicCamera;
|
camera: OrthographicCamera;
|
||||||
|
|
||||||
atlasFramebuffer: WebGLFramebuffer;
|
atlasFramebuffer!: WebGLFramebuffer;
|
||||||
atlasDepthTexture: WebGLTexture;
|
atlasDepthTexture!: WebGLTexture;
|
||||||
|
|
||||||
get isMulticolor(): boolean {
|
get isMulticolor(): boolean {
|
||||||
return false;
|
return false;
|
||||||
|
@ -142,8 +142,8 @@ export abstract class TextRenderer extends Renderer {
|
||||||
return glmatrix.vec2.create();
|
return glmatrix.vec2.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
private stemDarkening: StemDarkeningMode;
|
private stemDarkening!: StemDarkeningMode;
|
||||||
private subpixelAA: SubpixelAAType;
|
private subpixelAA!: SubpixelAAType;
|
||||||
|
|
||||||
constructor(renderContext: TextRenderContext) {
|
constructor(renderContext: TextRenderContext) {
|
||||||
super(renderContext);
|
super(renderContext);
|
||||||
|
|
|
@ -63,6 +63,7 @@ export abstract class PathfinderView {
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.dirty = false;
|
this.dirty = false;
|
||||||
|
this.pulseHandle = 0;
|
||||||
this.suppressAutomaticRedraw = false;
|
this.suppressAutomaticRedraw = false;
|
||||||
this.canvas = unwrapNull(document.getElementById('pf-canvas')) as HTMLCanvasElement;
|
this.canvas = unwrapNull(document.getElementById('pf-canvas')) as HTMLCanvasElement;
|
||||||
window.addEventListener('resize', () => this.resizeToFit(false), false);
|
window.addEventListener('resize', () => this.resizeToFit(false), false);
|
||||||
|
@ -137,24 +138,24 @@ export abstract class PathfinderView {
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class DemoView extends PathfinderView implements RenderContext {
|
export abstract class DemoView extends PathfinderView implements RenderContext {
|
||||||
readonly renderer: Renderer;
|
readonly renderer!: Renderer;
|
||||||
|
|
||||||
gl: WebGLRenderingContext;
|
gl!: WebGLRenderingContext;
|
||||||
|
|
||||||
shaderPrograms: ShaderMap<PathfinderShaderProgram>;
|
shaderPrograms: ShaderMap<PathfinderShaderProgram>;
|
||||||
gammaLUT: HTMLImageElement;
|
gammaLUT: HTMLImageElement;
|
||||||
|
|
||||||
instancedArraysExt: ANGLEInstancedArrays;
|
instancedArraysExt!: ANGLE_instanced_arrays;
|
||||||
textureHalfFloatExt: OESTextureHalfFloat;
|
textureHalfFloatExt!: OESTextureHalfFloat;
|
||||||
timerQueryExt: EXTDisjointTimerQuery;
|
timerQueryExt!: EXTDisjointTimerQuery;
|
||||||
vertexArrayObjectExt: OESVertexArrayObject;
|
vertexArrayObjectExt!: OESVertexArrayObject;
|
||||||
|
|
||||||
quadPositionsBuffer: WebGLBuffer;
|
quadPositionsBuffer!: WebGLBuffer;
|
||||||
quadTexCoordsBuffer: WebGLBuffer;
|
quadTexCoordsBuffer!: WebGLBuffer;
|
||||||
quadElementsBuffer: WebGLBuffer;
|
quadElementsBuffer!: WebGLBuffer;
|
||||||
|
|
||||||
atlasRenderingTimerQuery: WebGLQuery;
|
atlasRenderingTimerQuery!: WebGLQuery;
|
||||||
compositingTimerQuery: WebGLQuery;
|
compositingTimerQuery!: WebGLQuery;
|
||||||
|
|
||||||
meshes: PathfinderMeshBuffers[];
|
meshes: PathfinderMeshBuffers[];
|
||||||
meshData: PathfinderMeshData[];
|
meshData: PathfinderMeshData[];
|
||||||
|
@ -179,6 +180,9 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
|
||||||
shaderSources: ShaderMap<ShaderProgramSource>) {
|
shaderSources: ShaderMap<ShaderProgramSource>) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
this.meshes = [];
|
||||||
|
this.meshData = [];
|
||||||
|
|
||||||
this.initContext();
|
this.initContext();
|
||||||
|
|
||||||
const shaderSource = this.compileShaders(commonShaderSource, shaderSources);
|
const shaderSource = this.compileShaders(commonShaderSource, shaderSources);
|
||||||
|
@ -266,10 +270,10 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
|
||||||
this.gl = expectNotNull(this.canvas.getContext('webgl', { antialias: false, depth: true }),
|
this.gl = expectNotNull(this.canvas.getContext('webgl', { antialias: false, depth: true }),
|
||||||
"Failed to initialize WebGL! Check that your browser supports it.");
|
"Failed to initialize WebGL! Check that your browser supports it.");
|
||||||
this.colorBufferHalfFloatExt = this.gl.getExtension('EXT_color_buffer_half_float');
|
this.colorBufferHalfFloatExt = this.gl.getExtension('EXT_color_buffer_half_float');
|
||||||
this.instancedArraysExt = this.gl.getExtension('ANGLE_instanced_arrays');
|
this.instancedArraysExt = unwrapNull(this.gl.getExtension('ANGLE_instanced_arrays'));
|
||||||
this.textureHalfFloatExt = this.gl.getExtension('OES_texture_half_float');
|
this.textureHalfFloatExt = unwrapNull(this.gl.getExtension('OES_texture_half_float'));
|
||||||
this.timerQueryExt = this.gl.getExtension('EXT_disjoint_timer_query');
|
this.timerQueryExt = this.gl.getExtension('EXT_disjoint_timer_query');
|
||||||
this.vertexArrayObjectExt = this.gl.getExtension('OES_vertex_array_object');
|
this.vertexArrayObjectExt = unwrapNull(this.gl.getExtension('OES_vertex_array_object'));
|
||||||
this.gl.getExtension('EXT_frag_depth');
|
this.gl.getExtension('EXT_frag_depth');
|
||||||
this.gl.getExtension('OES_element_index_uint');
|
this.gl.getExtension('OES_element_index_uint');
|
||||||
this.gl.getExtension('OES_standard_derivatives');
|
this.gl.getExtension('OES_standard_derivatives');
|
||||||
|
|
|
@ -49,8 +49,8 @@ export type TransformType = 'dilation' | 'affine' | '3d';
|
||||||
export abstract class XCAAStrategy extends AntialiasingStrategy {
|
export abstract class XCAAStrategy extends AntialiasingStrategy {
|
||||||
abstract readonly directRenderingMode: DirectRenderingMode;
|
abstract readonly directRenderingMode: DirectRenderingMode;
|
||||||
|
|
||||||
protected patchVertexBuffer: WebGLBuffer | null;
|
protected patchVertexBuffer: WebGLBuffer | null = null;
|
||||||
protected patchIndexBuffer: WebGLBuffer | null;
|
protected patchIndexBuffer: WebGLBuffer | null = null;
|
||||||
|
|
||||||
get passCount(): number {
|
get passCount(): number {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -69,9 +69,9 @@ export abstract class XCAAStrategy extends AntialiasingStrategy {
|
||||||
|
|
||||||
protected resolveVAO: WebGLVertexArrayObject | null;
|
protected resolveVAO: WebGLVertexArrayObject | null;
|
||||||
|
|
||||||
protected aaAlphaTexture: WebGLTexture | null;
|
protected aaAlphaTexture: WebGLTexture | null = null;
|
||||||
protected aaDepthTexture: WebGLTexture | null;
|
protected aaDepthTexture: WebGLTexture | null = null;
|
||||||
protected aaFramebuffer: WebGLFramebuffer | null;
|
protected aaFramebuffer: WebGLFramebuffer | null = null;
|
||||||
|
|
||||||
protected abstract get mightUseAAFramebuffer(): boolean;
|
protected abstract get mightUseAAFramebuffer(): boolean;
|
||||||
|
|
||||||
|
@ -82,6 +82,8 @@ export abstract class XCAAStrategy extends AntialiasingStrategy {
|
||||||
|
|
||||||
this.supersampledFramebufferSize = glmatrix.vec2.create();
|
this.supersampledFramebufferSize = glmatrix.vec2.create();
|
||||||
this.destFramebufferSize = glmatrix.vec2.create();
|
this.destFramebufferSize = glmatrix.vec2.create();
|
||||||
|
|
||||||
|
this.pathBoundsBufferTextures = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
init(renderer: Renderer): void {
|
init(renderer: Renderer): void {
|
||||||
|
|
Loading…
Reference in New Issue