Rev 7259 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7257 | leency | 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) { |
||
7259 | leency | 26 | int x1, y1, x2, y2; |
27 | |||
7257 | leency | 28 | if (mouse.down) && (canvas.hovered()) first_click_in_canvas = true; |
29 | if (first_click_in_canvas) |
||
30 | { |
||
31 | if (mouseX>canvas.x+canvas.w-zoom.value) mouseX = canvas.x+canvas.w-zoom.value; |
||
32 | if (mouseY>canvas.y+canvas.h-zoom.value) mouseY = canvas.y+canvas.h-zoom.value; |
||
33 | if (mouseX |
||
34 | if (mouseY |
||
35 | |||
36 | if (mouse.key) { |
||
37 | if ((figTool.startX < 0) |
||
38 | || (figTool.startY < 0)) { |
||
39 | figTool.startX = mouseX; |
||
40 | figTool.startY = mouseY; |
||
41 | } |
||
42 | else { |
||
43 | if ((calc(mouseX - canvas.x/zoom.value) != figTool.lastTempPosX) |
||
44 | || (calc(mouseY - canvas.y/zoom.value) != figTool.lastTempPosY)) |
||
45 | { |
||
46 | DrawCanvas(); |
||
47 | } |
||
48 | } |
||
49 | mouseX_last = mouseX; |
||
50 | mouseY_last = mouseY; |
||
51 | } |
||
52 | if (mouse.up) { |
||
53 | if ((figTool.startX >= 0) |
||
54 | && (figTool.startY >= 0)) { |
||
7259 | leency | 55 | |
7271 | leency | 56 | x1 = TO_CANVAS_X(figTool.startX); |
57 | y1 = TO_CANVAS_Y(figTool.startY); |
||
58 | x2 = TO_CANVAS_X(mouseX); |
||
59 | y2 = TO_CANVAS_Y(mouseY); |
||
7259 | leency | 60 | |
7257 | leency | 61 | // Draw line from start position to current position |
62 | if (currentTool == TOOL_LINE) { |
||
7259 | leency | 63 | DrawLineIcon(x1, y1, x2, y2, tool_color, TOIMAGE); |
7257 | leency | 64 | } |
65 | else if (currentTool == TOOL_RECT) { |
||
7259 | leency | 66 | DrawRectangleIcon(x1, y1, x2, y2, tool_color, TOIMAGE); |
7257 | leency | 67 | } |
7259 | leency | 68 | else if (currentTool == TOOL_BAR) { |
69 | DrawBarIcon(x1, y1, x2, y2, tool_color, TOIMAGE); |
||
70 | } |
||
7257 | leency | 71 | |
72 | DrawCanvas(); |
||
73 | |||
74 | actionsHistory.saveCurrentState(); |
||
75 | |||
76 | // Reset start position |
||
77 | figTool.startX = -1; |
||
78 | figTool.startY = -1; |
||
79 | |||
80 | first_click_in_canvas = false; |
||
81 | } |
||
82 | } |
||
83 | } |
||
84 | } |
||
85 | |||
86 | void SimpleFigureTool_onCanvasDraw() { |
||
7259 | leency | 87 | int x1, y1, x2, y2; |
88 | if ((figTool.startX >= 0) |
||
7257 | leency | 89 | && (figTool.startY >= 0) && (mouse.key)) { |
90 | |||
7271 | leency | 91 | x1 = TO_CANVAS_X(figTool.startX); |
92 | y1 = TO_CANVAS_Y(figTool.startY); |
||
93 | x2 = TO_CANVAS_X(mouseX_last); |
||
94 | y2 = TO_CANVAS_Y(mouseY_last); |
||
7259 | leency | 95 | |
96 | if (currentTool == TOOL_LINE) |
||
97 | DrawLineIcon(x1, y1, x2, y2, tool_color, TOCANVAS); |
||
98 | else if (currentTool == TOOL_RECT) |
||
99 | DrawRectangleIcon(x1, y1, x2, y2, tool_color, TOCANVAS); |
||
100 | else if (currentTool == TOOL_BAR) |
||
101 | DrawBarIcon(x1, y1, x2, y2, tool_color, TOCANVAS); |
||
102 | |||
7257 | leency | 103 | figTool.lastTempPosX = mouseX_last - canvas.x/zoom.value; |
104 | figTool.lastTempPosY = mouseY_last - canvas.y/zoom.value; |
||
105 | } |
||
106 | } |
||
107 | |||
108 | |||
109 | //===================================================// |
||
110 | // // |
||
111 | // DRAWs // |
||
112 | // // |
||
113 | //===================================================// |
||
114 | |||
115 | |||
116 | |||
117 | // target - TOMAGE, TOCANVAS |
||
118 | void DrawLineIcon(int x1, int y1, int x2, int y2, dword color, int target) { |
||
119 | int dx, dy, signX, signY, error, error2; |
||
120 | |||
121 | if (TOIMAGE == target) { |
||
122 | image.draw_line(x1, y1, x2, y2, color); |
||
123 | return; |
||
124 | } |
||
125 | |||
126 | dx = x2 - x1; |
||
127 | |||
128 | if (dx < 0) |
||
129 | dx = -dx; |
||
130 | |||
131 | dy = y2 - y1; |
||
132 | |||
133 | if (dy < 0) |
||
134 | dy = -dy; |
||
135 | |||
136 | if (x1 < x2) |
||
137 | signX = 1; |
||
138 | else |
||
139 | signX = -1; |
||
140 | |||
141 | if (y1 < y2) |
||
142 | signY = 1; |
||
143 | else |
||
144 | signY = -1; |
||
145 | |||
146 | error = dx - dy; |
||
147 | |||
148 | DrawCanvasPixel(y2, x2, color); |
||
149 | image.pixel_state.set_drawable_state(y2, x2, false); |
||
150 | |||
151 | while((x1 != x2) || (y1 != y2)) |
||
152 | { |
||
153 | DrawCanvasPixel(y1, x1, color); |
||
154 | |||
155 | image.pixel_state.set_drawable_state(y1, x1, false); |
||
156 | |||
157 | error2 = error * 2; |
||
158 | |||
159 | if(error2 > calc(-dy)) |
||
160 | { |
||
161 | error -= dy; |
||
162 | x1 += signX; |
||
163 | } |
||
164 | |||
165 | if(error2 < dx) |
||
166 | { |
||
167 | error += dx; |
||
168 | y1 += signY; |
||
169 | } |
||
170 | } |
||
171 | } |
||
172 | |||
173 | void DrawRectangleIcon(int x1, int y1, int x2, int y2, dword color, int target) { |
||
174 | DrawLineIcon(x1, y1, x2, y1, color, target); |
||
175 | DrawLineIcon(x2, y1, x2, y2, color, target); |
||
176 | DrawLineIcon(x2, y2, x1, y2, color, target); |
||
177 | DrawLineIcon(x1, y2, x1, y1, color, target); |
||
178 | } |
||
179 | |||
7259 | leency | 180 | void DrawBarIcon(int x1, int y1, int x2, int y2, dword color, int target) { |
181 | signed signY; |
||
182 | if (y1 < y2) |
||
183 | signY = 1; |
||
184 | else |
||
185 | signY = -1; |
||
186 | |||
187 | while (y1 != y2+signY) { |
||
188 | DrawLineIcon(x1, y1, x2, y1, color, target); |
||
189 | y1 += signY; |
||
190 | } |
||
191 | }>>>>>>>> |