/*------------------------------------------------------------------------- * 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.tcuLogImage'); goog.require('framework.common.tcuSurface'); goog.require('framework.common.tcuTexture'); goog.require('framework.delibs.debase.deMath'); goog.scope(function() { var tcuLogImage = framework.common.tcuLogImage; var tcuTexture = framework.common.tcuTexture; var tcuSurface = framework.common.tcuSurface; var deMath = framework.delibs.debase.deMath; /** @const */ var MAX_IMAGE_SIZE_2D = 4096; /** * @param {tcuTexture.ConstPixelBufferAccess} src */ tcuLogImage.createImage = function(ctx, src) { var w = src.getWidth(); var h = src.getHeight(); var pixelSize = src.getFormat().getPixelSize(); var imgData = ctx.createImageData(w, h); var index = 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var pixel = src.getPixelInt(x, h - y - 1, 0); for (var i = 0; i < pixelSize; i++) { imgData.data[index] = pixel[i]; index = index + 1; } if (pixelSize < 4) imgData.data[index++] = 255; } } return imgData; }; /** * @param {tcuTexture.ConstPixelBufferAccess} image * @param {string} info */ tcuLogImage.logImageWithInfo = function(image, info) { var elem = document.getElementById('console'); var span = document.createElement('span'); tcuLogImage.logImage.counter = tcuLogImage.logImage.counter || 0; var i = tcuLogImage.logImage.counter++; var width = image.getWidth(); var height = image.getHeight(); elem.appendChild(span); span.innerHTML = info + '

'; var imageCanvas = document.getElementById('logImage' + i); var ctx = imageCanvas.getContext('2d'); var data = tcuLogImage.createImage(ctx, image); ctx.putImageData(data, 0, 0); }; /** * @param {Array=} scale * @param {Array=} bias * @return {string} HTML string to add to log. */ tcuLogImage.logScaleAndBias = function(scale, bias) { if (scale && bias) return '
Image normalized with formula p * (' + scale + ') + (' + bias + ')'; else if (scale) return '
Image normalized with formula p * (' + scale + ')'; else if (bias) return '
Image normalized with formula p + (' + bias + ')'; return ''; }; /** * @param {string} name * @param {string} description * @param {tcuTexture.ConstPixelBufferAccess} image * @param {Array=} scale * @param {Array=} bias */ tcuLogImage.logImageRGB = function(name, description, image, scale, bias) { var elem = document.getElementById('console'); var span = document.createElement('span'); var info = name + ' ' + description + '
' + image; if (scale || bias) info += tcuLogImage.logScaleAndBias(scale, bias); tcuLogImage.logImageWithInfo(image, info); }; /** * @param {string} name * @param {string} description * @param {tcuTexture.ConstPixelBufferAccess} access * @param {Array=} pixelScale * @param {Array=} pixelBias */ tcuLogImage.logImage = function(name, description, access, pixelScale, pixelBias) { pixelScale = pixelScale || [1, 1, 1, 1]; pixelBias = pixelBias || [0, 0, 0, 0]; var format = access.getFormat(); var width = access.getWidth(); var height = access.getHeight(); var depth = access.getDepth(); var needScaling = pixelBias[0] != 0 || pixelBias[1] != 0 || pixelBias[2] != 0 || pixelBias[3] != 0 || pixelScale[0] != 1 || pixelScale[1] != 1 || pixelScale[2] != 1 || pixelScale[3] != 1; if (depth == 1 && format.type == tcuTexture.ChannelType.UNORM_INT8 && width <= MAX_IMAGE_SIZE_2D && height <= MAX_IMAGE_SIZE_2D && (format.order == tcuTexture.ChannelOrder.RGB || tcuTexture.ChannelOrder.RGBA) && !needScaling) // Fast-path. tcuLogImage.logImageRGB(name, description, access); else if (depth == 1) { var sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.LINEAR, tcuTexture.FilterMode.NEAREST); var logImageSize = [width, height]; /* TODO: Add scaling */ var logImageAccess = new tcuSurface.Surface(width, height).getAccess(); for (var y = 0; y < logImageAccess.getHeight(); y++) { for (var x = 0; x < logImageAccess.getWidth(); x++) { var yf = (y + 0.5) / logImageAccess.getHeight(); var xf = (x + 0.5) / logImageAccess.getWidth(); var s = access.sample2D(sampler, sampler.minFilter, xf, yf, 0); if (needScaling) s = deMath.add(deMath.multiply(s, pixelScale), pixelBias); logImageAccess.setPixel(s, x, y); } } var info = name + ' ' + description + '
' + access; if (needScaling) { info += tcuLogImage.logScaleAndBias(pixelScale, pixelBias); } tcuLogImage.logImageWithInfo(logImageAccess, info); } else { /* TODO: Implement */ } }; });