Mercurial > hg > forks > multipaint-js
diff multipaint.pde @ 0:ebd5689e2985
Initial import of Multipaint sketch version 22.5.2017.
author | Tero Heikkinen |
---|---|
date | Tue, 03 Jul 2018 20:56:55 +0300 |
parents | |
children | 5eb3559e1778 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multipaint.pde Tue Jul 03 20:56:55 2018 +0300 @@ -0,0 +1,441 @@ +//Multipaint Metal Edition 22.5.2017 +//Tero Heikkinen (Dr. TerrorZ) +//processing setup draw and file things here + +PrintWriter exwriter; +final int C64=0, MSX=5, SPECTRUM=6, C64M=10, PLUS4=9, PLUS4M=19, CPC=2; // supported +final int TIMEX=7,JR200=8,AMIGA=11; // experimental or incomplete +final int C64FLI=20,C64FLIM=21; // experimental +final int PICO8=88; +final int FAKEX=32; // Commodore 64 without attribute limitations +final int UNIA=33; + +//-1 & -1 for normal operation +int machine=-1; // change this to autoselect +int debugger=-1; + +final int COMMAND=157; // Marq's cmd/ctrl solution + +int g_active,g_tooltrigger,g_prevtool; +int g_rband,g_rbang,g_boxreconstruct,g_sorsaa,g_charlimit; +int g_animx,g_animy,g_animframes,g_animno,g_animtime,g_animspeed; +int g_omag,g_bordh,g_bordv,g_keymacpos,g_framec; + +boolean gui=true,fileselect=false,saveas=false,refselect=false,g_control=false,g_shift=false,exporttxt=false,importfmt=false,exportemu=false,exportfmt=false; +String path="",refpath="",filename="",elename="",sfilename="",refname="",g_expname="",g_fmtname=""; +String exporttxtname="",exportemuname="",exportfmtname; +String g_keymacro=""; + +int[] g_r = new int[266];int[] g_g = new int[266];int[] g_b = new int[266]; +int[] g_rgb = new int[266]; + +byte[] g_map = new byte[88000]; +byte[] g_fillmap = new byte[88000]; +byte[] g_sparepage = new byte[88000]; +byte[] g_swappage = new byte[88000]; +byte[] g_rmap = new byte[88000]; +byte[] g_icons = new byte[88000]; +byte[] g_brush = new byte[88000]; +byte[][] g_undob = new byte[11][88000]; +byte[][] g_undobs = new byte[11][88000]; +byte[] g_template = new byte[16384]; +byte[] g_redo = new byte[1024]; +byte[] g_remdo = new byte[1024]; +int[] g_chaup = new int[64]; +byte[] g_data = new byte[1024]; +int [] g_uindex = new int[8]; +int [] g_ubottom = new int[8]; +int [] g_utop = new int[8]; +int [] g_magpix = new int[64];int [] g_magpiy = new int[64]; + +byte g_realfront,g_realback; +PImage output,outputsans; +String g_name; + +//dimensions +int X,Y,MX,MY; +//generic mouse +int g_ofx,g_ofy,g_button,g_realbutton,g_klikkeri,g_mx,g_my,g_orx,g_ory,g_msx,g_msy; +//rubberband,mouse +int g_phase,g_rx,g_ry,g_rx2,g_ry2,g_rubbermode; +int g_prex,g_prey,g_storedcoordx,g_storedcoordy; +//window positioning +int g_windowx,g_windowy,g_maglocx,g_maglocy; +int g_hedge,g_vedge,g_uizoom,g_wzoom; +//icons & gui stuff +int g_iconx,g_icony,g_piconx,g_picony,g_iconmode; +int g_gridx,g_gridy,g_spare; +int g_farge,g_backg,g_ofarge,g_repanel,g_msgctr; +//machine related color properties +int g_attrimode,g_britemode,g_multic,g_backmode,g_maxcolors,g_hzoomer; +float g_palsteps; +//brush, tool parameters +int g_bsourcex,g_bsourcey,g_bsourcex2,g_bsourcey2; +int g_bsize,g_btype; + + +void setup() +{ +// size(1058,708);//processing3 + int i,x,y; + g_uizoom=2;g_animspeed=1; + g_magpix[0]=3;g_magpix[1]=8;g_magpix[2]=16; + g_magpix[10]=2;g_magpix[11]=6;g_magpix[12]=16; + g_magpix[20]=4;g_magpix[21]=16;g_magpix[22]=32; + + g_magpiy[0]=3;g_magpiy[1]=8;g_magpiy[2]=16; + g_magpiy[10]=2;g_magpiy[11]=6;g_magpiy[12]=16; + g_magpiy[20]=4;g_magpiy[21]=16;g_magpiy[22]=32; + + g_omag=1;g_bordh=64;g_bordv=32; + readprefs("prefs.txt"); + + //processing 2 + switch (g_uizoom){ + case 1: g_wzoom=2;size(700,468);break; + case 2: g_wzoom=3;size(1058,708);break; + case 3: g_wzoom=4;size(1460,950);break; + } + /* + //processing 3 + switch (g_uizoom){ + case 1: g_wzoom=2;surface.setSize(700,468);break; + case 2: g_wzoom=3;surface.setSize(1058,708);break; + case 3: g_wzoom=4;surface.setSize(1460,950);break; + } + */ + + g_hedge=32*g_uizoom;g_vedge=32*g_uizoom; + + if(machine==-1||debugger==0){ + if(gui) + { + try{ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); } + catch (Exception e) {}; + machine=selector("Select a Platform","C64 hires,C64 multicolor,ZX Spectrum,MSX1 mode 2,Plus4 hires,Plus4 multicolor,Amstrad CPC mode 0"); + } + switch(machine) + { + case 0: machine=C64; break; + case 1: machine=C64M; break; + case 2: machine=SPECTRUM; break; + case 3: machine=MSX; break; + case 4: machine=PLUS4; break; + case 5: machine=PLUS4M; break; + case 6: machine=CPC; break; + default: ; + } + } + + g_uindex[0]=0;g_utop[0]=0;g_ubottom[0]=0;g_uindex[1]=0;g_utop[1]=0;g_ubottom[1]=0; + g_spare=0;g_bsize=0;g_btype=0;g_phase=0;g_button=LEFT; + g_data['f']=1;g_data['g']=1; + if(fexists("icons.bin")==true)g_icons=loadBytes("icons.bin"); + set_tool(3); + + g_gridx=8;g_gridy=8;g_multic=0;g_repanel=-2; + + //UI colors + makecolor(256,0xff,0,0xff);makecolor(257,180,180,180);g_rgb[257]=0xff808080; + makecolor(258,0,0,0);makecolor(259,48,48,48); + //R,G,B + makecolor(260,255,0,0);makecolor(261,0,255,0);makecolor(262,0,0,255); + + set_machine(machine); + g_windowx=width-(g_hedge)-(g_wzoom*X);g_windowx=g_windowx/2; + g_windowy=height-(g_vedge)-(g_wzoom*Y);g_windowy=g_windowy/2; + + switcher(3); + + g_map[4]=byte(g_maxcolors-1); + g_ofarge=g_farge;MX=X/8;MY=Y/8; + g_realfront=byte(g_farge);g_realback=byte(g_backg); + + output= createImage (X*g_omag+g_bordh*g_omag,Y*g_omag+g_bordv*g_omag,RGB); + outputsans= createImage (X*g_omag,Y*g_omag,RGB); + + for(y=0;y<Y;y++){ + for(x=0;x<X;x++){ + absolute_clearpoint(x,y); + } + } + + switcher(2); + noStroke(); + background(g_r[259],g_g[259],g_b[259]); + sussborder(); + setup_raster(); + message("Multipaint|Metal|v22.5.2017"); + message("*"); +} + +void store(String name) +{ + String[] m1 = match(name, ".png"); + if (m1 != null) { + if(g_data['Q']==0){export_image_sans_border(name);} + if(g_data['Q']==1){export_image(name);} + return; + } + + //save the picture page g_map[], make sure some essential parameters are correct + g_map[3]=byte(machine); + g_map[5]=byte(MX); + g_map[7]=byte(MY); + saveBytes(name,g_map); +} + +boolean fexists(String fname) +{ + File f = new File(sketchPath(fname)); + if (f.exists())return true; + return false; +} + +void restore(String name) +{ + //load the picture page g_map[] with parameters + boolean im_import=false; + if(fexists(name)==false){ + message("NO FILE"); + return; + } + String[] m1 = match(name, ".png");if (m1 != null)im_import=true; + String[] m2 = match(name, ".PNG");if (m2 != null)im_import=true; + String[] m3 = match(name, ".jpg");if (m3 != null)im_import=true; + String[] m4 = match(name, ".JPG");if (m4 != null)im_import=true; + + if(im_import){ + int lefth=g_farge; + int righth=g_backg; + storeparameters();g_data['d']=0;g_data['t']=0;g_data['b']=1;//old IQ + import_image(name); + restoreparameters();refreshpalette();refresh(); + g_boxreconstruct=2; + message("Image|loaded"); + selectcolor(0,lefth);selectcolor(1,righth); + return; + } + g_map=loadBytes(name); + if(g_map[3]!=machine){message("Wrong|machine!");restore_undo();return;} + refreshpalette();consistency(); + g_farge=int(g_realfront);g_ofarge=g_farge;g_backg=int(g_realback); + sussborder(); + message("Page|loaded"); +} + +void draw() +{ + int msx,msy; + + if(!focused){ + g_control=false; + g_shift=false; + delay(200); + } + + if(g_data['n']==1){ + g_animtime++; + if(g_animtime>8-g_animspeed*2){ + animbrush_do(); + g_animtime=0; + } + } + /* + boolean depis=false; + for(int i=0;i<=255;i++){ + if(g_depressed[i]>0){ + g_depressed[i]--; + if(g_depressed[i]==0)depis=true; + } + } + if(depis)g_repanel=-2; + */ + if(moicon(16*16*g_uizoom,height-32*g_uizoom,16*g_uizoom,24*g_uizoom))help('<'); + if(moicon(16*16*g_uizoom,height-8*g_uizoom,16*g_uizoom,8*g_uizoom))help('>'); + if(moicon(0,height-32*g_uizoom,15*16*g_uizoom,32*g_uizoom))help(TAB); + if(moicon(width-32*g_uizoom,0,32*g_uizoom,16*g_uizoom))help('.'); + + if(g_data['m']==0&&g_data['M']==0){ + msx=mouseX-g_windowx; + msy=mouseY-g_windowy; + msx=g_msx-g_windowx;msy=g_msy-g_windowy; + } + else + { + msx=mouseX;msy=mouseY; + //msx=g_msx;msy=g_msy; + } + g_mx=msx;g_my=msy; + + //actual tool drawing + if(g_tooltrigger==1){ // comes from mousepressed, or mousedragged + if(g_mx<=width-g_hedge&&g_my<=height-g_vedge)do_tool(msx,msy,g_button); + } + g_msx=mouseX;g_msy=mouseY; + switcher(0); + + for(int i=0;i<1024;i++){ + g_remdo[i]=0; + } + int lipo=g_button; + //tool drawing for shows + if(tool()!=5){ + if(g_phase==0)g_button=LEFT; + do_tool(msx,msy,LEFT); + } + if(tool()==6)doline(g_rx,g_ry,g_rx2,g_ry2,0); + if(tool()==7)docircle(g_rx,g_ry,g_rx2,g_ry2); + if(tool()==8)rectangle(g_rx,g_ry,g_rx2,g_ry2); + g_button=lipo; + loadPixels(); + viewport(); + //magport(); + switcher(1); + update_ui(); + updatePixels(); + if(g_msgctr>0)g_msgctr--; + + // UI file operations + if(gui) + { + if(fileselect) // Fileselect "event" for Load + { + String s=fileselector(path,LOADIMG); + if(s!=null) + { + store_undo(); + if(g_spare==0){ + filename=s; + frame.setTitle(filename); + restore(s); + } + if(g_spare==1){ + restore(s); + sfilename=s; + frame.setTitle(sfilename); + } + refresh(); + } + fileselect=false;g_shift=false;g_control=false; + } + if(saveas) // Fileselect "event" for Save as + { + String s=fileselector(path,SAVEIMG); + String orig=""; + int kuva=0; + if(g_spare==0)orig=filename; + if(g_spare==1)orig=sfilename; + if(s!=null) + { + // Add extension if needed + if(s.length()<=2)s+=".bin"; + s=s+".dummy.dummy"; + String[]l=split(s,'.'); + String []m1=match(l[1],"png");String []m2=match(l[1],"PNG"); + String []m3=match(l[1],"bin");String []m4=match(l[1],"BIN"); + if(m1!=null||m2!=null)kuva=1; + if(m1==null&&m2==null&&m3==null&&m4==null)l[1]="bin"; + + if(g_spare==0){ + filename=l[0]+"."+l[1];store(filename); + if(kuva==1)filename=orig; + frame.setTitle(filename); + } + if(g_spare==1){ + sfilename=l[0]+"."+l[1];store(sfilename); + if(kuva==1)sfilename=orig; + frame.setTitle(sfilename); + } + + message("SAVED"); + if(kuva==1)message("EXPORTED|PNG"); + } + saveas=false;g_shift=false;g_control=false; + } + if(exporttxt) + { + String s=fileselector(path,SAVETXT); + if(s!=null) + { + // Add extension if needed + if(s.length()<=2)s+=".txt"; + s=s+".dummy.dummy"; + String[]l=split(s,'.'); + l[1]="txt"; + if(g_spare==0){exportemuname=l[0]+"."+l[1];machine_export(exportemuname,1);} + if(g_spare==1){exportemuname=l[0]+"."+l[1];machine_export(exportemuname,1);} + } + exporttxt=false;g_shift=false;g_control=false; + } + if(exportemu) + { + String s=fileselector(path,SAVEEMU); + if(s!=null) + { + // Add extension if needed + if(s.length()<=2)s+="."+g_expname; + s=s+".dummy.dummy"; + String[]l=split(s,'.'); + l[1]=g_expname; + if(g_spare==0){ + exportemuname=l[0]+"."+l[1];machine_export(exportemuname,0); + //println(exportemuname); + } + if(g_spare==1){ + exportemuname=l[0]+"."+l[1];machine_export(exportemuname,0); + } + + //message("EXPORTED"); + } + exportemu=false;g_shift=false;g_control=false; + } + if(importfmt) + { + String s=fileselector(path,LOADFMT); + if(s!=null) + { + store_undo(); + format_import(s); + refresh(); + } + importfmt=false;g_shift=false;g_control=false; + } + if(exportfmt) + { + String s=fileselector(path,SAVEFMT); + if(s!=null) + { + boolean koalakludge=false; + // Add extension if needed + if(s.indexOf(".kla")>-1&&machine==C64M)koalakludge=true; + if(s.length()<=2)s+="."+g_fmtname; + s=s+".dummy.dummy"; + String[]l=split(s,'.'); + l[1]=g_formatextension; + + if(koalakludge)l[1]="kla"; + + if(g_spare==0){ + exportfmtname=l[0]+"."+l[1];format_export(exportfmtname); + //println(exportemuname); + } + if(g_spare==1){ + exportfmtname=l[0]+"."+l[1];format_export(exportfmtname); + } + + //message("EXPORTED"); + } + exportfmt=false;g_shift=false;g_control=false; + } + + } + + //if(g_framec==1){saveFrame("frames/out-######.png");} + g_framec++;if(g_framec>1)g_framec=0; + if(g_keymacro.length()>g_keymacpos){ + macro_command(g_keymacro.charAt(g_keymacpos)); + g_keymacpos++; + } +} +