GWINM2P.MOD 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. IMPLEMENTATION MODULE GWinM2P;
  2. IMPORT GWinM2P,Graph,Storage,MATHLIB;
  3. CONST
  4. PI=3.141592654;
  5. OneK=1024;
  6. VAR
  7. vc:Graph.VideoConfig;
  8. CurrentMode:INTEGER;
  9. CurBackCol:INTEGER;
  10. CLASS IMPLEMENTATION GWindow;
  11. PROCEDURE XReal(x:GCoord):GCoord;
  12. BEGIN
  13. RETURN GCoord((LONGINT(x)*LONGINT(XScale))>>10)
  14. END XReal;
  15. PROCEDURE YReal(x:GCoord):GCoord;
  16. BEGIN
  17. RETURN GCoord((LONGINT(x)*LONGINT(YScale))>>10)
  18. END YReal;
  19. PROCEDURE XPhys(x:GCoord):GCoord;
  20. BEGIN
  21. RETURN XReal(x)+XL
  22. END XPhys;
  23. PROCEDURE YPhys(x:GCoord):GCoord;
  24. BEGIN
  25. RETURN YReal(x)+YT
  26. END YPhys;
  27. PROCEDURE Colour(x:INTEGER):INTEGER;
  28. BEGIN
  29. IF x<0 THEN
  30. RETURN CurrentColor;
  31. ELSE
  32. RETURN x MOD NumColors
  33. END
  34. END Colour;
  35. PROCEDURE Open(x1,y1,x2,y2:GCoord;ColsReq:INTEGER);
  36. VAR
  37. BestMode:INTEGER;
  38. BEGIN
  39. ok:=FALSE;
  40. PreviousMode:=CurrentMode;
  41. IF (CurrentMode=Graph._DEFAULTMODE) THEN
  42. BestMode:=Graph._DEFAULTMODE;
  43. Graph.GetVideoConfig(vc);
  44. CASE vc.adapter OF
  45. Graph._VGA:
  46. IF ColsReq>16 THEN
  47. BestMode:=Graph._MRES256COLOR;
  48. ELSE
  49. BestMode:=Graph._VRES16COLOR
  50. END;
  51. | Graph._EGA:
  52. BestMode:=Graph._ERESCOLOR;
  53. IF ColsReq>16 THEN
  54. _GraphErr:=ErrFewerColors
  55. END;
  56. | Graph._CGA:
  57. IF ColsReq>2 THEN
  58. BestMode:=Graph._MRES4COLOR;
  59. ELSE
  60. BestMode:=Graph._HRESBW;
  61. END;
  62. IF ColsReq<4 THEN
  63. _GraphErr:=ErrFewerColors
  64. END;
  65. | Graph._HGC:
  66. BestMode:=Graph._HERCMONO;
  67. IF ColsReq>2 THEN
  68. _GraphErr:=ErrFewerColors;
  69. END;
  70. ELSE
  71. _GraphErr:=ErrUnknownAdapter
  72. END;
  73. IF BestMode#Graph._DEFAULTMODE THEN
  74. IF Graph.SetVideoMode(BestMode) THEN END;
  75. Graph.GetVideoConfig(vc);
  76. CurrentMode:=BestMode;
  77. END;
  78. END;
  79. NumColors:=vc.numcolors;
  80. ReSize(x1,y1,x2,y2);
  81. CurrentColor:=NumColors-1;
  82. CurrentBackColor:=0;
  83. ok:=TRUE;
  84. END Open;
  85. PROCEDURE ReSize(x1,y1,x2,y2:GCoord);
  86. BEGIN
  87. XScale:=vc.numxpixels;
  88. YScale:=vc.numypixels;
  89. XL:=XReal(x1);
  90. XR:=XReal(x2);
  91. YT:=YReal(y1);
  92. YB:=YReal(y2);
  93. XScale:=GCoord((LONGINT(vc.numxpixels)*LONGINT(x2-x1)) DIV OneK);
  94. YScale:=GCoord((LONGINT(vc.numypixels)*LONGINT(y2-y1)) DIV OneK);
  95. END ReSize;
  96. PROCEDURE Close();
  97. BEGIN
  98. ok:=FALSE;
  99. IF (PreviousMode#CurrentMode) AND
  100. Graph.SetVideoMode(PreviousMode) THEN END
  101. END Close;
  102. PROCEDURE AffixColor(Col,BkCol:INTEGER);
  103. VAR
  104. BC:INTEGER;
  105. BEGIN
  106. IF Col=-1 THEN
  107. IF Graph.SetTextColor(CurrentColor)=0 THEN END;
  108. ELSE
  109. IF Graph.SetTextColor(Col)=0 THEN END;
  110. END;
  111. IF BkCol=-1 THEN
  112. BC:=CurrentBackColor
  113. ELSE
  114. BC:=BkCol
  115. END;
  116. IF BC#CurBackCol THEN
  117. IF Graph.SetBkColor(LONGCARD(BC))=0 THEN END;
  118. CurBackCol:=BC
  119. END;
  120. END AffixColor;
  121. PROCEDURE Plot(x,y:GCoord;Col:INTEGER);
  122. BEGIN
  123. Graph.SetClipRgn(XL,YT,XR,YB);
  124. Graph.Plot(XPhys(x),YPhys(y),Colour(Col))
  125. END Plot;
  126. PROCEDURE Point(x,y:GCoord):INTEGER;
  127. BEGIN
  128. Graph.SetClipRgn(XL,YT,XR,YB);
  129. RETURN Graph.Point(XPhys(x),YPhys(y));
  130. END Point;
  131. PROCEDURE Fill(x,y:GCoord;bound:INTEGER;Flood:BOOLEAN);
  132. BEGIN
  133. Graph.SetClipRgn(XL,YT,XR,YB);
  134. IF Flood THEN
  135. Graph.FloodFill(XPhys(x),YPhys(y),Colour(-1),Colour(bound))
  136. ELSE
  137. Graph.StackFill(XPhys(x),YPhys(y),Colour(-1),Colour(bound))
  138. END
  139. END Fill;
  140. PROCEDURE SetColor(Col,BkCol:INTEGER);
  141. BEGIN
  142. IF Col>0 THEN
  143. CurrentColor:=Col MOD NumColors
  144. END;
  145. IF BkCol>0 THEN
  146. CurrentBackColor:=BkCol MOD NumColors
  147. END;
  148. AffixColor(-1,-1);
  149. END SetColor;
  150. PROCEDURE Clear(BkCol:INTEGER);
  151. BEGIN
  152. Graph.Rectangle(XL,YT,XR,YB,CurrentBackColor,TRUE);
  153. END Clear;
  154. PROCEDURE Rectangle(left,top,width,height:GCoord;fill:INTEGER);
  155. BEGIN
  156. Graph.SetClipRgn(XL,YT,XR,YB);
  157. Graph.Rectangle(XPhys(left),YPhys(top),XPhys(left+width),YPhys(top+height),
  158. CurrentColor,fill#0);
  159. END Rectangle;
  160. PROCEDURE Polygon(nsides:INTEGER;px,py:ADDRESS;fill:INTEGER);
  161. TYPE
  162. GCP=ARRAY[0..20] OF CARDINAL;
  163. GCPP=POINTER TO GCP;
  164. VAR
  165. n:INTEGER;
  166. nx,ny:GCPP;
  167. BEGIN
  168. Graph.SetClipRgn(XL,YT,XR,YB);
  169. Storage.ALLOCATE(nx,SIZE(GCoord)*nsides);
  170. Storage.ALLOCATE(ny,SIZE(GCoord)*nsides);
  171. FOR n:=0 TO nsides DO
  172. nx^[n]:=XPhys(GCPP(px)^[n]);
  173. ny^[n]:=YPhys(GCPP(py)^[n]);
  174. END;
  175. Graph.Polygon(nsides,nx^,ny^,CurrentColor);
  176. Storage.DEALLOCATE(nx,SIZE(GCoord)*nsides);
  177. Storage.DEALLOCATE(ny,SIZE(GCoord)*nsides);
  178. END Polygon;
  179. PROCEDURE Ellipse(x,y,major,minor:GCoord;fill:INTEGER);
  180. BEGIN
  181. Graph.SetClipRgn(XL,YT,XR,YB);
  182. Graph.Ellipse(XPhys(x),YPhys(y),XReal(major),YReal(minor),CurrentColor,fill#0);
  183. END Ellipse;
  184. PROCEDURE Line(x1,y1,x2,y2:GCoord;Col:INTEGER);
  185. BEGIN
  186. Graph.SetClipRgn(XL,YT,XR,YB);
  187. Graph.Line(XPhys(x1),YPhys(y1),XPhys(x2),YPhys(y2),Colour(Col));
  188. END Line;
  189. PROCEDURE VectorFromAngle(Ang:INTEGER;VAR X,Y:GCoord);
  190. VAR
  191. RA:LONGREAL;
  192. BEGIN
  193. RA:=VAL(LONGREAL,Ang)*PI/180.0;
  194. X:=GCoord(1024.0*MATHLIB.Cos(RA));
  195. Y:=GCoord(1024.0*MATHLIB.Sin(RA));
  196. END VectorFromAngle;
  197. (* Draw a proportion of an ellipse from starting position and subtended angle
  198. StartAngle to EndAngle. The angle measurements are in degrees and measured
  199. from the first quadrant *)
  200. PROCEDURE ArcServer(X,Y,Major,Minor:GCoord;StartA,EndA:INTEGER;Pie,FillQ:BOOLEAN);
  201. VAR
  202. StartX,StartY,EndX,EndY:GCoord;
  203. BEGIN
  204. VectorFromAngle(StartA,EndX,EndY);
  205. VectorFromAngle(EndA,StartX,StartY);
  206. Graph.SetClipRgn(XL,YT,XR,YB);
  207. IF Pie THEN
  208. Graph.Pie(XPhys(X),YPhys(Y),XReal(Major),YReal(Minor),
  209. StartX,StartY,EndX,EndY,CurrentColor,FillQ);
  210. ELSE
  211. Graph.Arc(XPhys(X),YPhys(Y),XReal(Major),YReal(Minor),
  212. StartX,StartY,EndX,EndY,CurrentColor);
  213. END
  214. END ArcServer;
  215. PROCEDURE EllipticArc(x,y,major,minor:GCoord;StartAngle,EndAngle:INTEGER);
  216. BEGIN
  217. ArcServer(x,y,major,minor,StartAngle,EndAngle,FALSE,FALSE)
  218. END EllipticArc;
  219. PROCEDURE EllipticPie(x,y,major,minor:GCoord;Start,EndAngle,FillQ:INTEGER);
  220. BEGIN
  221. ArcServer(x,y,major,minor,Start,EndAngle,TRUE,FillQ#0)
  222. END EllipticPie;
  223. PROCEDURE Cuboid(X,Y,width,height,depth:GCoord;top,fill:INTEGER);
  224. BEGIN
  225. Graph.SetClipRgn(XL,YT,XR,YB);
  226. Graph.Cube(top#0,XPhys(X),YPhys(Y),XPhys(X+width),YPhys(Y+height),
  227. XReal(depth),CurrentColor,fill#0);
  228. END Cuboid;
  229. PROCEDURE CursorPosition(x,y:GCoord);
  230. VAR
  231. rx,ry:INTEGER;
  232. Junk:Graph.TextCoords;
  233. BEGIN
  234. rx:=INTEGER((LONGINT(XPhys(x))*LONGINT(vc.numtextcols) DIV LONGINT(vc.numxpixels)));
  235. ry:=INTEGER((LONGINT(YPhys(y))*LONGINT(vc.numtextrows) DIV LONGINT(vc.numypixels)));
  236. Graph.SetTextWindow(1,1,vc.numtextrows,vc.numtextcols);
  237. Junk:=Graph.SetTextPosition(ry+1,rx+1);
  238. AffixColor(-1,-1)
  239. END CursorPosition;
  240. PROCEDURE CharWidth():INTEGER;
  241. BEGIN
  242. RETURN 1+INTEGER(OneK*LONGINT(vc.numxpixels) DIV
  243. (LONGINT(XR-XL)*LONGINT(vc.numtextcols)))
  244. END CharWidth;
  245. PROCEDURE CharHeight():INTEGER;
  246. BEGIN
  247. RETURN 1+INTEGER(OneK*LONGINT(vc.numypixels) DIV
  248. (LONGINT(YB-YT)*LONGINT(vc.numtextrows)))
  249. END CharHeight;
  250. BEGIN
  251. END GWindow;
  252. BEGIN
  253. CurrentMode:=Graph._DEFAULTMODE;
  254. CurBackCol:=-1;
  255. END GWinM2P.