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

Commit

Permalink
HARP-13326: TextElementsRenderer supports update of FontCatalogs
Browse files Browse the repository at this point in the history
   * FontCatalogLoader only loads FontCatalogs
   * MapView only ever has one instance of TextElementsRenderer
   * MapViewThemeManager awaits Theme updates on DataSources

Signed-off-by: Frauke Fritz <frauke.fritz@here.com>
  • Loading branch information
Frauke Fritz committed Dec 9, 2020
1 parent 829a0db commit 8ae740d
Show file tree
Hide file tree
Showing 11 changed files with 286 additions and 237 deletions.
26 changes: 6 additions & 20 deletions @here/harp-mapview/lib/MapView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ import { PolarTileDataSource } from "./PolarTileDataSource";
import { ScreenCollisions, ScreenCollisionsDebug } from "./ScreenCollisions";
import { ScreenProjector } from "./ScreenProjector";
import { FrameStats, PerformanceStatistics } from "./Statistics";
import { FontCatalogLoader } from "./text/FontCatalogLoader";
import { MapViewState } from "./text/MapViewState";
import { TextCanvasFactory } from "./text/TextCanvasFactory";
import { TextElement } from "./text/TextElement";
Expand Down Expand Up @@ -1253,7 +1252,6 @@ export class MapView extends EventDispatcher {

this.m_enableMixedLod = enableMixedLod;
this.m_visibleTiles = this.createVisibleTileSet();
//FIXME: Why is this needed: this.resetTextRenderer(theme);
this.update();
}

Expand Down Expand Up @@ -3531,7 +3529,6 @@ export class MapView extends EventDispatcher {
this.m_visibleTiles.allVisibleTilesLoaded &&
this.m_connectedDataSources.size + this.m_failedDataSources.size ===
this.m_tileDataSources.length &&
!this.m_textElementsRenderer.initializing &&
!this.m_textElementsRenderer.loading
) {
this.m_initialTextPlacementDone = true;
Expand Down Expand Up @@ -3883,11 +3880,7 @@ export class MapView extends EventDispatcher {
tileObjectRenderer.setupRenderer();
}

private createTextRenderer(
fontCatalogs?: FontCatalogConfig[],
textStyles?: TextStyleDefinition[],
defaultTextStyle?: TextStyleDefinition
): TextElementsRenderer {
private createTextRenderer(): TextElementsRenderer {
const updateCallback: ViewUpdateCallback = () => {
this.update();
};
Expand All @@ -3901,8 +3894,7 @@ export class MapView extends EventDispatcher {
new TextCanvasFactory(this.m_renderer),
this.m_poiManager,
this.m_poiRenderer,
new FontCatalogLoader(fontCatalogs),
new TextStyleCache(textStyles, defaultTextStyle),
new TextStyleCache(),
this.m_options
);
}
Expand All @@ -3918,18 +3910,12 @@ export class MapView extends EventDispatcher {
textStyles?: TextStyleDefinition[],
defaultTextStyle?: TextStyleDefinition
): Promise<void> {
const overlayText = this.m_textElementsRenderer.overlayText;
this.m_poiRenderer.reset();
this.m_textElementsRenderer = this.createTextRenderer(
await this.m_textElementsRenderer.updateFontCatalogs(
fontCatalogs,
textStyles,
defaultTextStyle
!this.m_options.fontCatalog
);
if (overlayText !== undefined) {
this.m_textElementsRenderer.addOverlayText(overlayText);
}
await this.m_textElementsRenderer.waitInitialized();
await this.m_textElementsRenderer.waitLoaded();
await this.m_textElementsRenderer.updateTextStyles(textStyles, defaultTextStyle);
this.update();
}

/**
Expand Down
3 changes: 1 addition & 2 deletions @here/harp-mapview/lib/MapViewThemeManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,9 @@ export class MapViewThemeManager {
this.m_theme.styles = theme.styles ?? {};
this.m_theme.definitions = theme.definitions;

// TODO: this is asynchronouse too
environment.clearBackgroundDataSource();
for (const dataSource of this.m_mapView.dataSources) {
dataSource.setTheme(this.m_theme);
await dataSource.setTheme(this.m_theme);
}
}

Expand Down
73 changes: 19 additions & 54 deletions @here/harp-mapview/lib/text/FontCatalogLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/
import { FontCatalogConfig } from "@here/harp-datasource-protocol";
import { FontCatalog } from "@here/harp-text-canvas";
import { assert, LoggerManager } from "@here/harp-utils";
import { LoggerManager } from "@here/harp-utils";

export const DEFAULT_FONT_CATALOG_NAME = "default";

Expand All @@ -14,60 +14,25 @@ const logger = LoggerManager.instance.create("FontCatalogLoader");
type FontCatalogCallback = (name: string, catalog: FontCatalog) => void;

export class FontCatalogLoader {
private m_catalogsLoading: number = 0;

constructor(private m_fontCatalogs?: FontCatalogConfig[]) {}

/**
* Initializes font catalog loader.
* @param defaultFontCatalogUrl - Url of the font catalog that will be used by default if the
* theme doesn't define any font catalog.
* @returns Name of the default font catalog.
*/
initialize(defaultFontCatalogUrl: string): string {
if (this.m_fontCatalogs === undefined || this.m_fontCatalogs.length === 0) {
this.m_fontCatalogs = [
{
name: DEFAULT_FONT_CATALOG_NAME,
url: defaultFontCatalogUrl
}
];
return DEFAULT_FONT_CATALOG_NAME;
}

const defaultFontCatalogName = this.m_fontCatalogs[0].name;
return defaultFontCatalogName;
}

async loadCatalogs(
catalogCallback: FontCatalogCallback,
failureCallback?: (name: string, error: Error) => void
): Promise<void[]> {
assert(this.m_fontCatalogs !== undefined);
assert(this.m_fontCatalogs!.length > 0);

const promises: Array<Promise<void>> = [];

this.m_fontCatalogs!.forEach(fontCatalogConfig => {
this.m_catalogsLoading += 1;
const fontCatalogPromise: Promise<void> = FontCatalog.load(fontCatalogConfig.url, 1024)
.then<void>(catalogCallback.bind(undefined, fontCatalogConfig.name))
.catch((error: Error) => {
logger.error("Failed to load FontCatalog: ", error);
if (failureCallback) {
failureCallback(fontCatalogConfig.name, error);
}
})
.finally(() => {
this.m_catalogsLoading -= 1;
});
promises.push(fontCatalogPromise);
});

return Promise.all(promises);
static createDefaultFontCatalogConfig(defaultFontCatalogUrl: string): FontCatalogConfig {
return {
name: DEFAULT_FONT_CATALOG_NAME,
url: defaultFontCatalogUrl
};
}

get loading(): boolean {
return this.m_catalogsLoading > 0;
static async loadCatalog(
fontCatalogConfig: FontCatalogConfig,
onSuccess: FontCatalogCallback,
onError?: (error: Error) => void
): Promise<void> {
return await FontCatalog.load(fontCatalogConfig.url, 1024)
.then<void>(onSuccess.bind(undefined, fontCatalogConfig.name))
.catch((error: Error) => {
logger.error("Failed to load FontCatalog: ", fontCatalogConfig.name, error);
if (onError) {
onError(error);
}
});
}
}
Loading

0 comments on commit 8ae740d

Please sign in to comment.