Subversion Repositories Kolibri OS

Rev

Rev 9635 | Rev 9644 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9396 leency 1
#define MEMSIZE 1024*100
2
 
9643 leency 3
/*=====================================================
4
|                                                     |
5
|                         LIB                         |
6
|                                                     |
7
=====================================================*/
8
 
9396 leency 9
#include "../lib/gui.h"
10
#include "../lib/random.h"
11
#include "../lib/mem.h"
12
#include "../lib/cursor.h"
13
#include "../lib/list_box.h"
14
#include "../lib/events.h"
15
 
16
#include "../lib/obj/libimg.h"
17
#include "../lib/obj/box_lib.h"
18
#include "../lib/obj/proc_lib.h"
19
 
20
#include "../lib/patterns/rgb.h"
21
#include "../lib/patterns/toolbar_button.h"
22
#include "../lib/patterns/simple_open_dialog.h"
23
 
9643 leency 24
/*=====================================================
25
|                                                     |
26
|                        DATA                         |
27
|                                                     |
28
=====================================================*/
9396 leency 29
 
9643 leency 30
#include "data.h"
9396 leency 31
 
9643 leency 32
/*=====================================================
33
|                                                     |
34
|                        CODE                         |
35
|                                                     |
36
=====================================================*/
9396 leency 37
 
9643 leency 38
void main()
39
{
40
	/* Init external libraries */
41
	load_dll(libimg, #libimg_init, 1);
42
	load_dll(boxlib, #box_lib_init,0);
43
	load_dll(Proc_lib, #OpenDialog_init,0);
44
	OpenDialog_init stdcall (#o_dialog);
9632 leency 45
 
9643 leency 46
	/* Init UI */
9396 leency 47
	icons18.load("/sys/icons16.png");
9632 leency 48
	icons18.replace_2colors(0xffFFFfff, COL_LIGHT, 0xffCACBD6, COL_LIGHT-0x080808);
49
	icons18a.load("/sys/icons16.png");
50
	icons18a.replace_2colors(0xffFFFfff, COL_BUTTON, 0xffCACBD6, 0);
51
	pixie_skin.load("/sys/media/pixieskn.png");
9643 leency 52
	Form.width = screen.w/6*5;
53
	Form.height = screen.h/6*5;
9396 leency 54
 
9643 leency 55
	/* Handle application parameters */
56
	//if (!param) open_image("/sys/home.png");
9396 leency 57
 
9643 leency 58
	/* Set event mask and go to main loop */
9396 leency 59
	SetEventMask(EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER);
60
	loop() switch(WaitEvent())
61
	{
62
		case evMouse:
63
			mouse.get();
9643 leency 64
			if (main_image.h > canvas.h) scrollbar_v_mouse stdcall(#scroll_v);
65
			if (main_image.w > canvas.w) scrollbar_h_mouse stdcall(#scroll_h);
9396 leency 66
			if (scroll_v.delta) || (scroll_h.delta) draw_canvas();
9597 leency 67
			if (EAX = mouse.vert) {
68
				if (EAX<10) event_scroll_canvas(SCAN_CODE_DOWN);
69
				else event_scroll_canvas(SCAN_CODE_UP);
70
			} if (EAX = mouse.hor) {
71
				if (EAX<10) event_scroll_canvas(SCAN_CODE_RIGHT);
72
				else event_scroll_canvas(SCAN_CODE_LEFT);
73
			}
9396 leency 74
			break;
75
 
76
		case evButton:
77
			pressed_button_id = GetButtonID();
78
			if (pressed_button_id==1) ExitProcess();
79
			button.press(pressed_button_id);
80
			break;
81
 
82
		case evKey:
83
			GetKeys();
9597 leency 84
			if (key_scancode == SCAN_CODE_DOWN) event_scroll_canvas(SCAN_CODE_DOWN);
85
			if (key_scancode == SCAN_CODE_UP) event_scroll_canvas(SCAN_CODE_UP);
86
			if (key_scancode == SCAN_CODE_LEFT) event_scroll_canvas(SCAN_CODE_LEFT);
87
			if (key_scancode == SCAN_CODE_RIGHT) event_scroll_canvas(SCAN_CODE_RIGHT);
88
			key.press(key_scancode);
9396 leency 89
			break;
90
 
91
		case evReDraw:
92
			draw_window();
93
			break;
94
	}
95
}
96
 
97
void draw_window()
98
{
9632 leency 99
	DefineAndDrawWindow(screen.w-Form.width/2, screen.h-Form.height/2, Form.width, Form.height, 0x42, NULL, NULL, 0);
9396 leency 100
	GetProcessInfo(#Form, SelfInfo);
9643 leency 101
	/* Draw window borders */
102
	DrawRectangle(0,0,Form.width,Form.height,COL_LINE);
103
	DrawRectangle(1,1,Form.width-2,Form.height-2,COL_LIGHT);
104
	/* Check if the window is collapsed into header */
105
	if (Form.status_window&ROLLED_UP) {
106
		DrawBar(2, 2, Form.width-3, skin_h-4, COL_WORK);
107
		WriteText(5, skin_h-11/2, 0x90, COL_WORK_TEXT, "ImageEditor Pro [Collapsed]");
108
		draw_window_manipulation_buttons(skin_h-17/2);
109
		return;
110
	}
9396 leency 111
	if (Form.width  < 560) { MoveSize(OLD,OLD,560,OLD); return; }
112
	if (Form.height < 430) { MoveSize(OLD,OLD,OLD,430); return; }
9632 leency 113
	scroll_v.all_redraw = scroll_h.all_redraw = 1;
114
	draw_content();
115
}
116
 
117
void draw_content()
118
{
119
	incn tx;
9396 leency 120
	button.init(40);
121
	key.init(40);
122
 
9632 leency 123
	canvas.w = Form.cwidth - CANVASX - 1;
124
	canvas.h = Form.cheight - STATUSBAR_H - CANVASY - 1;
9396 leency 125
	if (main_image.h > canvas.h) canvas.w -= scroll_v.size_x + 1;
126
	if (main_image.w > canvas.w) canvas.h -= scroll_h.size_y + 1;
127
 
9643 leency 128
	//draw panel border
9632 leency 129
	DrawBar(CANVASX, 0, 1, Form.cheight, COL_LINE);
130
 
131
	//draw title
132
	DrawBar(2, 2, CANVASX-2, HEADERH-1, COL_DARK);
9633 leency 133
	WriteText(PAD+5, HEADER_TEXTY, 0x90, COL_WORK_TEXT, "ImageEditor Pro");
9632 leency 134
 
135
	//draw header
136
	DrawBar(CANVASX+1, CANVASY-1, Form.width-CANVASX-2, 1, COL_LINE);
137
	draw_acive_panel();
9643 leency 138
	draw_window_manipulation_buttons(7);
9632 leency 139
 
140
	//left panel bg
141
	DrawBar(2, 1+HEADERH, CANVASX-2, Form.cheight-2-HEADERH, COL_WORK);
142
 
9396 leency 143
	if (main_image.h > canvas.h) && (main_image.w > canvas.w) {
9632 leency 144
		DrawBar(CANVASX+canvas.w, CANVASY+canvas.h, scroll_v.size_x+1, scroll_h.size_y+1, COL_WORK);
9396 leency 145
	}
146
 
9597 leency 147
	#define GAP_S TOOLBAR_ITEM_H+8
148
	#define GAP_B TOOLBAR_ITEM_H+23
9632 leency 149
	tx.set(PAD-GAP_S+HEADERH);
9597 leency 150
	//draw_tool_btn(10, ECTRL + SCAN_CODE_KEY_N, PAD, tx.inc(GAP_S), 02, "Create image", false);
9643 leency 151
	draw_tool_btn(#event_open, ECTRL + SCAN_CODE_KEY_O, PAD, tx.inc(GAP_S), 00, "Open image  ", false);
152
	if (main_image.image) {
153
	 	draw_tool_btn(#event_activate_export, ECTRL + SCAN_CODE_KEY_S, PAD, tx.inc(GAP_S), 05, "Export image", active_tool & TOOL_EXPORT);
154
	 	//draw_tool_btn(#event_activate_crop,  0, PAD, tx.inc(GAP_B), 46, "Crop", active_tool & TOOL_CROP);
155
		//draw_tool_btn(#event_activate_resize,0, PAD, tx.inc(GAP_B), 06, "Resize      ", active_tool & TOOL_RESIZE);
156
		draw_tool_btn(#event_activate_depth, 0, PAD, tx.inc(GAP_B), 52, "Color depth ", active_tool & TOOL_COLOR_DEPTH);
157
		draw_tool_btn(#event_activate_flprot,0, PAD, tx.inc(GAP_S), 36, "Flip/Rotate ", active_tool & TOOL_FLIP_ROTATE);
158
	}
9597 leency 159
	draw_status_bar();
9396 leency 160
	draw_canvas();
161
}
162
 
9643 leency 163
void draw_window_manipulation_buttons(int y)
164
{
165
	DrawBar(Form.width-65, 2, 63, HEADERH-1, COL_WORK);
166
	img_draw stdcall(pixie_skin.image, Form.width-63, y, 57, 18, 265, 0);
167
	DefineHiddenButton(Form.width-63, y, 28, 17, button.add(#MinimizeWindow));
168
	DefineHiddenButton(Form.width-35, y, 28, 17, 1);
169
}
170
 
9597 leency 171
void draw_status_bar()
9396 leency 172
{
9597 leency 173
	char img_info[24];
9633 leency 174
	sprintf(#img_info, "%i\01%i\02%s", main_image.w, main_image.h, libimg_bpp[main_image.type]);
9632 leency 175
	DrawBar(CANVASX+1, Form.cheight - STATUSBAR_H - 1, Form.cwidth - CANVASX -2, STATUSBAR_H, COL_WORK);
176
	WriteText(CANVASX+4, Form.cheight - STATUSBAR_H + 2, 0x90, COL_WORK_TEXT, #img_info);
177
	for (ESI=0; img_info[ESI]!=0; ESI++) {
178
		if (img_info[ESI] == '\01') img_info[ESI]='x';
179
		else if (img_info[ESI] == '\02') img_info[ESI]='@';
180
		else img_info[ESI]=' ';
181
	}
182
	ECX = 0x90 << 24 + COL_BUTTON_TEXT;
183
	$int 64
9396 leency 184
}
185
 
9633 leency 186
int draw_tool_btn(dword _event, _hotkey, _x, _y, _icon_n, _text, _active)
9396 leency 187
{
9633 leency 188
	dword img_ptr = icons18.image;
9643 leency 189
 
190
	int w = 32; //default width: icon only
191
	if (_text) {
192
		w = strlen(_text) * 8 + 15;
193
		if (_icon_n!=-1) w += 26;
194
	}
195
 
9633 leency 196
	if (_active==-1) {
9634 leency 197
		$push COL_LIGHT
9633 leency 198
		EDX = COL_LINE;
199
	} else if (_active) {
9632 leency 200
		img_ptr = icons18a.image;
9634 leency 201
		$push COL_BUTTON_TEXT
9632 leency 202
		EDX = COL_BUTTON;
9633 leency 203
 
9632 leency 204
	} else {
9633 leency 205
		$push COL_WORK_TEXT
9632 leency 206
		EDX = COL_LIGHT;
9633 leency 207
	}
9597 leency 208
	DrawBar(_x, _y, w, TOOLBAR_ITEM_H+1, EDX);
9632 leency 209
	PutPixel(_x,_y,COL_WORK);
210
	PutPixel(_x,_y+TOOLBAR_ITEM_H,COL_WORK);
211
	PutPixel(_x+w-1,_y,COL_WORK);
212
	PutPixel(_x+w-1,_y+TOOLBAR_ITEM_H,COL_WORK);
9396 leency 213
	if (_event) DefineHiddenButton(_x, _y, w, TOOLBAR_ITEM_H, button.add(_event));
9597 leency 214
	if (_hotkey) key.add_n(_hotkey, _event);
215
	if (_icon_n!=-1) {
9632 leency 216
		#define ISIZE 18
217
		img_draw stdcall(img_ptr, _x+7, _y+4, ISIZE, ISIZE, 0, _icon_n*ISIZE);
9597 leency 218
		_x += PAD+ISIZE+2;
219
	} else {
220
		_x += 7;
221
	}
9633 leency 222
	$pop EDX
9597 leency 223
	if (_text) {
224
		WriteText(_x, _y+6, 0x90, EDX, _text);
225
	}
9633 leency 226
	return w;
9396 leency 227
}
228
 
9632 leency 229
void draw_canvas()
9396 leency 230
{
9632 leency 231
	int content_w = math.min(main_image.w, canvas.w-1);
232
	int content_h = math.min(main_image.h, canvas.h);
233
	if (main_image.image) {
234
		img_draw stdcall(main_image.image, CANVASX+1, CANVASY,
235
		content_w, content_h, scroll_h.position, scroll_v.position);
236
 	}
237
	DrawBar(CANVASX+1+content_w, CANVASY, canvas.w - content_w - 1, content_h, COL_DARK);
238
	DrawBar(CANVASX+1, CANVASY+content_h, canvas.w - 1, canvas.h - content_h, COL_DARK);
239
	//Draw scroll V
9396 leency 240
	scroll_v.max_area = main_image.h;
9632 leency 241
	scroll_v.cur_area = scroll_v.size_y = canvas.h + 1;
242
	scroll_v.start_x = CANVASX + canvas.w;
9396 leency 243
	if (main_image.h > canvas.h) scrollbar_v_draw stdcall (#scroll_v);
9632 leency 244
	//Draw scroll H
9396 leency 245
	scroll_h.max_area = main_image.w;
246
	scroll_h.cur_area = scroll_h.size_x = canvas.w;
9632 leency 247
	scroll_h.start_y = CANVASY + canvas.h;
9396 leency 248
	if (main_image.w > canvas.w) scrollbar_h_draw stdcall (#scroll_h);
249
 
250
}
251
 
9632 leency 252
void set_file_path(char* _new_title)
9396 leency 253
{
9632 leency 254
	strcpy(#param, _new_title);
255
	draw_status_bar();
9396 leency 256
}
257
 
258
void open_image(char* _path)
259
{
260
	main_image.load(_path);
9632 leency 261
	set_file_path(_path);
9396 leency 262
	scroll_v.position = 0;
263
	scroll_h.position = 0;
264
}
265
 
9633 leency 266
void event_set_color_depth() {
9643 leency 267
	img_convert stdcall(main_image.image, 0, pressed_button_id-color_depth_btnid_1, 0, 0);
9633 leency 268
	if (!EAX) {
9643 leency 269
		notify("'ImageEdit Pro\nNot possible to convert into specified color depth' -Et");
9633 leency 270
	} else {
271
		$push eax
9634 leency 272
		img_destroy stdcall(main_image.image);
273
		$pop eax
274
		main_image.image = EAX;
9633 leency 275
		main_image.set_vars();
276
		draw_acive_panel();
277
		draw_status_bar();
9635 leency 278
		draw_canvas();
9633 leency 279
	}
280
}
281
 
9643 leency 282
void WritePanelText(int _x, _text) { WriteTextWithBg(_x, HEADER_TEXTY, 0xD0, COL_WORK_TEXT, _text, COL_WORK); }
9632 leency 283
void draw_acive_panel()
284
{
9643 leency 285
	char edit_width_text[8];
286
	edit_box edit_width;
9633 leency 287
	int i, x = CANVASX + PAD;
288
	bool a;
9643 leency 289
	DrawBar(CANVASX+1, 2, Form.width-CANVASX-64, HEADERH-1, COL_WORK);
9632 leency 290
	switch(active_tool) {
9643 leency 291
		case TOOL_EXPORT:
292
			WritePanelText(CANVASX+PAD, "Format");
293
			x += 6*8 + PAD;
294
		 	x += draw_tool_btn(#event_save_png, 0, x, 7, -1, "PNG", saving_type & SAVE_AS_PNG) + PAD;
295
			x += draw_tool_btn(#event_save_pnm, 0, x, 7, -1, "PNM", saving_type & SAVE_AS_PNM) + PAD;
296
			x += draw_tool_btn(#event_save_bmp, 0, x, 7, -1, "BMP", saving_type & SAVE_AS_BMP) + PAD + PAD;
297
			if (saving_type) draw_tool_btn(#event_save,     0, x, 7, 53, "Export", false);
298
			break;
9632 leency 299
		case TOOL_CROP:
9643 leency 300
			WritePanelText(CANVASX+PAD, "Crop tool");
9632 leency 301
			break;
302
		case TOOL_RESIZE:
9643 leency 303
			WritePanelText(CANVASX+PAD, "New width");
304
			WritePanelText(CANVASX+PAD+150, "New height");
9632 leency 305
			draw_tool_btn(#event_rotate_left, SCAN_CODE_ENTER, CANVASX + PAD + 300, 7, -1, "Apply", false);
9643 leency 306
			EditBox_Create(#edit_width, 9*8+CANVASX+PAD+PAD, HEADER_TEXTY-3, 50, sizeof(edit_width_text), #edit_width_text, 0b);
307
			edit_box_draw stdcall (#edit_width);
9632 leency 308
			break;
309
		case TOOL_COLOR_DEPTH:
9643 leency 310
			WritePanelText(CANVASX+PAD, "Color depth");
9633 leency 311
			x += 11*8 + PAD;
9643 leency 312
			color_depth_btnid_1 = button.new_id;
9633 leency 313
			for (i=1; i<11; i++) {
9643 leency 314
				DeleteButton(color_depth_btnid_1+i);
9633 leency 315
				if (main_image.type == i) {
9643 leency 316
					a = true; //this is current image depth
9633 leency 317
				} else {
9643 leency 318
					a = false; //this is image depth we can set
9633 leency 319
					//probe does libimg support converting current image gepth to i-one
320
					img_create stdcall(1, 1, main_image.type);
321
					img_convert stdcall(EAX, 0, i, 0, 0);
322
					if (EAX) {
323
						img_destroy stdcall(EAX);
324
					} else {
325
						a = -1;
9643 leency 326
						if (Form.width-CANVASX-64 < 652) {
327
							button.add(1);
328
							continue;
329
						}
9633 leency 330
					}
331
				}
332
				x += draw_tool_btn(#event_set_color_depth, SCAN_CODE_ENTER, x, 7, -1, libimg_bpp[i], a) + PAD;
333
			}
9632 leency 334
			break;
335
		case TOOL_FLIP_ROTATE:
9643 leency 336
			WritePanelText(CANVASX+PAD, "Flip");
9632 leency 337
			draw_tool_btn(#event_flip_hor, ECTRL + SCAN_CODE_KEY_H, CANVASX + PAD + 040, 7, 34, NULL, false);
338
			draw_tool_btn(#event_flip_ver, ECTRL + SCAN_CODE_KEY_V, CANVASX + PAD + 080, 7, 35, NULL, false);
9643 leency 339
			WritePanelText(CANVASX+PAD + 142, "Rotate");
340
			draw_tool_btn(#event_rotate_left,  ECTRL + SCAN_CODE_KEY_L, CANVASX + PAD + 200, 7, 37, NULL, false);
341
			draw_tool_btn(#event_rotate_right, ECTRL + SCAN_CODE_KEY_R, CANVASX + PAD + 240, 7, 36, NULL, false);
342
			// WritePanelText(CANVASX+PAD + 142, "Move");
343
			//draw_tool_btn(#event_move_left,  ECTRL + SCAN_CODE_LEFT,  PAD, tx.inc(GAP_B), 30, false);
344
			//draw_tool_btn(#event_move_right, ECTRL + SCAN_CODE_RIGHT, PAD, tx.inc(GAP_S), 31, false);
345
			//draw_tool_btn(#event_move_up,    ECTRL + SCAN_CODE_UP,    PAD, tx.inc(GAP_S), 32, false);
346
			//draw_tool_btn(#event_move_down,  ECTRL + SCAN_CODE_DOWN,  PAD, tx.inc(GAP_S), 33, false);
9632 leency 347
			break;
348
		default:
9643 leency 349
			if (!param) WritePanelText(CANVASX+PAD, "Welcome to ImageEditor Pro! Try to open a file.");
9632 leency 350
	}
351
}
352
 
9396 leency 353
//===================================================//
354
//                                                   //
355
//                      EVENTS                       //
356
//                                                   //
357
//===================================================//
358
 
9643 leency 359
void event_save_png() { saving_type = SAVE_AS_PNG; draw_acive_panel(); }
360
void event_save_bmp() { saving_type = SAVE_AS_BMP; draw_acive_panel(); }
361
void event_save_raw() { saving_type = SAVE_AS_RAW; draw_acive_panel(); }
362
void event_save_pnm() { saving_type = SAVE_AS_PNM; draw_acive_panel(); }
363
void event_activate_export() { active_tool = TOOL_EXPORT; draw_content(); }
364
void event_activate_crop() { active_tool = TOOL_CROP; draw_content(); }
365
void event_activate_resize() { active_tool = TOOL_RESIZE; draw_content(); }
366
void event_activate_depth() { active_tool = TOOL_COLOR_DEPTH; draw_content(); }
367
void event_activate_flprot() { active_tool = TOOL_FLIP_ROTATE; draw_content(); }
368
 
9396 leency 369
void event_open()
370
{
371
	o_dialog.type = 0; //open file
372
	OpenDialog_start stdcall (#o_dialog);
373
	if (o_dialog.status) {
374
		open_image(#openfile_path);
9635 leency 375
		draw_window();
9396 leency 376
	}
377
}
378
 
379
void event_flip_hor()
380
{
381
	img_flip stdcall (main_image.image, FLIP_HORIZONTAL);
382
	draw_canvas();
383
}
384
 
385
void event_flip_ver()
386
{
387
	img_flip stdcall (main_image.image, FLIP_VERTICAL);
388
	draw_canvas();
389
}
390
 
9632 leency 391
void event_rotate_left()
9396 leency 392
{
9632 leency 393
	img_rotate stdcall (main_image.image, ROTATE_270_CW);
394
	main_image.w >< main_image.h;
395
	draw_content();
396
}
397
 
398
void event_rotate_right()
399
{
9396 leency 400
	img_rotate stdcall (main_image.image, ROTATE_90_CW);
401
	main_image.w >< main_image.h;
9632 leency 402
	draw_content();
9396 leency 403
}
404
 
405
void event_save()
406
{
9643 leency 407
	dword _image_format, _image_depth;
408
	strcpy(#filename_area, #param + strrchr(#param, '/'));
409
	if (EAX = strrchr(#filename_area, '.'))	filename_area[EAX-1] = '\0';
9597 leency 410
	switch (saving_type) {
411
		case SAVE_AS_PNG:
9643 leency 412
				strcat(#filename_area, "_IEP.png");
413
				_image_format = LIBIMG_FORMAT_PNG;
414
				_image_depth = IMAGE_BPP24;
9597 leency 415
				break;
416
		case SAVE_AS_BMP:
9643 leency 417
				strcat(#filename_area, "_IEP.bmp");
418
				_image_format = LIBIMG_FORMAT_BMP;
419
				_image_depth = IMAGE_BPP24;
9597 leency 420
				break;
9643 leency 421
		case SAVE_AS_PNM:
422
				strcat(#filename_area, "_IEP.pnm");
423
				_image_format = LIBIMG_FORMAT_PNM;
424
				_image_depth = IMAGE_BPP24;
425
				break;
9597 leency 426
		case SAVE_AS_RAW:
427
				notify("Not implemented yet.");
9643 leency 428
				return;
9396 leency 429
	}
9643 leency 430
	o_dialog.type = 1; //save file
431
	OpenDialog_start stdcall (#o_dialog);
432
	if (o_dialog.status) {
433
		set_file_path(#openfile_path);
434
		img_convert stdcall(main_image.image, 0, _image_depth, 0, 0);
435
		if (!EAX) {
436
			notify("'ImageEdit Pro\nCan not convert image into specified color depth' -Et");
437
		} else {
438
			$push eax //converted data
439
			img_encode stdcall(EAX, _image_format, 0); //<=EAX data, ECX size
440
			$push eax //encoded data
441
			CreateFile(ECX, EAX, #openfile_path);
442
			$pop ecx
443
			free(ECX);
444
			$pop eax
445
			img_destroy stdcall(EAX);
446
		}
447
	}
9396 leency 448
}
449
 
9597 leency 450
void event_scroll_canvas(int _direction)
451
{
452
	switch(_direction) {
453
		case SCAN_CODE_DOWN:
454
			scroll_v.position = math.min(scroll_v.position+25,
455
				scroll_v.max_area - scroll_v.cur_area);
456
			break;
457
		case SCAN_CODE_UP:
458
			scroll_v.position = math.max(scroll_v.position-25, 0);
459
			break;
460
		case SCAN_CODE_RIGHT:
461
			scroll_h.position = math.min(scroll_h.position+25,
462
				scroll_h.max_area - scroll_h.cur_area);
463
			break;
464
		case SCAN_CODE_LEFT:
465
			scroll_h.position = math.max(scroll_h.position-25, 0);
466
	}
467
	draw_canvas();
468
}
469
 
9396 leency 470
stop:
471