Subversion Repositories Kolibri OS

Rev

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