Login

Subversion Repositories NedoOS

Rev

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

fire_or_rmb_navigator
        call isitclick
        ret nz ;кнопку уже держали
        ld hl,(arrx)
        ld bc,-navigatorx
        add hl,bc
        ex de,hl
        ld bc,(curbitmapwid_edit)
        ;ld a,b
        ;or c
        ;ret z ;пустой битмэп
        call mulbcde_ahl ;hl=bitmapwid * (x-navigatorx)
        push hl ;hl=bitmapwid * (x-navigatorx)
        call calcnavigatorsize ;hl=navigatorwid, b=navigatorhgt
        ex de,hl ;de=navigatorwid
        pop hl ;hl=bitmapwid * (x-navigatorx)
        push bc ;navigatorhgt
        call divhlde ;hl=hl/de = (bitmapwid * (x-navigatorx))/navigatorwid
;вычесть workzonewid/scale/2 с учётом переполнения
        push hl
        ld hl,workzonewid8*8/2
        call scalescrcoords
        ex de,hl
        pop hl
        ;or a
        ;sbc hl,de
        ;jr nc,$+5
        ;ld hl,0
        call subhldecheck0
       ld (curbitmapxscroll),hl ;ставим в центр
        ld a,(arry)
        sub navigatory
        ld e,a
        ld d,0
        ld bc,(curbitmaphgt)
        call mulbcde_ahl ;hl=bitmaphgt * (y-navigatory)
        pop bc ;b=navigatorhgt
        ld d,0
        ld e,b
        call divhlde ;hl=hl/de = (bitmaphgt * (y-navigatory))/navigatorhgt
;вычесть workzonehgt/scale/2 с учётом переполнения
        push hl
        ld hl,workzonehgt/2
        call scalescrcoords
        ex de,hl
        pop hl
        ;or a
        ;sbc hl,de
        ;jr nc,$+5
        ;ld hl,0
        call subhldecheck0
       ld (curbitmapyscroll),hl ;ставим в центр
        jp control_scroll_checksize

calcnavigatorsize
;out: hl=wid, b=hgt
        ld hl,(curbitmapwid_edit)
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl ;при wid>=2048 будет переполнение!
        jr nc,$+5
        ld hl,0xffff ;wid==2048
        ld de,(curbitmaphgt)
        call divhlde ;hl=hl/de
        ld bc,navigatorwid*32/navigatorhgt
        or a
        sbc hl,bc
        jr c,shownavigator_high
;shownavigator_wide
        ld bc,(curbitmaphgt) ;<2048
        ld de,navigatorwid
        call mulbcde_ahl
        ld de,(curbitmapwid_edit)
        call divhlde ;hl=hl/de
        ld b,l ;b=hgt = (navigatorwid*bitmaphgt)/bitmapwid
        ld hl,navigatorwid ;hl=wid
        ret;jr shownavigator_high_or_wide_q
shownavigator_high
        ld bc,(curbitmapwid_edit) ;<2048
        ld de,navigatorhgt
        call mulbcde_ahl
        ld de,(curbitmaphgt)
        call divhlde ;hl=hl/de
        ;hl=wid = (navigatorhgt*bitmapwid)/bitmaphgt
        ld b,navigatorhgt ;b=hgt
;shownavigator_high_or_wide_q
        ret

shownavigator
        ld hl,(curbitmaphgt)
        ld a,h
        or l
        ret z ;пустой битмэп
;картинка высокая или широкая?
;если bitmapwid/bitmaphgt >= navigatorwid/navigatorhgt, то картинка широкая, иначе высокая
        call setpgshapes

        call calcnavigatorsize ;hl=wid, b=hgt
       
        ld c,navigatory ;c=y
        ld de,navigatorx ;de=x
        ld a,l
        ld (shownavigator_wid),a
        ld a,b
        ld (shownavigator_hgt),a
        push bc
        push de
        push hl
        ;ld lx,backcolor ;lx=color
        ;call getcontrastcolors
        call getblackongrey
        ;call getgreycolor ;ld a,backcolor
        ;ld lx,a
        call shapes_prpixelbox
        pop hl
        pop de
        pop bc
        ;ld lx,0 ;lx=color
        call getcontrastcolors
        ld lx,hx
        call shapes_prpixelframe

;shapes_prpixelframe(navigatorx+xleft, navigatory+ytop, xright-xleft, ybottom-ytop)

;расчёт k=navigatorwid*256/bitmapwid:
        ;ld hl,navigatorwid*256
        ld hl,(shownavigator_wid-1) ;h=wid
        ld l,0
        ld de,(curbitmapwid_edit)
        call divhlde ;hl=k
        ex de,hl ;de=k
;xleft=k*bitmapxscroll
        ld bc,(curbitmapxscroll)
        call mulbcde_ahl
        ld b,a
        ld c,h
;bc=xleft
;при xleft==0, но bitmapxscroll!=0, сделать xleft++
        ld a,b
        or c
        jr nz,shownavigator_nocorrectxleft
        ld hl,(curbitmapxscroll)
        ld a,h
        or l
        jr z,shownavigator_nocorrectxleft ;bitmapxscroll==0
        inc bc ;xleft++ ;TODO test
shownavigator_nocorrectxleft
        ld hl,navigatorx
        add hl,bc
        ld (shownavigator_xleft),hl
;xright=min[k*(bitmapxscroll+workzonewid/scale),navigatorwid]
        push de ;k
        ld hl,workzonewid8*8
        call scalescrcoords
        ld bc,(curbitmapxscroll)
        add hl,bc
        ld b,h
        ld c,l
        pop de ;k
        call mulbcde_ahl
        ld l,h
        ld h,a
shownavigator_wid=$+1
        ld bc,navigatorwid
        call minhl_bc_tobc ;bc = наименьшее из k*(bitmapxscroll+workzonewid/scale) и navigatorwid
;bc=xright
;если не существует пиксель (workzonex+workzonewid,workzoney), то xright=navigatorwid
;при xright==navigatorwid, но существует пиксель (workzonex+workzonewid,workzoney), сделать xright--
        push de ;k
        push bc
        ld a,workzoney
        ld hl,workzonex8*8+(workzonewid8*8)
        call checkfirecoords ;out: CY=вне битмэпа ;bc=x в bitmap, de=y в bitmap
        pop bc
        ld hl,(shownavigator_wid)
        jr nc,shownavigator_nogluexright
        ld b,h
        ld c,l
        jr shownavigator_nocorrectxright
shownavigator_nogluexright
        or a
        sbc hl,bc
        jr nz,shownavigator_nocorrectxright ;xright!=navigatorwid
        dec bc ;xleft-- ;TODO test
shownavigator_nocorrectxright
        pop de ;k
        ld hl,navigatorx
        add hl,bc
        ld (shownavigator_xright),hl

;y аналогично

;yleft=k*bitmapyscroll
        ld bc,(curbitmapyscroll)
        call mulbcde_ahl
;h=ytop
;при ytop==0, но bitmapyscroll!=0, сделать ytop++
        ld a,h
        or a
        jr nz,shownavigator_nocorrectytop
        ld bc,(curbitmapyscroll)
        ld a,b
        or c
        jr z,shownavigator_nocorrectytop ;bitmaptscroll==0
        inc h ;ytop++ ;TODO test
shownavigator_nocorrectytop
        ld a,h
        add a,navigatory
        ld (shownavigator_ytop),a
;yright=k*(min[bitmapyscroll+workzonehgt/scale,bitmaphgt])
        push de
        ld hl,workzonehgt
        call scalescrcoords
        ld bc,(curbitmapyscroll)
        add hl,bc
        ld bc,(curbitmaphgt)
        call minhl_bc_tobc ;bc = наименьшее из bitmapyscroll+workzonehgt/scale и bitmaphgt
        pop de
        call mulbcde_ahl
;h=ybottom
;если не существует пиксель (workzonex,workzoney+workzonehgt), то ybottom=navigatorhgt
;при ybottom==navigatorhgt, но существует пиксель (workzonex,workzoney+workzonehgt), сделать ybottom--
        push de ;k
        push hl
        ld a,workzoney+workzonehgt
        ld hl,workzonex8*8
        call checkfirecoords ;out: CY=вне битмэпа ;bc=x в bitmap, de=y в bitmap
        pop hl
shownavigator_hgt=$+1
        ld a,0
        jr nc,shownavigator_noglueybottom
        ld h,a;navigatorhgt
        jr shownavigator_nocorrectybottom
shownavigator_noglueybottom
        cp h
        jr nz,shownavigator_nocorrectybottom ;ybottom!=navigatorhgt
        dec h ;ybottom-- ;TODO test
shownavigator_nocorrectybottom
        pop de ;k
        ld a,h
        add a,navigatory
        ld (shownavigator_ybottom),a

shownavigator_xleft=$+1
        ld de,0
shownavigator_xright=$+1
        ld hl,0
        or a
        sbc hl,de ;xright-xleft
shownavigator_ytop=$+1
        ld c,0 ;c=y
shownavigator_ybottom=$+1
        ld a,0
        sub c ;ybottom-ytop
        ld b,a ;b=hgt
       
        ;ld c,navigatory ;c=y
        ;ld de,navigatorx8*8 ;de=x
        ;ld b,navigatorhgt-1 ;b=hgt
        ;ld hl,navigatorwid-1 ;hl=wid
        ld lx,0xe4;%11100100 ;lx=color
        jp shapes_prpixelframe

showbitmapcoords
;hl=x
;a=y
        call checkfirezone ;out: a=код зоны
        cp ZONE_WORK
        ret nz ;вне рабочей зоны
;bc=x в bitmap, de=y в bitmap
        call setpgshapes
        call getblackongrey
        ;call getcontrastcolors;ld ix,0xff3f;%00111111 ;lx=фоновый цвет
        ;call getgreycolor
        ;ld lx,a

        push de ;y
        ;push bc ;x

        ld hl,coordsy*40 + (coordsx/8) + scrbase
        ld de,tnavigator_x
        ;pop bc ;x
        call shapes_prtext_num
        pop bc ;y
        jp shapes_prtext_num

showwindowcoords
;bc=x
;de=y
        call setpgshapes
        ;ld ix,0xff3f;%00111111 ;lx=фоновый цвет
        call getblackongrey
        ;call getcontrastcolors
        ;call getgreycolor
        ;ld lx,a

        push de ;y
        ;push bc ;x

        ld hl,coordswindowy*40 + (coordsx/8) + scrbase
        ld de,tnavigator_wx
        ;pop bc
        call shapes_prtext_num
        pop bc ;y
        call shapes_prtext_num
        ld bc,(curwindowwid)
        call shapes_prtext_num
        ld bc,(curwindowhgt)
        jp shapes_prtext_num

tnavigator_x
        db "x ",0
tnavigator_y
        db "y ",0
tnavigator_wx
        db "wx ",0
tnavigator_wy
        db "wy ",0
tnavigator_wid
        db "wid ",0
tnavigator_hgt
        db "hgt ",0