?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;работа внутри битмэпа
  2. ;и свойства битмэпа
  3.  
  4. fillbitmap
  5. ;bc=x
  6. ;de=y
  7. ;a=color1
  8. ;a'=color2
  9.         ld (setpixel_color),a ;setcolor
  10.         ex af,af'
  11.        ld (setpixel_color2),a
  12.        call getpixel
  13.        ld (curcheckcolor),a ;checkcolor
  14.        ld hl,setpixel_color
  15.        cp (hl)
  16.        jr nz,fillbitmap_noerrorcolor ;цвет заливки != цвет пикселя
  17.         ld a,(setpixel_color2)
  18.         cp (hl)
  19.        ret z ;нельзя кликать на цвет и заливать тем же СПЛОШНЫМ цветом - зациклится
  20. fillbitmap_noerrorcolor
  21. ;использует максимум 1K стека
  22. ;кладёт в стек только начало пустой последовательности сверху или снизу
  23.        push bc
  24.        push de
  25.        ld lx,2
  26. fillarea0
  27.        dec lx
  28.        ret z ;jp z,setpgs_scr
  29.        pop de
  30.        pop bc
  31.        ld (fillareastartx),bc
  32.        ld (fillareastarty),de
  33.        ld iy,0xffff ;hy: верх был занят (будет новая последовательность), ly: низ был занят (будет новая последовательность)
  34. fillarea00
  35.        call setpixel_fast
  36. ;проверяем снизу
  37.        inc de
  38.        ld a,lx ;stack size
  39.        or a
  40.        jr z,fillareanodown_blocked
  41.        ld hl,(curbitmaphgt)
  42.        or a
  43.        sbc hl,de
  44.        jr z,fillareanodown_blocked
  45.        call getpixel
  46.        jr nz,fillareanodown_blocked
  47.        xor a
  48.        cp ly
  49.        jr z,fillareanodown ;старая последовательность
  50.        ld ly,a
  51.         push bc
  52.         push de
  53.         inc lx
  54.        jr fillareanodown
  55. fillareanodown_blocked
  56.        ld ly,0xff
  57. fillareanodown
  58.        dec de
  59. ;проверяем сверху
  60.        ld a,d
  61.        or e
  62.         dec de ;y
  63.        jr z,fillareanoup_blocked
  64.        ld a,lx ;stack size
  65.        or a
  66.        jr z,fillareanoup_blocked
  67.        call getpixel
  68.        jr nz,fillareanoup_blocked
  69.        xor a
  70.        cp hy
  71.        jr z,fillareanoup ;старая последовательность
  72.        ld hy,a
  73.         push bc
  74.         push de
  75.         inc lx ;stack size
  76.        jr fillareanoup
  77. fillareanoup_blocked
  78.        ld hy,0xff
  79. fillareanoup
  80.         inc de ;y
  81. ;движемся влево (если возможно), иначе вправо
  82.        ld a,b
  83.        or c
  84.        dec bc ;x
  85.        jr z,fillareanoleft_blocked;filrarea0
  86.        call getpixel
  87.        jr z,fillarea00 ;ставит пиксель
  88. fillareanoleft_blocked
  89.        call showbitmap_rarely
  90. fillareastartx=$+1
  91.        ld bc,0
  92. fillareastarty=$+1
  93.        ld de,0
  94.        jr filrarea00
  95. ;движемся вправо
  96. filrarea0
  97.        dec lx ;stack size
  98.        ret z ;jp z,setpgs_scr
  99.        pop de
  100.        pop bc
  101.        ld iy,0xffff ;hy: верх был занят (будет новая последовательность), ly: низ был занят (будет новая последовательность)
  102. filrarea00
  103.        call setpixel_fast
  104. ;проверяем снизу
  105.        inc de
  106.        ld a,lx ;stack size
  107.        or a
  108.        jr z,filrareanodown_blocked
  109.        ld hl,(curbitmaphgt)
  110.        or a
  111.        sbc hl,de
  112.        jr z,filrareanodown_blocked
  113.        call getpixel
  114.        jr nz,filrareanodown_blocked
  115.        xor a
  116.        cp ly
  117.        jr z,filrareanodown ;старая последовательность
  118.        ld ly,a
  119.         push bc
  120.         push de
  121.         inc lx ;stack size
  122.        jr filrareanodown
  123. filrareanodown_blocked
  124.        ld ly,0xff
  125. filrareanodown
  126.        dec de
  127. ;проверяем сверху
  128.        ld a,d
  129.        or e
  130.         dec de ;y
  131.        jr z,filrareanoup_blocked
  132.        ld a,lx ;stack size
  133.        or a
  134.        jr z,filrareanoup_blocked
  135.        call getpixel
  136.        jr nz,filrareanoup_blocked
  137.        xor a
  138.        cp hy
  139.        jr z,filrareanoup ;старая последовательность
  140.        ld hy,a
  141.         push bc
  142.         push de
  143.         inc lx ;stack size
  144.        jr filrareanoup
  145. filrareanoup_blocked
  146.        ld hy,0xff
  147. filrareanoup
  148.         inc de ;y
  149. ;движемся вправо
  150.        inc bc ;x
  151.        ld hl,(curbitmapwid_edit)
  152.        or a
  153.        sbc hl,bc
  154.        jp z,fillarea0
  155.        call getpixel
  156.        jr z,filrarea00 ;ставит пиксель
  157.        call showbitmap_rarely
  158.        jp fillarea0 ;берёт из стека
  159.  
  160. showbitmap_rarely
  161.        ld a,r
  162.        add a,a
  163.        ret nz
  164.        push ix
  165.        push iy
  166.        call showbitmap
  167.        pop iy
  168.        pop ix
  169.        ret
  170.        
  171. prlinebitmap
  172. ;bc=x
  173. ;de=y ;TODO рисовать без учёта этого пикселя (но 1 пиксель рисовать всегда)
  174. ;ix=x2
  175. ;hl=y2
  176. ;a=color1
  177. ;a'=color2
  178.         ld (setpixel_color),a
  179.         ex af,af'
  180.        ld (setpixel_color2),a
  181.        or a
  182.        sbc hl,de
  183.        add hl,de
  184.        jp p,prlinebitmap_noswap
  185.        ex de,hl ;y <-> y2
  186.        push ix
  187.        push bc
  188.        pop ix
  189.        pop bc ;x <-> x2
  190.        ;ld a,lx
  191.        ;ld lx,c
  192.        ;ld c,a
  193.        ;ld a,hx
  194.        ;ld hx,b
  195.        ;ld b,a ;x <-> x2
  196. prlinebitmap_noswap
  197.        or a
  198.        sbc hl,de ;dy >= 0
  199.        push hl ;dy
  200.        ;ld a,lx
  201.        ;sub c
  202.        ;ld l,a
  203.        ;ld a,hx
  204.        ;sbc a,b
  205.        ;ld h,a
  206.        push ix
  207.        pop hl
  208.        sbc hl,bc
  209.        push hl ;dx
  210.        exx
  211.        pop bc ;dx
  212.        ld a,0x03 ;inc bc
  213.        jp p,prlinebitmap_nodec
  214.        xor a
  215.        sub c
  216.        ld c,a
  217.        sbc a,b
  218.        sub c
  219.        ld b,a ;dx >= 0
  220.        ld a,0x0b ;dec bc
  221. prlinebitmap_nodec
  222.        pop de ;dy
  223. ;a=код inc/dec bc
  224. ;bc'=x
  225. ;de'=y
  226. ;bc=dx
  227. ;de=dy
  228.         ex de,hl
  229.         or a
  230.         sbc hl,bc
  231.         add hl,bc
  232.         ex de,hl
  233.         jr nc,prlinebitmap_ver ;dy>=dx
  234.         ld hy,b
  235.         ld ly,c ;counter=dx
  236.         ;inc iy ;inc hy ;рисуем, включая последний пиксель (учтено в цикле)
  237.         ld h,b
  238.         ld l,c
  239.         sra h
  240.         rr l ;ym=dx div 2
  241.          ;xor a
  242.          ;sub l
  243.          ;ld l,a
  244.          ;sbc a,h
  245.          ;sub l
  246.          ;ld h,a ;mym=256-(dx div 2)
  247.         exx
  248.         ld (prlinebitmap_incx),a
  249. ;bc=x
  250. ;de=y
  251. ;hl'=xm
  252. ;bc'=dx
  253. ;de'=dy
  254. prlinebitmap_hor0
  255.         call setpixel_line
  256. prlinebitmap_incx=$
  257.         inc bc ;x+1        
  258.         exx
  259.         ;add hl,de ;mym+dy
  260.         or a
  261.         sbc hl,de ;ym-dy
  262.         exx
  263.         jr nc,prlinebitmap_hor1
  264.         inc de ;y+1
  265.         exx
  266.         ;or a
  267.         ;sbc hl,bc ;mym-dx
  268.         add hl,bc ;ym+dx
  269.         exx
  270. prlinebitmap_hor1
  271.         dec iy
  272.         ld a,hy
  273.         rla
  274.         jp nc,prlinebitmap_hor0
  275.         ret
  276. prlinebitmap_ver
  277.         ld hy,d
  278.         ld ly,e ;counter=dy
  279.         ;inc iy ;inc hy ;рисуем, включая последний пиксель (учтено в цикле)
  280.         ld h,d
  281.         ld l,e
  282.         sra h
  283.         rr l ;xm=dy div 2
  284.          ;xor a
  285.          ;sub l
  286.          ;ld l,a
  287.          ;sbc a,h
  288.          ;sub l
  289.          ;ld h,a ;mxm=256-(dy div 2)
  290.         exx
  291.         ld (prlinebitmap_incx2),a
  292. ;bc=x
  293. ;de=y
  294. ;hl'=xm
  295. ;bc'=dx
  296. ;de'=dy
  297. prlinebitmap_ver0
  298.         call setpixel_line
  299.         inc de ;y+1
  300.         exx
  301.         ;add hl,bc ;mxm+dx
  302.         or a
  303.         sbc hl,bc ;xm-dx
  304.         exx
  305.         jr nc,prlinebitmap_ver1
  306. prlinebitmap_incx2=$
  307.         inc bc ;x+1
  308.         exx
  309.         ;or a
  310.         ;sbc hl,de ;mxm-dy
  311.         add hl,de ;xm+dy
  312.         exx
  313. prlinebitmap_ver1
  314.         dec iy
  315.         ld a,hy
  316.         rla
  317.         jp nc,prlinebitmap_ver0
  318.         ret
  319.        
  320. bitmap_fillbox
  321. ;bc=x в bitmap
  322. ;de=y в bitmap
  323. ;hl=wid
  324. ;ix=hgt
  325. ;a=color1
  326. ;[a'=color2]
  327.         ;ld (setpixel_color),a ;setcolor
  328.         ;ex af,af'
  329.         ;ld (setpixel_color2),a
  330.         ld (bitmap_fillbox_color),a
  331. bitmap_fillbox0
  332.         push bc
  333.         push hl
  334.          push hl ;wid
  335.          call calcbitmap_setpg32k ;hl=addr
  336.          pop bc ;wid
  337. bitmap_fillbox00
  338.         ;push hl
  339.         ;call setpixel_fast
  340.         ;pop hl
  341.         ;inc bc ;x
  342.         ;dec hl
  343.         ;ld a,h
  344.         ;or l
  345.         ;jr nz,bitmap_fillbox00
  346. bitmap_fillbox_color=$+1
  347.          ld (hl),0
  348.          cpi
  349.         jp pe,bitmap_fillbox00
  350.         pop hl
  351.         pop bc
  352.         inc de ;y
  353.         dec ix
  354.         ld a,hx
  355.         or lx
  356.         jr nz,bitmap_fillbox0
  357.         ret
  358.        
  359. setpixel_fast_coloraa
  360.         ld (setpixel_color),a
  361.         ex af,af'
  362.        ld (setpixel_color2),a
  363. setpixel_line
  364. ;bc=x в bitmap (не портится) - может быть вне bitmap
  365. ;de=y в bitmap (не портится) - может быть вне bitmap
  366.        ld hl,(curbitmapwid_edit)
  367.        scf
  368.        sbc hl,bc
  369.        ret c
  370.        ld hl,(curbitmaphgt)
  371.        scf
  372.        sbc hl,de
  373.        ret c
  374. setpixel_fast
  375. ;bc=x в bitmap (не портится)
  376. ;de=y в bitmap (не портится)
  377.        push bc
  378.        ld a,c
  379.        xor e
  380.        rra
  381.        jr c,setpixel_fast_color2
  382.        call calcbitmap_from_xy ;a=pg, hl=addr
  383.        SETPGBITMAPLOW
  384. setpixel_color=$+1
  385.        ld (hl),0
  386.        pop bc
  387.        ret
  388. setpixel_fast_color2
  389.        call calcbitmap_from_xy ;a=pg, hl=addr
  390.        SETPGBITMAPLOW
  391. setpixel_color2=$+1
  392.        ld (hl),0
  393.        pop bc
  394.        ret
  395.  
  396. getpixel
  397. ;bc=x в bitmap (не портится)
  398. ;de=y в bitmap (не портится)
  399. ;out: a=цвет, Z=цвет совпадает с curcheckcolor
  400.        push bc
  401.        call calcbitmap_from_xy ;a=pg, hl=addr
  402.        SETPGBITMAPLOW
  403.        ld a,(hl)
  404.        pop bc
  405. curcheckcolor=$+1
  406.        cp 0
  407.        ret
  408.        
  409. calcbitmap_from_xy
  410. ;bc=x в bitmap (не портится)
  411. ;de=y в bitmap (не портится)
  412. ;out: a=pg, hl=addr
  413.        call muldewid_ahl
  414.        add hl,bc ;x
  415.        adc a,0
  416.        rl h
  417.        rla
  418.        rl h
  419.        rla
  420.        srl h
  421.        if (scrbase != 0x0000)
  422.        scf
  423.        rr h
  424.        else
  425.        srl h ;ahl = %pppppppp 00aaaaaa aaaaaaaa
  426.        endif
  427.        ret
  428.        
  429. calcbitmapcoords
  430. ;hl=x на экране
  431. ;a=y на экране
  432. ;out: bc=x в bitmap, de=y в bitmap (могут быть отрицательные)
  433.        sub workzoney
  434.        ld e,a
  435.        sbc a,a
  436.        ld d,a ;de=y в workzone
  437.        ld bc,-workzonex8*8
  438.        add hl,bc ;hl=x в workzone
  439.        call scalescrcoords ;hl=x,de=y
  440.        ld bc,(curbitmapxscroll)
  441.        add hl,bc ;hl=y в bitmap
  442.        ld b,h
  443.        ld c,l
  444.        ld hl,(curbitmapyscroll)
  445.        add hl,de ;hl=y в bitmap
  446.        ex de,hl
  447.        ret
  448.        
  449. calccoords_frombitmapcoords
  450. ;bc=x в bitmap
  451. ;de=y в bitmap
  452. ;out: hl=x, a=y (с клипированием по workzone)
  453.        call calccoords_frombitmapcoords_noclip
  454. ;TODO убрать из этого модуля
  455. ;hl=x, de=y без учёта workzone
  456.        bit 7,h
  457.        jr z,$+5
  458.        ld hl,0
  459.        ld bc,+(8*workzonewid8)
  460.        or a
  461.        sbc hl,bc
  462.        add hl,bc
  463.        jr c,$+5
  464.        ld hl,+(8*workzonewid8)-1
  465.        ld bc,+(8*workzonex8)
  466.        add hl,bc
  467.        ex de,hl
  468.        bit 7,h
  469.        jr z,$+5
  470.        ld hl,0
  471.        ld bc,workzonehgt
  472.        or a
  473.        sbc hl,bc
  474.        add hl,bc
  475.        jr c,$+5
  476.        ld hl,workzonehgt-1
  477.        ex de,hl
  478.        ld a,e
  479.        add a,workzoney
  480.        ret
  481.        
  482. calccoords_frombitmapcoords_noclip
  483. ;bc=x в bitmap
  484. ;de=y в bitmap
  485. ;out: hl=x, de=y (относительно workzone, могут быть отрицательные)
  486.        ld hl,(curbitmapyscroll)
  487.        ex de,hl
  488.        or a
  489.        sbc hl,de
  490.        ex de,hl
  491.        ld hl,(curbitmapxscroll)
  492.        ld a,c
  493.        sub l
  494.        ld l,a
  495.        ld a,b
  496.        sbc a,h
  497.        ld h,a
  498. scalebitmapcoords
  499. ;hl=x, de=y (могут быть отрицательные!)
  500.        ld a,(curbitmapscale)
  501.        dec a
  502.        jr nz,calccoords_frombitmapcoords_no25
  503.        call shrhl_de
  504.        inc a
  505. calccoords_frombitmapcoords_no25
  506.        dec a
  507.        jr z,shrhl_de ;50%
  508.        sub 2
  509.        ret c ;100%
  510.        call nz,shlhl_de ;400%
  511. shlhl_de
  512.        add hl,hl
  513.        ex de,hl
  514.        add hl,hl
  515.        ex de,hl
  516.        ret
  517.  
  518. scalescrcoords
  519. ;hl=x,de=y
  520.        ld a,(curbitmapscale)
  521.        dec a
  522.        jr nz,calcbitmapcoords_no25
  523.        call shlhl_de
  524.        inc a
  525. calcbitmapcoords_no25
  526.        dec a
  527.        jr z,shlhl_de ;50%
  528.        sub 2
  529.        ret c ;100%
  530.        call nz,shrhl_de ;400%
  531. shrhl_de
  532.        sra h ;могут быть отрицательные!
  533.        rr l
  534.        sra d ;могут быть отрицательные!
  535.        rr e
  536.        ret
  537.  
  538. window_x_setpg32k
  539.        ld bc,(curwindowx)
  540. calcbitmap_setpg32k
  541.        call calcbitmap_from_xy ;a=pg, hl=addr
  542. setpg32k
  543.        ;push af
  544.        ;SETPGBITMAPLOW
  545.        ;pop af
  546.        ;inc a
  547.        ;SETPGBITMAPHIGH
  548.        push hl
  549.        ld l,a
  550.        ld h,tbitmappages/256
  551.        ld a,(hl)
  552.        SETPG32KLOW
  553.        inc l
  554.        ld a,(hl)
  555.        SETPG32KHIGH
  556.        pop hl
  557.        ret
  558.  
  559. calcbitmapsize_pages
  560.        ld bc,(curbitmapwid_view)
  561.        dec bc
  562.        ld de,(curbitmaphgt)
  563.        dec de
  564.        call calcbitmap_from_xy ;a=last page
  565.        inc a ;number of pages
  566.        ret
  567.        
  568. newbitmap
  569. ;bc=wid
  570. ;de=hgt
  571. ;a=color
  572.        push af ;color
  573.        ld (curbitmapwid_edit),bc
  574.        ;dec bc
  575.        ;ld a,c
  576.        ;or 8-1 ;для 4bit
  577.        ;ld c,a
  578.        ;inc bc ;округлили вверх (чтобы строка .bmp была кратна 4 байтам)
  579.        ;ld (curbitmapwid_view),bc
  580.        ld (curbitmaphgt),de
  581.        call reserve_bmp_pages
  582.        ;xor a
  583.        ;ex af,af'
  584.         xor a
  585.         ld b,a
  586.         ld c,a ;bc=x в bitmap
  587.         ld d,a
  588.         ld e,a ;de=y в bitmap
  589.         ld hl,(curbitmapwid_edit) ;hl=wid
  590.         ld ix,(curbitmaphgt) ;ix=hgt
  591.         pop af ;color
  592.         jp bitmap_fillbox
  593.        
  594. reserve_bmp_pages
  595.         call genmuldewid_ahl ;после смены curbitmapwid
  596.         call calcbitmapsize_pages ;a=number of pages, z=no pages
  597.         ld hl,tbitmappages
  598.         ld b,a
  599. reserve_bmp_pages0
  600.         push bc
  601.         push hl
  602. reserve_bmp_pages_fail        
  603.         OS_NEWPAGE
  604.         or a
  605.         jr nz,reserve_bmp_pages_fail ;repeat until success
  606.         pop hl
  607.         pop bc
  608.         ld (hl),e
  609.         inc hl
  610.         djnz reserve_bmp_pages0
  611.         ret
  612.  
  613. delbitmap
  614.         ld hl,(curbitmaphgt)
  615.         ld a,h
  616.         or l
  617.         ret z ;пустой битмэп
  618.         call calcbitmapsize_pages ;a=number of pages, z=no pages
  619.         ld hl,tbitmappages
  620.         ld b,a
  621. unreserve_bmp_pages0
  622.         push bc
  623.         push hl
  624.         ld e,(hl)
  625.         OS_DELPAGE
  626.         pop hl
  627.         pop bc
  628.         inc hl
  629.         djnz unreserve_bmp_pages0
  630.         ret
  631.  
  632. selectbmp
  633. ;a=выбираемый битмэп
  634.         push af
  635. curbmp=$+1
  636.         ld a,0
  637.         call findcurbitmap ;hl=адрес структуры текущего bmp
  638.         ex de,hl
  639.         ld hl,curbitmapstruct
  640.         ld bc,curbitmapstruct_sz
  641.         ldir
  642.         ld hl,tbitmappages
  643.         ld bc,bmpmaxpages
  644.         ldir
  645.         pop af
  646.         ld (curbmp),a
  647.         call findcurbitmap ;hl=адрес структуры выбранного bmp
  648.         ld de,curbitmapstruct
  649.         ld bc,curbitmapstruct_sz
  650.         ldir
  651.         ld de,tbitmappages
  652.         ld bc,bmpmaxpages
  653.         ldir
  654.         jp genmuldewid_ahl ;после смены curbitmapwid
  655.  
  656. curbitmapstruct
  657. curbitmapwid_view
  658.         ;dw 0 ;кратно 32 или как удобно bmp'шке при загрузке ;теперь объединено (даже при загрузке bmp не инициализируется)
  659. curbitmapwid_edit
  660.         dw 0
  661. curbitmaphgt
  662.         dw 0
  663. curbitmapxscroll
  664.         dw 0
  665. curbitmapyscroll
  666.         dw 0
  667. curpicname
  668.         db "kartinka.bmp",0
  669. curbitmapscale
  670.         db 3
  671. workpal
  672.         STANDARDPAL
  673. workpalend=$-1
  674. curbitmapstruct_sz=$-curbitmapstruct
  675. bitmapstruct_sz=$-curbitmapstruct+bmpmaxpages
  676.  
  677. bitmaps
  678.         dup maxbitmaps
  679.         ds curbitmapstruct_sz-32-1 ;нули в описателях bmp
  680.         db 3 ;scale
  681.         STANDARDPAL
  682.         ds bmpmaxpages,0x7f ;имеющая смысл страничка
  683.         edup
  684.