Subversion Repositories Kolibri OS

Rev

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

  1. // Line tool
  2. struct SimpleFigureTool_State {
  3.         int startX, startY;
  4.         int lastTempPosX, lastTempPosY;
  5. };
  6.  
  7. enum {
  8.         TOOL_LINE_STATE,
  9.         TOOL_RECT_STATE
  10. };
  11.  
  12. SimpleFigureTool_State figTool;
  13.  
  14. void SimpleFigureTool_Reset() {
  15.         figTool.startX = -1;
  16.         figTool.startY = -1;
  17.         figTool.lastTempPosX = -1;
  18.         figTool.lastTempPosY = -1;
  19. }
  20.  
  21. int mouseX_last;
  22. int mouseY_last;
  23. bool first_click_in_canvas = false;
  24.  
  25. void SimpleFigureTool_onMouseEvent(int mouseX, int mouseY, int lkm, int pkm) {
  26.         if (mouse.down) && (canvas.hovered()) first_click_in_canvas = true;
  27.         if (first_click_in_canvas)
  28.         {
  29.                 if (mouseX>canvas.x+canvas.w-zoom.value) mouseX = canvas.x+canvas.w-zoom.value;
  30.                 if (mouseY>canvas.y+canvas.h-zoom.value) mouseY = canvas.y+canvas.h-zoom.value;
  31.                 if (mouseX<canvas.x) mouseX = canvas.x;
  32.                 if (mouseY<canvas.y) mouseY = canvas.y;
  33.  
  34.                 if (mouse.key) {
  35.                         if ((figTool.startX < 0)
  36.                         || (figTool.startY < 0)) {
  37.                                 figTool.startX = mouseX;
  38.                                 figTool.startY = mouseY;
  39.                         }
  40.                         else {
  41.                                 if ((calc(mouseX - canvas.x/zoom.value) != figTool.lastTempPosX)
  42.                                         || (calc(mouseY - canvas.y/zoom.value) != figTool.lastTempPosY))
  43.                                 {
  44.                                         DrawCanvas();
  45.                                 }
  46.                         }
  47.                         mouseX_last = mouseX;
  48.                         mouseY_last = mouseY;
  49.                 }
  50.                 if (mouse.up) {
  51.                         if ((figTool.startX >= 0)
  52.                         && (figTool.startY >= 0)) {
  53.                                 // Draw line from start position to current position
  54.                                 if (currentTool == TOOL_LINE) {
  55.                                         DrawLineIcon(figTool.startX - canvas.x/zoom.value,
  56.                                                 figTool.startY - canvas.y/zoom.value,
  57.                                                 mouseX - canvas.x/zoom.value,
  58.                                                 mouseY - canvas.y/zoom.value,
  59.                                                 tool_color,
  60.                                                 TOIMAGE);
  61.                                 }
  62.                                 else if (currentTool == TOOL_RECT) {
  63.                                         DrawRectangleIcon(figTool.startX - canvas.x/zoom.value,
  64.                                                 figTool.startY - canvas.y/zoom.value,
  65.                                                 mouseX - canvas.x/zoom.value,
  66.                                                 mouseY - canvas.y/zoom.value, tool_color,
  67.                                                 TOIMAGE);
  68.                                 }
  69.  
  70.                                 DrawCanvas();
  71.  
  72.                                 actionsHistory.saveCurrentState();
  73.  
  74.                                 // Reset start position
  75.                                 figTool.startX = -1;
  76.                                 figTool.startY = -1;
  77.  
  78.                                 first_click_in_canvas = false;
  79.                         }
  80.                 }
  81.         }
  82. }
  83.  
  84. void SimpleFigureTool_onCanvasDraw() {
  85.         if ((figTool.startX >= 0)
  86.         && (figTool.startY >= 0) && (mouse.key)) {
  87.                 if (currentTool == TOOL_LINE) {
  88.                         DrawLineIcon(figTool.startX - canvas.x/zoom.value,
  89.                                 figTool.startY - canvas.y/zoom.value,
  90.                                 mouseX_last - canvas.x/zoom.value,
  91.                                 mouseY_last - canvas.y/zoom.value,
  92.                                 tool_color,
  93.                                 TOCANVAS);
  94.                 }
  95.                 else if (currentTool == TOOL_RECT) {
  96.                         DrawRectangleIcon(figTool.startX - canvas.x/zoom.value,
  97.                                 figTool.startY - canvas.y/zoom.value,
  98.                                 mouseX_last - canvas.x/zoom.value,
  99.                                 mouseY_last - canvas.y/zoom.value,
  100.                                 tool_color,
  101.                                 TOCANVAS);
  102.                 }
  103.  
  104.                 figTool.lastTempPosX = mouseX_last - canvas.x/zoom.value;
  105.                 figTool.lastTempPosY = mouseY_last - canvas.y/zoom.value;
  106.         }
  107. }
  108.  
  109.  
  110. //===================================================//
  111. //                                                   //
  112. //                      DRAWs                        //
  113. //                                                   //
  114. //===================================================//
  115.  
  116.  
  117.  
  118. // target - TOMAGE, TOCANVAS
  119. void DrawLineIcon(int x1, int y1, int x2, int y2, dword color, int target) {
  120.         int dx, dy, signX, signY, error, error2;
  121.  
  122.         if (TOIMAGE == target) {
  123.                 image.draw_line(x1, y1, x2, y2, color);
  124.                 return;
  125.         }
  126.        
  127.         dx = x2 - x1;
  128.  
  129.         if (dx < 0)
  130.                 dx = -dx;
  131.    
  132.         dy = y2 - y1;
  133.  
  134.         if (dy < 0)
  135.                 dy = -dy;
  136.    
  137.         if (x1 < x2)
  138.                 signX = 1;
  139.         else
  140.                 signX = -1;
  141.    
  142.         if (y1 < y2)
  143.                 signY = 1;
  144.         else
  145.                 signY = -1;
  146.    
  147.         error = dx - dy;
  148.  
  149.         DrawCanvasPixel(y2, x2, color);
  150.         image.pixel_state.set_drawable_state(y2, x2, false);
  151.  
  152.         while((x1 != x2) || (y1 != y2))
  153.         {
  154.                 DrawCanvasPixel(y1, x1, color);
  155.  
  156.                 image.pixel_state.set_drawable_state(y1, x1, false);
  157.                
  158.                 error2 = error * 2;
  159.  
  160.                 if(error2 > calc(-dy))
  161.                 {
  162.                         error -= dy;
  163.                         x1 += signX;
  164.                 }
  165.  
  166.                 if(error2 < dx)
  167.                 {
  168.                         error += dx;
  169.                         y1 += signY;
  170.                 }
  171.         }
  172. }
  173.  
  174. void DrawRectangleIcon(int x1, int y1, int x2, int y2, dword color, int target) {
  175.         DrawLineIcon(x1, y1, x2, y1, color, target);
  176.         DrawLineIcon(x2, y1, x2, y2, color, target);
  177.         DrawLineIcon(x2, y2, x1, y2, color, target);
  178.         DrawLineIcon(x1, y2, x1, y1, color, target);
  179. }
  180.  
  181.