Subversion Repositories Kolibri OS

Rev

Rev 9174 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2021 Anton Krotov
  3.  
  4.     This file is part of CEdit.
  5.  
  6.     CEdit is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     CEdit is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with CEdit. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Graph;
  21.  
  22. IMPORT SYSTEM, K := KOSAPI;
  23.  
  24. CONST
  25.  
  26.     modeCOPY = 0;
  27.     modeNOT  = 1;
  28.     modeXOR  = 2;
  29.  
  30. TYPE
  31.  
  32.     tFont* = POINTER TO RECORD
  33.         handle*: INTEGER;
  34.         height*: INTEGER;
  35.         width*:  INTEGER;
  36.         size:    INTEGER;
  37.         name*:   ARRAY 256 OF WCHAR
  38.     END;
  39.  
  40.     tCanvas* = POINTER TO RECORD
  41.         bitmap: INTEGER;
  42.         width*, height*: INTEGER;
  43.         color, backColor, textColor: INTEGER;
  44.         font*: tFont;
  45.         mode: INTEGER
  46.     END;
  47.  
  48.  
  49. PROCEDURE DrawCanvas* (canvas: tCanvas; x, y: INTEGER);
  50. BEGIN
  51.     K.sysfunc7(65, canvas.bitmap, canvas.width*65536 + canvas.height, x*65536 + y, 32, 0, 0);
  52. END DrawCanvas;
  53.  
  54.  
  55. PROCEDURE SetColor* (canvas: tCanvas; color: INTEGER);
  56. BEGIN
  57.     canvas.color := color
  58. END SetColor;
  59.  
  60.  
  61. PROCEDURE SetTextColor* (canvas: tCanvas; color: INTEGER);
  62. BEGIN
  63.     canvas.textColor := color
  64. END SetTextColor;
  65.  
  66.  
  67. PROCEDURE SetBkColor* (canvas: tCanvas; color: INTEGER);
  68. BEGIN
  69.     canvas.backColor := color
  70. END SetBkColor;
  71.  
  72.  
  73. PROCEDURE CreateFont* (height: INTEGER; name: ARRAY OF WCHAR; attr: SET): tFont;
  74. VAR
  75.     font: tFont;
  76. BEGIN
  77.     NEW(font);
  78.     font.size := MAX(MIN(height, 8), 1);
  79.     font.width := font.size*8;
  80.     font.height := font.size*16;
  81.     DEC(font.size);
  82.     font.name := name
  83.     RETURN font
  84. END CreateFont;
  85.  
  86.  
  87. PROCEDURE SetFont* (canvas: tCanvas; font: tFont);
  88. BEGIN
  89.     canvas.font := font
  90. END SetFont;
  91.  
  92.  
  93. PROCEDURE HLine* (canvas: tCanvas; y, x1, x2: INTEGER);
  94. VAR
  95.     X1, X2, i: INTEGER;
  96.     ptr: INTEGER;
  97.     color: INTEGER;
  98. BEGIN
  99.     X1 := MAX(MIN(x1, x2), 0);
  100.     X2 := MIN(MAX(x1, x2), canvas.width - 1);
  101.     IF (0 <= y) & (y < canvas.height) THEN
  102.         color := canvas.color;
  103.         ptr := canvas.bitmap + y*canvas.width*4 + X1*4;
  104.         FOR i := X1 TO X2 DO
  105.             SYSTEM.PUT32(ptr, color);
  106.             INC(ptr, 4)
  107.         END
  108.     END
  109. END HLine;
  110.  
  111.  
  112. PROCEDURE VLine* (canvas: tCanvas; x, y1, y2: INTEGER);
  113. VAR
  114.     Y1, Y2, i: INTEGER;
  115.     ptr: INTEGER;
  116.     color: INTEGER;
  117. BEGIN
  118.     Y1 := MAX(MIN(y1, y2), 0);
  119.     Y2 := MIN(MAX(y1, y2), canvas.height - 1);
  120.     IF (0 <= x) & (x < canvas.width) THEN
  121.         color := canvas.color;
  122.         ptr := canvas.bitmap + Y1*canvas.width*4 + x*4;
  123.         FOR i := Y1 TO Y2 DO
  124.             IF canvas.mode = modeNOT THEN
  125.                 SYSTEM.GET32(ptr, color);
  126.                 color := ORD(-BITS(color)*{0..23})
  127.             ELSIF canvas.mode = modeXOR THEN
  128.                 SYSTEM.GET32(ptr, color);
  129.                 color := ORD((BITS(color)/BITS(canvas.color))*{0..23})
  130.             END;
  131.             SYSTEM.PUT32(ptr, color);
  132.             INC(ptr, canvas.width*4)
  133.         END
  134.     END
  135. END VLine;
  136.  
  137.  
  138. PROCEDURE notVLine* (canvas: tCanvas; x, y1, y2: INTEGER);
  139. BEGIN
  140.     IF (0 <= y1) & (y1 < canvas.height) & (0 <= y2) & (y2 < canvas.height) THEN
  141.         canvas.mode := modeNOT;
  142.         VLine(canvas, x, y1, y2);
  143.         canvas.mode := modeCOPY
  144.     END
  145. END notVLine;
  146.  
  147.  
  148. PROCEDURE xorVLine* (canvas: tCanvas; x, y1, y2: INTEGER);
  149. BEGIN
  150.     IF (0 <= y1) & (y1 < canvas.height) & (0 <= y2) & (y2 < canvas.height) THEN
  151.         canvas.mode := modeXOR;
  152.         SetColor(canvas, 0FF0000H);
  153.         VLine(canvas, x, y1, y2);
  154.         canvas.mode := modeCOPY
  155.     END
  156. END xorVLine;
  157.  
  158.  
  159. PROCEDURE DLine* (canvas: tCanvas; x1, x2, y: INTEGER; k: INTEGER);
  160. VAR
  161.     ptr: INTEGER;
  162.     color: INTEGER;
  163.     d: INTEGER;
  164. BEGIN
  165.     color := canvas.color;
  166.     ptr := canvas.bitmap + y*canvas.width*4 + x1*4;
  167.     IF k = -1 THEN
  168.         d := canvas.width*4 + 4
  169.     ELSIF k = 1 THEN
  170.         d := 4 - canvas.width*4
  171.     END;
  172.     WHILE x1 <= x2 DO
  173.         SYSTEM.PUT32(ptr, color);
  174.         INC(ptr, d);
  175.         INC(x1)
  176.     END
  177. END DLine;
  178.  
  179.  
  180. PROCEDURE FillRect* (canvas: tCanvas; left, top, right, bottom: INTEGER);
  181. VAR
  182.     y: INTEGER;
  183. BEGIN
  184.     FOR y := top TO bottom DO
  185.         HLine(canvas, y, left, right)
  186.     END
  187. END FillRect;
  188.  
  189.  
  190. PROCEDURE Rect* (canvas: tCanvas; left, top, right, bottom: INTEGER);
  191. BEGIN
  192.     HLine(canvas, top, left, right);
  193.     HLine(canvas, bottom, left, right);
  194.     VLine(canvas, left, top, bottom);
  195.     VLine(canvas, right, top, bottom)
  196. END Rect;
  197.  
  198.  
  199. PROCEDURE clear* (canvas: tCanvas);
  200. VAR
  201.     ptr, ptr2, w, i: INTEGER;
  202. BEGIN
  203.     HLine(canvas, 0, 0, canvas.width - 1);
  204.     w := canvas.width*4;
  205.     ptr := canvas.bitmap;
  206.     ptr2 := ptr;
  207.     i := canvas.height - 1;
  208.     WHILE i > 0 DO
  209.         INC(ptr2, w);
  210.         SYSTEM.MOVE(ptr, ptr2, w);
  211.         DEC(i)
  212.     END
  213. END clear;
  214.  
  215.  
  216. PROCEDURE TextOut* (canvas: tCanvas; x, y: INTEGER; text: INTEGER; n: INTEGER);
  217. CONST
  218.     WCHAR_SIZE = 2;
  219. VAR
  220.     color, i: INTEGER;
  221. BEGIN
  222.     IF (0 <= y) & (y <= canvas.height - canvas.font.height - 1) THEN
  223.         IF x < 0 THEN
  224.             i := -(x DIV canvas.font.width);
  225.             INC(x, i*canvas.font.width);
  226.             DEC(n, i)
  227.         ELSE
  228.             i := 0
  229.         END;
  230.         IF n > 0 THEN
  231.             n := MAX(MIN(n, (canvas.width - x) DIV canvas.font.width), 0);
  232.             color := canvas.color;
  233.             canvas.color := canvas.backColor;
  234.             FillRect(canvas, x, y, x + n*canvas.font.width, y + canvas.font.height);
  235.             canvas.color := color;
  236. (*            WHILE n > 0 DO
  237.                 K.sysfunc6(4, x*65536 + y, LSL(28H + canvas.font.size, 24) + canvas.textColor, text + i*WCHAR_SIZE, 1, canvas.bitmap - 8);
  238.                 INC(x, canvas.font.width);
  239.                 INC(i);
  240.                 DEC(n)
  241.             END*)
  242.             K.sysfunc6(4, x*65536 + y, LSL(28H + canvas.font.size, 24) + canvas.textColor, text + i*WCHAR_SIZE, n, canvas.bitmap - 8)
  243.         END
  244.     END
  245. END TextOut;
  246.  
  247.  
  248. PROCEDURE TextOut2* (canvas: tCanvas; x, y: INTEGER; text: ARRAY OF WCHAR; n: INTEGER);
  249. BEGIN
  250.     TextOut(canvas, x, y, SYSTEM.ADR(text[0]), n)
  251. END TextOut2;
  252.  
  253.  
  254. PROCEDURE CreateCanvas* (width, height: INTEGER): tCanvas;
  255. VAR
  256.     canvas: tCanvas;
  257. BEGIN
  258.     NEW(canvas);
  259.     canvas.bitmap := K.malloc(width*height*4 + 8);
  260.     ASSERT(canvas.bitmap # 0);
  261.     SYSTEM.PUT32(canvas.bitmap, width);
  262.     SYSTEM.PUT32(canvas.bitmap + 4, height);
  263.     INC(canvas.bitmap, 8);
  264.     canvas.width := width;
  265.     canvas.height := height;
  266.     canvas.mode := modeCOPY
  267.     RETURN canvas
  268. END CreateCanvas;
  269.  
  270.  
  271. PROCEDURE destroy* (VAR canvas: tCanvas);
  272. BEGIN
  273.     IF canvas # NIL THEN
  274.         canvas.bitmap := K.free(canvas.bitmap);
  275.         DISPOSE(canvas)
  276.     END
  277. END destroy;
  278.  
  279.  
  280. END Graph.