@mapbox/mapbox-gl-style-spec
Version:
a specification for mapbox gl styles
80 lines (65 loc) • 2.2 kB
text/typescript
import {ImageId} from './image_id';
import type Color from '../../util/color';
import type {Brand} from '../../types/brand';
import type {ImageIdSpec} from './image_id';
/**
* `StringifiedImageVariant` is a stringified version of the `ImageVariant`.
*
* @private
*/
export type StringifiedImageVariant = Brand<string, 'ImageVariant'>;
/**
* {@link ImageVariant} rasterization options.
*
* @private
*/
export type RasterizationOptions = {
params?: Record<string, Color>;
transform?: DOMMatrix;
}
/**
* `ImageVariant` is a component of {@link ResolvedImage}
* that represents either the primary or secondary image
* along with its rendering configuration.
*
* @private
*/
export class ImageVariant {
id: ImageId;
options: RasterizationOptions;
constructor(id: string | ImageIdSpec, options: RasterizationOptions = {}) {
this.id = ImageId.from(id);
this.options = Object.assign({}, options);
if (!options.transform) {
this.options.transform = new DOMMatrix([1, 0, 0, 1, 0, 0]);
} else {
const {a, b, c, d, e, f} = options.transform;
this.options.transform = new DOMMatrix([a, b, c, d, e, f]);
}
}
toString(): StringifiedImageVariant {
const {a, b, c, d, e, f} = this.options.transform;
const serialized = {
name: this.id.name,
iconsetId: this.id.iconsetId,
params: this.options.params,
transform: {a, b, c, d, e, f},
};
return JSON.stringify(serialized) as StringifiedImageVariant;
}
static parse(str: StringifiedImageVariant): ImageVariant | null {
let name, iconsetId, params, transform;
try {
({name, iconsetId, params, transform} = JSON.parse(str) || {});
} catch (e) {
return null;
}
if (!name) return null;
const {a, b, c, d, e, f} = transform || {};
return new ImageVariant({name, iconsetId}, {params, transform: new DOMMatrix([a, b, c, d, e, f])});
}
scaleSelf(factor: number, yFactor?: number): this {
this.options.transform.scaleSelf(factor, yFactor);
return this;
}
}