Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
function getRowData(finalFrameTimings: Array>, configs: DefaultConfigs, pixSelectStr?: string): Map {
const rowData = new Map();
rowData.set("iModel", configs.iModelName!);
rowData.set("View", configs.viewName!);
const w = cssPixelsToDevicePixels(configs.view!.width);
const h = cssPixelsToDevicePixels(configs.view!.height);
rowData.set("Screen Size", w + "X" + h);
rowData.set("Skip & Time Renders", configs.numRendersToSkip + " & " + configs.numRendersToTime);
rowData.set("Display Style", activeViewState.viewState!.displayStyle.name);
rowData.set("Render Mode", getRenderMode());
rowData.set("View Flags", getViewFlagsString() !== "" ? " " + getViewFlagsString() : "");
rowData.set("Render Options", getRenderOpts() !== "" ? " " + getRenderOpts() : "");
rowData.set("Tile Props", getTileProps() !== "" ? " " + getTileProps() : "");
rowData.set("Bkg Map Props", getBackgroundMapProps() !== "" ? " " + getBackgroundMapProps() : "");
if (pixSelectStr) rowData.set("ReadPixels Selector", " " + pixSelectStr);
rowData.set("Tile Loading Time", curTileLoadingTime);
rowData.set("Test Name", getTestName(configs));
rowData.set("Browser", getBrowserName(IModelApp.queryRenderCompatibility().userAgent));
// Calculate average timings
if (pixSelectStr) { // timing read pixels
let gpuTime = 0;
async function createReadPixelsImages(testConfig: DefaultConfigs, pix: Pixel.Selector, pixStr: string) {
const canvas = theViewport !== undefined ? theViewport.readImageToCanvas() : undefined;
if (canvas !== undefined) {
const ctx = canvas.getContext("2d");
if (ctx) {
const cssWidth = testConfig.view!.width;
const cssHeight = testConfig.view!.height;
const cssRect = new ViewRect(0, 0, cssWidth, cssHeight);
const imgWidth = cssPixelsToDevicePixels(cssWidth);
const imgHeight = cssPixelsToDevicePixels(cssHeight);
ctx.clearRect(0, 0, canvas.width, canvas.height);
const elemIdImgData = (pix & Pixel.Selector.Feature) ? ctx.createImageData(imgWidth, imgHeight) : undefined;
const depthImgData = (pix & Pixel.Selector.GeometryAndDistance) ? ctx.createImageData(imgWidth, imgHeight) : undefined;
const typeImgData = (pix & Pixel.Selector.GeometryAndDistance) ? ctx.createImageData(imgWidth, imgHeight) : undefined;
theViewport!.readPixels(cssRect, pix, (pixels: any) => {
if (undefined === pixels)
return;
for (let y = 0; y < imgHeight; ++y) {
for (let x = 0; x < imgWidth; ++x) {
const index = (x * 4) + (y * 4 * imgWidth);
const pixel = pixels.getPixel(x, y);
// // RGB for element ID
if (elemIdImgData !== undefined) {
const elemId = Id64.getLowerUint32(pixel.elementId ? pixel.elementId : "");
function getRowData(finalFrameTimings: Array>, configs: DefaultConfigs, pixSelectStr?: string): Map {
const rowData = new Map();
rowData.set("iModel", configs.iModelName!);
rowData.set("View", configs.viewName!);
const w = cssPixelsToDevicePixels(configs.view!.width);
const h = cssPixelsToDevicePixels(configs.view!.height);
rowData.set("Screen Size", w + "X" + h);
rowData.set("Skip & Time Renders", configs.numRendersToSkip + " & " + configs.numRendersToTime);
rowData.set("Display Style", activeViewState.viewState!.displayStyle.name);
rowData.set("Render Mode", getRenderMode());
rowData.set("View Flags", getViewFlagsString() !== "" ? " " + getViewFlagsString() : "");
rowData.set("Render Options", getRenderOpts() !== "" ? " " + getRenderOpts() : "");
rowData.set("Tile Props", getTileProps() !== "" ? " " + getTileProps() : "");
rowData.set("Bkg Map Props", getBackgroundMapProps() !== "" ? " " + getBackgroundMapProps() : "");
if (pixSelectStr) rowData.set("ReadPixels Selector", " " + pixSelectStr);
rowData.set("Tile Loading Time", curTileLoadingTime);
rowData.set("Test Name", getTestName(configs));
rowData.set("Browser", getBrowserName(IModelApp.queryRenderCompatibility().userAgent));
// Calculate average timings
if (pixSelectStr) { // timing read pixels
async function createReadPixelsImages(testConfig: DefaultConfigs, pix: Pixel.Selector, pixStr: string) {
const canvas = theViewport !== undefined ? theViewport.readImageToCanvas() : undefined;
if (canvas !== undefined) {
const ctx = canvas.getContext("2d");
if (ctx) {
const cssWidth = testConfig.view!.width;
const cssHeight = testConfig.view!.height;
const cssRect = new ViewRect(0, 0, cssWidth, cssHeight);
const imgWidth = cssPixelsToDevicePixels(cssWidth);
const imgHeight = cssPixelsToDevicePixels(cssHeight);
ctx.clearRect(0, 0, canvas.width, canvas.height);
const elemIdImgData = (pix & Pixel.Selector.Feature) ? ctx.createImageData(imgWidth, imgHeight) : undefined;
const depthImgData = (pix & Pixel.Selector.GeometryAndDistance) ? ctx.createImageData(imgWidth, imgHeight) : undefined;
const typeImgData = (pix & Pixel.Selector.GeometryAndDistance) ? ctx.createImageData(imgWidth, imgHeight) : undefined;
theViewport!.readPixels(cssRect, pix, (pixels: any) => {
if (undefined === pixels)
return;
for (let y = 0; y < imgHeight; ++y) {
for (let x = 0; x < imgWidth; ++x) {
const index = (x * 4) + (y * 4 * imgWidth);
const pixel = pixels.getPixel(x, y);
// // RGB for element ID
if (elemIdImgData !== undefined) {
vp.readPixels(rect, Pixel.Selector.All, (pixels: Pixel.Buffer | undefined) => {
if (undefined === pixels)
return;
const sRect = rect.clone();
sRect.left = cssPixelsToDevicePixels(sRect.left);
sRect.right = cssPixelsToDevicePixels(sRect.right);
sRect.bottom = cssPixelsToDevicePixels(sRect.bottom);
sRect.top = cssPixelsToDevicePixels(sRect.top);
for (let x = sRect.left; x < sRect.right; x++)
for (let y = sRect.top; y < sRect.bottom; y++)
set.insert(pixels.getPixel(x, y));
}, excludeNonLocatable);
vp.readPixels(rect, Pixel.Selector.All, (pixels: Pixel.Buffer | undefined) => {
if (undefined === pixels)
return;
const sRect = rect.clone();
sRect.left = cssPixelsToDevicePixels(sRect.left);
sRect.right = cssPixelsToDevicePixels(sRect.right);
sRect.bottom = cssPixelsToDevicePixels(sRect.bottom);
sRect.top = cssPixelsToDevicePixels(sRect.top);
for (let x = sRect.left; x < sRect.right; x++)
for (let y = sRect.top; y < sRect.bottom; y++)
set.insert(pixels.getPixel(x, y));
}, excludeNonLocatable);
vp.readPixels(rect, Pixel.Selector.All, (pixels: Pixel.Buffer | undefined) => {
if (undefined === pixels)
return;
const sRect = rect.clone();
sRect.left = cssPixelsToDevicePixels(sRect.left);
sRect.right = cssPixelsToDevicePixels(sRect.right);
sRect.bottom = cssPixelsToDevicePixels(sRect.bottom);
sRect.top = cssPixelsToDevicePixels(sRect.top);
for (let x = sRect.left; x < sRect.right; x++)
for (let y = sRect.top; y < sRect.bottom; y++)
set.insert(pixels.getPixel(x, y));
}, excludeNonLocatable);
vp.readPixels(rect, Pixel.Selector.All, (pixels: Pixel.Buffer | undefined) => {
if (undefined === pixels)
return;
const sRect = rect.clone();
sRect.left = cssPixelsToDevicePixels(sRect.left);
sRect.right = cssPixelsToDevicePixels(sRect.right);
sRect.bottom = cssPixelsToDevicePixels(sRect.bottom);
sRect.top = cssPixelsToDevicePixels(sRect.top);
for (let x = sRect.left; x < sRect.right; x++)
for (let y = sRect.top; y < sRect.bottom; y++)
set.insert(pixels.getPixel(x, y));
}, excludeNonLocatable);