[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]

    Program MouseEdit;
    {
                 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
                 ÛÛÛÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÞÛÛÛ±±
                 ÛÛÛÝÛÛ                                      ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ          Mouse Cursor Editor         ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ                                      ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ           Aleksandar Dlabac          ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ    (C) 1996. Dlabac Bros. Company    ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ    ------------------------------    ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ      adlabac@urcpg.urc.cg.ac.yu      ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ      adlabac@urcpg.pmf.cg.ac.yu      ÛÛÞÛÛÛ±±
                 ÛÛÛÝÛÛ                                      ÛÛÞÛÛÛ±±
                 ÛÛÛÝßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÛÛÛ±±
                 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±±
                   ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

         This program creates file MOUSEDIT.DAT file on disk. You can insert
    this file directly in pascal program/unit or you can rename it and include
    it with $I directive. Examples of both techniques can be founded in MOUSE.PAS
    unit, written by same author.

          Also, this program demonstrates how to use mentioned MOUSE unit.

    }
      Uses Mouse, Graph;

      Procedure Initialize;
        Var Gd, Gm : integer;
          Begin
            If not MouseOK then
              Begin
                Writeln ('Mouse driver not loaded.');
                Halt
              End;
            DetectGraph (Gd,Gm);
            InitGraph (Gd,Gm,'')
          End;

      Function InBox (X,Y,X1,Y1,X2,Y2:integer) : Boolean;
        Begin
          InBox:=(X>=X1) and (X<=X2) and (Y>=Y1) and (Y<=Y2)
        End;

      Procedure EditCursor;
        Var I, J, X, Y : integer;
            M          : word;
            Button     : byte;
            Error      : Boolean;
            Temp, Mask : CursorMask;

        Procedure DrawCursor (X,Y:integer);
          Var I, J : integer;
              M    : word;
            Begin
              For J:=1 to 16 do
                Begin
                  M:=Mask.Mask [J];
                  For I:=1 to 16 do
                    Begin
                      If (M and 1=1) and (GetPixel (X+16-I,Y+J-1)>0) then
                        PutPixel (X+16-I,Y+J-1,White)
                                   else
                        PutPixel (X+16-I,Y+J-1,Black);
                      M:=M shr 1
                    End
                End;
              For J:=1 to 16 do
                Begin
                  M:=Mask.Mask [16+J];
                  For I:=1 to 16 do
                    Begin
                      If (M and 1=1) XOR (GetPixel (X+16-I,Y+J-1)>0) then
                        PutPixel (X+16-I,Y+J-1,White)
                                   else
                        PutPixel (X+16-I,Y+J-1,Black);
                      M:=M shr 1
                    End
                End
            End;

        Procedure DrawTest;
          Begin
            SetColor (White);
            SetFillStyle (SolidFill,White);
            Bar (240,310,320,390);
            SetFillStyle (SolidFill,Black);
            Bar (320,310,400,390);
            Rectangle (240,310,400,390);
            DrawCursor (272,342);
            DrawCursor (352,342)
          End;

        Procedure DrawMasks;
          Var I, J : integer;
              M    : word;
            Begin
              For J:=1 to 16 do
                Begin
                  M:=Mask.Mask [J];
                  For I:=1 to 16 do
                    Begin
                      If M and 1=1 then
                        SetFillStyle (SolidFill,White)
                                   else
                        SetFillStyle (SolidFill,Black);
                      Bar (281-I*15,41+(J-1)*15,279-(I-1)*15,39+J*15);
                      M:=M shr 1
                    End
                End;
              For J:=1 to 16 do
                Begin
                  M:=Mask.Mask [16+J];
                  For I:=1 to 16 do
                    Begin
                      If M and 1=1 then
                        SetFillStyle (SolidFill,White)
                                   else
                        SetFillStyle (SolidFill,Black);
                      Bar (601-I*15,41+(J-1)*15,599-(I-1)*15,39+J*15);
                      M:=M shr 1
                    End
                End
            End;

        Procedure Load;
          Var I, J, Code : integer;
              S          : string;
              F          : text;
            Begin
              Error:=True;
    {$I-}
              Assign (F,'MOUSEDIT.DAT');
              Reset (F);
              For J:=1 to 2 do
                Begin
                  Readln (F,S);
                  If Pos (')',S)>0 then
                    S [Pos (')',S)]:=',';
                  For I:=1 to 16 do
                    Begin
                      While not (S [1] in ['0'..'9']) and (S>'') do
                        S:=Copy (S,2,Length (S)-1);
                      If (S='') or (Pos (',',S)=0) then Exit;
                      Val (Copy (S,1,Pos (',',S)-1),Temp.Mask [(J-1)*16+I],Code);
                      If Code<>0 then Exit;
                      S:=Copy (S,Pos (',',S)+1,Length (S)-Pos (',',S))
                    End
                End;
              Close (F);
    {$I+}
              Error:=False
            End;

        Procedure Save;
          Var I, J : integer;
              F    : text;
            Begin
    {$I-}
              Assign (F,'MOUSEDIT.DAT');
              Rewrite (F);
              Write (F,'(');
              For J:=1 to 2 do
                For I:=1 to 16 do
                  If I=16 then
                    If J=2 then
                      Writeln (F,Mask.Mask [(J-1)*16+I],');')
                           else
                      Writeln (F,Mask.Mask [(J-1)*16+I],',')
                         else
                    Write (F,Mask.Mask [(J-1)*16+I],',');
              Close (F)
    {$I+}
            End;

          Begin
            SetTextJustify (CenterText,CenterText);
            OutTextXY (GetMaxX div 2,GetMaxY-10,'(C) 1996. Aleksandar Dlabac');
            SetColor (LightGray);
            For I:=0 to 16 do
              Line (40+I*15,40,40+I*15,280);
            For I:=0 to 16 do
              Line (40,40+I*15,280,40+I*15);
            For I:=0 to 16 do
              Line (360+I*15,40,360+I*15,280);
            For I:=0 to 16 do
              Line (360,40+I*15,600,40+I*15);
            SetColor (White);
            OutTextXY (160,25,'Screen (AND) mask');
            OutTextXY (480,25,'Cursor (XOR) mask');
            Rectangle (100,430,200,450);
            OutTextXY (150,440,'Load');
            Rectangle (270,430,370,450);
            OutTextXY (320,440,'Save');
            Rectangle (440,430,540,450);
            OutTextXY (490,440,'Exit');
            OutTextXY (320,300,'Test');
            ResetMouse;
            For I:=1 to 16 do
              Mask.Mask [I]:=$FFFF;
            For I:=17 to 32 do
              Mask.Mask [I]:=0;
              Repeat
                DrawTest;
                DrawMasks;
                Button:=0;
                ShowCursor;
                Repeat Until LeftButton;
                X:=GetMouseX;
                Y:=GetMouseY;
                Repeat Until not LeftButton;
                HideCursor;
                For J:=1 to 16 do
                  Begin
                    M:=1;
                    For I:=1 to 16 do
                      Begin
                        If InBox (X,Y,281-I*15,41+(J-1)*15,279-(I-1)*15,39+J*15) then
                          Mask.Mask [J]:=Mask.Mask [J] XOR M;
                        M:=M shl 1
                      End
                  End;
                For J:=1 to 16 do
                  Begin
                    M:=1;
                    For I:=1 to 16 do
                      Begin
                        If InBox (X,Y,601-I*15,41+(J-1)*15,599-(I-1)*15,39+J*15) then
                          Mask.Mask [16+J]:=Mask.Mask [16+J] XOR M;
                        M:=M shl 1
                      End
                  End;
                For I:=1 to 3 do
                  If InBox (X,Y,I*170-70,430,I*170+30,450) then
                    Button:=I;
                  Case Button of
                    1 : Begin
                          Load;
                          If (IOResult<>0) or Error then
                            Write (#7)
                                                    else
                            Mask:=Temp
                        End;
                    2 : Begin
                          Save;
                          If IOResult<>0 then
                            Write (#7)
                        End
                  End
              Until Button=3;
            HideCursor
          End;

        Begin
          Initialize;
          EditCursor;
          CloseGraph
        End.

[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]