function failed(ex) { ok(false, "Promise failure: " + ex); } function isPixel(sourceType, bitmapFormat, imageData, bitmapImageData, x, y, tolerance) { if (imageData.width != bitmapImageData.width || imageData.height != bitmapImageData.height) { ok(false, "Wrong dimension"); } var index = 4 * (y * imageData.width + x); var pr = imageData.data[index+0], pg = imageData.data[index+1], pb = imageData.data[index+2], pa = imageData.data[index+3]; if (bitmapFormat == "RGBA32" || bitmapFormat == "RGBX32") { var bpr = bitmapImageData.data[index+0], bpg = bitmapImageData.data[index+1], bpb = bitmapImageData.data[index+2], bpa = bitmapImageData.data[index+3]; } else if (bitmapFormat == "BGRA32" || bitmapFormat == "BGRX32") { var bpb = bitmapImageData.data[index+0], bpg = bitmapImageData.data[index+1], bpr = bitmapImageData.data[index+2], bpa = bitmapImageData.data[index+3]; } else { // format might be one of the followings: "R5G6B5", "A8", "YUV", "" ok(false, "Not supported ImageFormat: " + bitmapFormat); } ok(pr - tolerance <= bpr && bpr <= pr + tolerance && pg - tolerance <= bpg && bpg <= pg + tolerance && pb - tolerance <= bpb && bpb <= pb + tolerance && pa - tolerance <= bpa && bpa <= pa + tolerance, "pixel[" + x + "][" + y + "]: " + sourceType + " is "+pr+","+pg+","+pb+","+pa+"; ImageBitmap is "+ bpr + "," + bpg + "," + bpb + "," + bpa); } function promiseThrows(p, name) { var didThrow; return p.then(function() { didThrow = false; }, function() { didThrow = true; }) .then(function() { ok(didThrow, name); }); } function testExceptions() { return Promise.all([ promiseThrows(testColorConversion("GRAY8", "RGBA32", undefined, true), "[Exception] Cannot convert from GRAY8 to RGBA32"), promiseThrows(testColorConversion("GRAY8", "BGRA32", undefined, true), "[Exception] Cannot convert from GRAY8 to BGRA32"), promiseThrows(testColorConversion("GRAY8", "RGB24", undefined, true), "[Exception] Cannot convert from GRAY8 to RGB24"), promiseThrows(testColorConversion("GRAY8", "BGR24", undefined, true), "[Exception] Cannot convert from GRAY8 to BGR24"), promiseThrows(testColorConversion("GRAY8", "YUV444P", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV444P"), promiseThrows(testColorConversion("GRAY8", "YUV422P", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV422P"), promiseThrows(testColorConversion("GRAY8", "YUV420P", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV420P"), promiseThrows(testColorConversion("GRAY8", "YUV420SP_NV12", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV420SP_NV12"), promiseThrows(testColorConversion("GRAY8", "YUV420SP_NV21", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV420SP_NV21"), promiseThrows(testColorConversion("GRAY8", "HSV", undefined, true), "[Exception] Cannot convert from GRAY8 to HSV"), promiseThrows(testColorConversion("GRAY8", "Lab", undefined, true), "[Exception] Cannot convert from GRAY8 to Lab"), promiseThrows(testColorConversion("GRAY8", "DEPTH", undefined, true), "[Exception] Cannot convert from GRAY8 to DEPTH"), promiseThrows(testColorConversion("DEPTH", "RGBA32", undefined, true), "[Exception] Cannot convert from DEPTH to RGBA32"), promiseThrows(testColorConversion("DEPTH", "BGRA32", undefined, true), "[Exception] Cannot convert from DEPTH to BGRA32"), promiseThrows(testColorConversion("DEPTH", "RGB24", undefined, true), "[Exception] Cannot convert from DEPTH to RGB24"), promiseThrows(testColorConversion("DEPTH", "BGR24", undefined, true), "[Exception] Cannot convert from DEPTH to BGR24"), promiseThrows(testColorConversion("DEPTH", "GRAY8", undefined, true), "[Exception] Cannot convert from DEPTH to GRAY8"), promiseThrows(testColorConversion("DEPTH", "YUV444P", undefined, true), "[Exception] Cannot convert from DEPTH to YUV444P"), promiseThrows(testColorConversion("DEPTH", "YUV422P", undefined, true), "[Exception] Cannot convert from DEPTH to YUV422P"), promiseThrows(testColorConversion("DEPTH", "YUV420P", undefined, true), "[Exception] Cannot convert from DEPTH to YUV420P"), promiseThrows(testColorConversion("DEPTH", "YUV420SP_NV12", undefined, true), "[Exception] Cannot convert from DEPTH to YUV420SP_NV12"), promiseThrows(testColorConversion("DEPTH", "YUV420SP_NV21", undefined, true), "[Exception] Cannot convert from DEPTH to YUV420SP_NV21"), promiseThrows(testColorConversion("DEPTH", "HSV", undefined, true), "[Exception] Cannot convert from DEPTH to HSV"), promiseThrows(testColorConversion("DEPTH", "Lab", undefined, true), "[Exception] Cannot convert from DEPTH to Lab"), promiseThrows(testColorConversion("RGBA32", "DEPTH", undefined, true), "[Exception] Cannot convert from RGBA32 to DEPTH"), promiseThrows(testColorConversion("BGRA32", "DEPTH", undefined, true), "[Exception] Cannot convert from BGRA32 to DEPTH"), promiseThrows(testColorConversion("RGB24", "DEPTH", undefined, true), "[Exception] Cannot convert from RGB24 to DEPTH"), promiseThrows(testColorConversion("BGR24", "DEPTH", undefined, true), "[Exception] Cannot convert from BGR24 to DEPTH"), promiseThrows(testColorConversion("YUV444P", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV444P to DEPTH"), promiseThrows(testColorConversion("YUV422P", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV422P to DEPTH"), promiseThrows(testColorConversion("YUV420P", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV420P to DEPTH"), promiseThrows(testColorConversion("YUV420SP_NV12", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV420SP_NV12 to DEPTH"), promiseThrows(testColorConversion("YUV420SP_NV21", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV420SP_NV21 to DEPTH"), promiseThrows(testColorConversion("HSV", "DEPTH", undefined, true), "[Exception] Cannot convert from HSV to DEPTH"), promiseThrows(testColorConversion("Lab", "DEPTH", undefined, true), "[Exception] Cannot convert from Lab to DEPTH"), ]); } function testInvalidAccess(sources) { function callMapDataIntoWithImageBitmapCroppedOutSideOfTheSourceImage(source) { return new Promise(function(resolve, reject) { var p = createImageBitmap(source, -1, -1, 2, 2); p.then( function(bitmap) { var format = bitmap.findOptimalFormat(); var length = bitmap.mappedDataLength(format); var buffer = new ArrayBuffer(length); bitmap.mapDataInto(format, buffer, 0).then( function(layout) { resolve(); }, function(error) { reject(error); } ); }, function() { resolve(); }); }); }; var testCases = sources.map( function(source) { return promiseThrows(callMapDataIntoWithImageBitmapCroppedOutSideOfTheSourceImage(source), "[Exception] mapDataInto() should throw with transparent black."); }); return Promise.all(testCases); } function testColorConversions() { return Promise.all([// From RGBA32 testColorConversion("RGBA32", "RGBA32"), testColorConversion("RGBA32", "BGRA32"), testColorConversion("RGBA32", "RGB24"), testColorConversion("RGBA32", "BGR24"), testColorConversion("RGBA32", "GRAY8"), testColorConversion("RGBA32", "YUV444P"), testColorConversion("RGBA32", "YUV422P"), testColorConversion("RGBA32", "YUV420P", 2), testColorConversion("RGBA32", "YUV420SP_NV12"), testColorConversion("RGBA32", "YUV420SP_NV21"), testColorConversion("RGBA32", "HSV", 0.01), testColorConversion("RGBA32", "Lab", 0.5), // From BGRA32 testColorConversion("BGRA32", "RGBA32"), testColorConversion("BGRA32", "BGRA32"), testColorConversion("BGRA32", "RGB24"), testColorConversion("BGRA32", "BGR24"), testColorConversion("BGRA32", "GRAY8"), testColorConversion("BGRA32", "YUV444P", 3), testColorConversion("BGRA32", "YUV422P", 2), testColorConversion("BGRA32", "YUV420P", 2), testColorConversion("BGRA32", "YUV420SP_NV12", 2), testColorConversion("BGRA32", "YUV420SP_NV21", 2), testColorConversion("BGRA32", "HSV", 0.01), testColorConversion("BGRA32", "Lab", 0.5), // From RGB24 testColorConversion("RGB24", "RGBA32"), testColorConversion("RGB24", "BGRA32"), testColorConversion("RGB24", "RGB24"), testColorConversion("RGB24", "BGR24"), testColorConversion("RGB24", "GRAY8"), testColorConversion("RGB24", "YUV444P"), testColorConversion("RGB24", "YUV422P"), testColorConversion("RGB24", "YUV420P"), testColorConversion("RGB24", "YUV420SP_NV12"), testColorConversion("RGB24", "YUV420SP_NV21"), testColorConversion("RGB24", "HSV", 0.01), testColorConversion("RGB24", "Lab", 0.5), // From BGR24 testColorConversion("BGR24", "RGBA32"), testColorConversion("BGR24", "BGRA32"), testColorConversion("BGR24", "RGB24"), testColorConversion("BGR24", "BGR24"), testColorConversion("BGR24", "GRAY8"), testColorConversion("BGR24", "YUV444P"), testColorConversion("BGR24", "YUV422P"), testColorConversion("BGR24", "YUV420P"), testColorConversion("BGR24", "YUV420SP_NV12"), testColorConversion("BGR24", "YUV420SP_NV21"), testColorConversion("BGR24", "HSV", 0.01), testColorConversion("BGR24", "Lab", 0.5), // From YUV444P testColorConversion("YUV444P", "RGBA32"), testColorConversion("YUV444P", "BGRA32"), testColorConversion("YUV444P", "RGB24"), testColorConversion("YUV444P", "BGR24"), testColorConversion("YUV444P", "GRAY8"), testColorConversion("YUV444P", "YUV444P"), testColorConversion("YUV444P", "YUV422P", 4), testColorConversion("YUV444P", "YUV420P", 3), testColorConversion("YUV444P", "YUV420SP_NV12", 3), testColorConversion("YUV444P", "YUV420SP_NV21", 3), testColorConversion("YUV444P", "HSV", 0.01), testColorConversion("YUV444P", "Lab", 0.01), // From YUV422P testColorConversion("YUV422P", "RGBA32"), testColorConversion("YUV422P", "BGRA32", 2), testColorConversion("YUV422P", "RGB24"), testColorConversion("YUV422P", "BGR24"), testColorConversion("YUV422P", "GRAY8"), testColorConversion("YUV422P", "YUV444P", 3), testColorConversion("YUV422P", "YUV422P"), testColorConversion("YUV422P", "YUV420P"), testColorConversion("YUV422P", "YUV420SP_NV12"), testColorConversion("YUV422P", "YUV420SP_NV21"), testColorConversion("YUV422P", "HSV", 0.01), testColorConversion("YUV422P", "Lab", 0.01), // From YUV420P testColorConversion("YUV420P", "RGBA32", 2), testColorConversion("YUV420P", "BGRA32", 2), testColorConversion("YUV420P", "RGB24"), testColorConversion("YUV420P", "BGR24"), testColorConversion("YUV420P", "GRAY8"), testColorConversion("YUV420P", "YUV444P", 3), testColorConversion("YUV420P", "YUV422P", 1), testColorConversion("YUV420P", "YUV420P"), testColorConversion("YUV420P", "YUV420SP_NV12"), testColorConversion("YUV420P", "YUV420SP_NV21"), testColorConversion("YUV420P", "HSV", 0.01), testColorConversion("YUV420P", "Lab", 0.01), // From NV12 testColorConversion("YUV420SP_NV12", "RGBA32"), testColorConversion("YUV420SP_NV12", "BGRA32", 2), testColorConversion("YUV420SP_NV12", "RGB24"), testColorConversion("YUV420SP_NV12", "BGR24"), testColorConversion("YUV420SP_NV12", "GRAY8"), testColorConversion("YUV420SP_NV12", "YUV444P", 3), testColorConversion("YUV420SP_NV12", "YUV422P", 1), testColorConversion("YUV420SP_NV12", "YUV420P"), testColorConversion("YUV420SP_NV12", "YUV420SP_NV12"), testColorConversion("YUV420SP_NV12", "YUV420SP_NV21"), testColorConversion("YUV420SP_NV12", "HSV", 0.01), testColorConversion("YUV420SP_NV12", "Lab", 0.01), // From NV21 testColorConversion("YUV420SP_NV21", "RGBA32"), testColorConversion("YUV420SP_NV21", "BGRA32", 2), testColorConversion("YUV420SP_NV21", "RGB24"), testColorConversion("YUV420SP_NV21", "BGR24"), testColorConversion("YUV420SP_NV21", "GRAY8"), testColorConversion("YUV420SP_NV21", "YUV444P", 3), testColorConversion("YUV420SP_NV21", "YUV422P", 1), testColorConversion("YUV420SP_NV21", "YUV420P"), testColorConversion("YUV420SP_NV21", "YUV420SP_NV12"), testColorConversion("YUV420SP_NV21", "YUV420SP_NV21"), testColorConversion("YUV420SP_NV21", "HSV", 0.01), testColorConversion("YUV420SP_NV21", "Lab", 0.01), // From HSV testColorConversion("HSV", "RGBA32"), testColorConversion("HSV", "BGRA32"), testColorConversion("HSV", "RGB24"), testColorConversion("HSV", "BGR24"), testColorConversion("HSV", "GRAY8"), testColorConversion("HSV", "YUV444P"), testColorConversion("HSV", "YUV422P"), testColorConversion("HSV", "YUV420P"), testColorConversion("HSV", "YUV420SP_NV12"), testColorConversion("HSV", "YUV420SP_NV21"), testColorConversion("HSV", "HSV", 0), testColorConversion("HSV", "Lab", 0.5), // From Lab testColorConversion("Lab", "RGBA32", 1), testColorConversion("Lab", "BGRA32", 1), testColorConversion("Lab", "RGB24", 1), testColorConversion("Lab", "BGR24", 1), testColorConversion("Lab", "GRAY8", 1), testColorConversion("Lab", "YUV444P", 1), testColorConversion("Lab", "YUV422P", 1), testColorConversion("Lab", "YUV420P", 1), testColorConversion("Lab", "YUV420SP_NV12", 1), testColorConversion("Lab", "YUV420SP_NV21", 1), testColorConversion("Lab", "HSV", 0.5), testColorConversion("Lab", "Lab", 0), // From GRAY8 testColorConversion("GRAY8", "GRAY8"), // From DEPTH testColorConversion("DEPTH", "DEPTH", 0, Uint16Array), ]); } function testDraw() { return Promise.all([doOneDrawTest("RGB24"), doOneDrawTest("BGR24"), doOneDrawTest("YUV444P", 5), doOneDrawTest("YUV422P", 2), doOneDrawTest("YUV420P", 2), doOneDrawTest("YUV420SP_NV12", 2), doOneDrawTest("YUV420SP_NV21", 2), doOneDrawTest("HSV", 2), doOneDrawTest("Lab", 2)]); } // Create an ImageBitmap, _bitmap_, from the _source_. // Read the underlying data of _bitmap_ into _bitmapBuffer_. // Compare the _bitmapBuffer_ with gGroundTruthImageData. function testAccessing_randomTest(sourceType, source, duration) { return new Promise(function(resolve, reject) { var p = createImageBitmap(source); p.then( function(bitmap) { bitmapFormat = "RGBA32"; var bitmapBufferLength = bitmap.mappedDataLength(bitmapFormat); var bitmapBuffer = new ArrayBuffer(bitmapBufferLength); var bitmapBufferView = new Uint8ClampedArray(bitmapBuffer, 0, bitmapBufferLength); var promise = bitmap.mapDataInto(bitmapFormat, bitmapBuffer, 0); promise.then( function(bitmapPixelLayout) { // Prepare. bitmapImageData = new ImageData(bitmapBufferView, bitmap.width, bitmap.height); // Test. for (var t = 0; t < 50; ++t) { var randomX = Math.floor(Math.random() * 240); var randomY = Math.floor(Math.random() * 175); isPixel(sourceType, "RGBA32", gGroundTruthImageData, bitmapImageData, randomX, randomY, duration); } resolve(); }, function(ev) { failed(ev); reject(); }); }, function(ev) { failed(ev); reject(); }); }); } // Create an ImageBitmap, _bitmap_, from the _source_. // Read the underlying data of _bitmap_ into _bitmapBuffer_. // Create another ImageBitmap, _bitmap2_, from _bitmapBuffer_. // Read the underlying data of _bitmap2_ into _bitmapBuffer2_. // Compare the _bitmapBuffer2_ with gGroundTruthImageData. function testCreateFromArrayBffer_randomTest(sourceType, source, duration) { return new Promise(function(resolve, reject) { var p = createImageBitmap(source); p.then( function(bitmap) { bitmapFormat = "RGBA32"; var bitmapBufferLength = bitmap.mappedDataLength(bitmapFormat); var bitmapBuffer = new ArrayBuffer(bitmapBufferLength); var bitmapBufferView = new Uint8ClampedArray(bitmapBuffer, 0, bitmapBufferLength); var promiseMapDataInto = bitmap.mapDataInto(bitmapFormat, bitmapBuffer, 0); promiseMapDataInto.then( function(bitmapPixelLayout) { // Create a new ImageBitmap from an ArrayBuffer. var p2 = createImageBitmap(bitmapBufferView, 0, bitmapBufferLength, bitmapFormat, bitmapPixelLayout); p2.then( function(bitmap2) { bitmapFormat2 = "RGBA32"; var bitmapBufferLength2 = bitmap2.mappedDataLength(bitmapFormat2); var bitmapBuffer2 = new ArrayBuffer(bitmapBufferLength2); var bitmapBufferView2 = new Uint8ClampedArray(bitmapBuffer2, 0, bitmapBufferLength2); var promise2 = bitmap2.mapDataInto(bitmapFormat2, bitmapBuffer2, 0); promise2.then( function(bitmapPixelLayout2) { // Prepare. var bitmapImageData2 = new ImageData(bitmapBufferView2, bitmap2.width, bitmap2.height); // Test. for (var t = 0; t < 50; ++t) { var randomX = Math.floor(Math.random() * 240); var randomY = Math.floor(Math.random() * 175); isPixel(sourceType, "RGBA32", gGroundTruthImageData, bitmapImageData2, randomX, randomY, duration); } resolve(); }, function(ev) { failed(ev); reject(); }); }, function(ev) { console.log("p2 rejected!"); failed(ev); reject(); }); }, function(ev) { console.log("promiseMapDataInto rejected!"); failed(ev); reject(); }); }, function(ev) { failed(ev); reject(); }); }); } function testColorConversion(sourceFromat, destinationFormat, tolerance, shouldThrow) { tolerance = tolerance || 0; shouldThrow = shouldThrow || false; return new Promise(function(resolve, reject) { var [srcData, dstData] = getTestData(sourceFromat, destinationFormat); ok(!!srcData, "Get valid srcData of type:" + sourceFromat); ok(!!dstData, "Get valid dstData of type:" + destinationFormat); // printInfo(sourceFromat, srcData); // printInfo(destinationFormat, dstData); // Create a new ImageBitmap from an ArrayBuffer. var p = createImageBitmap(srcData.buffer, 0, srcData.bufferLength, srcData.format, srcData.pixelLayout); p.then( function(srcBitmap) { ok(!!srcBitmap, "Should get a valid srcBitmap."); ok(srcBitmap.findOptimalFormat() == sourceFromat, "srcBitmap.findOptimalFormat():" + srcBitmap.findOptimalFormat() + " should equal to sourceFromat:" + sourceFromat); var dstBufferLength = srcBitmap.mappedDataLength(destinationFormat); var dstBuffer = new ArrayBuffer(dstBufferLength); var dstBufferView = new dstData.ArrayType(dstBuffer, 0, dstBufferLength / dstData.ArrayType.BYTES_PER_ELEMENT); // Do color conversion here. var p2 = srcBitmap.mapDataInto(destinationFormat, dstBuffer, 0); p2.then( function(dstPixelLayout) { var dataPixalLayout = dstData.pixelLayout; // Check pixel layout. ok(dstPixelLayout.length == dstData.channelCount, "dstPixelLayout.length:" + dstPixelLayout.length + " should equal to dstData.channelCount:" + dstData.channelCount); for (var c = 0; c < dstData.channelCount; ++c) { var dstChannelLayout = dstPixelLayout[c]; var dataChannelLayout = dataPixalLayout[c]; ok(dstChannelLayout.width == dataChannelLayout.width, "channel[" + c + "] dstChannelLayout.width:" + dstChannelLayout.width + " should equal to dataChannelLayout.width:" + dataChannelLayout.width); ok(dstChannelLayout.height == dataChannelLayout.height, "channel[" + c + "] dstChannelLayout.height:" + dstChannelLayout.height + " should equal to dataChannelLayout.height:" + dataChannelLayout.height); ok(dstChannelLayout.skip == dataChannelLayout.skip, "channel[" + c + "] dstChannelLayout.skip:" + dstChannelLayout.skip + " should equal to dataChannelLayout.skip:" + dataChannelLayout.skip); for (var i = 0; i < dstChannelLayout.height; ++i) { for (var j = 0; j < dstChannelLayout.width; ++j) { var byteOffset = dstChannelLayout.offset + i * dstChannelLayout.stride + j * (dstChannelLayout.skip + 1) * dstData.ArrayType.BYTES_PER_ELEMENT; var view = new dstData.ArrayType(dstBuffer, byteOffset, 1); var dstBufferViewValue = view[0]; var dstDataValue = dstData.getPixelValue(i, j, c); ok(Math.abs(dstBufferViewValue - dstDataValue) <= tolerance, "[" + sourceFromat + " -> " + destinationFormat + "] pixel(" + i + "," + j + ") channnel(" + c + "): dstBufferViewValue:" + dstBufferViewValue + " should equal to dstDataValue:" + dstDataValue); } } } resolve(); }, function(ev) { // If the "mapDataInto" throws, the flow goes here. if (!shouldThrow) { failed(ev); } reject(); } ); }, function(ev) { reject(ev); } ); }); } function doOneDrawTest(sourceFromat, tolerance) { tolerance = tolerance || 0; var destinationFormat = "RGBA32"; return new Promise(function(resolve, reject) { var [srcData, dstData] = getTestData(sourceFromat, destinationFormat); ok(!!srcData, "Get valid srcData of type:" + sourceFromat); ok(!!dstData, "Get valid dstData of type:" + destinationFormat); var p = createImageBitmap(srcData.buffer, 0, srcData.bufferLength, srcData.format, srcData.pixelLayout); p.then( function(srcBitmap) { ok(!!srcBitmap, "Should get a valid srcBitmap."); ok(srcBitmap.findOptimalFormat() == sourceFromat, "srcBitmap.findOptimalFormat():" + srcBitmap.findOptimalFormat() + " should equal to sourceFromat:" + sourceFromat); var canvas = document.createElement("canvas"); canvas.width = srcBitmap.width; canvas.height = srcBitmap.height; var ctx = canvas.getContext("2d"); ctx.drawImage(srcBitmap, 0, 0, srcBitmap.width, srcBitmap.height); // Get an ImageData from the canvas. var imageData = ctx.getImageData(0, 0, srcBitmap.width, srcBitmap.height); for (var i = 0; i < srcBitmap.height; ++i) { for (var j = 0; j < srcBitmap.width; ++j) { var pixelOffset = i * srcBitmap.width * dstData.channelCount + j * dstData.channelCount; var dstImageDataValue_R = imageData.data[pixelOffset + 0]; var dstImageDataValue_G = imageData.data[pixelOffset + 1]; var dstImageDataValue_B = imageData.data[pixelOffset + 2]; var dstImageDataValue_A = imageData.data[pixelOffset + 3]; var logPrefix = "[" + sourceFromat + " -> " + destinationFormat + "] pixel(" + i + "," + j + ")"; var dstDataValue_R = dstData.getPixelValue(i, j, 0); var dstDataValue_G = dstData.getPixelValue(i, j, 1); var dstDataValue_B = dstData.getPixelValue(i, j, 2); var dstDataValue_A = dstData.getPixelValue(i, j, 3); ok(Math.abs(dstImageDataValue_R - dstDataValue_R) <= tolerance, logPrefix + "channnel(R): dstImageDataValue:" + dstImageDataValue_R + " should equal to dstDataValue_R: " + dstDataValue_R); ok(Math.abs(dstImageDataValue_G - dstDataValue_G) <= tolerance, logPrefix + "channnel(G): dstImageDataValue:" + dstImageDataValue_G + " should equal to dstDataValue_G: " + dstDataValue_G); ok(Math.abs(dstImageDataValue_B - dstDataValue_B) <= tolerance, logPrefix + "channnel(B): dstImageDataValue:" + dstImageDataValue_B + " should equal to dstDataValue_B: " + dstDataValue_B); ok(Math.abs(dstImageDataValue_A - dstDataValue_A) <= tolerance, logPrefix + "channnel(A): dstImageDataValue:" + dstImageDataValue_A + " should equal to dstDataValue_A: " + dstDataValue_A); } } resolve(); }, function(ev) { failed(ev); reject(ev); } ); }); }