WMGraphicsGfx.Mod 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. MODULE WMGraphicsGfx; (** AUTHOR "Patrick Hunziker"; PURPOSE "use rich Gfx Business logic for WMWindowManager.Canvas"; *)
  2. IMPORT Gfx, GfxBuffer, GfxRaster, GfxMatrix, GfxRegions, Raster, Strings, WMGraphics, WMWindowManager, KernelLog;
  3. TYPE Canvas*= OBJECT(WMGraphics.BufferCanvas)
  4. VAR
  5. gfxContext-: GfxBuffer.Context;
  6. fillColor: LONGINT;
  7. gfxStrokeColor: Gfx.Color;
  8. gfxFillColor: Gfx.Color;
  9. gfxLineWidth: REAL;
  10. dashLength: REAL;
  11. PROCEDURE &New*(img : Raster.Image);
  12. BEGIN
  13. New^(img);
  14. generator:=Strings.NewString("WMGraphicsGfx.GenCanvas");
  15. SetupDrawing;
  16. END New;
  17. PROCEDURE SetupDrawing;
  18. VAR m: GfxMatrix.Matrix;
  19. BEGIN
  20. NEW(gfxContext);
  21. GfxBuffer.Init(gfxContext, img(*GetImage()*));
  22. (*
  23. GfxBuffer.SetCompOp(gfxContext, Raster.srcOverDst);
  24. GfxRaster.ResetClip(gfxContext);
  25. GfxRegions.SetToRect(gfxContext.clipReg, SHORT(clipRect.l), SHORT(clipRect.t), SHORT(clipRect.r), SHORT(clipRect.b));
  26. GfxMatrix.Init(m,1,0,0,1,dx,dy); (* one to one coordinate system, translated by the component's origin *)
  27. Gfx.SetCTM(gfxContext,m);
  28. *)
  29. SetDashLength(0);
  30. SetLineWidth(1.0);
  31. SetColor(WMGraphics.Blue);
  32. SetFillColor(WMGraphics.Red);
  33. END SetupDrawing;
  34. PROCEDURE SetLineWidth*(w:REAL);
  35. BEGIN
  36. gfxLineWidth:=w;
  37. Gfx.SetLineWidth(gfxContext,w);
  38. END SetLineWidth;
  39. (* set line color*)
  40. PROCEDURE SetColor*(color:WMGraphics.Color);
  41. BEGIN
  42. IF color#SELF.color THEN
  43. SetColor^(color);
  44. gfxStrokeColor:=ColorToGfxColor(color);
  45. Gfx.SetStrokeColor(gfxContext, gfxStrokeColor);
  46. END;
  47. END SetColor;
  48. (* set line color*)
  49. PROCEDURE SetDashLength*(dl:REAL);
  50. VAR on,off: ARRAY 1 OF REAL;
  51. BEGIN
  52. dashLength:=dl;
  53. IF dashLength > 0 THEN
  54. on[0] := dashLength; off[0] := dashLength; Gfx.SetDashPattern(gfxContext, on, off, 1, 0);
  55. END;
  56. END SetDashLength;
  57. (* set fill/font color*)
  58. PROCEDURE SetFillColor*(fillColor:LONGINT);
  59. BEGIN
  60. IF fillColor#SELF.fillColor THEN
  61. SELF.fillColor := fillColor;
  62. gfxFillColor:=ColorToGfxColor(fillColor);
  63. Gfx.SetFillColor(gfxContext, gfxFillColor);
  64. END;
  65. END SetFillColor;
  66. PROCEDURE ColorToGfxColor(color:WMGraphics.Color):Gfx.Color;
  67. VAR gfxcolor:Gfx.Color;
  68. BEGIN
  69. gfxcolor.a := INTEGER(color MOD 100H);
  70. gfxcolor.b := INTEGER(color DIV 100H MOD 100H);
  71. gfxcolor.g := INTEGER(color DIV 10000H MOD 100H);
  72. gfxcolor.r := INTEGER(color DIV 1000000H MOD 100H);
  73. RETURN gfxcolor
  74. END ColorToGfxColor;
  75. PROCEDURE GfxColorToColor(gfxColor:Gfx.Color):WMGraphics.Color;
  76. BEGIN
  77. RETURN LONGINT (((HUGEINT(gfxColor.r*100H)+gfxColor.g)*100H+gfxColor.b)*100H+gfxColor.a)
  78. END GfxColorToColor;
  79. (* ????
  80. PROCEDURE SetFont*(f: WMGraphics.Font);
  81. BEGIN
  82. SetFont^(f);
  83. Gfx.SetFontName(gfxContext, f.name, SHORT(f.size));
  84. END SetFont;
  85. *)
  86. PROCEDURE DrawString*(x, y: LONGINT; CONST text : ARRAY OF CHAR);
  87. BEGIN
  88. ASSERT(font#NIL);
  89. Gfx.DrawStringAt(gfxContext, x, y, text);
  90. END DrawString;
  91. PROCEDURE Line*(x0, y0, x1, y1 : LONGINT; lineColor : WMGraphics.Color; mode : LONGINT); (*this is a heavy duty procedure that can be called millions of times in time-varying or scrolled graphs - optimize*)
  92. BEGIN
  93. IF lineColor # color THEN
  94. SetColor(lineColor);
  95. END;
  96. Gfx.DrawLine(gfxContext, dx+x0, dy+y0, dx+x1, dy+y1, {Gfx.Stroke}); (*may be refined by plotting to upper/lower boundary*)
  97. (* Performance issue: Gfx.DrawLine expects REAL coordinates; inside of Gfx a coordinate transformation and conversion from REAL to Integer pixel position will happen again *)
  98. END Line;
  99. (** draw circle in requested mode (clockwise if r > 0, counterclockwise if r < 0) **)
  100. PROCEDURE Circle(x,y,r:LONGINT); (*tentative -this method will be changed*)
  101. BEGIN
  102. Gfx.DrawCircle(gfxContext, x,y,r, {Gfx.Stroke});
  103. END Circle;
  104. (*to be extended by various Gfx specific drawing primitives*)
  105. END Canvas;
  106. PROCEDURE GenCanvas*(img:Raster.Image):WMGraphics.BufferCanvas; (* generator procedure *)
  107. VAR c:Canvas;
  108. BEGIN
  109. NEW(c,img); RETURN c (* img is NIL, needs a call of c.New(img) later on *)
  110. END GenCanvas;
  111. PROCEDURE Test*; (* will be removed *)
  112. VAR w:WMWindowManager.BufferWindow; c: WMGraphics.BufferCanvas;
  113. BEGIN
  114. NEW(w, 300,400, FALSE);
  115. w.SetCanvasGenerator(GenCanvas);
  116. c:=w.canvas;
  117. c.Fill(w.bounds, WMGraphics.Red, WMGraphics.ModeCopy);
  118. c(Canvas).SetDashLength(10);
  119. c.SetLineWidth(1);
  120. c.Line(50,50,100,100, WMGraphics.Blue, WMGraphics.ModeCopy);
  121. c.SetLineWidth(3);
  122. c.Line(50,50,120,110, WMGraphics.Blue, WMGraphics.ModeCopy);
  123. c.SetPixel (50,30, WMGraphics.White, WMGraphics.ModeCopy);
  124. c(Canvas).SetFillColor(WMGraphics.Yellow);
  125. c.DrawString(60,40,"Hello World");
  126. c.SetColor(WMGraphics.Black);
  127. c.SetLineWidth(3);
  128. c(Canvas).Circle(150,200, 100);
  129. WMWindowManager.DefaultAddWindow(w);
  130. w.Invalidate(w.bounds);
  131. END Test;
  132. END WMGraphicsGfx.
  133. WMGraphicsGfx.Test ~
  134. System.FreeDownTo WMGraphicsGfx ~