blob: 2dabc9060baaebb67a4930ce4c423dbb3707ad26 [file] [log] [blame]
/*-------------------------------------------------------------------------
* 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 + '<br> <canvas id="logImage' + i + '" width=' + width + ' height=' + height + '></canvas><br>';
var imageCanvas = document.getElementById('logImage' + i);
var ctx = imageCanvas.getContext('2d');
var data = tcuLogImage.createImage(ctx, image);
ctx.putImageData(data, 0, 0);
};
/**
* @param {Array<number>=} scale
* @param {Array<number>=} bias
* @return {string} HTML string to add to log.
*/
tcuLogImage.logScaleAndBias = function(scale, bias) {
if (scale && bias)
return '<br> Image normalized with formula p * (' + scale + ') + (' + bias + ')';
else if (scale)
return '<br> Image normalized with formula p * (' + scale + ')';
else if (bias)
return '<br> Image normalized with formula p + (' + bias + ')';
return '';
};
/**
* @param {string} name
* @param {string} description
* @param {tcuTexture.ConstPixelBufferAccess} image
* @param {Array<number>=} scale
* @param {Array<number>=} bias
*/
tcuLogImage.logImageRGB = function(name, description, image, scale, bias) {
var elem = document.getElementById('console');
var span = document.createElement('span');
var info = name + ' ' + description + '<br> ' + 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<number>=} pixelScale
* @param {Array<number>=} 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 + '<br> ' + access;
if (needScaling) {
info += tcuLogImage.logScaleAndBias(pixelScale, pixelBias);
}
tcuLogImage.logImageWithInfo(logImageAccess, info);
} else {
/* TODO: Implement */
}
};
});