Login

Subversion Repositories NedoOS

Rev

Rev 147 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

showcopywindow
;hl=x на экране
;a=y на экране
;рисуем окно копирования, если окно существует (в любом битмэпе) и включен режим windowcopymode!=0
        call iscopywindowvisible
        ret nz
        jp showwindow_calcandshow_noshowwindowcoords

iscopywindowvisible
;out: nz=invisible
        ld bc,(curwindowstate)
        dec c
        dec c
        ret nz ;окно нигде не существует
        ld bc,(windowcopymode)
        dec c
        ret nz ;выключен режим windowcopymode
        call checkfirezone
        cp ZONE_WORK
        ret ;nz=invisible

showwindow
;hl=x на экране
;a=y на экране
;рисуем окно, если оно выделено в текущем битмэпе
        ld bc,(curwindowstate)
        dec c
        jr z,showwindow_onecorner
        inc c
        ret z ;окна нет
        ld bc,(curwindowx)
        ld de,(curwindowy)
showwindow_calcandshow
         ld a,(curwindowbmp)
         ld hl,curbmp
         cp (hl)
         ret nz ;окно выделено не в текущем битмэпе
        push bc
        push de
        call showwindowcoords
        pop de
        pop bc
showwindow_calcandshow_noshowwindowcoords
        call calccoords_frombitmapcoords_noclip ;hl=x, de=y
        ld b,h
        ld c,l ;bc=x, de=y без учёта workzone
        push de ;y
        ld hl,(curwindowwid)
        ld de,(curwindowhgt)
        call scalebitmapcoords ;hl=wid, de=hgt (могут оказаться 0)
        dec hl
        bit 7,h
        jr z,$+3
        inc hl
        dec de
        bit 7,d
        jr z,$+3
        inc de
        push de
        pop ix ;hgt
        pop de ;y
        call setpgshapes
        jp shapes_invpixelframe
       
showwindow_onecorner
;hl=x на экране
;a=y на экране
        call checkfirezone
        cp ZONE_WORK
        ret nz
;out: bc=x cur, de=y cur в bitmap (с клипированием по workzone)          
        call window_definecorner2
;bc=x в bitmap
;de=y в bitmap
        jr showwindow_calcandshow

fire_or_rmb_window
;bc=x в bitmap, de=y в bitmap
        call isitclick
        ret nz ;кнопку уже держали
         ld a,(curbmp)
         ld (curwindowbmp),a ;отныне выделяем окно в текущем битмэпе
        ld hl,(curwindowstate)
        dec l
        jr z,fire_or_rmb_window_onecorner ;задан один угол - задаём второй
        inc l
        ld a,1 ;задан угол
        jr z,fire_or_rmb_window_setcorner ;окна нет - задаём угол
;окно есть - отменяем окно
clearwindowcoords
        ld bc,coordswindowy*256 + (coordswindowx/8) ;b=y ;c=x/8
        ld de,coordswindowhgt*256 + (coordswindowwid/8) ;d=hgt ;e=wid8
        ld a,0x3f;%00111111 ;a=%33210210
        call shapes_fillbox
clearwindowstate
        xor a
        jr setwindowstate
fire_or_rmb_window_onecorner
;угол уже задан, но не всё окно
        call window_definecorner2
window_settwocorners
;bc=x в bitmap
;de=y в bitmap
        ld a,1
        ld (windowcopymode),a
        inc a ;ld a,2 ;окно задано
fire_or_rmb_window_setcorner
        ld (curwindowx),bc ;переставляем xcorner
        ld (curwindowy),de ;переставляем ycorner
setwindowstate
        ld (curwindowstate),a
        ret

window_allpicture
;TODO через OS_KEYMATRIX
        ld a,0xfb
        in a,(0xfe)
        rra ;Q
        ret nc ;было паразитное нажатие W при движении стрелки через OPQA
        ld a,(curwindowstate)
        or a
        jr nz,clearwindowcoords ;окно есть - отменяем окно
        ld hl,(curbitmapwid_edit)
        ld (curwindowwid),hl
        ld hl,(curbitmaphgt)
        ld (curwindowhgt),hl
        ld b,a
        ld c,a ;0
        ld d,a
        ld e,a ;0
        jr window_settwocorners
       
window_definecorner2        
        ld hl,(curwindowx)
        or a
        sbc hl,bc ;|hl|+1 = ширина окна
        jr nc,$+2+4 ;был xcorner >= x; переставляем xcorner
        ld bc,(curwindowx) ;xcorner < x
        call m,neghl
        inc hl
        ld (curwindowwid),hl
        ld hl,(curwindowy)
        or a
        sbc hl,de ;|hl|+1 = высота окна
        jr nc,$+2+4 ;был ycorner >= y; переставляем ycorner
        ld de,(curwindowy) ;xcorner < x
        call m,neghl
        inc hl
        ld (curwindowhgt),hl
        ret

window_mirrhor
        ld a,(curwindowstate)
        cp 2
        ret nz
        ld hl,(curwindowy)
        ld bc,(curwindowhgt)
window_mirrhor0        
        push bc
        push hl ;y1
        ex de,hl
        call window_x_setpg32k ;y1 ;hl=addr
        ex de,hl ;de=addr[x1]
        ld hl,(curwindowwid)
        ld b,h
        ld c,l
        add hl,de ;hl=addr[x2]+1
        srl b
        rr c ;bc=wid/2
window_mirrhor00
        dec hl
        ld a,(de)
        ldi
        dec hl
        ld (hl),a
        jp pe,window_mirrhor00
        pop hl ;y1
        pop bc
        cpi
        jp pe,window_mirrhor0
        jp showbitmap
       
window_mirrver
        ld a,(curwindowstate)
        cp 2
        ret nz
        ld a,(curpgtemp)
        SETPG16K
        ld de,(curwindowy)
        ld hl,(curwindowhgt)
        add hl,de
        dec hl
window_mirrver0
;de=y1
;hl=y2
;CY=0
        ld a,tempc000/256
        call window_mirrver_ldir ;from y1
        ex de,hl
        ;ld a,tempe000/256
        call window_mirrver_ldir ;from y2
        scf
        ;ld a,tempc000/256
        call window_mirrver_ldir ;to y2
        ex de,hl
        scf
        ;ld a,tempe000/256
        call window_mirrver_ldir ;to y1
        inc de ;y1
        dec hl ;y2
        ;or a
        sbc hl,de
        add hl,de
        jr nc,window_mirrver0
        jp showbitmap

window_mirrver_ldir
        push de
        push hl
        push af
        call window_x_setpg32k
        pop af
        jr nc,window_mirrver_ldir_de
        ex de,hl
        ld h,a
        ld l,0
        jr window_mirrver_ldir_go
window_mirrver_ldir_de
        ld d,a
        ld e,0
window_mirrver_ldir_go
        ld bc,(curwindowwid)
        ldir
        pop hl
        pop de
        xor +(tempe000-tempc000)/256
        ret ;CY=0

window_copy
        call ahl_coords
        call iscopywindowvisible
        ret nz
        ld a,(curbmp)
        ld (window_curbmp),a
;out: bc=x cur, de=y cur в bitmap (с клипированием по workzone)
        ld (window_copy_xto),bc
        ex de,hl ;hl=y куда
;сравнение координат и копирование снизу вверх, если надо
        ld a,(curpgtemp)
        SETPG16K
        ld bc,(curwindowhgt)
        ld de,(curwindowy)
        ;hl=y куда
        or a
        sbc hl,de
        add hl,de
        jr nc,window_copyup ;y куда >= y откуда, копируем снизу вверх
;копируем сверху вниз
window_copyline0
        call window_copylinepp
        inc hl
        inc de
        jr nz,window_copyline0
        jp showbitmap
       
window_copyup
;bc=curwindowhgt
;de=curwindowy
;hl=y куда
        add hl,bc
        ex de,hl
        add hl,bc
        ex de,hl
;копируем снизу вверх
window_copylineup0
        dec hl
        dec de
        call window_copylinepp
        jr nz,window_copylineup0
        jp showbitmap

window_copylinepp
        push bc
        push de ;y откуда
        push hl ;y куда
         push hl ;y куда
        push de ;y откуда
        ld a,(curwindowbmp)
        call selectbmp
        pop de ;y откуда
        call window_x_setpg32k ;hl=addr откуда
        ld de,tempc000
        ld bc,(curwindowwid)
        ldir
window_curbmp=$+1
        ld a,0;(curbmp)
        call selectbmp
         pop hl ;y куда
        ld bc,(curbitmaphgt)
        or a
        sbc hl,bc
        add hl,bc
        jr nc,window_copylineppq ;y куда за границей
         ex de,hl ;de=y куда
window_copy_xto=$+1
        ld bc,0
        call calcbitmap_setpg32k ;hl=addr куда
        ex de,hl ;de=addr куда
        ld hl,(curbitmapwid_edit)
        ld bc,(window_copy_xto)
        or a
        sbc hl,bc ;сколько пикселей доступно справа
        ld bc,(curwindowwid) ;сколько надо пикселей
        jr z,window_copylineppq
        call minhl_bc_tobc ;клипирование по x
        ld hl,tempc000
        ld a,(key)
        cp 'a'
        jr nc,window_copylinepp_ldir ;no Caps Shift
;with Caps Shift - transparent copy
window_copylinepp0
        ld a,(curcolor2)
        cp (hl)
        jr nz,$+4
        ld a,(de)
        ld (hl),a
        ldi
        jp pe,window_copylinepp0
        jr window_copylineppq
window_copylinepp_ldir
        ldir
window_copylineppq
        pop hl ;y куда
        pop de ;y откуда
        pop bc
        dec bc
        ld a,b
        or c
        ret

curwindowbmp
        db 0 ;0..3
windowcopymode
        db 0

curwindowstate
        db 0
curwindowx
        dw 0
curwindowy
        dw 0
curwindowwid
        dw 0
curwindowhgt
        dw 0