diff options
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/deqp/framework/common/tcuRGBA.js')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/framework/common/tcuRGBA.js | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/framework/common/tcuRGBA.js b/dom/canvas/test/webgl-conf/checkout/deqp/framework/common/tcuRGBA.js new file mode 100644 index 000000000..0bab841d1 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/deqp/framework/common/tcuRGBA.js @@ -0,0 +1,279 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program OpenGL ES Utilities + * ------------------------------------------------ + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +'use strict'; +goog.provide('framework.common.tcuRGBA'); +goog.require('framework.delibs.debase.deMath'); + +goog.scope(function() { + +var tcuRGBA = framework.common.tcuRGBA; +var deMath = framework.delibs.debase.deMath; + + var DE_ASSERT = function(x) { + if (!x) + throw new Error('Assert failed'); + }; + + /** + * class tcuRGBA.RGBA + * @constructor + * @struct + * @param {goog.NumberArray=} value + */ + tcuRGBA.RGBA = function(value) { + /** @type {goog.NumberArray} */ this.m_value = value || null; + + }; + + /** + * @enum + * In JS, these are not shift values, but positions in a typed array + */ + tcuRGBA.RGBA.Shift = { + RED: 0, + GREEN: 1, + BLUE: 2, + ALPHA: 3 + }; + + /** + * @enum + * Mask used as flags + * Hopefully will not use typed arrays + */ + tcuRGBA.RGBA.Mask = function() { + return { + RED: false, + GREEN: false, + BLUE: false, + ALPHA: false + }; + }; + + /** + * Builds an tcuRGBA.RGBA object from color components + * @param {number} r + * @param {number} g + * @param {number} b + * @param {number} a + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.newRGBAComponents = function(r, g, b, a) { + DE_ASSERT(deMath.deInRange32(r, 0, 255)); + DE_ASSERT(deMath.deInRange32(g, 0, 255)); + DE_ASSERT(deMath.deInRange32(b, 0, 255)); + DE_ASSERT(deMath.deInRange32(a, 0, 255)); + + return new tcuRGBA.RGBA([r, g, b, a]); + }; + + /** + * Builds an tcuRGBA.RGBA object from a number array + * @param {goog.NumberArray} v + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.newRGBAFromArray = function(v) { + return new tcuRGBA.RGBA(v.slice(0, 4)); + }; + + /** + * @param {number} value + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.newRGBAFromValue = function(value) { + var rgba = new tcuRGBA.RGBA(); + var array32 = new Uint32Array([value]); + rgba.m_value = (new Uint8Array(array32.buffer)); + return rgba; + }; + + /** + * @param {Array<number>} v + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.newRGBAFromVec = function (v) { + var r = deMath.clamp(v[0] * 255.0, 0, 255); + var g = deMath.clamp(v[1] * 255.0, 0, 255); + var b = deMath.clamp(v[2] * 255.0, 0, 255); + var a = deMath.clamp(v[3] * 255.0, 0, 255); + + return new tcuRGBA.RGBA([r, g, b, a]); + }; + + /** + * @param {number} v + */ + tcuRGBA.RGBA.prototype.setRed = function(v) { DE_ASSERT(deMath.deInRange32(v, 0, 255)); this.m_value[tcuRGBA.RGBA.Shift.RED] = v; }; + + /** + * @param {number} v + */ + tcuRGBA.RGBA.prototype.setGreen = function(v) { DE_ASSERT(deMath.deInRange32(v, 0, 255)); this.m_value[tcuRGBA.RGBA.Shift.GREEN] = v; }; + + /** + * @param {number} v + */ + tcuRGBA.RGBA.prototype.setBlue = function(v) { DE_ASSERT(deMath.deInRange32(v, 0, 255)); this.m_value[tcuRGBA.RGBA.Shift.BLUE] = v; }; + + /** + * @param {number} v + */ + tcuRGBA.RGBA.prototype.setAlpha = function(v) { DE_ASSERT(deMath.deInRange32(v, 0, 255)); this.m_value[tcuRGBA.RGBA.Shift.ALPHA] = v; }; + + /** + * @return {number} + */ + tcuRGBA.RGBA.prototype.getRed = function() { return this.m_value[tcuRGBA.RGBA.Shift.RED]; }; + + /** + * @return {number} + */ + tcuRGBA.RGBA.prototype.getGreen = function() { return this.m_value[tcuRGBA.RGBA.Shift.GREEN]; }; + + /** + * @return {number} + */ + tcuRGBA.RGBA.prototype.getBlue = function() { return this.m_value[tcuRGBA.RGBA.Shift.BLUE]; }; + + /** + * @return {number} + */ + tcuRGBA.RGBA.prototype.getAlpha = function() { return this.m_value[tcuRGBA.RGBA.Shift.ALPHA]; }; + + /** + * @param {tcuRGBA.RGBA} thr + * @return {boolean} + */ + tcuRGBA.RGBA.prototype.isBelowThreshold = function(thr) { return (this.getRed() <= thr.getRed()) && (this.getGreen() <= thr.getGreen()) && (this.getBlue() <= thr.getBlue()) && (this.getAlpha() <= thr.getAlpha()); }; + + /** + * @param {Uint8Array} bytes + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.RGBA.fromBytes = function(bytes) { return tcuRGBA.newRGBAFromArray(bytes); }; + + /** + * @param {Uint8Array} bytes + */ + tcuRGBA.RGBA.prototype.toBytes = function(bytes) { var result = new Uint8Array(this.m_value); bytes[0] = result[0]; bytes[1] = result[1]; bytes[2] = result[2]; bytes[3] = result[3]; }; + + /** + * @return {Array<number>} + */ + tcuRGBA.RGBA.prototype.toVec = function() { + return [ + this.getRed() / 255.0, + this.getGreen() / 255.0, + this.getBlue() / 255.0, + this.getAlpha() / 255.0 + ]; + }; + + /** + * @return {Array<number>} + */ + tcuRGBA.RGBA.prototype.toIVec = function() { + return [ + this.getRed(), + this.getGreen(), + this.getBlue(), + this.getAlpha() + ]; + }; + + /** + * @param {tcuRGBA.RGBA} v + * @return {boolean} + */ + tcuRGBA.RGBA.prototype.equals = function(v) { + return ( + this.m_value[0] == v.m_value[0] && + this.m_value[1] == v.m_value[1] && + this.m_value[2] == v.m_value[2] && + this.m_value[3] == v.m_value[3] + ); + }; + + /** + * @param {tcuRGBA.RGBA} a + * @param {tcuRGBA.RGBA} b + * @param {tcuRGBA.RGBA} threshold + * @return {boolean} + */ + tcuRGBA.compareThreshold = function(a, b, threshold) { + if (a.equals(b)) return true; // Quick-accept + return tcuRGBA.computeAbsDiff(a, b).isBelowThreshold(threshold); + }; + + /** + * @param {tcuRGBA.RGBA} a + * @param {tcuRGBA.RGBA} b + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.computeAbsDiff = function(a, b) { + return tcuRGBA.newRGBAComponents( + Math.abs(a.getRed() - b.getRed()), + Math.abs(a.getGreen() - b.getGreen()), + Math.abs(a.getBlue() - b.getBlue()), + Math.abs(a.getAlpha() - b.getAlpha()) + ); + }; + + /** + * @param {tcuRGBA.RGBA} a + * @param {number} b + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.multiply = function(a, b) { + return tcuRGBA.newRGBAComponents( + deMath.clamp(a.getRed() * b, 0, 255), + deMath.clamp(a.getGreen() * b, 0, 255), + deMath.clamp(a.getBlue() * b, 0, 255), + deMath.clamp(a.getAlpha() * b, 0, 255)); + }; + + /** + * @param {tcuRGBA.RGBA} a + * @param {tcuRGBA.RGBA} b + * @return {tcuRGBA.RGBA} + */ + tcuRGBA.max = function(a, b) { + return tcuRGBA.newRGBAComponents( + Math.max(a.getRed(), b.getRed()), + Math.max(a.getGreen(), b.getGreen()), + Math.max(a.getBlue(), b.getBlue()), + Math.max(a.getAlpha(), b.getAlpha()) + ); + }; + + tcuRGBA.RGBA.prototype.toString = function() { + return '[' + this.m_value[0] + ',' + this.m_value[1] + ',' + this.m_value[2] + ',' + this.m_value[3] + ']'; + }; + + // Color constants + tcuRGBA.RGBA.red = tcuRGBA.newRGBAComponents(0xFF, 0, 0, 0xFF); + tcuRGBA.RGBA.green = tcuRGBA.newRGBAComponents(0, 0xFF, 0, 0xFF); + tcuRGBA.RGBA.blue = tcuRGBA.newRGBAComponents(0, 0, 0xFF, 0xFF); + tcuRGBA.RGBA.gray = tcuRGBA.newRGBAComponents(0x80, 0x80, 0x80, 0xFF); + tcuRGBA.RGBA.white = tcuRGBA.newRGBAComponents(0xFF, 0xFF, 0xFF, 0xFF); + tcuRGBA.RGBA.black = tcuRGBA.newRGBAComponents(0, 0, 0, 0xFF); + +}); |