?login_element?

Subversion Repositories NedoOS

Rev

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

  1. showcopywindow
  2. ;hl=x на экране
  3. ;a=y на экране
  4. ;рисуем окно копирования, если окно существует (в любом битмэпе) и включен режим windowcopymode!=0
  5.         call iscopywindowvisible
  6.         ret nz
  7.         jp showwindow_calcandshow_noshowwindowcoords
  8.  
  9. iscopywindowvisible
  10. ;out: nz=invisible
  11.         ld bc,(curwindowstate)
  12.         dec c
  13.         dec c
  14.         ret nz ;окно нигде не существует
  15.         ld bc,(windowcopymode)
  16.         dec c
  17.         ret nz ;выключен режим windowcopymode
  18.         call checkfirezone
  19.         cp ZONE_WORK
  20.         ret ;nz=invisible
  21.  
  22. showwindow
  23. ;hl=x на экране
  24. ;a=y на экране
  25. ;рисуем окно, если оно выделено в текущем битмэпе
  26.         ld bc,(curwindowstate)
  27.         dec c
  28.         jr z,showwindow_onecorner
  29.         inc c
  30.         ret z ;окна нет
  31.         ld bc,(curwindowx)
  32.         ld de,(curwindowy)
  33. showwindow_calcandshow
  34.          ld a,(curwindowbmp)
  35.          ld hl,curbmp
  36.          cp (hl)
  37.          ret nz ;окно выделено не в текущем битмэпе
  38.         push bc
  39.         push de
  40.         call showwindowcoords
  41.         pop de
  42.         pop bc
  43. showwindow_calcandshow_noshowwindowcoords
  44.         call calccoords_frombitmapcoords_noclip ;hl=x, de=y
  45.         ld b,h
  46.         ld c,l ;bc=x, de=y без учёта workzone
  47.         push de ;y
  48.         ld hl,(curwindowwid)
  49.         ld de,(curwindowhgt)
  50.         call scalebitmapcoords ;hl=wid, de=hgt (могут оказаться 0)
  51.         dec hl
  52.         bit 7,h
  53.         jr z,$+3
  54.         inc hl
  55.         dec de
  56.         bit 7,d
  57.         jr z,$+3
  58.         inc de
  59.         push de
  60.         pop ix ;hgt
  61.         pop de ;y
  62.         call setpgshapes
  63.         jp shapes_invpixelframe
  64.        
  65. showwindow_onecorner
  66. ;hl=x на экране
  67. ;a=y на экране
  68.         call checkfirezone
  69.         cp ZONE_WORK
  70.         ret nz
  71. ;out: bc=x cur, de=y cur в bitmap (с клипированием по workzone)          
  72.         call window_definecorner2
  73. ;bc=x в bitmap
  74. ;de=y в bitmap
  75.         jr showwindow_calcandshow
  76.  
  77. fire_or_rmb_window
  78. ;bc=x в bitmap, de=y в bitmap
  79.         call isitclick
  80.         ret nz ;кнопку уже держали
  81.          ld a,(curbmp)
  82.          ld (curwindowbmp),a ;отныне выделяем окно в текущем битмэпе
  83.         ld hl,(curwindowstate)
  84.         dec l
  85.         jr z,fire_or_rmb_window_onecorner ;задан один угол - задаём второй
  86.         inc l
  87.         ld a,1 ;задан угол
  88.         jr z,fire_or_rmb_window_setcorner ;окна нет - задаём угол
  89. ;окно есть - отменяем окно
  90. clearwindowcoords
  91.         ld bc,coordswindowy*256 + (coordswindowx/8) ;b=y ;c=x/8
  92.         ld de,coordswindowhgt*256 + (coordswindowwid/8) ;d=hgt ;e=wid8
  93.         ld a,0x3f;%00111111 ;a=%33210210
  94.         call shapes_fillbox
  95. clearwindowstate
  96.         xor a
  97.         jr setwindowstate
  98. fire_or_rmb_window_onecorner
  99. ;угол уже задан, но не всё окно
  100.         call window_definecorner2
  101. window_settwocorners
  102. ;bc=x в bitmap
  103. ;de=y в bitmap
  104.         ld a,1
  105.         ld (windowcopymode),a
  106.         inc a ;ld a,2 ;окно задано
  107. fire_or_rmb_window_setcorner
  108.         ld (curwindowx),bc ;переставляем xcorner
  109.         ld (curwindowy),de ;переставляем ycorner
  110. setwindowstate
  111.         ld (curwindowstate),a
  112.         ret
  113.  
  114. window_allpicture
  115. ;TODO через OS_KEYMATRIX
  116.         ld a,0xfb
  117.         in a,(0xfe)
  118.         rra ;Q
  119.         ret nc ;было паразитное нажатие W при движении стрелки через OPQA
  120.         ld a,(curwindowstate)
  121.         or a
  122.         jr nz,clearwindowcoords ;окно есть - отменяем окно
  123.         ld hl,(curbitmapwid_edit)
  124.         ld (curwindowwid),hl
  125.         ld hl,(curbitmaphgt)
  126.         ld (curwindowhgt),hl
  127.         ld b,a
  128.         ld c,a ;0
  129.         ld d,a
  130.         ld e,a ;0
  131.         jr window_settwocorners
  132.        
  133. window_definecorner2        
  134.         ld hl,(curwindowx)
  135.         or a
  136.         sbc hl,bc ;|hl|+1 = ширина окна
  137.         jr nc,$+2+4 ;был xcorner >= x; переставляем xcorner
  138.         ld bc,(curwindowx) ;xcorner < x
  139.         call m,neghl
  140.         inc hl
  141.         ld (curwindowwid),hl
  142.         ld hl,(curwindowy)
  143.         or a
  144.         sbc hl,de ;|hl|+1 = высота окна
  145.         jr nc,$+2+4 ;был ycorner >= y; переставляем ycorner
  146.         ld de,(curwindowy) ;xcorner < x
  147.         call m,neghl
  148.         inc hl
  149.         ld (curwindowhgt),hl
  150.         ret
  151.  
  152. window_mirrhor
  153.         ld a,(curwindowstate)
  154.         cp 2
  155.         ret nz
  156.         ld hl,(curwindowy)
  157.         ld bc,(curwindowhgt)
  158. window_mirrhor0        
  159.         push bc
  160.         push hl ;y1
  161.         ex de,hl
  162.         call window_x_setpg32k ;y1 ;hl=addr
  163.         ex de,hl ;de=addr[x1]
  164.         ld hl,(curwindowwid)
  165.         ld b,h
  166.         ld c,l
  167.         add hl,de ;hl=addr[x2]+1
  168.         srl b
  169.         rr c ;bc=wid/2
  170. window_mirrhor00
  171.         dec hl
  172.         ld a,(de)
  173.         ldi
  174.         dec hl
  175.         ld (hl),a
  176.         jp pe,window_mirrhor00
  177.         pop hl ;y1
  178.         pop bc
  179.         cpi
  180.         jp pe,window_mirrhor0
  181.         jp showbitmap
  182.        
  183. window_mirrver
  184.         ld a,(curwindowstate)
  185.         cp 2
  186.         ret nz
  187.         ld a,(curpgtemp)
  188.         SETPG16K
  189.         ld de,(curwindowy)
  190.         ld hl,(curwindowhgt)
  191.         add hl,de
  192.         dec hl
  193. window_mirrver0
  194. ;de=y1
  195. ;hl=y2
  196. ;CY=0
  197.         ld a,tempc000/256
  198.         call window_mirrver_ldir ;from y1
  199.         ex de,hl
  200.         ;ld a,tempe000/256
  201.         call window_mirrver_ldir ;from y2
  202.         scf
  203.         ;ld a,tempc000/256
  204.         call window_mirrver_ldir ;to y2
  205.         ex de,hl
  206.         scf
  207.         ;ld a,tempe000/256
  208.         call window_mirrver_ldir ;to y1
  209.         inc de ;y1
  210.         dec hl ;y2
  211.         ;or a
  212.         sbc hl,de
  213.         add hl,de
  214.         jr nc,window_mirrver0
  215.         jp showbitmap
  216.  
  217. window_mirrver_ldir
  218.         push de
  219.         push hl
  220.         push af
  221.         call window_x_setpg32k
  222.         pop af
  223.         jr nc,window_mirrver_ldir_de
  224.         ex de,hl
  225.         ld h,a
  226.         ld l,0
  227.         jr window_mirrver_ldir_go
  228. window_mirrver_ldir_de
  229.         ld d,a
  230.         ld e,0
  231. window_mirrver_ldir_go
  232.         ld bc,(curwindowwid)
  233.         ldir
  234.         pop hl
  235.         pop de
  236.         xor +(tempe000-tempc000)/256
  237.         ret ;CY=0
  238.  
  239. window_copy
  240.         call ahl_coords
  241.         call iscopywindowvisible
  242.         ret nz
  243.         ld a,(curbmp)
  244.         ld (window_curbmp),a
  245. ;out: bc=x cur, de=y cur в bitmap (с клипированием по workzone)
  246.         ld (window_copy_xto),bc
  247.         ex de,hl ;hl=y куда
  248. ;сравнение координат и копирование снизу вверх, если надо
  249.         ld a,(curpgtemp)
  250.         SETPG16K
  251.         ld bc,(curwindowhgt)
  252.         ld de,(curwindowy)
  253.         ;hl=y куда
  254.         or a
  255.         sbc hl,de
  256.         add hl,de
  257.         jr nc,window_copyup ;y куда >= y откуда, копируем снизу вверх
  258. ;копируем сверху вниз
  259. window_copyline0
  260.         call window_copylinepp
  261.         inc hl
  262.         inc de
  263.         jr nz,window_copyline0
  264.         jp showbitmap
  265.        
  266. window_copyup
  267. ;bc=curwindowhgt
  268. ;de=curwindowy
  269. ;hl=y куда
  270.         add hl,bc
  271.         ex de,hl
  272.         add hl,bc
  273.         ex de,hl
  274. ;копируем снизу вверх
  275. window_copylineup0
  276.         dec hl
  277.         dec de
  278.         call window_copylinepp
  279.         jr nz,window_copylineup0
  280.         jp showbitmap
  281.  
  282. window_copylinepp
  283.         push bc
  284.         push de ;y откуда
  285.         push hl ;y куда
  286.          push hl ;y куда
  287.         push de ;y откуда
  288.         ld a,(curwindowbmp)
  289.         call selectbmp
  290.         pop de ;y откуда
  291.         call window_x_setpg32k ;hl=addr откуда
  292.         ld de,tempc000
  293.         ld bc,(curwindowwid)
  294.         ldir
  295. window_curbmp=$+1
  296.         ld a,0;(curbmp)
  297.         call selectbmp
  298.          pop hl ;y куда
  299.         ld bc,(curbitmaphgt)
  300.         or a
  301.         sbc hl,bc
  302.         add hl,bc
  303.         jr nc,window_copylineppq ;y куда за границей
  304.          ex de,hl ;de=y куда
  305. window_copy_xto=$+1
  306.         ld bc,0
  307.         call calcbitmap_setpg32k ;hl=addr куда
  308.         ex de,hl ;de=addr куда
  309.         ld hl,(curbitmapwid_edit)
  310.         ld bc,(window_copy_xto)
  311.         or a
  312.         sbc hl,bc ;сколько пикселей доступно справа
  313.         ld bc,(curwindowwid) ;сколько надо пикселей
  314.         jr z,window_copylineppq
  315.         call minhl_bc_tobc ;клипирование по x
  316.         ld hl,tempc000
  317.         ld a,(key)
  318.         cp 'a'
  319.         jr nc,window_copylinepp_ldir ;no Caps Shift
  320. ;with Caps Shift - transparent copy
  321. window_copylinepp0
  322.         ld a,(curcolor2)
  323.         cp (hl)
  324.         jr nz,$+4
  325.         ld a,(de)
  326.         ld (hl),a
  327.         ldi
  328.         jp pe,window_copylinepp0
  329.         jr window_copylineppq
  330. window_copylinepp_ldir
  331.         ldir
  332. window_copylineppq
  333.         pop hl ;y куда
  334.         pop de ;y откуда
  335.         pop bc
  336.         dec bc
  337.         ld a,b
  338.         or c
  339.         ret
  340.  
  341. curwindowbmp
  342.         db 0 ;0..3
  343. windowcopymode
  344.         db 0
  345.  
  346. curwindowstate
  347.         db 0
  348. curwindowx
  349.         dw 0
  350. curwindowy
  351.         dw 0
  352. curwindowwid
  353.         dw 0
  354. curwindowhgt
  355.         dw 0
  356.