Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Icon Editor for KolibriOS
  3.  * Authors: Leency, Nicolas
  4.  * Licence: GPL v2
  5. */
  6.  
  7. #define MEMSIZE 4096*500
  8.  
  9. #include "../lib/gui.h"
  10. #include "../lib/random.h"
  11. #include "../lib/mem.h"
  12. #include "../lib/cursor.h"
  13.  
  14. #include "../lib/obj/libimg.h"
  15. #include "../lib/obj/box_lib.h"
  16.  
  17. #include "../lib/patterns/rgb.h"
  18. #include "../lib/patterns/libimg_load_skin.h"
  19.  
  20. #include "colors_mas.h"
  21.  
  22. #ifndef AUTOBUILD
  23. #include "lang.h--"
  24. #endif
  25.  
  26. //===================================================//
  27. //                                                   //
  28. //                       DATA                        //
  29. //                                                   //
  30. //===================================================//
  31.  
  32. #ifdef LANG_RUS
  33. #define T_NOTIFY_OPEN "'IconEdit
  34. ‚ ¤ ­­ë© ¬®¬¥­â IconEdit ¬®¦¥â ®âªà뢠âì ⮫쪮 ¨ª®­ª¨, ᮧ¤ ­­ë¥ ¢ á ¬®¬ । ªâ®à¥.
  35. …᫨ ­ã¦­® ®âªàëâì ¤à㣮¥ ¨§®¡à ¦¥­¨¥, ¢®á¯®«ì§ã©â¥áì ¨­áâà㬥­â®¬ <”®â® ¯¯ à â>
  36. ¤«ï § å¢ â  ª à⨭ª¨ á íªà ­ .' -Wt"
  37. #else
  38. #define T_NOTIFY_OPEN "'IconEdit
  39. You can open only files created in IconEdit for now!
  40. In other case please use <Photo> tool to get an image from screen.' -Wt"
  41. #endif
  42.  
  43.  
  44. #define T_TITLE "Icon Editor 0.58 Alpha"
  45.  
  46. #define TOPBAR_H    24+8
  47. #define LEFTBAR_W 16+5+5+3+3
  48. #define PALLETE_SIZE 116
  49.  
  50. #define PAL_ITEMS_X_COUNT 13
  51. #define COLSIZE 18
  52. #define RIGHT_BAR_W PAL_ITEMS_X_COUNT*COLSIZE
  53.  
  54. #define TO_CANVAS_X(xval) xval - canvas.x/zoom.value
  55. #define TO_CANVAS_Y(yval) yval - canvas.y/zoom.value
  56.  
  57. block canvas = { NULL, NULL, NULL, NULL };
  58. block wrapper = { LEFTBAR_W, TOPBAR_H, NULL, NULL };
  59. block right_bar = { NULL, 10+TOPBAR_H, RIGHT_BAR_W+10, NULL };
  60.  
  61. dword linear_gradient[RIGHT_BAR_W];
  62. block b_color_gradient = {NULL, 40+TOPBAR_H, RIGHT_BAR_W, 25};
  63. //block b_opacity_gradient = {NULL, 75+TOPBAR_H, RIGHT_BAR_W, 15};
  64. block b_last_colors = {NULL, 75+TOPBAR_H, RIGHT_BAR_W, COLSIZE};
  65. block b_default_palette = {NULL, COLSIZE+10+75+TOPBAR_H, RIGHT_BAR_W, COLSIZE*9};
  66.  
  67. dword transparent = 0xBFCAD2;
  68. dword color1 = 0x000000;
  69. dword color2 = 0xBFCAD2;
  70. dword tool_color;
  71.  
  72. signed hoverX;
  73. signed hoverY;
  74. signed priorHoverX;
  75. signed priorHoverY;
  76. bool canvasMouseMoved = false;
  77.  
  78. enum {
  79.         BTN_NEW = 40,
  80.         BTN_OPEN,
  81.         BTN_SAVE,
  82.         BTN_MOVE_LEFT,
  83.         BTN_MOVE_RIGHT,
  84.         BTN_MOVE_UP,
  85.         BTN_MOVE_DOWN,
  86.         BTN_FLIP_HOR,
  87.         BTN_FLIP_VER,
  88.         BTN_ROTATE_LEFT,
  89.         BTN_ROTATE_RIGHT,
  90.         BTN_TEST_ICON,
  91.         BTN_PENCIL,
  92.         BTN_PICK,
  93.         BTN_FILL,
  94.         BTN_LINE,
  95.         BTN_RECT,
  96.         BTN_BAR,
  97.         BTN_SELECT,
  98.         BTN_SCREEN_COPY,
  99.         BTN_ZOOM_IN,
  100.         BTN_ZOOM_OUT,
  101.         BTN_CANVAS_RESIZE,
  102.         BTN_CROP,
  103.         BTNS_PALETTE_COLOR_MAS = 100,
  104.         BTNS_LAST_USED_COLORS = 400
  105. };
  106.  
  107. proc_info Form;
  108. dword semi_white;
  109. bool bg_dark=false;
  110.  
  111. more_less_box zoom = { 11, 1, 40, "Zoom" };
  112.  
  113. dword default_palette[] = {
  114. 0x330000,0x331900,0x333300,0x193300,0x003300,0x003319,0x003333,0x001933,0x000033,0x190033,
  115. 0x330033,0x330019,0x000000,0x660000,0x663300,0x666600,0x336600,0x006600,0x006633,0x006666,
  116. 0x003366,0x000066,0x330066,0x660066,0x660033,0x202020,0x990000,0x994C00,0x999900,0x4C9900,
  117. 0x009900,0x00994C,0x009999,0x004C99,0x000099,0x4C0099,0x990099,0x99004C,0x404040,0xCC0000,
  118. 0xCC6600,0xCCCC00,0x66CC00,0x00CC00,0x00CC66,0x00CCCC,0x0066CC,0x0000CC,0x6600CC,0xCC00CC,
  119. 0xCC0066,0x606060,0xFF0000,0xFF8000,0xFFFF00,0x80FF00,0x00FF00,0x00FF80,0x00FFFF,0x0080FF,
  120. 0x0000FF,0x7F00FF,0xFF00FF,0xFF007F,0x808080,0xFF3333,0xFF9933,0xFFFF33,0x99FF33,0x33FF33,
  121. 0x33FF99,0x33FFFF,0x3399FF,0x3333FF,0x9933FF,0xFF33FF,0xFF3399,0xA0A0A0,0xFF6666,0xFFB266,
  122. 0xFFFF66,0xB2FF66,0x66FF66,0x66FFB2,0x66FFFF,0x66B2FF,0x6666FF,0xB266FF,0xFF66FF,0xFF66B2,
  123. 0xC0C0C0,0xFF9999,0xFFCC99,0xFFFF99,0xCCFF99,0x99FF99,0x99FFCC,0x99FFFF,0x99CCFF,0x9999FF,
  124. 0xCC99FF,0xFF99FF,0xFF99CC,0xE0E0E0,0xFFCCCC,0xFFE5CC,0xFFFFCC,0xE5FFCC,0xCCFFCC,0xCCFFE5,
  125. 0xCCFFFF,0xCCE5FF,0xCCCCFF,0xE5CCFF,0xFFCCFF,0xFFCCE5,0xFFFFFF 
  126. };
  127.  
  128. #define LAST_USED_MAX 13
  129. dword last_used_colors[LAST_USED_MAX] = {
  130. 0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
  131. 0xFFFFFF,0xFFFFFF,0xFFFFFF
  132. };
  133.  
  134. CustomCursor Cursor;
  135. dword CursorBar = FROM "cursors/bar.cur";
  136. dword CursorFill = FROM "cursors/fill.cur";
  137. dword CursorLine = FROM "cursors/line.cur";
  138. dword CursorPencil = FROM "cursors/pencil.cur";
  139. dword CursorPipette = FROM "cursors/pipette.cur";
  140. dword CursorRectangle = FROM "cursors/rectangle.cur";
  141. dword CursorSelect = FROM "cursors/select.cur";
  142.  
  143. _image image;
  144.  
  145. #include "actions_history.h"
  146.  
  147. _ActionsHistory actionsHistory;
  148.  
  149. #include "tools.h"
  150. #include "canvas_resize.h"
  151.  
  152. //===================================================//
  153. //                                                   //
  154. //                       CODE                        //
  155. //                                                   //
  156. //===================================================//
  157.  
  158. libimg_image top_icons;
  159. libimg_image left_icons;
  160.  
  161. void main()
  162. {
  163.         word btn;
  164.         libimg_image open_image;
  165.         dword bg_col;
  166.  
  167.         load_dll(libio,  #libio_init,  1);
  168.         load_dll(libimg, #libimg_init, 1);
  169.         load_dll(boxlib, #box_lib_init,0);
  170.  
  171.         Libimg_LoadImage(#top_icons, "/sys/icons16.png");
  172.         Libimg_LoadImage(#left_icons, "/sys/icons16.png");
  173.  
  174.         system.color.get();
  175.         bg_col = system.color.work;
  176.         if (GrayScaleImage(#bg_col,1,1)<65) bg_dark=true; else bg_dark=false;
  177.  
  178.         semi_white = MixColors(system.color.work, 0xFFFfff, bg_dark*90 + 96);
  179.         Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffFFFfff, semi_white);
  180.         Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffCACBD6, MixColors(semi_white, 0, 220));
  181.  
  182.         Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xffFFFfff, system.color.work);
  183.         Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xffCACBD6, MixColors(system.color.work, 0, 200));
  184.  
  185.         //fix line and rectandle color for dark skins
  186.         if (bg_dark) Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xff545454, 0xffD3D3D4);
  187.  
  188.         EventSetActiveColor(1, color1);
  189.  
  190.         if (!param[0]) {
  191.                 image.create(32, 32);
  192.         }
  193.         else
  194.         {
  195.                 Libimg_LoadImage(#open_image, #param);
  196.  
  197.                 if (open_image.w*open_image.h>MAX_CELL_SIZE*MAX_CELL_SIZE) {
  198.                         notify("'Hey, this is just an icon editor,\nselected image is too big to open!' -E");
  199.                         ExitProcess();
  200.                 }
  201.                 else {
  202.                         image.create(open_image.h, open_image.w);
  203.                         image.set_image(open_image.imgsrc);
  204.                 }
  205.         }
  206.  
  207.         actionsHistory.init();
  208.  
  209.         initTools();
  210.         setCurrentTool(TOOL_PENCIL);
  211.        
  212.         SetEventMask(EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER);
  213.  
  214.         loop() switch(WaitEvent())
  215.         {
  216.                 case evMouse:
  217.                         if (Window_CanvasReSize.thread_exists()) break;
  218.                         mouse.get();
  219.                        
  220.                         if (mouse.lkm) tool_color = color1;
  221.                         if (mouse.pkm) tool_color = color2;
  222.                         if (mouse.mkm) break;
  223.  
  224.                         hoverX = mouse.x - canvas.x / zoom.value;
  225.                         hoverY = mouse.y - canvas.y / zoom.value;
  226.                         if (hoverX<0) hoverX = 0;
  227.                         if (hoverY<0) hoverY = 0;
  228.                         if (hoverX>image.columns-1) hoverX = image.columns-1;
  229.                         if (hoverY>image.rows-1) hoverY = image.rows-1;
  230.                         canvasMouseMoved = false;
  231.                         if (priorHoverX != hoverX) canvasMouseMoved = true;
  232.                         if (priorHoverY != hoverY) canvasMouseMoved = true;
  233.                         priorHoverX = hoverX;
  234.                         priorHoverY = hoverY;
  235.                         //DrawBar(Form.cwidth-100, 3, 80, 12, 0xFFFfff);
  236.                         //WriteText(Form.cwidth-100, 3, 0x80, 0x000000,
  237.                         //      sprintf(#param, "%i %i", hoverX, hoverY));
  238.  
  239.                         if (currentTool != TOOL_NONE)
  240.                                 tools[currentTool].onMouseEvent(mouse.x, mouse.y, mouse.lkm, mouse.pkm);
  241.  
  242.                         if (mouse.vert) {
  243.                                 if (mouse.vert==65535) zoom.inc();
  244.                                 if (mouse.vert==1) zoom.dec();
  245.                                 DrawEditArea();
  246.                         }
  247.  
  248.                         if (wrapper.hovered()) SetCursor();
  249.                         else Cursor.Restore();
  250.  
  251.                         if (mouse.down) {
  252.                                 if (b_color_gradient.hovered())
  253.                                 || (b_last_colors.hovered())
  254.                                 || (b_default_palette.hovered()) {
  255.                                         if (mouse.key&MOUSE_LEFT) EventSetActiveColor(1, GetPixelUnderMouse());
  256.                                         if (mouse.key&MOUSE_RIGHT) EventSetActiveColor(2, GetPixelUnderMouse());
  257.                                 }      
  258.                         }
  259.  
  260.                         break;
  261.  
  262.                 case evButton:
  263.                         if (Window_CanvasReSize.thread_exists()) break;
  264.                         btn = GetButtonID();
  265.  
  266.                         if (zoom.click(btn)) DrawEditArea();
  267.  
  268.                         switch(btn)
  269.                         {
  270.                                 case BTN_NEW:
  271.                                         EventCreateNewIcon();
  272.                                         break;
  273.                                 case BTN_OPEN:
  274.                                         EventOpenIcon();
  275.                                         break;
  276.                                 case BTN_SAVE:
  277.                                         EventSaveIconToFile();
  278.                                         break;
  279.                                 case BTN_MOVE_LEFT:
  280.                                         EventMove(MOVE_LEFT);
  281.                                         break;
  282.                                 case BTN_MOVE_RIGHT:
  283.                                         EventMove(MOVE_RIGHT);
  284.                                         break;
  285.                                 case BTN_MOVE_UP:
  286.                                         EventMove(MOVE_UP);
  287.                                         break;
  288.                                 case BTN_MOVE_DOWN:
  289.                                         EventMove(MOVE_DOWN);
  290.                                         break;
  291.                                 case BTN_FLIP_VER:
  292.                                         EventMove(FLIP_VER);
  293.                                         break;
  294.                                 case BTN_FLIP_HOR:
  295.                                         EventMove(FLIP_HOR);
  296.                                         break;
  297.                                 case BTN_ROTATE_LEFT:
  298.                                         EventMove(ROTATE_LEFT);
  299.                                         break;
  300.                                 case BTN_ROTATE_RIGHT:
  301.                                         EventMove(ROTATE_RIGHT);
  302.                                         break;
  303.                                 case BTN_TEST_ICON:
  304.                                         EventTestIcon();
  305.                                         break;
  306.                                 case BTN_PENCIL:
  307.                                         setCurrentTool(TOOL_PENCIL);
  308.                                         break;
  309.                                 case BTN_PICK:
  310.                                         setCurrentTool(TOOL_PIPETTE);
  311.                                         break;
  312.                                 case BTN_FILL:
  313.                                         setCurrentTool(TOOL_FILL);
  314.                                         break;
  315.                                 case BTN_LINE:
  316.                                         setCurrentTool(TOOL_LINE);
  317.                                         break;
  318.                                 case BTN_RECT:
  319.                                         setCurrentTool(TOOL_RECT);
  320.                                         break;
  321.                                 case BTN_BAR:
  322.                                         setCurrentTool(TOOL_BAR);
  323.                                         break;
  324.                                 case BTN_SELECT:
  325.                                         setCurrentTool(TOOL_SELECT);
  326.                                         break;
  327.                                 case BTN_SCREEN_COPY:
  328.                                         setCurrentTool(TOOL_SCREEN_COPY);
  329.                                         break;
  330.                                 case BTN_CANVAS_RESIZE:
  331.                                         notify("Sorry, not implemented yet.");
  332.                                         break;
  333.                                 case BTN_CROP:
  334.                                         EventCrop();
  335.                                         break;
  336.                                 case CLOSE_BTN:
  337.                                         EventExitIconEdit();
  338.                                         break;
  339.                         }
  340.                         break;
  341.          
  342.                 case evKey:
  343.                         GetKeys();
  344.  
  345.                         if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL)
  346.                         {
  347.                                 switch(key_scancode)
  348.                                 {
  349.                                         case SCAN_CODE_KEY_S:
  350.                                                 EventSaveIconToFile();
  351.                                                 break;
  352.                                         case SCAN_CODE_KEY_O:
  353.                                                 EventOpenIcon();
  354.                                                 break;
  355.                                         case SCAN_CODE_LEFT:
  356.                                                 EventMove(MOVE_LEFT);
  357.                                                 break;
  358.                                         case SCAN_CODE_RIGHT:
  359.                                                 EventMove(MOVE_RIGHT);
  360.                                                 break;
  361.                                         case SCAN_CODE_UP:
  362.                                                 EventMove(MOVE_UP);
  363.                                                 break;
  364.                                         case SCAN_CODE_DOWN:
  365.                                                 EventMove(MOVE_DOWN);
  366.                                                 break;
  367.                                         case SCAN_CODE_KEY_R:
  368.                                                 EventMove(BTN_ROTATE_RIGHT);
  369.                                                 break;
  370.                                         case SCAN_CODE_KEY_L:
  371.                                                 EventMove(BTN_ROTATE_LEFT);
  372.                                                 break;
  373.                                 }
  374.                         }
  375.  
  376.                         if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) {
  377.                                 if (key_scancode == SCAN_CODE_DEL) EventCleanCanvas();
  378.                         }
  379.  
  380.                         if (currentTool != TOOL_NONE) && (tools[currentTool].onKeyEvent != 0)
  381.                                 tools[currentTool].onKeyEvent(key_scancode);
  382.  
  383.                         if (key_scancode == SCAN_CODE_KEY_P) setCurrentTool(TOOL_PENCIL);
  384.                         if (key_scancode == SCAN_CODE_KEY_I) setCurrentTool(TOOL_PIPETTE);
  385.                         if (key_scancode == SCAN_CODE_KEY_F) setCurrentTool(TOOL_FILL);
  386.                         if (key_scancode == SCAN_CODE_KEY_L) setCurrentTool(TOOL_LINE);
  387.                         if (key_scancode == SCAN_CODE_KEY_R) setCurrentTool(TOOL_RECT);
  388.                         if (key_scancode == SCAN_CODE_KEY_B) setCurrentTool(TOOL_BAR);
  389.                         if (key_scancode == SCAN_CODE_KEY_S) setCurrentTool(TOOL_SELECT);
  390.  
  391.                         if (key_scancode == SCAN_CODE_KEY_T) EventTestIcon();
  392.  
  393.                         if (key_scancode == SCAN_CODE_KEY_Z) actionsHistory.undoLastAction();
  394.                         if (key_scancode == SCAN_CODE_KEY_Y) actionsHistory.redoLastAction();
  395.  
  396.                         if (key_scancode == SCAN_CODE_MINUS) {zoom.dec(); DrawEditArea();}
  397.                         if (key_scancode == SCAN_CODE_PLUS)  {zoom.inc(); DrawEditArea();}
  398.  
  399.                         break;
  400.                  
  401.                 case evReDraw:
  402.                         Window_CanvasReSize.thread_exists();
  403.                         DrawWindow();
  404.                         break;
  405.         }
  406. }
  407.  
  408. void DrawTopPanelButton(dword _id, _x, _icon_n)
  409. {
  410.         DrawWideRectangle(_x, 4, 22, 22, 3, semi_white);
  411.         PutPixel(_x,4,system.color.work);
  412.         PutPixel(_x,4+21,system.color.work);
  413.         PutPixel(_x+21,4,system.color.work);
  414.         PutPixel(_x+21,4+21,system.color.work);
  415.         DefineHiddenButton(_x, 4, 21, 21, _id);
  416.         img_draw stdcall(top_icons.image, _x+3, 7, 16, 16, 0, _icon_n*16);
  417. }
  418.  
  419. void DrawLeftPanelButton(dword _id, _y, _icon_n)
  420. {
  421.         int x = 5;
  422.         DrawRectangle(x, _y, 22-1, 22-1, system.color.work);
  423.         DefineHiddenButton(x, _y, 21, 21, _id);
  424.         img_draw stdcall(left_icons.image, x+3, _y+3, 16, 16, 0, _icon_n*16);
  425. }
  426.  
  427. void DrawStatusBar()
  428. {
  429.         zoom.draw(wrapper.x, wrapper.y + wrapper.h + 6);
  430.  
  431.         sprintf(#param,"%i x %i", image.columns, image.rows);
  432.         DrawCaptButton(
  433.                 wrapper.x+wrapper.w-calc(strlen(#param)*8) -6 - 1,
  434.                 zoom.y,
  435.                 calc(strlen(#param)*8)+6,
  436.                 18,
  437.                 BTN_CANVAS_RESIZE,
  438.                 system.color.work_button,
  439.                 system.color.work_button_text,
  440.                 #param
  441.                 );
  442. }
  443.  
  444. void DrawWindow()
  445. {
  446.         #define GAP 27
  447.         #define BLOCK_SPACE 10
  448.         incn tx;
  449.         system.color.get();
  450.         DefineAndDrawWindow(115+random(100), 50+random(100), 700, 540, 0x73, NULL, T_TITLE, 0);
  451.         GetProcessInfo(#Form, SelfInfo);
  452.         if (Form.status_window>2) return;
  453.         if (Form.width  < 560) { MoveSize(OLD,OLD,560,OLD); return; }
  454.         if (Form.height < 430) { MoveSize(OLD,OLD,OLD,430); return; }
  455.  
  456.         right_bar.x = Form.cwidth - right_bar.w;
  457.         b_color_gradient.x = b_last_colors.x = b_default_palette.x = right_bar.x;
  458.         DrawBar(0, 0, Form.cwidth, TOPBAR_H-1, system.color.work);
  459.         DrawBar(0, TOPBAR_H-1, Form.cwidth, 1, system.color.work_graph);
  460.  
  461.         tx.n = 5-GAP;
  462.         DrawTopPanelButton(BTN_NEW,    tx.inc(GAP), 2);
  463.         DrawTopPanelButton(BTN_OPEN,   tx.inc(GAP), 0); //not implemented
  464.         DrawTopPanelButton(BTN_SAVE,   tx.inc(GAP), 5);
  465.         DrawTopPanelButton(BTN_MOVE_LEFT,  tx.inc(GAP+BLOCK_SPACE), 30);
  466.         DrawTopPanelButton(BTN_MOVE_RIGHT, tx.inc(GAP),   31);
  467.         DrawTopPanelButton(BTN_MOVE_UP,    tx.inc(GAP),   32);
  468.         DrawTopPanelButton(BTN_MOVE_DOWN,  tx.inc(GAP),   33);
  469.        
  470.         DrawTopPanelButton(BTN_FLIP_HOR,   tx.inc(GAP+BLOCK_SPACE), 34);
  471.         DrawTopPanelButton(BTN_FLIP_VER,   tx.inc(GAP),   35);
  472.         DrawTopPanelButton(BTN_ROTATE_LEFT,   tx.inc(GAP), 37);
  473.         DrawTopPanelButton(BTN_ROTATE_RIGHT,  tx.inc(GAP), 36);
  474.  
  475.         DrawTopPanelButton(BTN_TEST_ICON,  tx.inc(GAP+BLOCK_SPACE), 12);
  476.  
  477.         DrawTopPanelButton(BTN_CROP,  tx.inc(GAP+BLOCK_SPACE), 46);
  478.        
  479.         DrawEditArea();
  480.  
  481.         DrawBar(0, TOPBAR_H, LEFTBAR_W-1, Form.cheight - TOPBAR_H, system.color.work);
  482.         DrawLeftPanel();
  483.  
  484.         DrawBar(wrapper.x+wrapper.w, TOPBAR_H, Form.cwidth-wrapper.x-wrapper.w,
  485.                 Form.cheight - TOPBAR_H, system.color.work);
  486.         DrawActiveColor(right_bar.y);
  487.         DrawColorPallets();
  488.         DrawPreview();
  489.  
  490.         DrawBar(LEFTBAR_W-1, wrapper.y + wrapper.h, wrapper.w+1,
  491.                 Form.cheight - wrapper.y - wrapper.h, system.color.work);
  492.         DrawStatusBar();
  493. }
  494.  
  495. void DrawLeftPanel()
  496. {
  497.         #define GAP 28
  498.         incn ty;
  499.         ty.n = right_bar.y - GAP - 2;
  500.         DrawLeftPanelButton(BTN_PENCIL, ty.inc(GAP), 38);
  501.         DrawLeftPanelButton(BTN_PICK,   ty.inc(GAP), 39);
  502.         DrawLeftPanelButton(BTN_FILL,   ty.inc(GAP), 40);
  503.         DrawLeftPanelButton(BTN_LINE,   ty.inc(GAP), 41);
  504.         DrawLeftPanelButton(BTN_RECT,   ty.inc(GAP), 42);
  505.         DrawLeftPanelButton(BTN_BAR,    ty.inc(GAP), 43);
  506.         DrawLeftPanelButton(BTN_SELECT, ty.inc(GAP), 44);
  507.         DrawLeftPanelButton(BTN_SCREEN_COPY, ty.inc(GAP), 45);
  508.         DrawRectangle3D(5, currentTool*GAP+right_bar.y-2, 16+3+2, 16+3+2, 0x333333, 0x777777);
  509. }
  510.  
  511. void DrawEditArea()
  512. {
  513.         dword color1=0xC0C0C0;
  514.         int top_side;
  515.         int left_side;
  516.  
  517.         wrapper.w = Form.cwidth - right_bar.w - 10 - wrapper.x;
  518.         wrapper.h = Form.cheight - TOPBAR_H - 35;
  519.  
  520.         //canvas{
  521.         canvas.w = image.columns * zoom.value;
  522.         canvas.h = image.rows * zoom.value;
  523.         if (canvas.w+2 > wrapper.w) || (canvas.h+2 > wrapper.h) {
  524.                 zoom.value--;
  525.                 if (zoom.x) zoom.redraw();
  526.                 DrawEditArea();
  527.                 return;
  528.         }
  529.         canvas.x = -zoom.value*image.columns+wrapper.w/2 + wrapper.x;
  530.         canvas.y = -zoom.value*image.rows+wrapper.h/2 + wrapper.y;
  531.         DrawCanvas();
  532.         //}
  533.  
  534.         left_side = canvas.x-wrapper.x-1;
  535.         top_side = canvas.y-wrapper.y-1;
  536.  
  537.         DrawRectangle(wrapper.x-1, wrapper.y-1, wrapper.w, wrapper.h, system.color.work_graph);
  538.  
  539.         if (left_side>0)
  540.         {
  541.                 DrawBar(wrapper.x, wrapper.y, wrapper.w-1, top_side, color1); //top
  542.                 DrawBar(wrapper.x, wrapper.y+wrapper.h-top_side-1, wrapper.w-1, top_side, color1); //bottom
  543.         }
  544.         if (top_side>0)
  545.         {
  546.                 //left
  547.                 DrawBar(wrapper.x, wrapper.y+top_side, left_side,
  548.                         wrapper.h-top_side-top_side, color1);
  549.                 //right
  550.                 DrawBar(wrapper.x+wrapper.w-left_side-1, wrapper.y+top_side, left_side,
  551.                         wrapper.h-top_side-top_side, color1);
  552.         }
  553.         DrawRectangle(canvas.x-1, canvas.y-1, canvas.w+1, canvas.h+1, 0x808080);
  554. }
  555.  
  556. void DrawActiveColor(dword iny)
  557. {
  558.         #define CELL 20
  559.         static dword outy;
  560.         if (iny != NULL) outy = iny;
  561.         DrawFrame(right_bar.x, outy, CELL, CELL, NULL);
  562.         DrawBar(right_bar.x+2, outy+2, CELL-4, CELL-4, color1);
  563.  
  564.         DrawFrame(right_bar.x+CELL+5, outy, CELL, CELL, NULL);
  565.         DrawBar(right_bar.x+CELL+5+2, outy+2, CELL-4, CELL-4, color2);
  566.  
  567.         //sprintf(#param, "%A", color1);
  568.         //WriteTextWithBg(right_bar.x+30, outy+3, 0xD0, system.color.work_text, #param+4, system.color.work);
  569.         DrawCurrentColorGradient();
  570. }
  571.  
  572. int lmax;
  573. void GenerateCurrentColorGradient()
  574. {
  575.         int i, avg, rmax;
  576.  
  577.         rgb.DwordToRgb(color1);
  578.         avg = 255 - calc(rgb.r + rgb.g + rgb.b / 3);
  579.  
  580.         lmax = b_color_gradient.w *avg/255 | 1;
  581.         rmax = b_color_gradient.w - lmax | 1;
  582.         if (lmax == 0) lmax=1;
  583.         if (rmax == 0) rmax=1;
  584.        
  585.         for (i=0; i<lmax; i++) {
  586.                 linear_gradient[i] = MixColors(color1,0xFFFfff,255*i/lmax);
  587.         }
  588.  
  589.         for (i=0 ; i<=rmax; i++) {
  590.                 linear_gradient[lmax+rmax - i] = MixColors(color1,0x000000,255*i/rmax);
  591.         }
  592. }
  593.  
  594. int DrawGradientMarker(dword marker_x, marker_color)
  595. {
  596.         if (marker_x > b_color_gradient.w - 1) marker_x = b_color_gradient.w - 1;
  597.         DrawBar(b_color_gradient.x + marker_x-2, b_color_gradient.y-3, 5, 1, marker_color);
  598.         DrawBar(b_color_gradient.x + marker_x-1, b_color_gradient.y-2, 3, 1, marker_color);
  599.         PutPixel(b_color_gradient.x + marker_x, b_color_gradient.y-1, marker_color);
  600.         return marker_x;
  601. }
  602.  
  603. int old_marker_pos;
  604. void DrawCurrentColorGradient()
  605. {
  606.         int i;
  607.         for (i=0 ; i<b_color_gradient.w; i++) {
  608.                 DrawBar(b_color_gradient.x+i, b_color_gradient.y, 1, b_color_gradient.h, linear_gradient[i]);          
  609.         }
  610.         DrawGradientMarker(old_marker_pos, system.color.work);
  611.         old_marker_pos = DrawGradientMarker(lmax, 0xFFFfff * bg_dark);
  612. }
  613.  
  614. void DrawColorPallets()
  615. {
  616.         int r, c, i=0;
  617.         //Last used colors
  618.         for (r = 0; r < LAST_USED_MAX/PAL_ITEMS_X_COUNT; r++)
  619.         {
  620.                 for (c = 0; c < PAL_ITEMS_X_COUNT; c++, i++)
  621.                 {
  622.                         DrawBar(c*COLSIZE + b_last_colors.x, r*COLSIZE + b_last_colors.y,
  623.                                 COLSIZE, COLSIZE, last_used_colors[i]);
  624.                 }
  625.         }
  626.         i=0;
  627.         //Default colors
  628.         for (r = 0; r < 9; r++)
  629.         {
  630.                 for (c = 0; c < PAL_ITEMS_X_COUNT; c++, i++)
  631.                 {
  632.                         DrawBar(c*COLSIZE + b_default_palette.x, r*COLSIZE + b_default_palette.y,
  633.                                 COLSIZE, COLSIZE, default_palette[PALLETE_SIZE-i]);
  634.                 }
  635.         }
  636. }
  637.  
  638. void DrawCanvasPixel(dword _r,_c,_color)
  639. {
  640.         DrawBar(_c*zoom.value + canvas.x, _r*zoom.value + canvas.y,
  641.         zoom.value, zoom.value, _color);
  642. }
  643.  
  644. void DrawCanvas()
  645. {
  646.         int r, c;
  647.         dword color;
  648.  
  649.         if ((currentTool != TOOL_NONE) && (tools[currentTool].onCanvasDraw != 0))
  650.         {
  651.                 tools[currentTool].onCanvasDraw();
  652.         }
  653.  
  654.         for (r = 0; r < image.rows; r++)
  655.         {
  656.                 for (c = 0; c < image.columns; c++)
  657.                 {
  658.                         if (image.pixel_state.is_drawable(r,c))
  659.                                 DrawCanvasPixel(r, c, image.get_pixel(r,c));
  660.                 }
  661.         }
  662.         image.pixel_state.reset_and_set_all_drawable();
  663.  
  664.         DrawPreview();
  665. }
  666.  
  667. void DrawPreview()
  668. {
  669.         int x = right_bar.x;
  670.         int y = b_default_palette.y + b_default_palette.h + 6;
  671.         int preview_h = Form.cheight - y;
  672.  
  673.         if (image.columns > right_bar.w) return;
  674.         if (image.rows > preview_h) return;
  675.  
  676.         _PutImage(right_bar.w - image.columns / 2 + x - 3,
  677.                 preview_h - image.rows / 2 + y,
  678.                 image.columns, image.rows, image.get_image()
  679.                 );
  680. }
  681.  
  682. dword GetPixelUnderMouse()
  683. {
  684.         return GetPixelColorFromScreen(mouse.x + Form.left + 5, mouse.y + Form.top + skin_height);
  685. }
  686.  
  687. int preview_size = 128;
  688. void DrawImageWithBg(dword _x, _y, _col_to)
  689. {
  690.         _x *= preview_size;
  691.         _y *= preview_size;
  692.         DrawWideRectangle(_x,_y, preview_size, preview_size, preview_size-image.columns/2, _col_to);
  693.         _PutImage(preview_size - image.columns / 2 + _x, preview_size - image.rows / 2 + _y,
  694.                 image.columns, image.rows, image.get_image_with_replaced_color(color2, _col_to));
  695. }
  696.  
  697. void ShowWindow_TestIcon()
  698. {
  699.         if (image.rows>=preview_size) || (image.columns>=preview_size) {
  700.                 notify("'IconEdit\nImage is too big for preview!' -tE");
  701.                 return;
  702.         }
  703.         loop() switch(WaitEvent())
  704.         {
  705.                 case evButton:
  706.                         if (GetButtonID()) ExitProcess();
  707.                         break;
  708.          
  709.                 case evKey:
  710.                         GetKeys();
  711.                         if (key_scancode == SCAN_CODE_ESC) ExitProcess();
  712.                         break;
  713.                  
  714.                 case evReDraw:
  715.                         DefineAndDrawWindow(Form.left+100, Form.top+100, preview_size*2+9,
  716.                                 preview_size*2+skin_height+4, 0x74, NULL, "Test Icon", 0);
  717.                         DrawImageWithBg(0, 0, 0x000000);
  718.                         DrawImageWithBg(1, 0, 0xFFFfff);
  719.                         DrawImageWithBg(0, 1, GetPixelColorFromScreen(0, 0));
  720.                         DrawImageWithBg(1, 1, system.color.work);
  721.                         break;
  722.         }
  723. }
  724.  
  725. //===================================================//
  726. //                                                   //
  727. //                      EVENTS                       //
  728. //                                                   //
  729. //===================================================//
  730.  
  731. void EventCreateNewIcon()
  732. {
  733.         EventSaveIconToFile();
  734.         Window_CanvasReSize.create();
  735. }
  736.  
  737. void EventOpenIcon()
  738. {
  739.         //notify(T_NOTIFY_OPEN);
  740.         RunProgram("/sys/lod", sprintf(#param, "*png* %s",#program_path));
  741. }
  742.  
  743. void EventSaveIconToFile()
  744. {
  745.         int i=0;
  746.         char save_file_name[4096];
  747.         char save_path_stable[4096];
  748.         strcpy(#save_path_stable, "/tmp0/1");
  749.         do {
  750.                 i++;
  751.                 sprintf(#save_file_name, "%s/saved_icon_%i.png", #save_path_stable, i);
  752.         } while (file_exists(#save_file_name));
  753.         save_image(image.get_image(), image.columns, image.rows, #save_file_name);
  754. }
  755.  
  756. void EventCleanCanvas()
  757. {
  758.         image.create(image.rows, image.columns);
  759.         actionsHistory.saveCurrentState();
  760.         DrawCanvas();
  761. }
  762.  
  763. void EventExitIconEdit()
  764. {
  765.         EventSaveIconToFile();
  766.         ExitProcess();
  767. }
  768.  
  769. void EventSetActiveColor(int _number, _color)
  770. {
  771.         int i;
  772.         if (last_used_colors[0] == _color) return;
  773.         for (i=LAST_USED_MAX-1; i>0; i--) {
  774.                 last_used_colors[i] = last_used_colors[i-1];
  775.         }
  776.         last_used_colors[0] = _color;
  777.  
  778.         if (_number == 1) color1 = _color;
  779.         if (_number == 2) color2 = _color;
  780.  
  781.         if (b_color_gradient.hovered()) {
  782.                 lmax = mouse.x - b_color_gradient.x;
  783.         }
  784.         else {
  785.                 GenerateCurrentColorGradient();
  786.         }
  787.         DrawActiveColor(NULL);
  788.         DrawColorPallets();
  789. }
  790.  
  791. void EventTestIcon()
  792. {
  793.         CreateThread(#ShowWindow_TestIcon, #test_icon_stak+4092);
  794. }
  795.  
  796. void EventMove(dword _action)
  797. {
  798.         if (selection.state) {
  799.                 selection.buf.move(_action);
  800.                 SelectTool_onCanvasDraw();
  801.         }
  802.         else {
  803.                 image.move(_action);
  804.                 DrawCanvas();
  805.         }
  806.         actionsHistory.saveCurrentState();
  807. }
  808.  
  809. void EventCrop()
  810. {
  811.         if (selection.state) {
  812.                 EventSaveIconToFile();
  813.                 image.create(selection.buf.rows, selection.buf.columns);
  814.                 selection.move_to_point(0,0);
  815.                 selection.apply_to_image();
  816.                 selection.reset();
  817.                 actionsHistory.init();
  818.                 DrawWindow();
  819.         }
  820.         else {
  821.                 notify("'You need to select something before usnig crop tool.' -W");
  822.         }
  823. }
  824.  
  825. stop:
  826.  
  827. char test_icon_stak[4096];
  828.