aboutsummaryrefslogtreecommitdiff
path: root/engines/avalanche/makevmou.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/avalanche/makevmou.cpp')
-rw-r--r--engines/avalanche/makevmou.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/engines/avalanche/makevmou.cpp b/engines/avalanche/makevmou.cpp
new file mode 100644
index 0000000000..5ed388531c
--- /dev/null
+++ b/engines/avalanche/makevmou.cpp
@@ -0,0 +1,270 @@
+#include "ptoc.h"
+
+
+#include "graph.h"
+/*#include "Squeak.h"*/
+/*#include "Crt.h"*/
+
+/*$R+*/
+
+struct mp { /* mouse-pointer */
+ matrix<0,1,0,15,word> mask;
+ integer horzhotspot,verthotspot;
+};
+
+struct vmctype { /* Virtual Mouse Cursor */
+ pointer andpic,xorpic;
+ array<0,1,pointer> backpic;
+ array<0,1,pointtype> wherewas;
+ byte picnumber;
+ shortint ofsx,ofsy;
+};
+
+const array<1,9,arrowtype> mps =
+{{{ /* 1 - up-arrow */
+ ((65151,64575,64575,63519,63519,61455,61455,57351,57351,49155,49155,64575,64575,64575,64575,64575),
+ (0,384,384,960,960,2016,2016,4080,4080,8184,384,384,384,384,384,0)),
+ 8,
+ 0},
+
+{ /* 2 - screwdriver */
+ ((8191,4095,2047,34815,50175,61951,63743,64543,65039,65031,65027,65281,65408,65472,65505,65523),
+ (0,24576,28672,12288,2048,1024,512,256,224,176,216,96,38,10,12,0)),
+ 0,
+ 0},
+
+{ /* 3 - right-arrow */
+ ((65535,65535,64639,64543,7,1,0,1,7,64543,64639,65535,65535,65535,65535,65535),
+ (0,0,0,384,480,32760,32766,32760,480,384,0,0,0,0,0,0)),
+ 15,
+ 6},
+
+{ /* 4 - fletch */
+ ((255,511,1023,2047,1023,4607,14591,31871,65031,65283,65281,65280,65280,65409,65473,65511),
+ (0,10240,20480,24576,26624,17408,512,256,128,88,32,86,72,20,16,0)),
+ 0,
+ 0},
+
+{ /* 5 - hourglass */
+ ((0,0,0,34785,50115,61455,61455,63519,63519,61839,61455,49155,32769,0,0,0),
+ (0,32766,16386,12300,2064,1440,1440,576,576,1056,1440,3024,14316,16386,32766,0)),
+ 8,
+ 7},
+
+{ /* 6 - TTHand */
+ ((62463,57855,57855,57855,57471,49167,32769,0,0,0,0,32768,49152,57344,61441,61443),
+ (3072,4608,4608,4608,4992,12912,21070,36937,36873,36865,32769,16385,8193,4097,2050,4092)),
+ 4,
+ 0},
+
+{ /* 7- Mark's crosshairs */
+ ((65535,65151,65151,65151,65151,0,65151,65151,65151,65151,65535,65535,65535,65535,65535,65535),
+ (0,384,384,384,384,65535,384,384,384,384,0,0,0,0,0,0)),
+ 8,
+ 5},
+
+{ /* 8- I-beam. */
+ ((65535,65535,63631,63503,63503,65087,65087,65087,65087,65087,63503,63503,63631,65535,65535,65535),
+ (0,0,0,864,128,128,128,128,128,128,128,864,0,0,0,0)),
+ 8,
+ 7},
+
+{ /* 9- Question mark. */
+ ((511,1023,2047,31,15,8199,32647,65415,63503,61471,61503,61695,63999,63999,61695,61695),
+ (65024,33792,34816,34784,40976,57224,32840,72,1936,2080,2496,2304,1536,1536,2304,3840)),
+ 0,
+ 0}}};
+
+const integer mouse_size = 134;
+
+const array<1,134,char> mice_header =
+ string("Mouse file copyright (c) 1993. I saw a mouse! Where? SQUEEAAAKK!!! Cheese ")+ /* 74 */
+ "cheese cheese. Cheddar, Stilton, Double Gloucester. Squeak."+'\32'; /* 60 */
+
+integer gd,gm;
+matrix<0,50,1,40,word> a /*absolute $A000:0i*/;
+byte fv;
+vmctype vmc;
+byte plot; integer plx,ply;
+
+word swapbits(word a)
+{word swapbits_result;
+;
+ swapbits_result=lo(a)*256+hi(a);
+return swapbits_result;
+}
+
+void plot_vmc(integer xx,integer yy, byte page_)
+{;
+ {;
+ xx=xx+vmc.ofsx;
+ yy=yy+vmc.ofsy;
+
+ getimage(xx,yy,xx+15,yy+15,vmc.backpic[page_]);
+ putimage(xx,yy,vmc.andpic,andput);
+ putimage(xx,yy,vmc.xorpic,xorput);
+ {
+ pointtype& with1 = vmc.wherewas[page_];
+ ;
+ with1.x=xx;
+ with1.y=yy;
+ }
+ }
+}
+
+void wipe_vmc(byte page_)
+{;
+ { pointtype& with1 = vmc.wherewas[page_];
+ if (with1.x!=maxint)
+ putimage(with1.x,with1.y,vmc.backpic[page_],0);}
+}
+
+void setup_vmc()
+{
+ byte fv;
+;
+/* gd:=imagesize(0,0,15,15);*/
+
+ {;
+ getmem(vmc.andpic,mouse_size);
+ getmem(vmc.xorpic,mouse_size);
+
+ for( fv=0; fv <= 1; fv ++)
+ {;
+ getmem(vmc.backpic[fv],mouse_size);
+ vmc.wherewas[fv].x=maxint;
+ }
+ }
+}
+
+void show_off_mouse()
+{;
+
+ setcolor(14); settextstyle(0,0,2);
+
+ for( gm=0; gm <= 1; gm ++)
+ {;
+ setactivepage(gm);
+ setfillstyle(1,blue); bar(0,0,getmaxx(),getmaxy());
+ outtextxy(400,20,chr(48+gm));
+ }
+
+ gd=0;
+ do {
+ setactivepage(gd);
+ setvisualpage(1-gd);
+ gd=1-gd;
+
+ delay(56);
+
+ getbuttonstatus;
+ wipe_vmc(gd);
+
+ if (plot>0)
+ {;
+ putpixel(plx,ply,red);
+ plot -= 1;
+ }
+
+ plot_vmc(mx,my,gd);
+
+ if ((mkey==left) && (plot==0))
+ {;
+ plot=2;
+ plx=mx;
+ ply=my;
+ }
+
+ } while (!(mkey==right));
+
+ for( gm=0; gm <= 1; gm ++)
+ {;
+ setactivepage(1-gm);
+ wipe_vmc(gm);
+ }
+
+ setvisualpage(0);
+ setactivepage(0);
+}
+
+void grab_cursor(byte n)
+{;
+ getimage(32*n-16, 0,32*n-1,15,vmc.andpic);
+ getimage(32*n-16,20,32*n-1,35,vmc.xorpic);
+}
+
+void save_mice()
+{
+ untyped_file f;
+ byte fv;
+;
+ assign(f,"v:mice.avd");
+ rewrite(f,1);
+
+ blockwrite(f,mice_header,mouse_size);
+
+ for( fv=1; fv <= 9; fv ++)
+ {;
+ grab_cursor(fv);
+ putimage(100,100,vmc.xorpic,0);
+ blockwrite(f,vmc.andpic,mouse_size);
+ blockwrite(f,vmc.xorpic,mouse_size);
+ }
+
+ close(f);
+}
+
+void load_a_mouse(byte which)
+{
+ untyped_file f;
+;
+ assign(f,"v:mice.avd");
+ reset(f,1);
+ seek(f,mouse_size*2*(which-1)+134);
+
+ {;
+ blockread(f,vmc.andpic,mouse_size);
+ blockread(f,vmc.xorpic,mouse_size);
+ close(f);
+ {
+ void& with1 = mps[which];
+ ;
+ vmc.ofsx=-horzhotspot;
+ vmc.ofsy=-verthotspot;
+
+ setminmaxhorzcurspos(horzhotspot,624+horzhotspot);
+ setminmaxvertcurspos(verthotspot,199);
+ }
+ }
+
+}
+
+void draw_mouse_cursors()
+{;
+ for( fv=1; fv <= 9; fv ++)
+ for( gm=0; gm <= 1; gm ++)
+ for( gd=0; gd <= 15; gd ++)
+ a[gd+gm*20][fv*2]=swapbits(mps[fv].mask[gm][gd]);
+}
+
+int main(int argc, const char* argv[])
+{pio_initialize(argc, argv);
+;
+ gd=3; gm=0; initgraph(gd,gm,"c:\\bp\\bgi");
+ resetmouse;
+ setup_vmc();
+
+ draw_mouse_cursors();
+
+
+ save_mice();
+
+/* grab_cursor(3);*/
+/* load_a_mouse(4);
+ setgraphicscursor(mps[4]);
+
+ show_off_mouse;
+ on; repeat getbuttonstatus until mkey=left; off;
+ show_off_mouse;*/
+return EXIT_SUCCESS;
+}