diff draw_inputs.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/draw_inputs.pde	Tue Jul 03 20:56:55 2018 +0300
@@ -0,0 +1,297 @@
+// Collect all that "reads" the virtual image in some way or other
+// plus other passive manipulations
+
+int odd(int v)
+{
+    if((v|1)==v)return 1;
+    return 0;
+}
+
+int even(int v)
+{
+    if(v>>1==v)return 1;
+    return 0;
+}
+
+float getangel(float xx,float yy)
+{
+    float ang=degrees(atan2(xx,-yy));
+    if(ang<0)return 360+ang;
+    return ang;
+}
+
+int zxcolor(int col)
+{
+  //something that allows different zx brightness colors treated logically as the same
+  //i.e. bright red and dark red the same. handy for brush transparency
+  if(g_britemode==0)return col;
+  if(col>7)return col-8;
+  return col;
+}
+
+//the "slow" call to mark "dirty block"
+void updatepoint(int xx,int yy)
+{
+  if(yy<0||xx<0||xx>=X||yy>=Y)return;
+  xx=xx/8;yy=yy/8;xx=xx+yy*MX;
+  g_redo[xx]=byte(0);//block update
+  g_remdo[xx]=byte(1);//block update
+}
+
+int getmultibrush(int x1,int y1)
+{
+  
+  //returns the multicolor color on point x1,y1 at brush
+    
+  int ad,looks,mmc; 
+  if(g_multic==2)return g_brush[1024+x1+y1*X];
+  
+  ad=1024+x1+y1*X;
+  looks=65536+(x1/8)+(y1/8)*MX;
+  mmc=g_brush[ad]+g_brush[ad+1]*2;
+  switch(mmc)
+  {
+    case 0:
+      return g_map[1];
+    case 1:
+      return g_brush[looks];
+    case 2:
+      return g_brush[looks+1000];
+    case 3:
+      if(machine==PLUS4M)return int(g_map[2]);
+      return g_brush[looks+2000];
+  }
+  return g_brush[ad]+g_brush[ad+1]*2;
+}
+
+int getmultic(int x1,int y1,int mode) //mode 0=screen 1=brush
+{
+  
+  //returns the multicolor color on point x1,y1
+    
+  int ad,looks,mmc,source1,source2;
+   
+  if(g_multic==2){
+    looks=1024+x1+y1*X;
+    if(mode==0)return g_map[looks];
+    if(mode==1)return g_brush[looks];
+  }
+  x1=x1/2;x1=x1*2;
+  ad=1024+x1+y1*X;
+  source1=0;source2=0;
+  looks=65536+(x1/8)+(y1/8)*MX;
+  if(mode==0){source1=g_map[ad];source2=g_map[ad+1];}
+  if(mode==1){source1=g_brush[ad];source2=g_brush[ad+1];}
+  mmc=source1+source2*2;
+  //source1=0
+  //source2=+1
+  //00=zeroc =0
+  //01=color1=2
+  //10=color2=1
+  //11=color3=3
+  
+  if(mode==0){
+    switch(mmc)
+    {
+      case 0:
+        return g_map[1];
+      case 1:
+        return g_map[looks];
+      case 2:
+        return g_map[looks+1000];
+      case 3:
+        if(machine==PLUS4M)return int(g_map[2]);
+        return g_map[looks+2000];
+    }
+  }
+  if(mode==1){
+    switch(mmc)
+    {
+      case 0:
+        return g_map[1];
+      case 1:
+        return g_brush[looks];
+      case 2:
+        return g_brush[looks+1000];
+      case 3:
+        if(machine==PLUS4M)return int(g_map[2]);
+        return g_brush[looks+2000];
+    }
+  }  
+  return source1+source2;
+}
+
+int getattra(int xx,int yy,int mode) //mode foreground backround
+{
+  //returns the internal foreground / background color on point xx,yy
+  int xv,yv,val;
+  if(g_multic==2){
+    if(mode==0)return getmultic(xx,yy,0);
+    return g_backg;
+  }
+  if(g_multic==1){
+   if(mode==0)return getmultic(xx,yy,0);
+   return g_map[1];// was 0?
+  }
+  xx=xx/8;
+  yv=yy/8;
+  int ad=65536+xx+yy*MX; 
+  if(mode==0){
+    val=g_map[ad];
+    if(g_britemode==1&&val==8)return 0;
+    return val;
+  }
+//  if(mode==1)
+  val=g_map[ad+(MX*MY)*8];
+  if(g_britemode==1&&val==8)return 0;
+  return val;
+}
+
+int getabsa(int xx,int yy,int mode)//mode 0=screen 1=brush
+{
+  // returns the visible colour on point xx,yy
+  int sad,ssap,ad,val;
+  int chek;
+  val=0;sad=1024+xx+yy*X;
+  xx=xx/8;
+  ad=65536+xx+yy*MX;
+  chek=int(g_map[sad]);
+  if(chek==100||chek==200)return chek;
+  
+  if(mode==0){
+    ssap=int(g_map[sad]);
+  }else{
+    ssap=int(g_brush[sad]);
+  }
+  
+  if(ssap==1){
+    if(mode==0){val=g_map[ad];}else{val=g_brush[ad];}
+    if(g_britemode==1&&val==8)return 0;
+    return val;
+  }
+  if(ssap==0){         
+    if(mode==0){val=g_map[ad+(MX*MY)*8];}else{val=g_brush[ad+(MX*MY)*8];;}
+    if(g_britemode==1&&val==8)return 0;
+    return val;
+  }
+  return g_map[sad];
+}
+
+//the most accessible way to get a color index from a point
+int easygetcolor(int xx,int yy)
+{
+  if(yy<0||xx<0||xx>=X||yy>=Y)return 0;
+  if(g_multic>0)return getmultic(xx,yy,0);
+  if(g_multic==0)return getabsa(xx,yy,0);
+  return 0;
+}
+
+void infersize()
+{
+  int xx,yy,cp,molox,okay;
+  int bx,by;
+  storeparameters();
+  xx=0;molox=1;okay=0;
+  if(g_multic==1||g_hzoomer==2)molox=2;
+  cp=easygetcolor(0,0);
+  for(xx=0;xx<X;xx=xx+molox){
+    if(easygetcolor(xx,0)==cp&&okay==0){g_animx=xx;}
+    else{
+      okay=1;
+    }
+  }
+  okay=0;
+  for(yy=0;yy<Y;yy++){
+    if(easygetcolor(0,yy)==cp&&okay==0){g_animy=yy;}
+    else{
+      okay=1;
+    }
+  }
+
+  g_animx=g_animx+molox;
+  g_animy=g_animy+1;
+  if(g_animx>63||g_animy>63||g_animx<=2||g_animy<=2){
+    message("BAD SIZE|See manual");restoreparameters();g_data['n']=0;
+    return;
+  }
+  int boldsourcex=g_bsourcex;
+  int boldsourcey=g_bsourcey;
+  int boldsourcex2=g_bsourcex2;
+  int boldsourcey2=g_bsourcey2;
+  
+  g_bsourcex=g_animx;
+  g_bsourcey=0;
+  g_bsourcex2=g_animx+g_animx-molox;
+  g_bsourcey2=g_animy-1;
+  g_animframes=0;
+  g_animno=1;
+  int raamit=-1;
+  for(yy=0;yy<=Y;yy=yy+g_animy){
+    for(xx=0;xx<=X;xx=xx+g_animx){
+      okay=1;
+      for(bx=0;bx<g_animx;bx=bx+molox){
+        for(by=0;by<g_animy;by++){
+          if(easygetcolor(xx+bx,yy+by)!=cp)okay=0;
+        }
+      }
+      if(okay==1&&g_animframes<=1)g_animframes=raamit;
+      if(xx+g_animx<X||xx+g_animx==X)raamit++;
+    }
+  }
+  if(g_animframes<=0){
+    message("BAD BOOKEND|See manual");restoreparameters();g_data['n']=0;
+    g_bsourcex=boldsourcex;g_bsourcey=boldsourcey;
+    g_bsourcex2=boldsourcex2;g_bsourcey2=boldsourcey2;
+    return;
+  }
+  message("Play Brush|"+g_animx+" x "+g_animy+"|"+g_animframes+" frames");
+}
+
+void animbrush_do()
+{
+  int bx,by;
+  int horisize;
+  int molox=1;
+  if(g_multic==1)molox=2;
+  horisize=X/g_animx;
+  g_animno=g_animno+1;
+  if(g_animno>g_animframes)g_animno=1;
+  by=g_animno/horisize;
+  bx=g_animno-(by*horisize);
+  g_bsourcex=bx*g_animx;
+  g_bsourcey=by*g_animy;
+  g_bsourcex2=g_bsourcex+g_animx-molox;
+  g_bsourcey2=g_bsourcey+g_animy-1;
+}
+
+void set_fixed_raster(int set)
+{
+  for(int i=0;i<64;i++){
+    g_fixedraster[i]=g_rasterpatterns[set*64+i];
+  }
+}
+
+int get_raster(int xx,int yy)
+{
+  int molox=1;
+  if(g_multic==1||g_hzoomer==2)molox=2;
+  xx=xx+g_raster_offset_x*molox;
+  yy=yy+g_raster_offset_y;
+  if(g_multic==1||g_hzoomer==2){
+    xx=xx/2;
+  }
+  int mx=xx/8;
+  int my=yy/8;
+  mx=mx*8;my=my*8;xx=xx-mx;yy=yy-my;
+  return g_fixedraster[xx+yy*8];
+}
+
+void refreshpalette()
+{
+ //relevant for alterable palettes, such as amiga or cpc
+ if(g_palsteps==0)return;
+  for(int i=0;i<g_maxcolors;i++){
+    makecolor(i,int(g_map[256+i*3]),int(g_map[256+i*3+1]),int(g_map[256+i*3+2]));
+  }
+}
+