|
|
@@ -0,0 +1,115 @@ |
|
|
|
import ISurface from "/app/js/ifaces/ISurface.js"; |
|
|
|
import NESPalette from "/app/js/models/NESPalette.js"; |
|
|
|
|
|
|
|
|
|
|
|
function render(surf, sx, sy, sw, sh, scale, ctx, dx, dy, palcolored){ |
|
|
|
if (!(surf instanceof ISurface)){ |
|
|
|
console.log("WARNING: Cannot render non-ISurface object."); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (sx + sw > surf.width || sy + sh > surf.height){ |
|
|
|
console.log("WARNING: Cannot render. Region is out of bounds."); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
palcolored = (palcolored === true); |
|
|
|
|
|
|
|
var cw = (Math.floor(ctx.canvas.clientWidth) > 0) ? |
|
|
|
Math.floor(ctx.canvas.clientWidth) : |
|
|
|
Math.floor(ctx.canvas.width); |
|
|
|
|
|
|
|
var ch = (Math.floor(ctx.canvas.clientHeight) > 0) ? |
|
|
|
Math.floor(ctx.canvas.clientHeight) : |
|
|
|
Math.floor(ctx.canvas.height); |
|
|
|
|
|
|
|
if (cw <= 0 || ch <= 0){return;} |
|
|
|
|
|
|
|
ctx.save(); |
|
|
|
ctx.fillStyle = NESPalette.Default[4]; |
|
|
|
ctx.fillRect(0,0,cw,ch); |
|
|
|
|
|
|
|
var ctximg = ctx.getImageData(0, 0, cw, ch); |
|
|
|
var idat = ctximg.data; |
|
|
|
|
|
|
|
var PutPixel = (i,j,s,c) => { |
|
|
|
i = Math.round(i); |
|
|
|
j = Math.round(j); |
|
|
|
s = Math.ceil(s); |
|
|
|
|
|
|
|
var r = parseInt(c.substring(1, 3), 16); |
|
|
|
var g = parseInt(c.substring(3, 5), 16); |
|
|
|
var b = parseInt(c.substring(5, 7), 16); |
|
|
|
|
|
|
|
for (var y=j; y < j+s; y++){ |
|
|
|
for (var x=i; x < i+s; x++){ |
|
|
|
if (x >= 0 && x < cw && y >= 0 && y < ch){ |
|
|
|
var index = (y*cw*4) + (x*4); |
|
|
|
idat[index] = r; |
|
|
|
idat[index+1] = g; |
|
|
|
idat[index+2] = b; |
|
|
|
idat[index+3] = 255; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
for (let j=sy; j < sy + sh; j++){ |
|
|
|
var y = (j*scale) + dy; |
|
|
|
for (let i=sx; i < sx + sw; i++){ |
|
|
|
var x = (i*scale) + dx; |
|
|
|
|
|
|
|
if (x >= 0 && x < cw && y >= 0 && y < ch){ |
|
|
|
var color = NESPalette.Default[4]; |
|
|
|
if (palcolored){ |
|
|
|
color = surf.getColor(i, j); |
|
|
|
} else { |
|
|
|
var pinfo = surf.getColorIndex(i, j); |
|
|
|
color = (pinfo.ci >= 0) ? NESPalette.Default[pinfo.ci] : NESPalette.Default[4]; |
|
|
|
} |
|
|
|
PutPixel(x,y,scale,color); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ctx.putImageData(ctximg, 0, 0); |
|
|
|
ctx.restore(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function renderToFit(surf, ctx, palcolored){ |
|
|
|
if (!(surf instanceof ISurface)){ |
|
|
|
console.log("WARNING: Cannot render non-ISurface object."); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
palcolored = (palcolored === true); |
|
|
|
|
|
|
|
var cw = (Math.floor(ctx.canvas.clientWidth) > 0) ? |
|
|
|
Math.floor(ctx.canvas.clientWidth) : |
|
|
|
Math.floor(ctx.canvas.width); |
|
|
|
|
|
|
|
var ch = (Math.floor(ctx.canvas.clientHeight) > 0) ? |
|
|
|
Math.floor(ctx.canvas.clientHeight) : |
|
|
|
Math.floor(ctx.canvas.height); |
|
|
|
|
|
|
|
if (cw <= 0 || ch <= 0){return;} |
|
|
|
|
|
|
|
var scale = Math.min( |
|
|
|
cw/surf.width, |
|
|
|
ch/surf.height |
|
|
|
); |
|
|
|
var offX = Math.floor((cw - (surf.width*scale)) * 0.5); |
|
|
|
var offY = Math.floor((ch - (surf.height*scale)) * 0.5); |
|
|
|
|
|
|
|
render(surf, 0, 0, surf.width, surf.height, scale, ctx, offX, offY, palcolored); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default { |
|
|
|
render: render, |
|
|
|
renderToFit: renderToFit |
|
|
|
}; |