Cache complete image in elements for faster drawing

pull/1916/head
Martin Boonk 2022-03-07 21:23:41 +01:00
parent eb3dd9e401
commit ebfc73ebd8
1 changed files with 51 additions and 36 deletions

View File

@ -180,9 +180,9 @@ function drawNumber(resources, element, offset){
if (isNegative && minusImage){
//print("Draw minus at", currentX);
if (imageIndexMinus){
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "" + (0 + imageIndexMinus));
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element, "" + (0 + imageIndexMinus));
} else {
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "minus");
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element, "minus");
}
currentX += minusImage.width + spacing;
}
@ -195,14 +195,14 @@ function drawNumber(resources, element, offset){
currentDigit = 0;
}
//print("Digit " + currentDigit + " " + currentX);
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, currentDigit + imageIndex);
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element, currentDigit + imageIndex);
currentX += firstImage.width + spacing;
}
if (imageIndexUnit){
//print("Draw unit at", currentX);
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "" + (0 + imageIndexUnit));
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element, "" + (0 + imageIndexUnit));
} else if (element.Unit){
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, getMultistate(element.Unit,"unknown"));
drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element, getMultistate(element.Unit,"unknown"));
}
element.lastDrawnValue = number;
@ -214,16 +214,33 @@ function setColors(properties){
if (properties.bg) g.setBgColor(properties.bg);
}
function drawElement(resources, pos, offset, path, lastElem){
function drawElement(resources, pos, offset, element, lastElem){
startPerfLog("drawElement");
var cacheKey = "_"+(lastElem?lastElem:"nole");
if (!element.cachedImage) element.cachedImage={};
if (!element.cachedImage[cacheKey]){
var resource = getByPath(resources, element.ImagePath, lastElem);
if (resource){
prepareImg(resource);
//print("lastElem", typeof resource)
if (resource) {
element.cachedImage[cacheKey] = resource;
//print("cache res ",typeof element.cachedImage[cacheKey]);
} else {
element.cachedImage[cacheKey] = null;
//print("cache null",typeof element.cachedImage[cacheKey]);
//print("Could not create image from", resource);
}
} else {
//print("Could not get resource from", element, lastElem);
}
}
//print("cache ",typeof element.cachedImage[cacheKey], element.ImagePath, lastElem);
if(element.cachedImage[cacheKey]){
//print("drawElement ",pos, offset, path, lastElem);
//print("drawElement offset", offset, pos.X, pos.Y);
var resource = getByPath(resources, path, lastElem);
//print("Got resource", resource);
if (resource){
//print("resource ", resource,pos, offset, path, lastElem);
var image = prepareImg(resource);
if (image){
var imageOffset = updateColors(pos, offset);
setColors(imageOffset);
//print("drawImage from drawElement", image, pos, offset);
@ -237,13 +254,11 @@ function drawElement(resources, pos, offset, path, lastElem){
//print("options", options);
//print("Memory before drawing", process.memory(false));
startPerfLog("drawElement_g.drawImage");
g.drawImage(image ,(imageOffset.X ? imageOffset.X : 0) + (pos.X ? pos.X : 0),(imageOffset.Y ? imageOffset.Y :0) + (pos.Y ? pos.Y : 0), options);
endPerfLog("drawElement_g.drawImage");
} else {
//print("Could not create image from", resource);
try{
g.drawImage(element.cachedImage[cacheKey] ,(imageOffset.X ? imageOffset.X : 0) + (pos.X ? pos.X : 0),(imageOffset.Y ? imageOffset.Y :0) + (pos.Y ? pos.Y : 0), options);} catch (e) {
//print("Error", e, element.cachedImage[cacheKey]);
}
} else {
//print("Could not get resource from", path, lastElem);
endPerfLog("drawElement_g.drawImage");
}
endPerfLog("drawElement");
}
@ -280,7 +295,7 @@ function drawScale(resources, scale, offset){
var segmentsToDraw = Math.ceil(value * segments.length);
for (var i = 0; i < segmentsToDraw; i++){
drawElement(resources, segments[i], scaleOffset, scale.ImagePath, imageIndex + i);
drawElement(resources, segments[i], scaleOffset, scale, imageIndex + i);
}
scale.lastDrawnValue = segmentsToDraw;
@ -288,7 +303,7 @@ function drawScale(resources, scale, offset){
}
function drawDigit(resources, element, offset, digit){
drawElement(resources, element, offset, element.ImagePath, digit);
drawElement(resources, element, offset, element, digit);
}
function drawImage(resources, image, offset, name){
@ -298,11 +313,11 @@ function drawImage(resources, image, offset, name){
if (image.Value && image.Steps){
var steps = Math.floor(scaledown(image.Value, image.MinValue, image.MaxValue) * (image.Steps - 1));
//print("Step", steps, "of", image.Steps);
drawElement(resources, image, imageOffset, image.ImagePath, "" + steps);
drawElement(resources, image, imageOffset, image, "" + steps);
} else if (image.ImageIndex !== undefined) {
drawElement(resources, image, imageOffset, image.ImagePath, image.ImageIndex);
drawElement(resources, image, imageOffset, image, image.ImageIndex);
} else {
drawElement(resources, image, imageOffset, image.ImagePath, name ? "" + name: undefined);
drawElement(resources, image, imageOffset, image, name ? "" + name: undefined);
}
endPerfLog("drawImage");