UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

77 lines 15.4 kB
import { clamp } from './util/util'; export class BoundsUnmodifiable { constructor(bounds) { this.bounds = bounds; } get iStart() { return this.bounds.iStart; } get jStart() { return this.bounds.jStart; } get iEnd() { return this.bounds.iEnd; } get jEnd() { return this.bounds.jEnd; } get i() { return this.bounds.i; } get j() { return this.bounds.j; } get w() { return this.bounds.w; } get h() { return this.bounds.h; } xFrac(i) { return this.bounds.xFrac(i); } yFrac(j) { return this.bounds.yFrac(j); } contains(i, j) { return this.bounds.contains(i, j); } } export class Bounds { constructor() { this._iStart = 0; this._jStart = 0; this._iEnd = 0; this._jEnd = 0; this._unmod = new BoundsUnmodifiable(this); } get iStart() { return this._iStart; } get jStart() { return this._jStart; } get iEnd() { return this._iEnd; } get jEnd() { return this._jEnd; } get i() { return this._iStart; } get j() { return this._jStart; } get w() { return this._iEnd - this._iStart; } get h() { return this._jEnd - this._jStart; } get unmod() { return this._unmod; } xFrac(i) { return (i - this._iStart) / (this._iEnd - this._iStart); } yFrac(j) { return (j - this._jStart) / (this._jEnd - this._jStart); } contains(i, j) { return (this._iStart <= i && i < this._iEnd && this._jStart <= j && j < this._jEnd); } setEdges(iStart, iEnd, jStart, jEnd) { this._iStart = iStart; this._jStart = jStart; this._iEnd = iEnd; this._jEnd = jEnd; } setRect(i, j, w, h) { this.setEdges(i, i + w, j, j + h); } setBounds(bounds) { this.setEdges(bounds.iStart, bounds.iEnd, bounds.jStart, bounds.jEnd); } cropToEdges(iCropStart, iCropEnd, jCropStart, jCropEnd) { this._iStart = clamp(iCropStart, iCropEnd, this._iStart); this._jStart = clamp(jCropStart, jCropEnd, this._jStart); this._iEnd = clamp(iCropStart, iCropEnd, this._iEnd); this._jEnd = clamp(jCropStart, jCropEnd, this._jEnd); } cropToRect(iCrop, jCrop, wCrop, hCrop) { this.cropToEdges(iCrop, iCrop + wCrop, jCrop, jCrop + hCrop); } cropToBounds(cropBounds) { this.cropToEdges(cropBounds.iStart, cropBounds.iEnd, cropBounds.jStart, cropBounds.jEnd); } } export function newBoundsFromRect(i, j, w, h) { const b = new Bounds(); b.setRect(i, j, w, h); return b; } export function newBoundsFromEdges(iStart, iEnd, jStart, jEnd) { const b = new Bounds(); b.setEdges(iStart, iEnd, jStart, jEnd); return b; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYmdsaW1wc2UvYm91bmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThCQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBDLE1BQU0sT0FBTyxrQkFBa0I7SUFHM0IsWUFBWSxNQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXJELElBQUksTUFBTSxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksTUFBTSxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRS9DLElBQUksQ0FBQyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpDLEtBQUssQ0FBQyxDQUFTLElBQVksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsS0FBSyxDQUFDLENBQVMsSUFBWSxPQUFPLElBQUksQ0FBQyxN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QUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUdELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLE1BQWMsRUFBRSxJQUFZO0lBQ3pGLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7SUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IHhGcmFjLCB5RnJhYyB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi91dGlsL3V0aWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJvdW5kc1VubW9kaWZpYWJsZSB7XHJcbiAgICBwcml2YXRlIGJvdW5kczogQm91bmRzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGJvdW5kczogQm91bmRzKSB7IHRoaXMuYm91bmRzID0gYm91bmRzOyB9XHJcblxyXG4gICAgZ2V0IGlTdGFydCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5ib3VuZHMuaVN0YXJ0OyB9XHJcbiAgICBnZXQgalN0YXJ0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJvdW5kcy5qU3RhcnQ7IH1cclxuICAgIGdldCBpRW5kKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJvdW5kcy5pRW5kOyB9XHJcbiAgICBnZXQgakVuZCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5ib3VuZHMuakVuZDsgfVxyXG5cclxuICAgIGdldCBpKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJvdW5kcy5pOyB9XHJcbiAgICBnZXQgaigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5ib3VuZHMuajsgfVxyXG4gICAgZ2V0IHcoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuYm91bmRzLnc7IH1cclxuICAgIGdldCBoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJvdW5kcy5oOyB9XHJcblxyXG4gICAgeEZyYWMoaTogbnVtYmVyKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuYm91bmRzLnhGcmFjKGkpOyB9XHJcbiAgICB5RnJhYyhqOiBudW1iZXIpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5ib3VuZHMueUZyYWMoaik7IH1cclxuICAgIGNvbnRhaW5zKGk6IG51bWJlciwgajogbnVtYmVyKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmJvdW5kcy5jb250YWlucyhpLCBqKTsgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEJvdW5kcyB7XHJcbiAgICBwcml2YXRlIF9pU3RhcnQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2pTdGFydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfaUVuZDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfakVuZDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfdW5tb2Q6IEJvdW5kc1VubW9kaWZpYWJsZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9pU3RhcnQgPSAwO1xyXG4gICAgICAgIHRoaXMuX2pTdGFydCA9IDA7XHJcbiAgICAgICAgdGhpcy5faUVuZCA9IDA7XHJcbiAgICAgICAgdGhpcy5fakVuZCA9IDA7XHJcbiAgICAgICAgdGhpcy5fdW5tb2QgPSBuZXcgQm91bmRzVW5tb2RpZmlhYmxlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpU3RhcnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2lTdGFydDsgfVxyXG4gICAgZ2V0IGpTdGFydCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5falN0YXJ0OyB9XHJcbiAgICBnZXQgaUVuZCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5faUVuZDsgfVxyXG4gICAgZ2V0IGpFbmQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2pFbmQ7IH1cclxuXHJcbiAgICBnZXQgaSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5faVN0YXJ0OyB9XHJcbiAgICBnZXQgaigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5falN0YXJ0OyB9XHJcbiAgICBnZXQgdygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5faUVuZCAtIHRoaXMuX2lTdGFydDsgfVxyXG4gICAgZ2V0IGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2pFbmQgLSB0aGlzLl9qU3RhcnQ7IH1cclxuXHJcbiAgICBnZXQgdW5tb2QoKTogQm91bmRzVW5tb2RpZmlhYmxlIHsgcmV0dXJuIHRoaXMuX3VubW9kOyB9XHJcblxyXG4gICAgeEZyYWMoaTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gKGkgLSB0aGlzLl9pU3RhcnQpIC8gKHRoaXMuX2lFbmQgLSB0aGlzLl9pU3RhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHlGcmFjKGo6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIChqIC0gdGhpcy5falN0YXJ0KSAvICh0aGlzLl9qRW5kIC0gdGhpcy5falN0YXJ0KTtcclxuICAgIH1cclxuXHJcbiAgICBjb250YWlucyhpOiBudW1iZXIsIGo6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5faVN0YXJ0IDw9IGkgJiYgaSA8IHRoaXMuX2lFbmQgJiYgdGhpcy5falN0YXJ0IDw9IGogJiYgaiA8IHRoaXMuX2pFbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEVkZ2VzKGlTdGFydDogbnVtYmVyLCBpRW5kOiBudW1iZXIsIGpTdGFydDogbnVtYmVyLCBqRW5kOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9pU3RhcnQgPSBpU3RhcnQ7XHJcbiAgICAgICAgdGhpcy5falN0YXJ0ID0galN0YXJ0O1xyXG4gICAgICAgIHRoaXMuX2lFbmQgPSBpRW5kO1xyXG4gICAgICAgIHRoaXMuX2pFbmQgPSBqRW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFJlY3QoaTogbnVtYmVyLCBqOiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRFZGdlcyhpLCBpICsgdywgaiwgaiArIGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJvdW5kcyhib3VuZHM6IEJvdW5kc1VubW9kaWZpYWJsZSkge1xyXG4gICAgICAgIHRoaXMuc2V0RWRnZXMoYm91bmRzLmlTdGFydCwgYm91bmRzLmlFbmQsIGJvdW5kcy5qU3RhcnQsIGJvdW5kcy5qRW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBjcm9wVG9FZGdlcyhpQ3JvcFN0YXJ0OiBudW1iZXIsIGlDcm9wRW5kOiBudW1iZXIsIGpDcm9wU3RhcnQ6IG51bWJlciwgakNyb3BFbmQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2lTdGFydCA9IGNsYW1wKGlDcm9wU3RhcnQsIGlDcm9wRW5kLCB0aGlzLl9pU3RhcnQpO1xyXG4gICAgICAgIHRoaXMuX2pTdGFydCA9IGNsYW1wKGpDcm9wU3RhcnQsIGpDcm9wRW5kLCB0aGlzLl9qU3RhcnQpO1xyXG4gICAgICAgIHRoaXMuX2lFbmQgPSBjbGFtcChpQ3JvcFN0YXJ0LCBpQ3JvcEVuZCwgdGhpcy5faUVuZCk7XHJcbiAgICAgICAgdGhpcy5fakVuZCA9IGNsYW1wKGpDcm9wU3RhcnQsIGpDcm9wRW5kLCB0aGlzLl9qRW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBjcm9wVG9SZWN0KGlDcm9wOiBudW1iZXIsIGpDcm9wOiBudW1iZXIsIHdDcm9wOiBudW1iZXIsIGhDcm9wOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmNyb3BUb0VkZ2VzKGlDcm9wLCBpQ3JvcCArIHdDcm9wLCBqQ3JvcCwgakNyb3AgKyBoQ3JvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JvcFRvQm91bmRzKGNyb3BCb3VuZHM6IEJvdW5kc1VubW9kaWZpYWJsZSkge1xyXG4gICAgICAgIHRoaXMuY3JvcFRvRWRnZXMoY3JvcEJvdW5kcy5pU3RhcnQsIGNyb3BCb3VuZHMuaUVuZCwgY3JvcEJvdW5kcy5qU3RhcnQsIGNyb3BCb3VuZHMuakVuZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3Qm91bmRzRnJvbVJlY3QoaTogbnVtYmVyLCBqOiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogQm91bmRzIHtcclxuICAgIGNvbnN0IGIgPSBuZXcgQm91bmRzKCk7XHJcbiAgICBiLnNldFJlY3QoaSwgaiwgdywgaCk7XHJcbiAgICByZXR1cm4gYjtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdCb3VuZHNGcm9tRWRnZXMoaVN0YXJ0OiBudW1iZXIsIGlFbmQ6IG51bWJlciwgalN0YXJ0OiBudW1iZXIsIGpFbmQ6IG51bWJlcik6IEJvdW5kcyB7XHJcbiAgICBjb25zdCBiID0gbmV3IEJvdW5kcygpO1xyXG4gICAgYi5zZXRFZGdlcyhpU3RhcnQsIGlFbmQsIGpTdGFydCwgakVuZCk7XHJcbiAgICByZXR1cm4gYjtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZSB7XHJcbiAgICB3OiBudW1iZXI7XHJcbiAgICBoOiBudW1iZXI7XHJcbn1cclxuXHJcblxyXG4iXX0=