Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
photopea committed Nov 1, 2019
1 parent 71056cf commit 9a0b6c1
Showing 1 changed file with 39 additions and 45 deletions.
84 changes: 39 additions & 45 deletions UPNG.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ UPNG.toRGBA8.decodeImage = function(data, w, h, out)

if (ctype==6) { // RGB + alpha
var qarea = area<<2;
if(depth== 8) for(var i=0; i<qarea;i++) { bf[i] = data[i]; /*if((i&3)==3 && data[i]!=0) bf[i]=255;*/ }
if(depth==16) for(var i=0; i<qarea;i++) { bf[i] = data[i<<1]; }
if(depth== 8) for(var i=0; i<qarea;i+=4) { bf[i] = data[i]; bf[i+1] = data[i+1]; bf[i+2] = data[i+2]; bf[i+3] = data[i+3]; }
if(depth==16) for(var i=0; i<qarea;i++ ) { bf[i] = data[i<<1]; }
}
else if(ctype==2) { // RGB
var ts=out.tabs["tRNS"];
Expand Down Expand Up @@ -313,41 +313,32 @@ UPNG.decode._filterZero = function(data, out, off, w, h)
var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), paeth = UPNG.decode._paeth;
bpp = Math.ceil(bpp/8);

var i=0, di=1, type=0, x=0;
var i=0, di=1, type=data[off], x=0;

if(type>1) data[off]=[0,0,1][type-2];
if(type==3) for(x=bpp; x<bpl; x++) data[x+1] = (data[x+1] + (data[x+1-bpp]>>>1) )&255;

for(var y=0; y<h; y++) {
i = off+y*bpl; di = i+y+1;
type = data[di-1]; x=0;

if (type==0) for(; x<bpl; x++) data[i+x] = data[di+x];
else if(type==1) {
for(; x<bpp; x++) data[i+x] = data[di+x];
for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpp])&255;
}
else if(y==0) {
for(; x<bpp; x++) data[i+x] = data[di+x];
if (type==2) for(; x<bpl; x++) data[i+x] = data[di+x];
else if(type==3) for(; x<bpl; x++) data[i+x] = (data[di+x] + (data[i+x-bpp]>>>1) )&255;
else if(type==4) for(; x<bpl; x++) data[i+x] = (data[di+x] + paeth(data[i+x-bpp], 0, 0) )&255;
}
else {
if (type==2) { for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpl])&255; }

else if(type==3) { for(; x<bpp; x++) data[i+x] = (data[di+x] + ( data[i+x-bpl]>>>1))&255;
for(; x<bpl; x++) data[i+x] = (data[di+x] + ((data[i+x-bpl]+data[i+x-bpp])>>>1) )&255; }

else if(type==4) { for(; x<bpp; x++) data[i+x] = (data[di+x] + paeth(0, data[i+x-bpl], 0))&255;
for(; x<bpl; x++) data[i+x] = (data[di+x] + paeth(data[i+x-bpp], data[i+x-bpl], data[i+x-bpp-bpl]) )&255; }
}
if (type==0) for(; x<bpl; x++) data[i+x] = data[di+x];
else if(type==1) { for(; x<bpp; x++) data[i+x] = data[di+x];
for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpp]); }
else if(type==2) { for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpl]); }
else if(type==3) { for(; x<bpp; x++) data[i+x] = (data[di+x] + ( data[i+x-bpl]>>>1));
for(; x<bpl; x++) data[i+x] = (data[di+x] + ((data[i+x-bpl]+data[i+x-bpp])>>>1) ); }
else { for(; x<bpp; x++) data[i+x] = (data[di+x] + paeth(0, data[i+x-bpl], 0));
for(; x<bpl; x++) data[i+x] = (data[di+x] + paeth(data[i+x-bpp], data[i+x-bpl], data[i+x-bpp-bpl]) ); }
}
return data;
}

UPNG.decode._paeth = function(a,b,c)
{
var p = a+b-c, pa = Math.abs(p-a), pb = Math.abs(p-b), pc = Math.abs(p-c);
if (pa <= pb && pa <= pc) return a;
else if (pb <= pc) return b;
var p = a+b-c, pa = (p-a), pb = (p-b), pc = (p-c);
if (pa*pa <= pb*pb && pa*pa <= pc*pc) return a;
else if (pb*pb <= pc*pc) return b;
return c;
}

Expand Down Expand Up @@ -422,8 +413,6 @@ UPNG._copyTile = function(sb, sw, sh, tb, tw, th, xoff, yoff, mode)





UPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte)
{
if(ps==null) ps=0;
Expand All @@ -438,13 +427,15 @@ UPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte)
UPNG.encodeLL = function(bufs, w, h, cc, ac, depth, dels, tabs) {
var nimg = { ctype: 0 + (cc==1 ? 0 : 2) + (ac==0 ? 0 : 4), depth: depth, frames: [] };

var time = Date.now();
var bipp = (cc+ac)*depth, bipl = bipp * w;
for(var i=0; i<bufs.length; i++)
nimg.frames.push({ rect:{x:0,y:0,width:w,height:h}, img:new Uint8Array(bufs[i]), blend:0, dispose:1, bpp:Math.ceil(bipp/8), bpl:Math.ceil(bipl/8) });

UPNG.encode.compressPNG(nimg, 4);
UPNG.encode.compressPNG(nimg, 0, true);

return UPNG.encode._main(nimg, w, h, dels, tabs);
var out = UPNG.encode._main(nimg, w, h, dels, tabs);
return out;
}

UPNG.encode._main = function(nimg, w, h, dels, tabs) {
Expand Down Expand Up @@ -552,7 +543,7 @@ UPNG.encode._main = function(nimg, w, h, dels, tabs) {
var ioff = offset;
wAs(data,offset,(j==0)?"IDAT":"fdAT"); offset+=4;
if(j!=0) { wUi(data, offset, fi++); offset+=4; }
for(var i=0; i<dl; i++) data[offset+i] = imgd[i];
data.set(imgd,offset);
offset += dl;
wUi(data,offset,crc(data,ioff,offset-ioff)); offset+=4; // crc
}
Expand All @@ -564,11 +555,11 @@ UPNG.encode._main = function(nimg, w, h, dels, tabs) {
return data.buffer;
}

UPNG.encode.compressPNG = function(out, filter) {
UPNG.encode.compressPNG = function(out, filter, levelZero) {
for(var i=0; i<out.frames.length; i++) {
var frm = out.frames[i], nw=frm.rect.width, nh=frm.rect.height;
var fdata = new Uint8Array(nh*frm.bpl+nh);
frm.cimg = UPNG.encode._filterZero(frm.img,nh,frm.bpp,frm.bpl,fdata, filter);
frm.cimg = UPNG.encode._filterZero(frm.img,nh,frm.bpp,frm.bpl,fdata, filter, levelZero);
}
}

Expand Down Expand Up @@ -788,23 +779,23 @@ UPNG.encode._prepareDiff = function(cimg, w,h, nimg, rec) {
}*/
}

UPNG.encode._filterZero = function(img,h,bpp,bpl,data, filter)
UPNG.encode._filterZero = function(img,h,bpp,bpl,data, filter, levelZero)
{
//console.log(filter);
if(filter!=-1) {
for(var y=0; y<h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, filter);
return pako["deflate"](data);
}
var fls = [];
for(var t=0; t<5; t++) { if(h*bpl>500000 && (t==1 || t==2 || t==3 || t==4)) continue;
for(var y=0; y<h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, t);
var fls = [], ftry=[0,1,2,3,4];
if (filter!=-1) ftry=[filter];
else if(h*bpl>500000 || bpp==1) ftry=[0];
var opts; if(levelZero) opts={level:0};

var CMPR = (levelZero && UZIP!=null) ? UZIP : pako;

for(var i=0; i<ftry.length; i++) {
for(var y=0; y<h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, ftry[i]);
//var nimg = new Uint8Array(data.length);
//var sz = UZIP.F.deflate(data, nimg); fls.push(nimg.slice(0,sz));
//var dfl = pako["deflate"](data), dl=dfl.length-4;
//var crc = (dfl[dl+3]<<24)|(dfl[dl+2]<<16)|(dfl[dl+1]<<8)|(dfl[dl+0]<<0);
//console.log(crc, UZIP.adler(data,2,data.length-6));
fls.push(pako["deflate"](data));
if(bpp==1) break;
fls.push(CMPR["deflate"](data,opts));
}
var ti, tsize=1e9;
for(var i=0; i<fls.length; i++) if(fls[i].length<tsize) { ti=i; tsize=fls[i].length; }
Expand All @@ -815,7 +806,10 @@ UPNG.encode._filterLine = function(data, img, y, bpl, bpp, type)
var i = y*bpl, di = i+y, paeth = UPNG.decode._paeth
data[di]=type; di++;

if(type==0) for(var x=0; x<bpl; x++) data[di+x] = img[i+x];
if(type==0) {
if(bpl<500) for(var x=0; x<bpl; x++) data[di+x] = img[i+x];
else data.set(new Uint8Array(img.buffer,i,bpl),di);
}
else if(type==1) {
for(var x= 0; x<bpp; x++) data[di+x] = img[i+x];
for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]-img[i+x-bpp]+256)&255;
Expand Down

0 comments on commit 9a0b6c1

Please sign in to comment.