From 84ed1a76b0c813823c87f8927e2a3f4ad34b6c08 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 20 Dec 2017 19:13:07 -0800 Subject: [PATCH] Hook the reftest framework up to the SVG renderer --- demo/client/html/reference-test.html.hbs | 1 + demo/client/src/reference-test.ts | 103 +++++++++++++++++++++-- 2 files changed, 95 insertions(+), 9 deletions(-) diff --git a/demo/client/html/reference-test.html.hbs b/demo/client/html/reference-test.html.hbs index b97b930e..efdff896 100644 --- a/demo/client/html/reference-test.html.hbs +++ b/demo/client/html/reference-test.html.hbs @@ -7,6 +7,7 @@ +
{{>partials/navbar.html isTool=true}} diff --git a/demo/client/src/reference-test.ts b/demo/client/src/reference-test.ts index 2ff94723..269a21e6 100644 --- a/demo/client/src/reference-test.ts +++ b/demo/client/src/reference-test.ts @@ -29,6 +29,8 @@ import {PathfinderFont, TextFrame, TextRun} from "./text"; import {unwrapNull} from "./utils"; import {DemoView} from "./view"; import {AdaptiveMonochromeXCAAStrategy} from './xcaa-strategy'; +import { SVGRenderer } from './svg-renderer'; +import { SVGLoader, BUILTIN_SVG_URI } from './svg-loader'; const FONT: string = 'open-sans'; const TEXT_COLOR: number[] = [0, 0, 0, 255]; @@ -92,12 +94,21 @@ class ReferenceTestAppController extends DemoAppController { font: PathfinderFont | null; textRun: TextRun | null; + svgLoader: SVGLoader; + referenceCanvas: HTMLCanvasElement; tests: Promise; + currentTestType: 'font' | 'svg'; + protected readonly defaultFile: string = FONT; - protected readonly builtinFileURI: string = BUILTIN_FONT_URI; + + protected get builtinFileURI(): string { + if (this.currentTestType === 'font') + return BUILTIN_FONT_URI; + return BUILTIN_SVG_URI; + } private glyphStore: GlyphStore; private baseMeshes: PathfinderMeshData; @@ -119,7 +130,6 @@ class ReferenceTestAppController extends DemoAppController { private ssimLabels: PerTestType; private resultsTables: PerTestType; - private currentTestType: 'font' | 'svg'; private currentTestGroupIndex: number | null; private currentTestCaseIndex: number | null; private currentGlobalTestCaseIndex: number | null; @@ -307,14 +317,30 @@ class ReferenceTestAppController extends DemoAppController { } protected fileLoaded(fileData: ArrayBuffer, builtinName: string | null): void { - const font = new PathfinderFont(fileData, builtinName); - this.font = font; + switch (this.currentTestType) { + case 'font': + this.textFileLoaded(fileData, builtinName); + break; + case 'svg': + this.svgFileLoaded(fileData, builtinName); + break; + } // Don't automatically run the test unless this is a custom test. if (this.currentGlobalTestCaseIndex == null) this.runSingleTest(); } + private textFileLoaded(fileData: ArrayBuffer, builtinName: string | null): void { + const font = new PathfinderFont(fileData, builtinName); + this.font = font; + } + + private svgFileLoaded(fileData: ArrayBuffer, builtinName: string | null): void { + this.svgLoader = new SVGLoader; + this.svgLoader.loadFile(fileData); + } + private populateFilesSelect(): void { const selectFileElement = unwrapNull(this.selectFileElement); while (selectFileElement.lastChild != null) @@ -387,7 +413,9 @@ class ReferenceTestAppController extends DemoAppController { } private runSingleTest(): void { - this.setUpTextRun(); + if (this.currentTestType === 'font') + this.setUpTextRun(); + this.loadReference().then(() => this.loadRendering()); } @@ -448,6 +476,17 @@ class ReferenceTestAppController extends DemoAppController { } private loadRendering(): void { + switch (this.currentTestType) { + case 'font': + this.loadTextRendering(); + break; + case 'svg': + this.loadSVGRendering(); + break; + } + } + + private loadTextRendering(): void { this.glyphStore.partition().then(result => { const textRun = unwrapNull(this.textRun); @@ -458,12 +497,23 @@ class ReferenceTestAppController extends DemoAppController { this.expandedMeshes = expandedMeshes; this.view.then(view => { + view.recreateRenderer(); view.attachMeshes([expandedMeshes.meshes]); view.redraw(); }); }); } + private loadSVGRendering(): void { + this.svgLoader.partition().then(meshes => { + this.view.then(view => { + view.recreateRenderer(); + view.attachMeshes([meshes]); + view.initCameraBounds(this.svgLoader.svgBounds); + }); + }); + } + private loadReference(): Promise { const request = { face: { @@ -513,7 +563,7 @@ class ReferenceTestAppController extends DemoAppController { } class ReferenceTestView extends DemoView { - readonly renderer: ReferenceTestRenderer; + renderer: ReferenceTestTextRenderer | ReferenceTestSVGRenderer; readonly appController: ReferenceTestAppController; get camera(): OrthographicCamera { @@ -527,16 +577,35 @@ class ReferenceTestView extends DemoView { super(gammaLUT, commonShaderSource, shaderSources); this.appController = appController; - this.renderer = new ReferenceTestRenderer(this); + this.recreateRenderer(); this.resizeToFit(true); } + recreateRenderer(): void { + switch (this.appController.currentTestType) { + case 'svg': + this.renderer = new ReferenceTestSVGRenderer(this); + break; + case 'font': + this.renderer = new ReferenceTestTextRenderer(this); + break; + } + } + + initCameraBounds(bounds: glmatrix.vec4): void { + if (this.renderer instanceof ReferenceTestSVGRenderer) + this.renderer.initCameraBounds(bounds); + } + protected renderingFinished(): void { const gl = this.renderContext.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, null); - const pixelRect = this.renderer.getPixelRectForGlyphAt(0); + // TODO(pcwalton): Get the SVG pixel rect. + let pixelRect: glmatrix.vec4 = glmatrix.vec4.create(); + if (this.renderer instanceof ReferenceTestTextRenderer) + pixelRect = this.renderer.getPixelRectForGlyphAt(0); const canvasHeight = this.canvas.height; const width = pixelRect[2] - pixelRect[0], height = pixelRect[3] - pixelRect[1]; @@ -566,7 +635,7 @@ class ReferenceTestView extends DemoView { } } -class ReferenceTestRenderer extends Renderer { +class ReferenceTestTextRenderer extends Renderer { renderContext: ReferenceTestView; camera: OrthographicCamera; @@ -730,6 +799,22 @@ class ReferenceTestRenderer extends Renderer { } } +class ReferenceTestSVGRenderer extends SVGRenderer { + renderContext: ReferenceTestView; + + protected get loader(): SVGLoader { + return this.renderContext.appController.svgLoader; + } + + protected get canvas(): HTMLCanvasElement { + return this.renderContext.canvas; + } + + constructor(renderContext: ReferenceTestView) { + super(renderContext); + } +} + function createSSIMImage(image: HTMLCanvasElement | Uint8Array, rect: glmatrix.vec4): imageSSIM.IImage { const size = glmatrix.vec2.clone([rect[2] - rect[0], rect[3] - rect[1]]);