view 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 source

//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++;
    }
}