Skip to content
This repository has been archived by the owner on Mar 8, 2023. It is now read-only.

Commit

Permalink
Update-able TextStyleCache (#2017)
Browse files Browse the repository at this point in the history
* HARP-13326: Makes TextStyleCache updatable

Signed-off-by: Frauke Fritz <[email protected]>

* HARP-13326: Adds updateTextStyles tests

Signed-off-by: Frauke Fritz <[email protected]>

* HARP-13326: Optimize updateTextStyles

Signed-off-by: Frauke Fritz <[email protected]>
  • Loading branch information
FraukeF authored Jan 7, 2021
1 parent 2c4ebb6 commit 075bf23
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 50 deletions.
15 changes: 6 additions & 9 deletions @here/harp-mapview/lib/text/TextElementsRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ export class TextElementsRenderer {
private readonly m_camera = new THREE.OrthographicCamera(-1, 1, 1, -1);
private m_defaultFontCatalogConfig: FontCatalogConfig | undefined;
private m_poiRenderer: PoiRenderer;
private m_textStyleCache: TextStyleCache = new TextStyleCache();
private readonly m_textStyleCache: TextStyleCache = new TextStyleCache();
private readonly m_screenCollisions:
| ScreenCollisions
| ScreenCollisionsDebug = new ScreenCollisions();
Expand Down Expand Up @@ -418,7 +418,7 @@ export class TextElementsRenderer {
this.initializeCamera();

this.initializeDefaultFontCatalog();
this.m_textStyleCache.initializeTextElementStyles(this.m_textCanvases);
this.m_textStyleCache.updateTextCanvases(this.m_textCanvases);
}

/**
Expand Down Expand Up @@ -520,19 +520,16 @@ export class TextElementsRenderer {
} else {
this.m_textCanvases.clear();
}
this.m_textStyleCache.initializeTextElementStyles(this.m_textCanvases);
this.m_textStyleCache.updateTextCanvases(this.m_textCanvases);
}

async updateTextStyles(
textStyles?: TextStyleDefinition[],
defaultTextStyle?: TextStyleDefinition
) {
// TODO: this is an intermeditate solution, in the end this
// should not create a new cache, but update the former one
this.m_textStyleCache = new TextStyleCache(textStyles, defaultTextStyle);
this.m_textStyleCache.initializeDefaultTextElementStyle();
this.m_textStyleCache.updateTextStyles(textStyles, defaultTextStyle);
await this.waitLoaded();
this.m_textStyleCache.initializeTextElementStyles(this.m_textCanvases);
this.m_textStyleCache.updateTextCanvases(this.m_textCanvases);
}

/**
Expand Down Expand Up @@ -772,7 +769,7 @@ export class TextElementsRenderer {
return;
}
await this.addTextCanvas(this.m_defaultFontCatalogConfig);
this.m_textStyleCache.initializeTextElementStyles(this.m_textCanvases);
this.m_textStyleCache.updateTextCanvases(this.m_textCanvases);
}

/**
Expand Down
73 changes: 37 additions & 36 deletions @here/harp-mapview/lib/text/TextStyleCache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,50 +84,30 @@ export class TextStyleCache {
layoutParams: defaultTextLayoutStyle.params
};

constructor(
private m_textStyleDefinitions?: TextStyleDefinition[],
private readonly m_defaultTextStyleDefinition?: TextStyleDefinition
) {}

initializeDefaultTextElementStyle() {
if (this.m_textStyleDefinitions === undefined) {
this.m_textStyleDefinitions = [];
}
const styles = this.m_textStyleDefinitions;
this.m_defaultStyle.fontCatalog = undefined;

const themedDefaultStyle = styles.find(style => style.name === DEFAULT_STYLE_NAME);
if (themedDefaultStyle !== undefined) {
this.m_defaultStyle = this.createTextElementStyle(
themedDefaultStyle,
DEFAULT_STYLE_NAME
);
} else if (this.m_defaultTextStyleDefinition !== undefined) {
this.m_defaultStyle = this.createTextElementStyle(
this.m_defaultTextStyleDefinition,
DEFAULT_STYLE_NAME
);
} else if (styles.length > 0) {
this.m_defaultStyle = this.createTextElementStyle(styles[0], DEFAULT_STYLE_NAME);
}
this.m_defaultStyle.textCanvas = undefined;
constructor() {
this.updateDefaultTextStyle();
}

initializeTextElementStyles(textCanvases: TextCanvases) {
// Initialize default text style.
this.initializeTextCanvas(this.m_defaultStyle, textCanvases);

// Initialize theme text styles.
this.m_textStyleDefinitions?.forEach(element => {
updateTextStyles(
textStyleDefinitions?: TextStyleDefinition[],
defaultTextStyleDefinition?: TextStyleDefinition
) {
this.m_textStyles.clear();
textStyleDefinitions?.forEach(element => {
this.m_textStyles.set(
element.name!,
this.createTextElementStyle(element, element.name!)
);
});
this.updateDefaultTextStyle(defaultTextStyleDefinition, textStyleDefinitions);
}

updateTextCanvases(textCanvases: TextCanvases) {
// Initialize default text style.
this.initializeTextCanvas(this.m_defaultStyle, textCanvases);

for (const [, style] of this.m_textStyles) {
if (style.textCanvas === undefined) {
this.initializeTextCanvas(style, textCanvases);
}
this.initializeTextCanvas(style, textCanvases);
}
}

Expand Down Expand Up @@ -353,7 +333,28 @@ export class TextStyleCache {
return layoutStyle;
}

private updateDefaultTextStyle(
defaultTextStyleDefinition?: TextStyleDefinition,
textStyleDefinitions?: TextStyleDefinition[]
) {
this.m_defaultStyle.fontCatalog = undefined;

const style =
textStyleDefinitions?.find(definition => {
return definition.name === DEFAULT_STYLE_NAME;
}) ??
defaultTextStyleDefinition ??
textStyleDefinitions?.[0];
if (style) {
this.m_defaultStyle = this.createTextElementStyle(style, DEFAULT_STYLE_NAME);
}
this.m_defaultStyle.textCanvas = undefined;
}

private initializeTextCanvas(style: TextElementStyle, textCanvases: TextCanvases): void {
if (style.textCanvas) {
return;
}
if (style.fontCatalog !== undefined) {
const styledTextCanvas = textCanvases.get(style.fontCatalog);
style.textCanvas = styledTextCanvas;
Expand Down
65 changes: 65 additions & 0 deletions @here/harp-mapview/test/TextElementsRendererTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Licensed under Apache 2.0, see full license in LICENSE
* SPDX-License-Identifier: Apache-2.0
*/
import { TextStyleDefinition } from "@here/harp-datasource-protocol";
import { expect } from "chai";
import * as sinon from "sinon";
import * as THREE from "three";
Expand Down Expand Up @@ -950,4 +951,68 @@ describe("TextElementsRenderer", function() {
]);
expect(fixture.loadCatalogStub.callCount).to.equal(7);
});

it("updates TextStyles", async function() {
const style1: TextStyleDefinition = {
name: "style-1",
fontCatalogName: "catalog-1"
};

const style2: TextStyleDefinition = {
name: "style-2",
fontCatalogName: "catalog-2"
};

const style3: TextStyleDefinition = {
name: "style-3",
fontCatalogName: "catalog-3"
};

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").name).to.equal(
"default"
);
await fixture.textRenderer.updateTextStyles();
expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").name).to.equal(
"default"
);

await fixture.textRenderer.updateTextStyles([]);

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").name).to.equal(
"default"
);

await fixture.textRenderer.updateTextStyles([], style2);

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").fontCatalog).to.equal(
"catalog-2",
"the new default is using style-2"
);

await fixture.textRenderer.updateTextStyles([]);

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").name).to.equal(
"default",
"the default is reset to 'default'"
);

await fixture.textRenderer.updateTextStyles([style1, style2]);

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").name).to.equal(
"style-1",
"the style is found in the list"
);

await fixture.textRenderer.updateTextStyles([style3, style2]);

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-1").name).to.equal(
"default",
"style-1 was removed, using default instead"
);

expect(fixture.textRenderer.styleCache.getTextElementStyle("style-3").name).to.equal(
"style-3",
"the style is found in the list"
);
});
});
5 changes: 0 additions & 5 deletions @here/harp-mapview/test/TextElementsRendererTestFixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -455,11 +455,6 @@ export class TestFixture {
}
}

private clearVisibleTiles() {
this.tileLists[0].visibleTiles.length = 0;
this.tileLists[0].renderedTiles.clear();
}

private get visibleTiles(): Tile[] {
return this.tileLists[0].visibleTiles;
}
Expand Down

0 comments on commit 075bf23

Please sign in to comment.