// Spectrum (or any 256x192) to Pana gfx converter // Mar 14th 2012: First working version int tolerance=60; // How many bits need to be right minimum in an 8x8 area String filez[],dirri="/home/marq/cross/jr200/speku"; int i=0,prev=-1,bloks=0; boolean repaint=false; PImage p,d=null,scr; int blok[][]=new int[32*24][8], kolor[][]=new int[32*24][2], num[]=new int[32*24]; boolean master[]=new boolean[32*24]; int pal[]={color(0,0,0),color(0,0,255),color(255,0,0),color(255,0,255), color(0,255,0),color(0,255,255),color(255,255,0),color(255,255,255)}; void setup() { size((256*2+1)*3,192*3); filez=listFileNames(dirri); noSmooth(); } void draw() { int x,y; if(prev!=i || repaint) { if(!repaint) { //println(filez[i]); p=loadImage(dirri+"/"+filez[i]); d=createImage(256,192,RGB); scr=createImage(256,192,RGB); bloks=1; for(y=0;y<8;y++) blok[0][y]=0; for(y=0;y<32*24;y++) master[y]=false; } // Convert to JR 8 colors first p.loadPixels(); d.loadPixels(); scr.loadPixels(); for(y=0;y<192;y++) { for(x=0;x<256;x++) { int r,g,b,off; // Some pics have borders off=(y+(p.height-192)/2)*p.width + x+(p.width-256)/2; r=(p.pixels[off]>>16)&255; g=(p.pixels[off]>>8)&255; b=(p.pixels[off]>>0)&255; if(r<128) r=0; else r=255; if(g<128) g=0; else g=255; if(b<128) b=0; else b=255; d.pixels[y*256+x]=color(r,g,b); } } // Count the different blocks and find fg/bg colors for(y=0;y<24;y++) for(x=0;x<32;x++) tile(d,x,y,false); frame.setTitle("("+filez[i]+") blocks: "+str(bloks)); // Let's see what we got for(y=0;y<24;y++) for(x=0;x<32;x++) { for(int a=0;a<8;a++) for(int b=0;b<8;b++) { int off=y*256*8+a*256+x*8+b; if((blok[num[y*32+x]][a]&(0x80>>b))!=0) scr.pixels[off]=pal[kolor[y*32+x][1]]; else scr.pixels[off]=pal[kolor[y*32+x][0]]; if(master[y*32+x]) scr.pixels[off]=((d.pixels[off]>>1)&0x7f7f7f)+0x505050; } } d.updatePixels(); scr.updatePixels(); repaint=false; } prev=i; scale(3,3); image(p,257-(p.width-256)/2,-(p.height-192)/2); image(scr,0,0); } void tile(PImage im,int tx,int ty,boolean newwi) { int j=ty*32+tx, off=ty*256*8+tx*8, x,y,c,k, fg=-1,bg=-1,found=-1, bitz[]={0,0,0,0, 0,0,0,0}; // Find fg/bg colors first for(y=0;y<8;y++) { for(x=0;x<8;x++) { for(c=0;c<8;c++) { if(im.pixels[off+x+y*256]==pal[c]) { if(bg==-1) bg=c; else { if(fg==-1 && c!=bg) fg=c; } found=c; } } if(found==fg) bitz[y]+=(0x80>>x); } // for(x=0;x<8;x++) // if((bitz[y]&(0x80>>x))!=0) // im.pixels[off+x+y*256]=pal[fg]; // else // im.pixels[off+x+y*256]=pal[bg]; } if(fg==-1) fg=0; if(bg==-1) bg=0; kolor[j][0]=bg; kolor[j][1]=fg; // Search if pattern exists int diff=0,biggest=0,smallest=0; for(k=0;k>x)) == (bitz[y]&(0x80>>x))) diff--; } if(diffabs(biggest)) // Exact pattern { num[j]=k; smallest=diff; } /* if(diff>biggest && abs(diff)>abs(smallest)) // Exact inverse { num[j]=k; kolor[j][0]=fg; kolor[j][1]=bg; biggest=diff; }*/ } // New block if(newwi && diff!=-64) { master[j]=true; for(k=0;k<8;k++) blok[bloks][k]=bitz[k]; num[j]=bloks; bloks++; } } void mousePressed() { int x,y; x=mouseX/3/8; y=mouseY/3/8; if(x<0 || x>=32 || y<0 || y>=24) return; if(!master[y*32+x] && bloks<320) { tile(d,x,y,true); repaint=true; } } void mouseDragged() { mousePressed(); } void keyPressed() { int n,m,k; if(key==' ') i++; if(i>=filez.length) i--; if(key==BACKSPACE) i--; if(i<0) i=0; // Print as asm data if(key=='p') { // First alternative patterns for(n=0;n<32;n++) { print("\tdb "); if(n+256255) bitti=0x40; print(kolor[n*32+m][1]+kolor[n*32+m][0]*8+bitti); } println(); } println(); // Main patterns for(n=0;n<256;n++) { print("\tdb "); if(n