home *** CD-ROM | disk | FTP | other *** search
- PRODUCT : TURBO GRAPHIX TOOLBOX NUMBER : 175
- VERSION : 1.05A
- OS : PC-DOS
- DATE : July 8, 1986
-
- TITLE : UPDATE FROM VERSION 1.05A TO 1.06A
-
-
- This handout contains updates for the following:
-
- RUN-TIME ERROR 92 IN WINDOWX, WINDOWY AND CLIP PAGE 1
-
- WORLD COORDINATES UPDATE PAGE 7
-
- BAR CHART MODULE PAGE 9
-
- POLYGON DRAWING MODULE PAGE 13
-
- WINDOW MOVE UPDATE PAGE 18
-
- RUN-TIME ERROR 92 IN WINDOWX, WINDOWY AND CLIP
-
- This patch eliminates runtime error 92 in the WindowX, WindowY,
- and Clip routines.
-
- The following routines are found in the file called "KERNEL.SYS".
-
- Change the WindowX function to read as follows:
-
- function WindowX(x:real):integer;
- var
- Temp : real;
- begin
- Temp := AxGlb + BxGlb * x;
- if Temp > MaxInt then
- WindowX := MaxInt
- else if Temp < $8001 then
- WindowX := $8001
- else
- WindowX := trunc(Temp);
- end;
-
-
- Change the WindowY funtion to read as follows:
-
- function WindowY(y:real):integer;
- var
- Temp : real;
- begin
- Temp := AyGlb + ByGlb * y;
- if Temp > MaxInt then
- WindowY := MaxInt
- else if Temp < $8001 then
- WindowY := $8001
- else
- WindowY := trunc(Temp);
- end;
-
- RUN-TIME ERROR IN WINDOWX, WINDOWY AND CLIP, Continued:
-
- Change the Clip function to read as follows:
-
- function clip(var x1,y1,x2,y2:integer):boolean;
-
- var ix1,iy1,ix2,iy2,dummy,X1Loc,X2Loc:integer;
- ClipLoc:boolean;
- Temp : real;
-
- function inside(x,xx1,xx2:integer):integer;
- begin
- inside:=0;
- if x<xx1 then inside:=-1
- else if x>xx2 then inside:=1;
- end;
-
- begin
- clip:=true;
- ClipLoc:=true;
- if ClippingGlb then
- begin
- if HatchGlb then
- begin
- X1Loc:=X1RefGlb;
- X2Loc:=X2RefGlb;
- end
- else
- begin
- X1Loc:=X1RefGlb shl 3;
- X2Loc:=X2RefGlb shl 3 +7;
- end;
-
- RUN-TIME ERROR 92 IN WINDOWX, WINDOWY AND CLIP, Continued:
-
- ix1:=inside(x1,X1Loc,X2Loc);
- iy1:=inside(y1,Y1RefGlb,Y2RefGlb);
- ix2:=inside(x2,X1Loc,X2Loc);
- iy2:=inside(y2,Y1RefGlb,Y2RefGlb);
- if (ix1 or ix2 or iy1 or iy2)<>0 then
- begin
- if x1<>x2 then
- begin
- if ix1<>0 then
- begin
- if ix1<0 then dummy:=X1Loc else dummy:=X2Loc;
- if y2<>y1 then
- begin { Changes start here }
- Temp := (y2-y1)/(x2-x1)*(dummy-x1);
- if Temp > MaxInt then
- Temp := MaxInt
- else if Temp < $8001 then
- Temp := $8001;
- y1:=y1+trunc(Temp);
- end; { Changes end here }
- x1:=dummy;
- end;
- if (ix2<>0) and (x1<>x2) then
- begin
- if ix2<0 then dummy:=X1Loc else dummy:=X2Loc;
- if y2<>y1 then
- begin { Changes start here }
- Temp := (y2-y1)/(x2-x1)*(dummy-x1);
- if Temp > MaxInt then
- Temp := MaxInt
- else if Temp < $8001 then
- Temp := $8001;
- y2:=y1+trunc(Temp);
- end; { Changes end here }
- x2:=dummy;
- end;
-
- RUN-TIME ERROR 92 IN WINDOWX, WINDOWY AND CLIP, Continued:
-
- iy1:=inside(y1,Y1RefGlb,Y2RefGlb);
- iy2:=inside(y2,Y1RefGlb,Y2RefGlb);
- end;
- if y1<>y2 then
- begin
- if iy1<>0 then
- begin
- if iy1<0 then dummy:=Y1RefGlb else dummy:=Y2RefGlb;
- if x1<>x2 then
- begin { Changes start here }
- Temp := (x2-x1)/(y2-y1)*(dummy-y1);
- if Temp > MaxInt then
- Temp := MaxInt
- else if Temp < $8001 then
- Temp := $8001;
- x1:=x1+trunc(Temp);
- end; { Changes end here }
- y1:=dummy;
- end;
- if iy2<>0 then
- begin
- if iy2<0 then dummy:=Y1RefGlb else dummy:=Y2RefGlb;
- if x1<>x2 then
- begin { Changes start here }
- Temp := (x2-x1)/(y2-y1)*(dummy-y1);
- if Temp > MaxInt then
- Temp := MaxInt
- else if Temp < $8001 then
- Temp := $8001;
- x2:=x1+trunc(Temp);
- end; { Changes end here }
- y2:=dummy;
- end;
- end;
-
- RUN-TIME ERROR 92 IN WINDOWX, WINDOWY AND CLIP, Continued:
-
- iy1:=inside(y1,Y1RefGlb,Y2RefGlb);
- iy2:=inside(y2,Y1RefGlb,Y2RefGlb);
- if (iy1<>0) or (iy2<>0) then ClipLoc:=false;
- if ClipLoc then
- begin
- ix1:=inside(x1,X1Loc,X2Loc);
- ix2:=inside(x2,X1Loc,X2Loc);
- if (ix2<>0) or (ix1<>0) then ClipLoc:=false;
- end;
- clip:=ClipLoc;
- end;
- end;
- end;
-
- WORLD COORDINATES
-
- In Turbo Graphix Toolbox version 1.05A, the Y coordinates
- are flipped, positive to negative. The following patches will
- reverse the direction of increasing positive Y coordinates.
-
- In KERNEL.SYS change the procedure DefineWorld to read:
-
- procedure DefineWorld(i:integer; X_1,Y_1,X_2,Y_2:real);
- begin
- if ((X_1<>X_2) and (Y_1<>Y_2)) and (i in [1..MaxWorldsGlb])
- then
- with world[i] do
- begin
- x1:=X_1;y1:=Y_1;x2:=X_2;y2:=Y_2;
- if i>MaxWorldGlb then MaxWorldGlb:=i;
- end
- else if i in [1..MaxWorldsGlb] then error(1,3)
- else error(1,2);
- end;
-
- In KERNEL.SYS change the procedure ReDefineWindow to read:
-
- procedure ReDefineWindow(i,X_1,Y_1,X_2,Y_2:integer);
- begin
- if (i in [1..MaxWindowsGlb]) and (X_1<=X_2) and (Y_1<=Y_2)
- and
- (X_1>=0) and (X_2<=XScreenMaxGlb) and (Y_1>=0) and
- (Y_2<=YMaxGlb)
- then
- with window[i] do
- begin
- x1:=X_1;
- y1:=Y_1;
- x2:=X_2;
- y2:=Y_2;
- if i>MaxWindowGlb then MaxWindowGlb:=i;
- end
- else if i in [1..MaxWindowsGlb] then error(3,3)
- else error(3,2);
- end;
-
- WORLD COORDINATES, Continued:
-
- Change the File called FINDWRLD.HGH to read:
-
- procedure FindWorld(i:integer;
- A:PlotArray;
- NPoints:integer;
- ScaleX,ScaleY:real);
- var XMax,YMax,XMin,YMin:real;
- j:integer;
-
- xmid, ymid, xdiff, ydiff : real;
- begin
- NPoints:=abs(NPoints);
- if NPoints>=2 then
- if i in [1..MaxWorldsGlb] then
- begin
- XMax:=A[1,1];
- YMax:=A[1,2];
- XMin:=XMax;
- YMin:=YMax;
- for j:=2 to NPoints do
- begin
- if A[j,1]>XMax then XMax:=A[j,1]
- else if A[j,1]<XMin then XMin:=A[j,1];
- if A[j,2]>YMax then YMax:=A[j,2]
- else if A[j,2]<YMin then YMin:=A[j,2];
- end;
- ScaleX:=abs(ScaleX);
- ScaleY:=abs(ScaleY);
- xdiff := xmax - xmin;
- xmid := (xmax + xmin) * 0.5;
- xmax := xmid + scalex * 0.5 * xdiff;
- xmin := xmid - scalex * 0.5 * xdiff;
- ydiff := ymax - ymin;
- ymid := (ymax + ymin) * 0.5;
- ymax := ymid + scaley * 0.5 * ydiff;
- ymin := ymid - scaley * 0.5 * ydiff;
- DefineWorld(i,XMin,YMin,XMax,YMax);
- SelectWorld(i);
- end
- else error(7,2)
- else error(7,4);
- end;
-
-
- MAKE THE FOLLOWING MODIFICATION TO THE FILE "HISTOGRM.HGH."
-
- (***********************************************************)
- (* *)
- (* TURBO GRAPHIX version 1.06A *)
- (* *)
- (* Bar chart module *)
- (* Module version 1.06A *)
- (* *)
- (* Copyright (C) 1985 by *)
- (* BORLAND International *)
- (* *)
- (***********************************************************)
-
- procedure DrawHistogram(A :PlotArray; NPoints : integer;
-
- var
- X1, X2, Y2, NPixels, Delta, NDiff, YRef, LineStyleLoc, I :
- integer;
- Fract, S, Y, YAxis : real;
- DirectModeLoc, Negative : boolean;
- Wtemp : WindowType;
- X1Loc, Y1Loc, X2Loc, Y2Loc : integer;
-
- function Balance : integer;
- begin
- Balance := 0;
- S := S + Fract;
- if S >= 0.0 then
- begin
- S := S - 1.0;
- Balance := 1;
- end;
- end; { Balance }
-
- begin { DrawHistogram }
- if abs(NPoints) >= 2 then
- begin
- X1Loc := X1Glb;
- Y1Loc := Y1Glb;
- X2Loc := X2Glb;
- Y2Loc := Y2Glb;
- LineStyleLoc := LinestyleGlb;
- SetLineStyle(0);
- if AxisGlb then
-
- BAR CHART MODULE, CONTINUED
-
- begin
- Wtemp := Window[WindowNdxGlb];
- ReDefineWindow(WindowNdxGlb, X1RefGlb + 4 + X1Glb,
- Y1RefGlb + 6 + Y1Glb, X2RefGlb - 2 -
- X2Glb, Y2RefGlb - 14 - Y2Glb);
- SelectWindow(WindowNdxGlb);
- AxisGlb := true;
- end;
- DirectModeLoc := DirectModeGlb;
- DirectModeGlb := true;
- Negative := NPoints < 0;
- NPoints := abs(NPoints);
- NPixels := (X2RefGlb - X1RefGlb) shl 3 + 7;
- Delta := NPixels div NPoints;
- NDiff := NPixels - Delta * NPoints;
- Fract := NDiff / NPoints;
- S := -Fract;
- X1 := X1RefGlb shl 3;
- YRef := trunc(Y2RefGlb + Y1RefGlb - AyGlb);
- if Negative then
- DrawStraight(X1, X2RefGlb shl 3 + 7, YRef);
- YAxis := Y1RefGlb;
- if BYGlb > 0 then
- YAxis := Y2RefGlb;
- for I := 1 to NPoints do
- begin
- X2 := X1 + Delta + Balance;
- Y := A[I, 2];
- if not Negative then
- Y := abs(Y);
- <-----------------------------------|
- if AxisGlb then |
- Y2 := trunc(AyGlb + ByGlb * Y) |
- else |-{ DELETE }
- Y2 := trunc((AyGlb + ByGlb * Y) * 0.99); | { THIS }
- Y2 := Y2RefGlb + Y1RefGlb - Y2; | { BLOCK }
- <-----------------------------------|
-
- { ADD THE FOLLOWING LINE }
- Y2 := Y2RefGlb + Y1RefGlb - (trunc(AyGlb + ByGlb * Y));
-
-
- BAR CHART MODULE, CONTINUED
-
- if not Negative then
- begin
- DrawLine(X1, YAxis, X1, Y2);
- DrawStraight(X1, X2, Y2);
- DrawLine(X2, Y2, X2, YAxis);
- if Hatching then
- if Odd(I) then
- Hatch(X1, Y2, X2, YAxis, HatchStyle)
- else
- Hatch(X1, Y2, X2, YAxis, -HatchStyle);
- end
- else
- begin
- DrawLine(X1, YRef, X1, Y2);
- DrawStraight(X1, X2, Y2);
- DrawLine(X2, Y2, X2, YRef);
- if Hatching then
- if YRef - Y2 < 0 then
- if Odd(I) then
- Hatch(X1, YRef, X2, Y2, HatchStyle)
- else
- Hatch(X1, YRef, X2, Y2, -HatchStyle)
- else
- if Odd(I) then
- Hatch(X1, Y2, X2,YRef, HatchStyle)
- else
- Hatch(X1, Y2, X2, YRef, -HatchStyle);
- end;
- X1 := X2;
- end;
- if AxisGlb then
- begin
- Window[WindowNdxGlb] := Wtemp;
- SelectWindow(WindowNdxGlb);
- X1Glb := X1Loc;
- Y1Glb := Y1Loc;
- X2Glb := X2Loc;
- Y2Glb := Y2Loc;
- AxisGlb := false;
- end;
- DirectModeGlb := DirectModeLoc;
- SetLineStyle(LineStyleLoc);
- end
- else
- Error(19, 4);
- end; { DrawHistogram }
-
- ADD THE FOLLOWING VARIABLE TO THE FILE "TYPEDEF.SYS."
-
- WorldNdxGlb : integer;
-
- { IN THE FILE CALLED "KERNEL.SYS" MODIFY THE PROCEDURE CALLED,
- "SelectWorld" as follows. }
-
- procedure SelectWorld(I : integer);
- begin
- if (I in [1..MaxWorldGlb]) then
- with World[I] do
- begin
- WorldNdxGlb := I; <----------------{ ADD THIS LINE }
- X1WldGlb := X1;
- Y1WldGlb := Y1;
- X2WldGlb := X2;
- Y2WldGlb := Y2;
- end
- else
- Error(2, 2);
- end; { SelectWorld }
-
- IN THE FILE CALLED "POLYGON.HGH" MAKE THE FOLLOWING
- MODIFICATIONS.
-
- (***********************************************************)
- (* *)
- (* TURBO GRAPHIX version 1.06A *)
- (* *)
- (* Polygon drawing module *)
- (* Module version 1.06A *)
- (* *)
- (* Copyright (C) 1985 by *)
- (* BORLAND International *)
- (* *)
- (***********************************************************)
-
- procedure DrawPolygon(A : PlotArray;I0, NPoints, Line, Scale,
- Lines : integer);
- var
- I, X1, X2, Y1, Y2, XOffset, YOffset,
- X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc,
- DeltaY, XOs1, XOs2, YOs1, YOs2 : integer;
- AutoClip, DirectModeLoc, PlotLine, PlotSymbol : boolean;
- X1Loc, Y1Loc, X2Loc, Y2Loc : integer;
- Temp : real; <-------------|
- Flipped : boolean; <----|-------{ ADD THESE TWO VARIABLES }
-
- procedure DrawPointClipped(X, Y : integer);
- begin
- if (X1 > X1RefGlb shl 3) and (X2 < X2RefGlb shl 3 + 7) then
- if (Y1 > Y1RefGlb) and (Y2 < Y2RefGlb) then
- DP(X, Y);
- end; { DrawPointClipped }
-
- procedure DrawItem(X, Y : integer);
- var
- LineStyleLoc : integer;
- begin
- LineStyleLoc := LineStyleGlb;
- SetLineStyle(0);
- POLYGON DRAWING MODULE, CONTINUED
-
- case Line of
- 2 : DrawCrossDiag(X, Y, Scale);
- 3, 4 : DrawSquareC(X - Scale, Y + Scale, X + Scale, Y -
- Scale, (Line = 4));
- 5 : DrawDiamond(X, Y, Scale + 1);
- 6 : DrawWye(X, Y, Scale + 1);
- 1 : DrawCross(X, Y, Scale);
- 8 : DrawCircleDirect(X, Y, Scale + 1, false);
- 9 : begin
- PlotLine := false;
- if AutoClip then
- DrawPointClipped(X, Y)
- else
- DP(X, Y);
- end;
- 7 : DrawStar(X, Y, Scale);
- end;
- SetLineStyle(LineStyleLoc);
- end; { DrawItem }
-
- begin { DrawPolygon }
- <-------------------|
- if not AxisGlb then |
- begin |
- with World[WorldNdxGlb] do |
- begin |
- Temp := Y1; |
- Y1 := Y2; |
- Y2 := Temp; |------{ ADD THIS BLOCK }
- end; |
- SelectWorld(WorldNdxGlb); |
- SelectWindow(WindowNdxGlb); |
- Flipped := true; |
- end |
- else |
- Flipped := false; |
- <-------------------|
- if abs(NPoints - I0) >= 2 then
- begin
- X1Loc := X1Glb;
- Y1Loc := Y1Glb;
- X2Loc := X2Glb;
- Y2Loc := Y2Glb;
- DirectModeLoc := DirectModeGlb;
- DirectModeGlb := true;
- AutoClip := (NPoints < 0);
- NPoints := abs(NPoints);
- POLYGON DRAWING MODULE, CONTINUED
- XOs1 := 1;
- XOs2 := 1;
-
- YOs1 := 6;
- YOs2 := 6;
- if AxisGlb then
- begin
- XOs1 := 4;
- XOs2 := 2;
- YOs1 := 6;
- YOs2 := 14;
- if (((X2RefGlb + 7 - XOs2 - X1RefGlb + XOs1) > (XOs1 +
- XOs2) shl 1) and (Y2RefGlb - YOs2 - Y1RefGlb + YOs1 >
- (YOs1 + YOs2) shl 1)) then
- begin
- X1RefLoc := X1RefGlb;
- X1 := X1RefGlb + XOs1 + X1Glb;
- Y1RefLoc := Y1RefGlb;
- Y1 := Y1RefGlb + YOs1 + Y1Glb;
- X2RefLoc := X2RefGlb;
- X2 := X2RefGlb - XOs2 - X2Glb;
- Y2RefLoc := Y2RefGlb;
- Y2 := Y2RefGlb - YOs2 - Y2Glb;
- ReDefineWindow(WindowNdxGlb, X1, Y1, X2, Y2);
- SelectWindow(WindowNdxGlb);
- AxisGlb := true;
- end;
- end;
- PlotLine := (Line >= 0);
- PlotSymbol := (Line <> 0);
- Line := abs(Line);
- Scale := abs(Scale);
- if Lines < 0 then
- DeltaY := Trunc(1.0 / (abs(Y1WldGlb) + abs(Y2WldGlb)) *
- abs(Y1WldGlb) * abs(Y2RefGlb -
- Y1RefGlb)) + 1
- else
- DeltaY := 0;
- if (NPoints < 2) and MessageGlb then
- Writeln('<DrawPolygon>: too few data pairs ->(NPoints)>=2')
- else
-
- begin
- X1 := WindowX(A[I0, 1]);
- Y1 := Y2RefGlb + Y1RefGlb - WindowY(A[I0, 2]);
- DrawItem(X1, Y1);
- if Abs(Lines) = 1 then
-
- POLYGON DRAWING MODULE, CONTINUED
-
- if AutoClip then
- DrawLineClipped(X1, Y2RefGlb - DeltaY, X1, Y1)
- else
- DrawLine(X1, Y2RefGlb - DeltaY, X1, Y1);
- for I:= I0 + 1 to NPoints do
- begin
- X2 := WindowX(A[I, 1]);
- Y2 := Y2RefGlb + Y1RefGlb - WindowY(A[I, 2]);
- DrawItem(X2, Y2);
- if Abs(Lines) = 1 then
- if AutoClip then
- DrawLineClipped(X2, Y2RefGlb - DeltaY, X2, Y2)
- else
- DrawLine(X2, Y2RefGlb - DeltaY, X2, Y2);
- if PlotLine then
- if AutoClip then
- DrawLineClipped(X1, Y1, X2, Y2)
- else
- DrawLine(X1, Y1, X2, Y2);
- X1 := X2;
- Y1 := Y2;
- end;
- end;
- if AxisGlb then
- begin
- ReDefineWindow(WindowNdxGlb, X1RefLoc, Y1RefLoc, X2RefLoc,
- Y2RefLoc);
- SelectWindow(WindowNdxGlb);
- X1Glb := X1Loc;
- Y1Glb := Y1Loc;
- X2Glb := X2Loc;
- Y2Glb := Y2Loc;
- AxisGlb := false;
- end;
- DirectModeGlb := DirectModeLoc;
- end
- else
- Error(18, 4);
-
- POLYGON DRAWING MODULE, CONTINUED
-
- <-------------------|
- if Flipped then |
- begin |
- with World[WorldNdxGlb] do |
- begin |
- Temp := Y1; |
- Y1 := Y2; |
- Y2 := Temp; |------{ ADD THIS BLOCK }
- end; |
- SelectWorld(WorldNdxGlb); |
- SelectWindow(WindowNdxGlb); |
- end; |
- <-------------------|
- end; { DrawPolygon }
-
- WINDOW MOVE UPDATE
-
- The following code modifications enable the Turbo Graphix Toolbox
- to properly display text after doing a move window.
-
- In the procedure MoveVer in the file WINDOWS.SYS
-
- Change from:
- Y1RefGlb := Y1RefGlb + HeaderSizeGlb
- else
- Y2RefGlb := Y2RefGlb - HeaderSizeGlb;
- end;
- end; { MoveVer }
-
-
- Change to:
- Y1RefGlb := Y1RefGlb + HeaderSizeGlb
- else
- Y2RefGlb := Y2RefGlb - HeaderSizeGlb;
- ReDefineWindow(WindowNdxGlb, X1RefGlb, Y1RefGlb, X2RefGlb,
- Y2RefGlb); { addition ver. 1.06A }
- SelectWindow(WindowNdxGlb); { addition ver. 1.06A }
- end;
- end; { MoveVer }
-
- In the procedure MoveHor in the WINDOWS.SYS:
-
- Change from:
- if Top then
- Y1RefGlb := Y1RefGlb + HeaderSizeGlb
- else
- Y2RefGlb := Y2RefGlb - HeaderSizeGlb;
- end;
- end; { MoveHor }
-
- Change to:
- if Top then
- Y1RefGlb := Y1RefGlb + HeaderSizeGlb
- else
- Y2RefGlb := Y2RefGlb - HeaderSizeGlb;
- ReDefineWindow(WindowNdxGlb, X1RefGlb, Y1RefGlb, X2RefGlb,
- Y2RefGlb); { addition ver. 1.06A }
- SelectWindow(WindowNdxGlb); { addition ver. 1.06A }
- end;
- end; { MoveHor }
-