Subversion Repositories Kolibri OS

Rev

Rev 9902 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2021-2023 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 Icons;
  21.  
  22. IMPORT
  23.         Graph, File, SYSTEM, KOSAPI;
  24.  
  25. CONST
  26.         fileName = "/sys/Icons16.png";
  27.         libName = "libimg.obj";
  28.  
  29.         SIZE* = 18;
  30.  
  31.         icoNew    *=  0;
  32.         icoOpen   *=  1;
  33.         icoSave   *=  2;
  34.         icoSearch *=  3;
  35.         icoUndo   *=  4;
  36.         icoRedo   *=  5;
  37.         icoBuild  *=  6;
  38.         icoRun    *=  7;
  39.  
  40.         NumberOfIcons = 8;
  41.  
  42.  
  43. PROCEDURE [stdcall, libName, ""] img_decode (data, size, options: INTEGER): INTEGER; END;
  44. PROCEDURE [stdcall, libName, ""] img_convert (src, dst, dst_type, flags, param: INTEGER): INTEGER; END;
  45. PROCEDURE [stdcall, libName, ""] img_destroy (img: INTEGER); END;
  46.  
  47.  
  48. PROCEDURE GetImg (ptr, size: INTEGER): INTEGER;
  49. VAR
  50.         image_data, dst, x, Type: INTEGER;
  51. BEGIN
  52.         image_data := img_decode(ptr, size, 0);
  53.         IF image_data # 0 THEN
  54.                 SYSTEM.GET(image_data + 4, x);
  55.                 ASSERT(x = SIZE);
  56.                 SYSTEM.GET(image_data + 20, Type);
  57.                 IF Type # 3 THEN
  58.                         dst := img_convert(image_data, 0, 3, 0, 0);
  59.                         img_destroy(image_data);
  60.                         image_data := dst
  61.                 END
  62.         END
  63.         RETURN image_data
  64. END GetImg;
  65.  
  66.  
  67. PROCEDURE load (): INTEGER;
  68. VAR
  69.         size, res, ptr: INTEGER;
  70. BEGIN
  71.         res := 0;
  72.         ptr := File.Load(fileName, size);
  73.         IF ptr # 0 THEN
  74.                 res := GetImg(ptr, size);
  75.                 ptr := KOSAPI.free(ptr)
  76.         END
  77.         RETURN res
  78. END load;
  79.  
  80.  
  81. PROCEDURE draw* (icons, n, x, y: INTEGER);
  82. BEGIN
  83.         KOSAPI.sysfunc7(65, icons + SIZE*SIZE*4*n, SIZE*65536 + SIZE, x*65536 + y, 32, 0, 0)
  84. END draw;
  85.  
  86.  
  87. PROCEDURE copy (img: INTEGER; n: INTEGER; dst: INTEGER; m: INTEGER);
  88. VAR
  89.         data: INTEGER;
  90. BEGIN
  91.         SYSTEM.GET(img + 24, data);
  92.         SYSTEM.MOVE(data + SIZE*SIZE*4*n, dst + SIZE*SIZE*4*m, SIZE*SIZE*4)
  93. END copy;
  94.  
  95.  
  96. PROCEDURE iconsBackColor (icons: INTEGER; BackColor: INTEGER);
  97. VAR
  98.         data, x, y, pix: INTEGER;
  99.         b, g, r, gr: BYTE;
  100. BEGIN
  101.         data := icons;
  102.         FOR y := 0 TO SIZE*NumberOfIcons - 1 DO
  103.                 FOR x := 0 TO SIZE - 1 DO
  104.                         SYSTEM.GET32(data, pix);
  105.                         Graph.getRGB(pix, r, g, b);
  106.                         gr := (r + g + b) DIV 3;
  107.                         IF BackColor = -1 THEN
  108.                                 pix := gr + 256*gr + 65536*gr
  109.                         ELSIF gr = 255 THEN
  110.                                 pix := BackColor
  111.                         END;
  112.                         SYSTEM.PUT32(data, pix);
  113.                         INC(data, 4)
  114.                 END
  115.         END
  116. END iconsBackColor;
  117.  
  118.  
  119. PROCEDURE get* (VAR icons, grayIcons: INTEGER; BackColor: INTEGER);
  120. VAR
  121.         source: INTEGER;
  122. BEGIN
  123.         source := load();
  124.         IF source # 0 THEN
  125.                 icons := KOSAPI.malloc(SIZE*SIZE*4*NumberOfIcons*2);
  126.                 grayIcons := icons + SIZE*SIZE*4*NumberOfIcons;
  127.  
  128.                 copy(source,  2, icons, icoNew);
  129.                 copy(source,  0, icons, icoOpen);
  130.                 copy(source,  5, icons, icoSave);
  131.                 copy(source, 49, icons, icoSearch);
  132.                 copy(source, 37, icons, icoUndo);
  133.                 copy(source, 36, icons, icoRedo);
  134.                 copy(source, 54, icons, icoBuild);
  135.                 copy(source, 53, icons, icoRun);
  136.                 img_destroy(source);
  137.                 source := 0;
  138.                 SYSTEM.MOVE(icons, grayIcons, SIZE*SIZE*4*NumberOfIcons);
  139.  
  140.                 iconsBackColor(grayIcons, -1);
  141.                 iconsBackColor(grayIcons, BackColor);
  142.                 iconsBackColor(icons, BackColor)
  143.         END
  144. END get;
  145.  
  146. END Icons.