Rev 1143 | Rev 1422 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1004 | diamond | 1 | use32 |
2 | org 0x0 |
||
3 | |||
4 | db 'MENUET01' |
||
5 | dd 0x01, START, I_END, 0x4000, 0x4000, @PARAMS, 0x0 |
||
6 | |||
7 | ;----------------------------------------------------------------------------- |
||
8 | |||
9 | FALSE = 0 |
||
10 | TRUE = 1 |
||
11 | |||
1080 | diamond | 12 | include '../../../proc32.inc' |
13 | include '../../../macros.inc' |
||
1004 | diamond | 14 | include 'dll.inc' |
15 | |||
16 | include '../../../develop/libraries/libs-dev/libio/libio.inc' |
||
17 | include '../../../develop/libraries/libs-dev/libimg/libimg.inc' |
||
18 | |||
19 | ;----------------------------------------------------------------------------- |
||
20 | |||
21 | START: |
||
22 | mcall 68, 11 |
||
23 | |||
24 | stdcall dll.Load, @IMPORT |
||
25 | or eax, eax |
||
26 | jnz exit |
||
27 | |||
1144 | diamond | 28 | invoke sort.START, 1 |
1016 | diamond | 29 | |
1004 | diamond | 30 | mov ecx, 1 ; for 15.4: 1 = tile |
31 | cmp word [@PARAMS], '\T' |
||
32 | jz set_bgr |
||
33 | inc ecx ; for 15.4: 2 = stretch |
||
34 | cmp word [@PARAMS], '\S' |
||
35 | jz set_bgr |
||
36 | |||
37 | cmp byte [@PARAMS], 0 |
||
38 | jnz params_given |
||
39 | |||
40 | call opendialog |
||
41 | jc exit |
||
42 | mov esi, path |
||
43 | mov edi, @PARAMS |
||
44 | mov ecx, 512/4 |
||
45 | rep movsd |
||
46 | mov byte [edi-1], 0 |
||
47 | jmp params_given |
||
48 | |||
49 | set_bgr: |
||
50 | mcall 15, 4 |
||
51 | mov eax, @PARAMS + 4 |
||
52 | call load_image |
||
1016 | diamond | 53 | jc exit |
1004 | diamond | 54 | |
1016 | diamond | 55 | call set_as_bgr |
1004 | diamond | 56 | jmp exit |
57 | |||
58 | params_given: |
||
59 | |||
60 | mov eax, @PARAMS |
||
61 | call load_image |
||
62 | jc exit |
||
63 | |||
64 | ;----------------------------------------------------------------------------- |
||
65 | |||
66 | red: |
||
67 | call draw_window |
||
68 | |||
69 | still: |
||
1080 | diamond | 70 | mov eax, [image] |
71 | test byte [eax + Image.Flags], Image.IsAnimated |
||
72 | push 10 |
||
73 | pop eax |
||
74 | jz @f |
||
75 | mcall 26, 9 |
||
76 | mov edx, [cur_frame] |
||
77 | mov ebx, [cur_frame_time] |
||
78 | add ebx, [edx + Image.Delay] |
||
79 | sub ebx, eax |
||
80 | cmp ebx, [edx + Image.Delay] |
||
81 | ja red_update_frame |
||
82 | test ebx, ebx |
||
83 | jz red_update_frame |
||
84 | push 23 |
||
85 | pop eax |
||
86 | @@: |
||
87 | mcall |
||
1004 | diamond | 88 | dec eax |
1080 | diamond | 89 | js red_update_frame |
1004 | diamond | 90 | jz red |
91 | dec eax |
||
92 | jnz button |
||
93 | |||
1080 | diamond | 94 | key: |
1004 | diamond | 95 | mcall 2 |
96 | jmp still |
||
97 | |||
1080 | diamond | 98 | red_update_frame: |
99 | mov eax, [cur_frame] |
||
100 | mov eax, [eax + Image.Next] |
||
101 | test eax, eax |
||
102 | jnz @f |
||
103 | mov eax, [image] |
||
104 | @@: |
||
105 | mov [cur_frame], eax |
||
106 | mcall 26, 9 |
||
107 | mov [cur_frame_time], eax |
||
108 | mcall 9, procinfo, -1 |
||
109 | call draw_cur_frame |
||
110 | jmp still |
||
111 | |||
112 | button: |
||
1004 | diamond | 113 | mcall 17 |
114 | shr eax, 8 |
||
115 | |||
116 | ; flip horizontally |
||
117 | cmp eax, 'flh' |
||
118 | jne @f |
||
119 | |||
120 | invoke img.flip, [image], FLIP_HORIZONTAL |
||
121 | jmp redraw_image |
||
122 | |||
123 | ; flip vertically |
||
124 | @@: cmp eax, 'flv' |
||
125 | jne @f |
||
126 | |||
127 | invoke img.flip, [image], FLIP_VERTICAL |
||
128 | jmp redraw_image |
||
129 | |||
130 | ; flip both horizontally and vertically |
||
131 | @@: cmp eax, 'flb' |
||
132 | jne @f |
||
133 | |||
134 | invoke img.flip, [image], FLIP_BOTH |
||
135 | jmp redraw_image |
||
136 | |||
137 | ; rotate left |
||
138 | @@: cmp eax, 'rtl' |
||
139 | jne @f |
||
140 | |||
141 | push ROTATE_90_CCW |
||
142 | .rotate_common: |
||
143 | invoke img.rotate, [image] |
||
144 | mov eax, [image] |
||
145 | test eax, eax ; clear ZF flag |
||
146 | call update_image_sizes |
||
147 | jmp redraw_image |
||
148 | |||
149 | ; rotate right |
||
150 | @@: cmp eax, 'rtr' |
||
151 | jne @f |
||
152 | |||
153 | push ROTATE_90_CW |
||
154 | jmp .rotate_common |
||
155 | |||
156 | ; open new file |
||
157 | @@: cmp eax, 'opn' |
||
158 | jne @f |
||
159 | |||
160 | call opendialog |
||
161 | jc still |
||
162 | push [image] |
||
163 | mov eax, path |
||
164 | call load_image |
||
165 | jc .restore_old |
||
166 | mov esi, path |
||
167 | mov edi, @PARAMS |
||
168 | mov ecx, 512/4 |
||
169 | rep movsd |
||
1016 | diamond | 170 | mov byte [edi-1], 0 |
1004 | diamond | 171 | invoke img.destroy |
1016 | diamond | 172 | call free_directory |
1004 | diamond | 173 | jmp red |
174 | .restore_old: |
||
175 | pop [image] |
||
1080 | diamond | 176 | call init_frame |
1004 | diamond | 177 | jmp still |
178 | |||
1016 | diamond | 179 | ; set background |
180 | @@: |
||
181 | cmp eax, 'bgr' |
||
182 | jne @f |
||
183 | |||
184 | call set_as_bgr |
||
185 | jmp still |
||
186 | |||
187 | @@: |
||
188 | |||
189 | cmp eax, 'bck' |
||
190 | jnz @f |
||
191 | call prev_image |
||
1087 | diamond | 192 | jmp red |
1016 | diamond | 193 | @@: |
194 | cmp eax, 'fwd' |
||
195 | jnz @f |
||
196 | call next_image |
||
1087 | diamond | 197 | jmp red |
1016 | diamond | 198 | @@: |
199 | |||
200 | cmp eax, 1 |
||
1004 | diamond | 201 | jne still |
202 | |||
203 | exit: |
||
204 | mcall -1 |
||
205 | |||
206 | redraw_image = red |
||
207 | |||
208 | load_image: |
||
209 | and [img_data], 0 |
||
210 | push eax |
||
211 | invoke file.open, eax, O_READ |
||
212 | or eax, eax |
||
213 | jz .error_pop |
||
214 | mov [fh], eax |
||
215 | invoke file.size |
||
216 | mov [img_data_len], ebx |
||
217 | stdcall mem.Alloc, ebx |
||
218 | test eax, eax |
||
219 | jz .error_close |
||
220 | mov [img_data], eax |
||
221 | invoke file.read, [fh], eax, [img_data_len] |
||
222 | cmp eax, -1 |
||
223 | jz .error_close |
||
224 | cmp eax, [img_data_len] |
||
225 | jnz .error_close |
||
226 | invoke file.close, [fh] |
||
227 | inc eax |
||
228 | jz .error |
||
229 | |||
230 | ; img.decode checks for img.is_img |
||
231 | ; invoke img.is_img, [img_data], [img_data_len] |
||
232 | ; or eax, eax |
||
233 | ; jz exit |
||
1102 | diamond | 234 | invoke img.decode, [img_data], [img_data_len], 0 |
1004 | diamond | 235 | or eax, eax |
236 | jz .error |
||
237 | cmp [image], 0 |
||
1080 | diamond | 238 | pushf |
1004 | diamond | 239 | mov [image], eax |
1080 | diamond | 240 | call init_frame |
241 | popf |
||
1004 | diamond | 242 | call update_image_sizes |
243 | call free_img_data |
||
244 | clc |
||
245 | ret |
||
246 | |||
247 | .error_free: |
||
248 | invoke img.destroy, [image] |
||
249 | jmp .error |
||
250 | |||
251 | .error_pop: |
||
252 | pop eax |
||
253 | jmp .error |
||
254 | .error_close: |
||
255 | invoke file.close, [fh] |
||
256 | .error: |
||
257 | call free_img_data |
||
258 | stc |
||
259 | ret |
||
260 | |||
261 | free_img_data: |
||
262 | mov eax, [img_data] |
||
263 | test eax, eax |
||
264 | jz @f |
||
265 | stdcall mem.Free, eax |
||
266 | @@: |
||
267 | ret |
||
268 | |||
269 | update_image_sizes: |
||
270 | pushf |
||
271 | mov edx, [eax + Image.Width] |
||
1040 | diamond | 272 | mov [draw_width], edx |
1004 | diamond | 273 | add edx, 19 |
1016 | diamond | 274 | cmp edx, 40 + 25*9 |
1004 | diamond | 275 | jae @f |
1016 | diamond | 276 | mov edx, 40 + 25*9 |
1004 | diamond | 277 | @@: |
278 | mov [wnd_width], edx |
||
279 | mov esi, [eax + Image.Height] |
||
1040 | diamond | 280 | mov [draw_height], esi |
1004 | diamond | 281 | add esi, 44 |
282 | mov [wnd_height], esi |
||
283 | popf |
||
284 | jz .no_resize |
||
285 | mcall 48, 4 |
||
286 | add esi, eax |
||
287 | mcall 67,-1,-1 |
||
288 | .no_resize: |
||
289 | ret |
||
290 | |||
1016 | diamond | 291 | set_as_bgr: |
292 | mov esi, [image] |
||
293 | mov ecx, [esi + Image.Width] |
||
294 | mov edx, [esi + Image.Height] |
||
295 | mcall 15, 1 |
||
296 | |||
297 | mcall 15, 6 |
||
298 | test eax, eax |
||
299 | jz @f |
||
300 | |||
301 | push eax |
||
302 | invoke img.to_rgb2, esi, eax |
||
303 | pop ecx |
||
304 | mcall 15, 7 |
||
305 | |||
306 | @@: |
||
307 | mcall 15, 3 |
||
308 | ret |
||
309 | |||
310 | prev_image: |
||
311 | call load_directory |
||
312 | cmp [directory_ptr], 0 |
||
313 | jz .ret |
||
314 | mov ebx, [directory_ptr] |
||
315 | mov eax, [cur_file_idx] |
||
316 | cmp eax, -1 |
||
317 | jnz @f |
||
318 | mov eax, [ebx+4] |
||
319 | @@: |
||
320 | push [image] |
||
321 | .scanloop: |
||
322 | dec eax |
||
323 | jns @f |
||
324 | mov eax, [ebx+4] |
||
325 | dec eax |
||
326 | cmp [cur_file_idx], -1 |
||
327 | jz .notfound |
||
328 | @@: |
||
329 | cmp eax, [cur_file_idx] |
||
330 | jz .notfound |
||
1040 | diamond | 331 | push eax ebx |
1016 | diamond | 332 | imul esi, eax, 304 |
333 | add esi, [directory_ptr] |
||
334 | add esi, 32 + 40 |
||
335 | mov edi, curdir |
||
336 | @@: |
||
337 | inc edi |
||
338 | cmp byte [edi-1], 0 |
||
339 | jnz @b |
||
340 | mov byte [edi-1], '/' |
||
341 | @@: |
||
342 | lodsb |
||
343 | stosb |
||
344 | test al, al |
||
345 | jnz @b |
||
346 | mov eax, curdir |
||
347 | call load_image |
||
1040 | diamond | 348 | pushf |
1016 | diamond | 349 | mov esi, curdir |
1040 | diamond | 350 | push esi |
1016 | diamond | 351 | mov edi, @PARAMS |
352 | mov ecx, 512/4 |
||
353 | rep movsd |
||
354 | mov byte [edi-1], 0 |
||
1040 | diamond | 355 | pop esi |
356 | @@: |
||
357 | lodsb |
||
358 | test al, al |
||
359 | jnz @b |
||
360 | @@: |
||
361 | dec esi |
||
362 | cmp byte [esi], '/' |
||
363 | jnz @b |
||
364 | mov byte [esi], 0 |
||
365 | popf |
||
366 | pop ebx eax |
||
367 | jc .scanloop |
||
368 | mov [cur_file_idx], eax |
||
369 | invoke img.destroy |
||
1016 | diamond | 370 | .ret: |
371 | ret |
||
372 | .notfound: |
||
373 | pop [image] |
||
1080 | diamond | 374 | call init_frame |
1016 | diamond | 375 | ret |
376 | |||
377 | next_image: |
||
378 | call load_directory |
||
379 | cmp [directory_ptr], 0 |
||
380 | jz .ret |
||
381 | mov ebx, [directory_ptr] |
||
382 | mov eax, [cur_file_idx] |
||
383 | push [image] |
||
384 | .scanloop: |
||
385 | inc eax |
||
386 | cmp eax, [ebx+4] |
||
387 | jb @f |
||
388 | xor eax, eax |
||
389 | cmp [cur_file_idx], -1 |
||
390 | jz .notfound |
||
391 | @@: |
||
392 | cmp eax, [cur_file_idx] |
||
393 | jz .notfound |
||
394 | push eax ebx |
||
395 | imul esi, eax, 304 |
||
396 | add esi, [directory_ptr] |
||
397 | add esi, 32 + 40 |
||
398 | mov edi, curdir |
||
399 | @@: |
||
400 | inc edi |
||
401 | cmp byte [edi-1], 0 |
||
402 | jnz @b |
||
403 | mov byte [edi-1], '/' |
||
404 | @@: |
||
405 | lodsb |
||
406 | stosb |
||
407 | test al, al |
||
408 | jnz @b |
||
409 | mov eax, curdir |
||
410 | call load_image |
||
1040 | diamond | 411 | pushf |
1016 | diamond | 412 | mov esi, curdir |
413 | push esi |
||
414 | mov edi, @PARAMS |
||
415 | mov ecx, 512/4 |
||
416 | rep movsd |
||
417 | mov byte [edi-1], 0 |
||
418 | pop esi |
||
419 | @@: |
||
420 | lodsb |
||
421 | test al, al |
||
422 | jnz @b |
||
423 | @@: |
||
424 | dec esi |
||
425 | cmp byte [esi], '/' |
||
426 | jnz @b |
||
427 | mov byte [esi], 0 |
||
1040 | diamond | 428 | popf |
429 | pop ebx eax |
||
430 | jc .scanloop |
||
431 | mov [cur_file_idx], eax |
||
432 | invoke img.destroy |
||
1016 | diamond | 433 | .ret: |
434 | ret |
||
435 | .notfound: |
||
436 | pop [image] |
||
1080 | diamond | 437 | call init_frame |
1016 | diamond | 438 | ret |
439 | |||
440 | load_directory: |
||
441 | cmp [directory_ptr], 0 |
||
442 | jnz .ret |
||
443 | mov esi, @PARAMS |
||
444 | mov ecx, esi |
||
445 | @@: |
||
446 | lodsb |
||
447 | test al, al |
||
448 | jnz @b |
||
449 | @@: |
||
450 | dec esi |
||
451 | cmp byte [esi], '/' |
||
452 | jnz @b |
||
453 | mov [last_name_component], esi |
||
454 | sub esi, ecx |
||
455 | xchg ecx, esi |
||
456 | mov edi, curdir |
||
457 | rep movsb |
||
458 | mov byte [edi], 0 |
||
459 | mcall 68, 12, 0x1000 |
||
460 | test eax, eax |
||
461 | jz .ret |
||
462 | mov ebx, readdir_fileinfo |
||
463 | mov dword [ebx+12], (0x1000 - 32) / 304 |
||
464 | mov dword [ebx+16], eax |
||
465 | mcall 70 |
||
466 | cmp eax, 6 |
||
467 | jz .dirok |
||
468 | test eax, eax |
||
469 | jnz free_directory |
||
470 | mov edx, [directory_ptr] |
||
471 | mov ecx, [edx+8] |
||
472 | mov [readblocks], ecx |
||
473 | imul ecx, 304 |
||
474 | add ecx, 32 |
||
475 | mcall 68, 20 |
||
476 | test eax, eax |
||
477 | jz free_directory |
||
478 | mov [directory_ptr], eax |
||
479 | mcall 70, readdir_fileinfo |
||
480 | .dirok: |
||
481 | cmp ebx, 0 |
||
482 | jle free_directory |
||
483 | mov eax, [directory_ptr] |
||
484 | add eax, 32 |
||
485 | mov edi, eax |
||
486 | push 0 |
||
487 | .dirskip: |
||
488 | push eax |
||
489 | test byte [eax], 18h |
||
490 | jnz .nocopy |
||
491 | lea esi, [eax+40] |
||
492 | mov ecx, esi |
||
493 | @@: |
||
494 | lodsb |
||
495 | test al, al |
||
496 | jnz @b |
||
497 | @@: |
||
498 | dec esi |
||
499 | cmp esi, ecx |
||
500 | jb .noext |
||
501 | cmp byte [esi], '.' |
||
502 | jnz @b |
||
503 | inc esi |
||
504 | mov ecx, [esi] |
||
505 | or ecx, 0x202020 |
||
506 | cmp ecx, 'jpg' |
||
507 | jz .copy |
||
508 | cmp ecx, 'bmp' |
||
509 | jz .copy |
||
510 | cmp ecx, 'gif' |
||
511 | jz .copy |
||
512 | cmp ecx, 'png' |
||
513 | jz .copy |
||
514 | cmp ecx, 'jpe' |
||
515 | jz .copy |
||
1102 | diamond | 516 | cmp ecx, 'ico' |
517 | jz .copy |
||
518 | cmp ecx, 'cur' |
||
519 | jz .copy |
||
1016 | diamond | 520 | cmp ecx, 'jpeg' |
521 | jz @f |
||
522 | cmp ecx, 'jpeG' |
||
523 | jnz .nocopy |
||
524 | @@: |
||
525 | cmp byte [esi+4], 0 |
||
526 | jnz .nocopy |
||
527 | .copy: |
||
528 | mov esi, [esp] |
||
529 | mov ecx, 304 / 4 |
||
530 | rep movsd |
||
531 | inc dword [esp+4] |
||
532 | .nocopy: |
||
533 | .noext: |
||
534 | pop eax |
||
535 | add eax, 304 |
||
536 | dec ebx |
||
537 | jnz .dirskip |
||
538 | mov eax, [directory_ptr] |
||
539 | pop ebx |
||
540 | mov [eax+4], ebx |
||
541 | test ebx, ebx |
||
542 | jz free_directory |
||
1144 | diamond | 543 | push 0 ; sort mode |
544 | push ebx |
||
545 | add eax, 32 |
||
546 | push eax |
||
547 | call [SortDir] |
||
1016 | diamond | 548 | xor eax, eax |
549 | mov edi, [directory_ptr] |
||
550 | add edi, 32 + 40 |
||
551 | .scan: |
||
552 | mov esi, [last_name_component] |
||
553 | inc esi |
||
1144 | diamond | 554 | push edi |
555 | invoke strcmpi |
||
556 | pop edi |
||
1016 | diamond | 557 | jz .found |
558 | inc eax |
||
559 | add edi, 304 |
||
560 | dec ebx |
||
561 | jnz .scan |
||
562 | or eax, -1 |
||
563 | .found: |
||
564 | mov [cur_file_idx], eax |
||
565 | .ret: |
||
566 | ret |
||
567 | |||
568 | free_directory: |
||
569 | mcall 68, 13, [directory_ptr] |
||
570 | and [directory_ptr], 0 |
||
571 | ret |
||
572 | |||
1080 | diamond | 573 | init_frame: |
574 | push eax |
||
575 | mov eax, [image] |
||
576 | mov [cur_frame], eax |
||
577 | test byte [eax + Image.Flags], Image.IsAnimated |
||
578 | jz @f |
||
579 | push ebx |
||
580 | mcall 26, 9 |
||
581 | pop ebx |
||
582 | mov [cur_frame_time], eax |
||
583 | @@: |
||
584 | pop eax |
||
585 | ret |
||
586 | |||
1004 | diamond | 587 | draw_window: |
1040 | diamond | 588 | cmp [bFirstDraw], 0 |
589 | jz .posok |
||
590 | or ecx, -1 |
||
591 | mcall 9, procinfo |
||
592 | |||
593 | cmp dword [ebx + 66], 0 |
||
1087 | diamond | 594 | jle .posok |
1040 | diamond | 595 | |
596 | mov edx, ecx |
||
597 | mov esi, ecx |
||
598 | cmp dword [ebx + 42], 40 + 25 * 9 |
||
599 | jae @f |
||
600 | mov edx, 40 + 25 * 9 |
||
601 | @@: |
||
602 | cmp dword [ebx + 46], 70 |
||
603 | jae @f |
||
604 | mov esi, 70 |
||
605 | @@: |
||
606 | mov eax, edx |
||
607 | and eax, esi |
||
608 | cmp eax, -1 |
||
609 | jz @f |
||
610 | mov ebx, ecx |
||
611 | mcall 67 |
||
612 | @@: |
||
613 | |||
614 | .posok: |
||
615 | mcall 12, 1 |
||
1004 | diamond | 616 | mcall 48, 4 |
617 | mov ebp, eax ; save skin height |
||
618 | add eax, [wnd_height] |
||
619 | __mov ebx, 100, 0 |
||
620 | add ebx, [wnd_width] |
||
621 | lea ecx, [100*65536 + eax] |
||
622 | mcall 0, , , 0x73FFFFFF, , s_header |
||
623 | |||
624 | mcall 9, procinfo, -1 |
||
1040 | diamond | 625 | mov [bFirstDraw], 1 |
1087 | diamond | 626 | cmp dword [ebx + 66], 0 |
627 | jle .nodraw |
||
628 | mov ebx, [ebx + 62] |
||
1016 | diamond | 629 | inc ebx |
1004 | diamond | 630 | mcall 13, , <0, 35>, 0xFFFFFF |
1016 | diamond | 631 | mov ecx, [procinfo + 66] |
1040 | diamond | 632 | inc ecx |
633 | mov esi, [draw_height] |
||
634 | add esi, 35 |
||
635 | sub ecx, esi |
||
636 | jbe @f |
||
637 | push esi |
||
638 | shl esi, 16 |
||
639 | add ecx, esi |
||
640 | pop esi |
||
1004 | diamond | 641 | mcall |
1040 | diamond | 642 | xor ecx, ecx |
643 | @@: |
||
644 | add ecx, esi |
||
645 | add ecx, 35*10000h - 35 |
||
646 | __mov ebx, 0, 5 |
||
1004 | diamond | 647 | mcall |
1040 | diamond | 648 | mov esi, [draw_width] |
649 | add esi, ebx |
||
650 | mov ebx, [procinfo+62] |
||
651 | inc ebx |
||
1004 | diamond | 652 | sub ebx, esi |
1040 | diamond | 653 | jbe @f |
654 | shl esi, 16 |
||
1004 | diamond | 655 | add ebx, esi |
656 | mcall |
||
1040 | diamond | 657 | @@: |
1004 | diamond | 658 | |
1016 | diamond | 659 | mov ebx, [procinfo + 62] |
660 | push ebx |
||
661 | mcall 38, , <30, 30>, 0x007F7F7F |
||
662 | mcall , <5 + 25 * 1, 5 + 25 * 1>, <0, 30> |
||
663 | mcall , <10 + 25 * 3, 10 + 25 * 3> |
||
664 | mcall , <15 + 25 * 4, 15 + 25 * 4> |
||
665 | pop ebx |
||
666 | sub ebx, 25 * 5 + 10 |
||
667 | push ebx |
||
668 | imul ebx, 10001h |
||
669 | mcall |
||
1004 | diamond | 670 | |
671 | mcall 8, <5 + 25 * 0, 20>, <5, 20>, 'opn'+40000000h |
||
1016 | diamond | 672 | mcall , <10 + 25 * 1, 20>, , 'bck'+40000000h |
673 | mcall , <10 + 25 * 2, 20>, , 'fwd'+40000000h |
||
674 | mcall , <15 + 25 * 3, 20>, , 'bgr'+40000000h |
||
675 | pop ebx |
||
676 | add ebx, 5 |
||
677 | shl ebx, 16 |
||
678 | mov bl, 20 |
||
679 | mcall , , , 'flh'+40000000h |
||
680 | add ebx, 25 * 65536 |
||
681 | mcall , , , 'flv'+40000000h |
||
682 | add ebx, 30 * 65536 |
||
683 | mcall , , , 'rtr'+40000000h |
||
684 | add ebx, 25 * 65536 |
||
685 | mcall , , , 'rtl'+40000000h |
||
686 | add ebx, 25 * 65536 |
||
687 | mcall , , , 'flb'+40000000h |
||
1004 | diamond | 688 | |
1016 | diamond | 689 | mov ebp, (numimages-1)*20 |
1004 | diamond | 690 | |
1016 | diamond | 691 | mcall 65, buttons+openbtn*20, <20, 20>, <5 + 25 * 0, 5>, 8, palette |
692 | mcall , buttons+backbtn*20, , <10 + 25 * 1, 5> |
||
693 | mcall , buttons+forwardbtn*20, , <10 + 25 * 2, 5> |
||
694 | mcall , buttons+bgrbtn*20, , <15 + 25 * 3, 5> |
||
695 | mov edx, [procinfo + 62] |
||
696 | sub edx, 25 * 5 + 4 |
||
697 | shl edx, 16 |
||
698 | mov dl, 5 |
||
699 | mcall , buttons+fliphorzbtn*20 |
||
700 | add edx, 25 * 65536 |
||
701 | mcall , buttons+flipvertbtn*20 |
||
702 | add edx, 30 * 65536 |
||
703 | mcall , buttons+rotcwbtn*20 |
||
704 | add edx, 25 * 65536 |
||
705 | mcall , buttons+rotccwbtn*20 |
||
706 | add edx, 25 * 65536 |
||
707 | mcall , buttons+rot180btn*20 |
||
1004 | diamond | 708 | |
1080 | diamond | 709 | call draw_cur_frame |
1004 | diamond | 710 | |
1087 | diamond | 711 | .nodraw: |
1040 | diamond | 712 | mcall 12, 2 |
713 | |||
1004 | diamond | 714 | ret |
715 | |||
1080 | diamond | 716 | draw_cur_frame: |
717 | push 0 ; ypos |
||
718 | push 0 ; xpos |
||
719 | mov eax, [procinfo+66] |
||
720 | sub eax, 34 |
||
721 | push eax ; max height |
||
722 | mov eax, [procinfo+62] |
||
723 | sub eax, 4 |
||
724 | push eax ; max width |
||
725 | push 35 ; y |
||
726 | push 5 ; x |
||
727 | push [cur_frame] |
||
728 | call [img.draw] |
||
1102 | diamond | 729 | mov eax, [image] |
730 | test [eax + Image.Flags], Image.IsAnimated |
||
731 | jnz .done |
||
732 | cmp [eax + Image.Next], 0 |
||
733 | jnz .additional_frames |
||
734 | .done: |
||
1080 | diamond | 735 | ret |
1102 | diamond | 736 | .additional_frames: |
737 | mov ebx, [procinfo+62] |
||
738 | sub ebx, 4 |
||
739 | jbe .done |
||
740 | push 5 |
||
741 | pop esi |
||
742 | .afloop: |
||
743 | sub ebx, [eax + Image.Width] |
||
744 | jbe .done |
||
745 | dec ebx |
||
746 | jz .done |
||
747 | add esi, [eax + Image.Width] |
||
748 | mov eax, [eax + Image.Next] |
||
749 | push eax |
||
750 | inc esi |
||
751 | push 0 ; ypos |
||
752 | push 0 ; xpos |
||
753 | mov ecx, [procinfo+66] |
||
754 | sub ecx, 34 |
||
755 | push ecx ; max height |
||
756 | push ebx ; max width |
||
757 | push 35 ; y |
||
758 | push esi ; x |
||
759 | push eax ; image |
||
760 | call [img.draw] |
||
761 | pop eax |
||
762 | cmp [eax + Image.Next], 0 |
||
763 | jnz .afloop |
||
764 | ret |
||
1080 | diamond | 765 | |
1004 | diamond | 766 | ; void* __stdcall mem.Alloc(unsigned size); |
767 | mem.Alloc: |
||
768 | push ebx ecx |
||
769 | mov ecx, [esp+12] |
||
770 | mcall 68, 12 |
||
771 | pop ecx ebx |
||
772 | ret 4 |
||
773 | |||
774 | ; void* __stdcall mem.ReAlloc(void* mptr, unsigned size); |
||
775 | mem.ReAlloc: |
||
776 | push ebx ecx edx |
||
777 | mov edx, [esp+16] |
||
778 | mov ecx, [esp+20] |
||
779 | mcall 68, 20 |
||
780 | pop edx ecx ebx |
||
781 | ret 8 |
||
782 | |||
783 | ; void __stdcall mem.Free(void* mptr); |
||
784 | mem.Free: |
||
785 | push ebx ecx |
||
786 | mov ecx, [esp+12] |
||
787 | mcall 68, 13 |
||
788 | pop ecx ebx |
||
789 | ret 4 |
||
790 | |||
791 | ;----------------------------------------------------------------------------- |
||
792 | |||
793 | s_header db 'Kolibri Image Viewer', 0 |
||
794 | |||
795 | ;----------------------------------------------------------------------------- |
||
796 | |||
797 | opendialog: |
||
798 | ; |
||
799 | ; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, |
||
800 | ; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) |
||
801 | ; |
||
802 | |||
803 | ;; mov esi,path |
||
804 | mov edi,path |
||
805 | xor eax,eax |
||
806 | mov ecx,(1024+16)/4 |
||
807 | rep stosd |
||
808 | |||
809 | ;mov [get_loops],0 |
||
810 | mov [dlg_pid_get],0 |
||
811 | |||
812 | ; Get my PID in dec format 4 bytes |
||
813 | mov eax,9 |
||
814 | mov ebx,procinfo |
||
815 | or ecx,-1 |
||
816 | mcall |
||
817 | |||
818 | ; convert eax bin to param dec |
||
819 | mov eax,dword [procinfo+30] ;offset of myPID |
||
820 | mov edi,param+4-1 ;offset to 4 bytes |
||
821 | mov ecx,4 |
||
822 | mov ebx,10 |
||
823 | new_d: |
||
824 | xor edx,edx |
||
825 | div ebx |
||
826 | add dl,'0' |
||
827 | mov [edi],dl |
||
828 | dec edi |
||
829 | loop new_d |
||
830 | |||
831 | ; wirite 1 byte space to param |
||
832 | mov [param+4],byte 32 ;Space for next parametr |
||
833 | ; and 1 byte type of dialog to param |
||
834 | mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog) |
||
835 | |||
836 | ; |
||
837 | ; STEP2 prepare IPC area for get messages |
||
838 | ; |
||
839 | |||
840 | ; prepare IPC area |
||
841 | mov [path],dword 0 |
||
842 | mov [path+4],dword 8 |
||
843 | |||
844 | ; define IPC memory |
||
845 | mov eax,60 |
||
846 | mov ebx,1 ; define IPC |
||
847 | mov ecx,path ; offset of area |
||
848 | mov edx,1024+16 ; size |
||
849 | mcall |
||
850 | |||
851 | ; change wanted events list 7-bit IPC event |
||
852 | mov eax,40 |
||
853 | mov ebx,01000111b |
||
854 | cmp [image], 0 |
||
855 | jnz @f |
||
856 | mov bl, 01000110b |
||
857 | @@: |
||
858 | mcall |
||
859 | |||
860 | ; |
||
861 | ; STEP 3 run SYSTEM XTREE with parameters |
||
862 | ; |
||
863 | |||
864 | mov eax,70 |
||
865 | mov ebx,run_fileinfo |
||
866 | mcall |
||
867 | |||
868 | mov [get_loops],0 |
||
869 | getmesloop: |
||
870 | mov eax,23 |
||
871 | mov ebx,50 ;0.5 sec |
||
872 | mcall |
||
873 | dec eax |
||
874 | jz mred |
||
875 | dec eax |
||
876 | jz mkey |
||
877 | dec eax |
||
878 | jz mbutton |
||
879 | cmp al, 7-3 |
||
880 | jz mgetmes |
||
881 | |||
882 | ; Get number of procces |
||
883 | mov ebx,procinfo |
||
884 | mov ecx,-1 |
||
885 | mov eax,9 |
||
886 | mcall |
||
887 | mov ebp,eax |
||
888 | |||
889 | loox: |
||
890 | mov eax,9 |
||
891 | mov ebx,procinfo |
||
892 | mov ecx,ebp |
||
893 | mcall |
||
894 | mov eax,[DLGPID] |
||
895 | cmp [procinfo+30],eax ;IF Dialog find |
||
896 | je dlg_is_work ;jmp to dlg_is_work |
||
897 | dec ebp |
||
898 | jnz loox |
||
899 | |||
900 | jmp erroff |
||
901 | |||
902 | dlg_is_work: |
||
903 | cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated |
||
904 | je erroff ;TESTODP2 terminated too |
||
905 | |||
906 | cmp [dlg_pid_get],dword 1 |
||
907 | je getmesloop |
||
908 | inc [get_loops] |
||
909 | cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated |
||
910 | jae erroff |
||
911 | jmp getmesloop |
||
912 | |||
913 | mred: |
||
914 | cmp [image], 0 |
||
915 | jz getmesloop |
||
916 | call draw_window |
||
917 | jmp getmesloop |
||
918 | mkey: |
||
919 | mov eax,2 |
||
920 | mcall ; read (eax=2) |
||
921 | jmp getmesloop |
||
922 | mbutton: |
||
923 | mov eax,17 ; get id |
||
924 | mcall |
||
925 | cmp ah,1 ; button id=1 ? |
||
926 | jne getmesloop |
||
927 | mov eax,-1 ; close this program |
||
928 | mcall |
||
929 | mgetmes: |
||
930 | |||
931 | ; If dlg_pid_get then second message get jmp to still |
||
932 | cmp [dlg_pid_get],dword 1 |
||
933 | je ready |
||
934 | |||
935 | ; First message is number of PID SYSXTREE dialog |
||
936 | |||
937 | ; convert PID dec to PID bin |
||
938 | movzx eax,byte [path+16] |
||
939 | sub eax,48 |
||
940 | imul eax,10 |
||
941 | movzx ebx,byte [path+16+1] |
||
942 | add eax,ebx |
||
943 | sub eax,48 |
||
944 | imul eax,10 |
||
945 | movzx ebx,byte [path+16+2] |
||
946 | add eax,ebx |
||
947 | sub eax,48 |
||
948 | imul eax,10 |
||
949 | movzx ebx,byte [path+16+3] |
||
950 | add eax,ebx |
||
951 | sub eax,48 |
||
952 | mov [DLGPID],eax |
||
953 | |||
954 | ; Claear and prepare IPC area for next message |
||
955 | mov [path],dword 0 |
||
956 | mov [path+4],dword 8 |
||
957 | mov [path+8],dword 0 |
||
958 | mov [path+12],dword 0 |
||
959 | mov [path+16],dword 0 |
||
960 | |||
961 | ; Set dlg_pid_get for get next message |
||
962 | mov [dlg_pid_get],dword 1 |
||
963 | cmp [image], 0 |
||
964 | jz getmesloop |
||
965 | call draw_window |
||
966 | jmp getmesloop |
||
967 | |||
968 | ready: |
||
969 | ; |
||
970 | ; The second message get |
||
971 | ; Second message is 100 bytes path to SAVE/OPEN file |
||
972 | ; shl path string on 16 bytes |
||
973 | ; |
||
974 | mov esi,path+16 |
||
975 | mov edi,path |
||
976 | mov ecx,1024/4 |
||
977 | rep movsd |
||
978 | mov [edi],byte 0 |
||
979 | |||
980 | openoff: |
||
981 | mcall 40, 7 |
||
982 | clc |
||
983 | ret |
||
984 | |||
985 | erroff: |
||
986 | mcall 40, 7 |
||
987 | stc |
||
988 | ret |
||
989 | |||
990 | ;----------------------------------------------------------------------------- |
||
991 | |||
992 | align 4 |
||
993 | @IMPORT: |
||
994 | |||
995 | library \ |
||
996 | libio , 'libio.obj' , \ |
||
997 | libgfx , 'libgfx.obj' , \ |
||
1144 | diamond | 998 | libimg , 'libimg.obj' , \ |
999 | sort , 'sort.obj' |
||
1004 | diamond | 1000 | |
1001 | import libio , \ |
||
1002 | libio.init , 'lib_init' , \ |
||
1102 | diamond | 1003 | file.size , 'file_size' , \ |
1004 | file.open , 'file_open' , \ |
||
1005 | file.read , 'file_read' , \ |
||
1006 | file.close , 'file_close' |
||
1004 | diamond | 1007 | |
1008 | import libgfx , \ |
||
1009 | libgfx.init , 'lib_init' , \ |
||
1102 | diamond | 1010 | gfx.open , 'gfx_open' , \ |
1011 | gfx.close , 'gfx_close' , \ |
||
1012 | gfx.pen.color , 'gfx_pen_color' , \ |
||
1013 | gfx.line , 'gfx_line' |
||
1004 | diamond | 1014 | |
1015 | import libimg , \ |
||
1016 | libimg.init , 'lib_init' , \ |
||
1102 | diamond | 1017 | img.is_img , 'img_is_img' , \ |
1018 | img.to_rgb2 , 'img_to_rgb2', \ |
||
1019 | img.decode , 'img_decode' , \ |
||
1020 | img.flip , 'img_flip' , \ |
||
1021 | img.rotate , 'img_rotate' , \ |
||
1022 | img.destroy , 'img_destroy', \ |
||
1023 | img.draw , 'img_draw' |
||
1004 | diamond | 1024 | |
1144 | diamond | 1025 | import sort, sort.START, 'START', SortDir, 'SortDir', strcmpi, 'strcmpi' |
1016 | diamond | 1026 | |
1040 | diamond | 1027 | bFirstDraw db 0 |
1004 | diamond | 1028 | ;----------------------------------------------------------------------------- |
1029 | |||
1016 | diamond | 1030 | virtual at 0 |
1031 | file 'kivicons.bmp':0xA,4 |
||
1032 | load offbits dword from 0 |
||
1033 | end virtual |
||
1034 | numimages = 9 |
||
1035 | openbtn = 0 |
||
1036 | backbtn = 1 |
||
1037 | forwardbtn = 2 |
||
1038 | bgrbtn = 3 |
||
1039 | fliphorzbtn = 4 |
||
1040 | flipvertbtn = 5 |
||
1041 | rotcwbtn = 6 |
||
1042 | rotccwbtn = 7 |
||
1043 | rot180btn = 8 |
||
1044 | |||
1004 | diamond | 1045 | palette: |
1016 | diamond | 1046 | file 'kivicons.bmp':0x36,offbits-0x36 |
1047 | buttons: |
||
1048 | file 'kivicons.bmp':offbits |
||
1004 | diamond | 1049 | repeat 10 |
1050 | y = % - 1 |
||
1051 | z = 20 - % |
||
1016 | diamond | 1052 | repeat numimages*5 |
1053 | load a dword from $ - numimages*20*20 + numimages*20*y + (%-1)*4 |
||
1054 | load b dword from $ - numimages*20*20 + numimages*20*z + (%-1)*4 |
||
1055 | store dword a at $ - numimages*20*20 + numimages*20*z + (%-1)*4 |
||
1056 | store dword b at $ - numimages*20*20 + numimages*20*y + (%-1)*4 |
||
1004 | diamond | 1057 | end repeat |
1058 | end repeat |
||
1059 | |||
1060 | ; DATA AREA |
||
1061 | get_loops dd 0 |
||
1062 | dlg_pid_get dd 0 |
||
1063 | DLGPID dd 0 |
||
1064 | |||
1065 | param: |
||
1066 | dd 0 ; My dec PID |
||
1067 | dd 0,0 ; Type of dialog |
||
1068 | |||
1069 | run_fileinfo: |
||
1070 | dd 7 |
||
1071 | dd 0 |
||
1072 | dd param |
||
1073 | dd 0 |
||
1074 | dd 0 |
||
1075 | ;run_filepath |
||
1076 | db '/sys/SYSXTREE',0 |
||
1077 | |||
1016 | diamond | 1078 | readdir_fileinfo: |
1079 | dd 1 |
||
1080 | dd 0 |
||
1081 | dd 0 |
||
1082 | readblocks dd 0 |
||
1083 | directory_ptr dd 0 |
||
1084 | |||
1004 | diamond | 1085 | ;----------------------------------------------------------------------------- |
1086 | |||
1087 | I_END: |
||
1088 | |||
1016 | diamond | 1089 | curdir rb 1024 |
1090 | |||
1091 | align 4 |
||
1004 | diamond | 1092 | img_data dd ? |
1093 | img_data_len dd ? |
||
1094 | fh dd ? |
||
1095 | image dd ? |
||
1096 | wnd_width dd ? |
||
1097 | wnd_height dd ? |
||
1040 | diamond | 1098 | draw_width dd ? |
1099 | draw_height dd ? |
||
1016 | diamond | 1100 | last_name_component dd ? |
1101 | cur_file_idx dd ? |
||
1080 | diamond | 1102 | cur_frame_time dd ? |
1103 | cur_frame dd ? |
||
1004 | diamond | 1104 | |
1105 | ctx dd ? |
||
1106 | |||
1107 | procinfo: rb 1024 |
||
1108 | path: rb 1024+16 |
||
1109 | |||
1110 | @PARAMS rb 51215>10>10>5>20,>15>10>10>5,>5>15>10>0,>5>30,>0,> |