NearlyDefault

NearlyDefault

53.6k Downloads

Less Edgy Default Textures

Downloads under "Files"

Algorithm Implementation

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;

import javax.imageio.ImageIO;

public class NDP2b {

public static void main(String[] args) throws Exception {
base=new File("M:/texdev/v2/vanilla/in");
o64=new File("M:/texdev/v2/vanilla/to64");
o128=new File("M:/texdev/v2/vanilla/to128");
o256=new File("M:/texdev/v2/vanilla/to256");
read.setOut(proc);
proc.setOut(write);
read.start();proc.start();write.start();
iter(base,"");
read.fillDeath();
}

public static void iter(File dir,String sub) throws Exception {
File[] farr=dir.listFiles();
for(File f : farr){
if(f.isDirectory()) {
iter(f,sub+'/'+f.getName());
}else{
String sup=sub+'/'+f.getName();
//System.out.println(sup);
File inf=new File(base,sup);
Transo o=new Transo(sup);
byte[] ii=new byte[(int) inf.length()];
FileInputStream is=new FileInputStream(inf);
int po=0,poe;
while(po<ii.length) {
poe=is.read(ii, po, ii.length-po);
if(poe==-1) {
is.close();
throw new EOFException("Baum");
}
po+=poe;
}
is.close();
o.ii=ii;
read.put(o);
}
}
}

static Object wlok=new Object();

static Taskor read=new Taskor(1) {

@Override
public Object work(Object trans) {try {
Transo o=(Transo)trans;
//System.out.println(o.sup);
o.bimg=ImageIO.read(new ByteArrayInputStream(o.ii));
return o;
}catch(Exception ex) {ex.printStackTrace();return null;}}

};

static Taskor write=new Taskor(1) {

@Override
public Object work(Object trans) {try {
WTr o=(WTr)trans;
ImageIO.write(o.out, "png", o.o);
return null;
}catch(Exception ex) {ex.printStackTrace();return null;}}

};

static class WTr {
File o;BufferedImage out;
public WTr(File a,BufferedImage b) {o=a;out=b;}
}

static Taskor proc=new Taskor(0) {

@Override
public Object work(Object trans) {try {
Transo o=(Transo)trans;
System.out.println(getName()+" "+o.sup);
boolean ipar=o.sup.contains("items/");
deo(o.bimg,ipar,new File(o64,o.sup),4,3,0);
deo(o.bimg,ipar,new File(o128,o.sup),8,5,1);
deo(o.bimg,ipar,new File(o256,o.sup),16,9,2);
return null;
}catch(Exception ex) {ex.printStackTrace();return null;}}

public void deo(BufferedImage bimg, boolean ipar, File o, int scal, int cust, int obid) throws Exception {
o.getParentFile().mkdirs();
BufferedImage out=ipar?parse(bimg,scal,cust,obid):parsenb(bimg,scal,cust,obid);
write.put(new WTr(o,out));
}

int[][] oR=new int[3][],oG=new int[3][],oB=new int[3][],oA=new int[3][];

/**
* generate median-upscaled image
* @param in ARGB-array
* @param outbuf @Nullable pass a array for output. Can be null. PLEASE USE RETURNED ARRAY AS OUTPUT
* @param iw in width
* @param ih in height
* @param scal scale factor
* @param cust median factor
* @return output array
*/
public byte[] parse(byte[] in, byte[] out, int iw, int ih, int scal, int cust, int obid) {
assert(in.length==(iw*ih*4));
int[] R=oR[obid],G=oG[obid],B=oB[obid],A=oA[obid];
int oh=ih*scal,ow=iw*scal,ymow,ydscalmiw,oxy,ixy;
if(out==null||out.length!=ow*oh*4) {out=new byte[ow*oh*4];}
for(int y=0;y<oh;y++) {
ymow=y*ow;
ydscalmiw=(y/scal)*iw;
for(int x=0;x<ow;x++) {
oxy=(ymow+x)*4;
ixy=(ydscalmiw+(x/scal))*4;
out[oxy]=in[ixy];out[oxy+1]=in[ixy+1];out[oxy+2]=in[ixy+2];out[oxy+3]=in[ixy+3];
}
}
int custq=cust*cust;
int wb=((cust-1)/2);
int wd=((custq-1)/2);
int m=0,dpx=0,dpy=0,pps;
if(A==null||A.length!=custq) {
//opixel[obid]=pixel=new int[custq];
oR[obid]=R=new int[custq];
oG[obid]=G=new int[custq];
oB[obid]=B=new int[custq];
oA[obid]=A=new int[custq];
}
for(int i=wb;i<ow-wb;i++){
for(int j=wb;j<oh-wb;j++){
//int ma=(img.getRGB(i, j) >> 24) & 0xff;
m=0;
pps=((j*ow)+i)*4;
for(int k=-wb;k<=wb;k++){
dpy=(k+j)*ow;
for(int l=-wb;l<=wb;l++){
//pixel[m]=img.getRGB(i+k, j+l);
dpx=(dpy+i+l)*4;
A[m]=out[dpx]&0xFF;
R[m]=out[dpx+1]&0xFF;
G[m]=out[dpx+2]&0xFF;
B[m]=out[dpx+3]&0xFF;
m++;
}
}
/*for(int k=0;k<pixel.length;k++){
R[k]=(pixel[k] >> 16) & 0xFF;
G[k]=(pixel[k] >> 8) & 0xFF;
B[k]=(pixel[k] >> 0) & 0xFF;
A[k]=(pixel[k] >> 24) & 0xff;
}*/
Arrays.sort(R);
Arrays.sort(G);
Arrays.sort(B);
Arrays.sort(A);
/*img.setRGB(i,j, ((A[wd] & 0xFF) << 24) |
((R[wd] & 0xFF) << 16) |
((G[wd] & 0xFF) << 8) |
((B[wd] & 0xFF) << 0));*/
out[pps]=(byte) A[wd];
out[pps+1]=(byte) R[wd];
out[pps+2]=(byte) G[wd];
out[pps+3]=(byte) B[wd];
}
}
return out;
}

byte[][] ozwbuf=new byte[3][],ozwobuf=new byte[3][];

BufferedImage[] bei=new BufferedImage[3];

/*public void etchCol(byte[] zwbuf, int w, int sx, int sy, int dx, int dy) {
int sp=((sy*w)+sx)*4,dp=((dy*w)+dx)*4;
zwbuf[dp]=zwbuf[sp];
zwbuf[dp+1]=zwbuf[sp+1];
zwbuf[dp+2]=zwbuf[sp+2];
zwbuf[dp+3]=zwbuf[sp+3];
}*/

public void etchCol(byte[] zwbuf, int w, byte a, byte r, byte g, byte b, int dx, int dy) {
int dp=((dy*w)+dx)*4;
zwbuf[dp]=a;
zwbuf[dp+1]=r;
zwbuf[dp+2]=g;
zwbuf[dp+3]=b;
}

byte[] sA=new byte[8192];
byte[] sR=new byte[8192];
byte[] sG=new byte[8192];
byte[] sB=new byte[8192];
byte[][] odA=new byte[3][];
byte[][] odR=new byte[3][];
byte[][] odG=new byte[3][];
byte[][] odB=new byte[3][];

public BufferedImage parsenb(BufferedImage in, int scal, int cust, int obid) {
int iw=in.getWidth(),ih=in.getHeight();
//int iwp1=iw+1,ihp1=ih+1,iwp2=iwp1+1,ihp2=ihp1+1;
int zwbufs=iw*ih*4;
byte[] zwbuf=ozwbuf[obid];byte[] zwobuf=ozwobuf[obid];
if(zwbuf==null||zwbuf.length!=zwbufs) {ozwobuf[obid]=zwbuf=new byte[zwbufs];}
int scany,pipo,cc;
for(int y=0;y<ih;y++) {
scany=y*iw;
for(int x=0;x<iw;x++) {
pipo=(scany+x)*4;
cc=in.getRGB(x, y);
zwbuf[pipo]=(byte) (cc >> 24);
zwbuf[pipo+1]=(byte) (cc >> 16);
zwbuf[pipo+2]=(byte) (cc >> 8);
zwbuf[pipo+3]=(byte) cc;
}
}
/*for(int y=0;y<ihp2;y++) {
scany=y*iwp2;
for(int x=0;x<iwp2;x++) {
pipo=(scany+x)*4;
if(y==0||y==ihp1||x==0||x==iwp1) {
zwbuf[pipo]=(byte) (dca/ccc);
zwbuf[pipo+1]=(byte) (dcr/ccc);
zwbuf[pipo+2]=(byte) (dcg/ccc);
zwbuf[pipo+3]=(byte) (dcb/ccc);
}
if(x<=1) {
if(y<=1&&(x==0||y==0)) {
zwbuf[pipo]=zwbuf[0];
zwbuf[pipo+1]=zwbuf[1];
zwbuf[pipo+2]=zwbuf[2];
zwbuf[pipo+3]=zwbuf[3];
} else if(y>=ihp1-1&&(x==0||y==ihp1)) {
zwbuf[pipo]=zwbuf[zwbuf.length-(iwp2*4)];
zwbuf[pipo+1]=zwbuf[zwbuf.length-(iwp2*4)+1];
zwbuf[pipo+2]=zwbuf[zwbuf.length-(iwp2*4)+2];
zwbuf[pipo+3]=zwbuf[zwbuf.length-(iwp2*4)+3];
}
} else if(x>=iwp1-1) {
if(y<=1&&(x==iwp1||y==0)) {
zwbuf[pipo]=zwbuf[(iwp2*4)];
zwbuf[pipo+1]=zwbuf[(iwp2*4)+1];
zwbuf[pipo+2]=zwbuf[(iwp2*4)+2];
zwbuf[pipo+3]=zwbuf[(iwp2*4)+3];
} else if(y>=ihp1-1&&(x==iwp1||y==ihp1)) {
zwbuf[pipo]=zwbuf[zwbuf.length-4];
zwbuf[pipo+1]=zwbuf[zwbuf.length-3];
zwbuf[pipo+2]=zwbuf[zwbuf.length-2];
zwbuf[pipo+3]=zwbuf[zwbuf.length-1];
}
}
}
}*/
zwobuf=parse(zwbuf,zwobuf,iw,ih,scal,cust,obid);
int ow=iw*scal,oh=ih*scal;//,owp1=iwp1*scal,ohp1=ihp1*scal,owp2=iwp2*scal;
BufferedImage o=bei[obid];
if(o==null||o.getWidth()!=ow||o.getHeight()!=oh) {
o=bei[obid]=new BufferedImage(ow,oh,BufferedImage.TYPE_INT_ARGB);
}
int minsc,pen;
for(int y=0;y<oh;y++) {
scany=y*ow;
minsc=((y/scal)*iw);
for(int x=0;x<ow;x++) {
pipo=(scany+x)*4;
if(sssse[scal][y%scal][x%scal]) {
pen=(minsc+(x/scal))*4;
zwobuf[pipo]=zwbuf[pen];
zwobuf[pipo+1]=zwbuf[pen+1];
zwobuf[pipo+2]=zwbuf[pen+2];
zwobuf[pipo+3]=zwbuf[pen+3];
}
o.setRGB(x, y, ((zwobuf[pipo] & 0xFF) << 24) |
((zwobuf[pipo+1] & 0xFF) << 16) |
((zwobuf[pipo+2] & 0xFF) << 8) |
(zwobuf[pipo+3] & 0xFF));
}
}
return o;
}

public BufferedImage parse(BufferedImage in, int scal, int cust, int obid) {
int iw=in.getWidth(),ih=in.getHeight();
int iwp1=iw+1,ihp1=ih+1,iwp2=iwp1+1,ihp2=ihp1+1;
int zwbufs=iwp2*ihp2*4;
byte[] zwbuf=ozwbuf[obid];byte[] zwobuf=ozwobuf[obid];
if(zwbuf==null||zwbuf.length!=zwbufs) {ozwobuf[obid]=zwbuf=new byte[zwbufs];}
int scany,pipo,cc;
int ccc=0,ym1;

for(int y=1;y<ihp1;y++) {
scany=y*iwp2;ym1=y-1;
for(int x=1;x<iwp1;x++) {
pipo=(scany+x)*4;
cc=in.getRGB(x-1, ym1);
zwbuf[pipo]=(byte) (cc >> 24);
zwbuf[pipo+1]=(byte) (cc >> 16);
zwbuf[pipo+2]=(byte) (cc >> 8);
zwbuf[pipo+3]=(byte) cc;
if(y==1||y==ih||x==1||x==iw) {
sA[ccc]=zwbuf[pipo];
sR[ccc]=zwbuf[pipo+1];
sG[ccc]=zwbuf[pipo+2];
sB[ccc]=zwbuf[pipo+3];
ccc++;
}
}
}
byte[] dA=odA[obid];if(dA==null||dA.length!=ccc) {odA[obid]=dA=new byte[ccc];}
System.arraycopy(sA, 0, dA, 0, ccc);Arrays.sort(dA);
byte[] dR=odR[obid];if(dR==null||dR.length!=ccc) {odR[obid]=dR=new byte[ccc];}
System.arraycopy(sR, 0, dR, 0, ccc);Arrays.sort(dR);
byte[] dG=odG[obid];if(dG==null||dG.length!=ccc) {odG[obid]=dG=new byte[ccc];}
System.arraycopy(sG, 0, dG, 0, ccc);Arrays.sort(dG);
byte[] dB=odB[obid];if(dB==null||dB.length!=ccc) {odB[obid]=dB=new byte[ccc];}
System.arraycopy(sB, 0, dB, 0, ccc);Arrays.sort(dB);
/*for(int y=0;y<ihp2;y++) {
scany=y*iwp2;
for(int x=0;x<iwp2;x++) {
pipo=(scany+x)*4;
if(y==0||y==ihp1||x==0||x==iwp1) {
zwbuf[pipo]=(byte) (dca/ccc);
zwbuf[pipo+1]=(byte) (dcr/ccc);
zwbuf[pipo+2]=(byte) (dcg/ccc);
zwbuf[pipo+3]=(byte) (dcb/ccc);
}
if(x<=1) {
if(y<=1&&(x==0||y==0)) {
zwbuf[pipo]=zwbuf[0];
zwbuf[pipo+1]=zwbuf[1];
zwbuf[pipo+2]=zwbuf[2];
zwbuf[pipo+3]=zwbuf[3];
} else if(y>=ihp1-1&&(x==0||y==ihp1)) {
zwbuf[pipo]=zwbuf[zwbuf.length-(iwp2*4)];
zwbuf[pipo+1]=zwbuf[zwbuf.length-(iwp2*4)+1];
zwbuf[pipo+2]=zwbuf[zwbuf.length-(iwp2*4)+2];
zwbuf[pipo+3]=zwbuf[zwbuf.length-(iwp2*4)+3];
}
} else if(x>=iwp1-1) {
if(y<=1&&(x==iwp1||y==0)) {
zwbuf[pipo]=zwbuf[(iwp2*4)];
zwbuf[pipo+1]=zwbuf[(iwp2*4)+1];
zwbuf[pipo+2]=zwbuf[(iwp2*4)+2];
zwbuf[pipo+3]=zwbuf[(iwp2*4)+3];
} else if(y>=ihp1-1&&(x==iwp1||y==ihp1)) {
zwbuf[pipo]=zwbuf[zwbuf.length-4];
zwbuf[pipo+1]=zwbuf[zwbuf.length-3];
zwbuf[pipo+2]=zwbuf[zwbuf.length-2];
zwbuf[pipo+3]=zwbuf[zwbuf.length-1];
}
}
}
}*/
byte dcca=dA[ccc/2],dccr=dR[ccc/2],dccg=dG[ccc/2],dccb=dB[ccc/2];
for(int x=0;x<iwp2;x++) {
etchCol(zwbuf,iwp2,dcca,dccr,dccg,dccb,x,0);
etchCol(zwbuf,iwp2,dcca,dccr,dccg,dccb,x,ihp1);
}
for(int y=0;y<ihp2;y++) {
etchCol(zwbuf,iwp2,dcca,dccr,dccg,dccb,0,y);
etchCol(zwbuf,iwp2,dcca,dccr,dccg,dccb,iwp1,y);
}
zwobuf=parse(zwbuf,zwobuf,iwp2,ihp2,scal,cust,obid);
int ow=iw*scal,oh=ih*scal,owp1=iwp1*scal,ohp1=ihp1*scal,owp2=iwp2*scal;
BufferedImage o=bei[obid];
if(o==null||o.getWidth()!=ow||o.getHeight()!=oh) {
o=bei[obid]=new BufferedImage(ow,oh,BufferedImage.TYPE_INT_ARGB);
}
int minsc,pen;
for(int y=scal;y<ohp1;y++) {
scany=y*owp2;ym1=y-scal;
minsc=((y/scal)*iwp2);
for(int x=scal;x<owp1;x++) {
pipo=(scany+x)*4;
if(sssse[scal][y%scal][x%scal]) {
pen=(minsc+(x/scal))*4;
zwobuf[pipo]=zwbuf[pen];
zwobuf[pipo+1]=zwbuf[pen+1];
zwobuf[pipo+2]=zwbuf[pen+2];
zwobuf[pipo+3]=zwbuf[pen+3];
}
o.setRGB(x-scal, ym1, ((zwobuf[pipo] & 0xFF) << 24) |
((zwobuf[pipo+1] & 0xFF) << 16) |
((zwobuf[pipo+2] & 0xFF) << 8) |
(zwobuf[pipo+3] & 0xFF));
}
}
return o;
}
};

static class Transo {
String sup;BufferedImage bimg;byte[] ii;
public Transo(String a) {sup=a;}
}


public static boolean beh=false;

public static File base,o64,o128,o256;

static boolean[][][] sssse= new boolean[][][]{null,null,{{true,true},{true,true}},null,
{{false,true,true,false},
{true,true,true,true},
{true,true,true,true},
{false,true,true,false}},null,null,null,
{{false,false,true,true,true,true,false,false},
{false,true,true,true,true,true,true,false},
{true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true},
{false,true,true,true,true,true,true,false},
{false,false,true,true,true,true,false,false},},null,null,null,null,null,null,null,
{{false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false},
{false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false},
{false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false},
{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false},
{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false},
{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},
{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},
{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false},
{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false},
{false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false},
{false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false},
{false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false}}
};
}