; WinUtils - различные опции для работы с окнами
;-------------------------------------------------


;---------------- обрезка ------------------------

WinClipping
.n0             ld a,%1111
                ld ix,WWinClipping
                ld (ix+6),a
                call Win_
                ld e,a
                call suxRAM
                ld a,e
                cp #FF
               jr z,.eclose
                ld bc,.WinCliptab
                call TAB_JP
                call wmbooframka
                call WinAmskSet
                call WinMenu.outWinBoof
               jr .n0

.eclose          call NormilizeWin
               jp WinMenu.outWinBoof


.EXcnk         sub 6
              jp WinMenu.EXcnknum_0




.WinCliptab     DW AutoMask  ; 0 - w1
                DW AutoMask  ; 1 - w2
                DW AutoMask  ; 2 - w3
                DW Ret       ; 3 - обрезка
                DW CleanMask ; 4 - сбросить
                DW Ret       ; 5 - ластик
                DW .EXcnk    ; 6
                DW .EXcnk    ; 7

WWinClipping  DB 21,1,11,13,6*8,7,%1111
              DB 6*8+3
           DW .Txt      ; объект-текст
           DW .Sel      ; объект-подсветка (выборка)
           DW .Hk
           DW #FFFF


.Txt         MSG_WIN_Clipping : DB 13             ; Обрезка /заголовок


             MSG_WIN_AutoMSK  : DB 13                  ; Автомаска
             DB " w1",#17,3," w2",#17,6," w3",13,13    ; выбор толщины маски
             MSG_WIN_Clipping_ : DB 13,15,13           ; Обрезка_
             MSG_WIN_Reset    : DB 13,15,13,13         ; Сбросить
             MSG_WIN_Eraser   : DB 13                  ; Ластик
            DB 0

.Sel         DB 1,4,2,1,%11    ; 0 - w1
             DB 4,4,2,1,%11    ; 1 - w2
             DB 7,4,2,1,%11    ; 2 - w3
             DB 1,6,9,1,%11    ; 3 - обрезка
             DB 1,8,9,1,%11    ; 4 - сбросить
             DB 1,11,9,1,%11   ; 5 - ластик
            DB #FF

.Hk        DB "B",0     ; смена чанка бордюра вперёд
          DW 6
           DB "N",0     ; смена чанка бордюра назад
          DW 7
           DB #FF

;-------------------------------------------------

; WinBoof      EQU #C000
; WinABoof     EQU WinBoof+6144
; WinMskBoof   EQU WinBoof+6912
; WinAMskBoof  EQU WinMskBoof+6144


wboofpars       ld de,WinMskBoof
.nDE            ld bc,0
FullWinSize_   EQU $-2            ; полный размер окна x8 (без атрибутов)
                ld hl,WinBoof
               ret

wboofpr4000
            push bc
            ld de,#4000
            call wboofpars.nDE
            ldir                ; первичное заполнение маски
            pop bc
           ret

wmbooframka     ; ставит рамку маски

                ld hl,WinMskBoof
                ld ix,WinXU
                ld c,0
.lsnY   EQU $-1
                ld a,(ix+5)  ; смещение до начала по y
                or a
               jr z,3F
1               ld b,(ix+2)  ; верх
2               ld (hl),#FF
                inc hl
               djnz 2B
                dec c
               ret z
                dec a
               jr nz,1B
3               ld a,(ix+9)  ; размер в пикс. по y
                inc a
                ld de,BmBUFF
1               ex af,af'
                ld b,(ix+2)
                push de
2               ld a,(de)
                or (hl)
                ld (hl),a
                inc de
                inc hl
               djnz 2B
                pop de
                ex af,af'
                dec c
               ret z
                dec a
               jr nz,1B
1               ld b,(ix+2)  ; низ
2               ld (hl),#FF
                inc hl
               djnz 2B
                dec c
               jr nz,1B
               ret

NormilizeWin    ; отрезает остатки окна маской
                call wboofpars
                ex de,hl
1               ld a,(de)
                or (hl)
                xor (hl)
                ld (de),a
                inc de
                inc hl
                dec bc
                ld a,b
                or c
               jr nz,1B
               ret

CleanMask       ; очищает текущую маску
                ld hl,(FullWinSize_)
                ld bc,WinMskBoof
.l              xor a
                ld (bc),a
                inc bc
                dec hl
                ld a,h
                or l
               jr nz,.l
               ret

AutoMask    inc a
            inc a
            inc a
            ld c,a
            push bc
            ld a,(RGBdefault)    ; очистка экрана
            ld c,a
            and %00111000
            rrca : rrca : rrca
            ld b,a
            ld a,c
            and %11111000
            or b
            call cls_a
            call wboofpr4000
            pop bc
            ld b,c
1           call .ordx          ; утолщение
           djnz 1B
            ld b,c
            push bc
            ld hl,(FullWinSize_)    ; инверсия
            ld bc,#4000
1           ld a,(bc)
            cpl
            ld (bc),a
            inc bc
            dec hl
            ld a,h
            or l
           jr nz,1B

            ld a,#37   ;  [ scf ]
            ld (BOLDln.rla),a
            ld (BOLDln.rra),a
            ld a,#12   ;  [ ld (de),a ]
            ld (BOLDln.nop1),a
            ld (BOLDln.nop2),a

            pop bc
1           call .ordx      ; обратное утолщение
           djnz 1B
            call .ordx
            dec c
            dec c
            ld b,c

            push bc
            call wboofpars
            ldir                ; вторичное заполнение маски

            ld a,#B7        ;  [ or a ]
            ld (BOLDln.rla),a
            ld (BOLDln.rra),a
            ld a,#00        ;  [ nop ]
            ld (BOLDln.nop1),a
            ld (BOLDln.nop2),a
            pop bc

1           call .ordxBf         ; вторичное утолщение
           djnz 1B
            ld bc,(FullWinSize_)
            ld hl,WinMskBoof
            ld de,#4000
1           ld a,(de)            ; совмещение масок
            or (hl)
            xor (hl)
            ld (hl),a
            inc hl
            inc de
            dec bc
            ld a,b
            or c
           jr nz,1B
           ret



.ordxBf     ld hl,WinMskBoof
           jr 1F
.ordx       ld hl,#4000
1           push bc
         ; растягивание маски вверх/вниз
            push hl
            call BOLDln.UPdn
            pop hl
         ; растягивание маски влево/вправо
            call BOLDln.LfRt
            pop bc
          ret




; WinXU                ; позиции выбранного текущего окна
; .x        DB 0  ;+0   - позиция в знакоместах по x
; .y        DB 0  ;+1   - позиция в знакоместах по y
; .csx      DB 0  ;+2   - размер в знакоместах по x
; .csy      DB 0  ;+3   - размер в знакоместах по y
; .dx       DB 0  ;+4   - смещение начала пикселей по х
; .dy       DB 0  ;+5   - смещение начала пикселей по y
; .px       DB 0  ;+6   - позиция в пикселях по x
; .py       DB 0  ;+7   - позуция в пикселях по y
; .dsx      DB 0  ;+8   - размер в пикселях по x
; .dsy      DB 0  ;+9   - размер в пикселях по y

;-------------------------------------------------
BOLDln


.UPdn         ; утолщение на линию вверх/вниз , in hl - WinBoof or WinMskBoof
              push hl
              ld a,(WinXU.csx)          ; .csx
              ld e,a
              ex af,af'
              ld hl,(FullWinSize_)
              xor a
              ld d,a
              sbc hl,de            ;  количество байт
              ld c,l
              ld b,h
              pop hl
             ret c
             ret z
              ex de,hl        ; de - тек. строка
              add hl,de       ; hl - след. строка
              push bc

1             ld a,(de)
              or (hl)  ; call .modb
              ld (de),a
              inc de
              inc hl
              dec bc
              ld a,b
              or c
             jr nz,1B

              push de       ; обработка нижней строки (для маски)
              ex af,af'
              ld b,a
              ex af,af'
              ld a,#FF
.nop1         nop           ; [ nop ] or [ ld (de),a ]
              inc de
             djnz .nop1
              pop de

              pop bc
          ; утолщение на линию вниз
              dec hl
              dec de           ; de - след. строка, hl - тек. строка
1             ld a,(de)
              or (hl)    ; call .modb
              ld (hl),a
              dec de
              dec hl
              dec bc
              ld a,b
              or c
             jr nz,1B

              push de       ; обработка верхней строки (для маски)
              ex af,af'
              ld b,a
              ex af,af'
              ld a,#FF
.nop2         nop           ; [ nop ] or [ ld (de),a ]
              dec de
             djnz .nop2
              pop de

             ret





.LfRt        ; утолщение на линию влево/вправо , in hl - WinBoof or WinMskBoof

              ld a,(wmbooframka.lsnY)
              ld e,a               ; количество линий
              ld a,(WinXU.csx)          ; .csx
              ld d,a

              ld c,e               ; вправо
1             ld b,d
.rla          or a            ; [ or a ] or [ scf ]     ; инициация флага переноса
              ex af,af'
2             ld a,(hl)
              ex af,af'
              rr (hl)
              ex af,af'
              or (hl)
              ld (hl),a
              inc hl
             djnz 2B
              dec c
             jr nz,1B

              dec hl               ; влево
              ld c,e
1             ld b,d
.rra          or a            ; [ or a ] or [ scf ]      ; инициация флага переноса
              ex af,af'
2             ld a,(hl)
              ex af,af'
              rl (hl)
              ex af,af'
              or (hl)
              ld (hl),a
              dec hl
             djnz 2B
              dec c
             jr nz,1B
             ret





