mapillary-js
Version:
WebGL JavaScript library for displaying street level imagery from mapillary.com
78 lines (64 loc) • 3 kB
text/typescript
import {combineLatest as observableCombineLatest, Observable, Subscription} from "rxjs";
import {distinctUntilChanged, filter, map} from "rxjs/operators";
import * as vd from "virtual-dom";
import {ComponentService, Component, IComponentConfiguration} from "../Component";
import {Node} from "../Graph";
import {ISize} from "../Render";
import {DOM} from "../Utils";
import {Container, Navigator} from "../Viewer";
export class ImageComponent extends Component<IComponentConfiguration> {
public static componentName: string = "image";
private _canvasId: string;
private _dom: DOM;
private drawSubscription: Subscription;
constructor(name: string, container: Container, navigator: Navigator, dom?: DOM) {
super(name, container, navigator);
this._canvasId = `${container.id}-${this._name}`;
this._dom = !!dom ? dom : new DOM();
}
protected _activate(): void {
const canvasSize$: Observable<[HTMLCanvasElement, ISize]> = this._container.domRenderer.element$.pipe(
map(
(element: HTMLElement): HTMLCanvasElement => {
return <HTMLCanvasElement>this._dom.document.getElementById(this._canvasId);
}),
filter(
(canvas: HTMLCanvasElement): boolean => {
return !!canvas;
}),
map(
(canvas: HTMLCanvasElement): [HTMLCanvasElement, ISize] => {
const adaptableDomRenderer: HTMLElement = canvas.parentElement;
const width: number = adaptableDomRenderer.offsetWidth;
const height: number = adaptableDomRenderer.offsetHeight;
return [canvas, { height: height, width: width }];
}),
distinctUntilChanged(
(s1: ISize, s2: ISize): boolean => {
return s1.height === s2.height && s1.width === s2.width;
},
([canvas, size]: [HTMLCanvasElement, ISize]): ISize => {
return size;
}));
this.drawSubscription = observableCombineLatest(
canvasSize$,
this._navigator.stateService.currentNode$)
.subscribe(
([[canvas, size], node]: [[HTMLCanvasElement, ISize], Node]): void => {
canvas.width = size.width;
canvas.height = size.height;
canvas
.getContext("2d")
.drawImage(node.image, 0, 0, size.width, size.height);
});
this._container.domRenderer.renderAdaptive$.next({name: this._name, vnode: vd.h(`canvas#${this._canvasId}`, [])});
}
protected _deactivate(): void {
this.drawSubscription.unsubscribe();
}
protected _getDefaultConfiguration(): IComponentConfiguration {
return {};
}
}
ComponentService.register(ImageComponent);
export default ImageComponent;