diff --git a/packages/pixel/src/api.ts b/packages/pixel/src/api.ts index d620de98c5..0591d576c8 100644 --- a/packages/pixel/src/api.ts +++ b/packages/pixel/src/api.ts @@ -192,6 +192,8 @@ export interface FloatFormat extends IABGRConvert { shift: IObjectOf; channels: Lane[]; + range: [number, number]; + /** * Maps given value to [0..1] interval. Used in combination with * {@link IntChannel.setFloat}. diff --git a/packages/pixel/src/float.ts b/packages/pixel/src/float.ts index 294487bdc8..115554e462 100644 --- a/packages/pixel/src/float.ts +++ b/packages/pixel/src/float.ts @@ -4,7 +4,7 @@ import { IGrid2DMixin } from "@thi.ng/api/mixins/igrid"; import { isNumber } from "@thi.ng/checks/is-number"; import { isString } from "@thi.ng/checks/is-string"; import { assert } from "@thi.ng/errors/assert"; -import { clamp01 } from "@thi.ng/math/interval"; +import { clamp } from "@thi.ng/math/interval"; import { isPremultiplied, postmultiply, @@ -248,9 +248,10 @@ export class FloatBuffer data, stride: [stride], } = this; + const [min, max] = this.format.range; const dest = new Float32Array(this.width * this.height); for (let i = id, j = 0, n = data.length; i < n; i += stride, j++) { - dest[j] = clamp01(data[i]); + dest[j] = clamp(data[i], min, max); } return new FloatBuffer(this.width, this.height, FLOAT_GRAY, dest); } @@ -437,8 +438,9 @@ export class FloatBuffer clamp() { const data = this.data; + const [min, max] = this.format.range; for (let i = data.length; i-- > 0; ) { - data[i] = clamp01(data[i]); + data[i] = clamp(data[i], min, max); } return this; } @@ -449,8 +451,12 @@ export class FloatBuffer data, stride: [stride], } = this; + const [min, max] = this.format.range; for (let i = id, n = data.length; i < n; i += stride) { - data[i] = clamp01(data[i]); + data[i] = clamp(data[i], min, max); + } + } + } } diff --git a/packages/pixel/src/format/float-format.ts b/packages/pixel/src/format/float-format.ts index ab6d68c557..37239a178e 100644 --- a/packages/pixel/src/format/float-format.ts +++ b/packages/pixel/src/format/float-format.ts @@ -14,6 +14,7 @@ export const defFloatFormat = (fmt: FloatFormatSpec) => { __float: true, size: chan.length, shift: chanShift, + range: [0, 1], getNormalized: (val) => clamp01(val), }; if (fmt.convert) { diff --git a/packages/pixel/src/format/float-gray-range.ts b/packages/pixel/src/format/float-gray-range.ts index d359ea5d33..6dfd1bbbd0 100644 --- a/packages/pixel/src/format/float-gray-range.ts +++ b/packages/pixel/src/format/float-gray-range.ts @@ -18,6 +18,7 @@ export const FLOAT_GRAY_RANGE = (min: number, max: number): FloatFormat => { channels: [Lane.RED], shift: { 3: 0 }, size: 1, + range: [min, max], getNormalized: (val) => { return fitClamped(val, min, max, 0, 1); }, diff --git a/packages/pixel/src/format/float-norm.ts b/packages/pixel/src/format/float-norm.ts index 1a69d0b309..29c864e29e 100644 --- a/packages/pixel/src/format/float-norm.ts +++ b/packages/pixel/src/format/float-norm.ts @@ -13,6 +13,7 @@ export const FLOAT_NORMAL: FloatFormat = { channels: [Lane.RED, Lane.GREEN, Lane.BLUE], shift: { 3: 0, 2: 8, 1: 16 }, size: 3, + range: [-1, 1], getNormalized: (val) => clamp01(val * 0.5 + 0.5), fromABGR: (src) => [ from(src & 0xff),