Update dependencies and fix TypeScript build failures.

Closes #68.
This commit is contained in:
Patrick Walton 2018-02-19 11:52:00 -08:00
parent a84b7c7cbd
commit 82be5d12d1
19 changed files with 209 additions and 188 deletions

View File

@ -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

View File

@ -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"
} }
} }

View File

@ -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 {

View File

@ -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();

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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>>) {

View File

@ -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;

View File

@ -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;

View File

@ -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());

View File

@ -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();

View File

@ -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;

View File

@ -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;
} }

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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');

View File

@ -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 {