#help_index "Graphics/Misc"
asm {
//************************************
_GR_UPDATE_LINE64::
        PUSH    RBP
        MOV     RBP,RSP
        PUSH    RSI
        PUSH    RDI

        MOV     RAX,U64 SF_ARG2[RBP]
        MOV     RSI,U64 [RAX]           //rsi=src
        MOV     RBX,U64 [&rev_bits_table]
        MOV     RCX,U64 SF_ARG3[RBP]    //rcx=d
        MOV     RAX,U64 SF_ARG4[RBP]
        MOV     RDI,U64 [RAX]           //rdi=image

        MOV     RAX,U64 SF_ARG1[RBP]
        MOV     R8,U64 [RAX]            //rbp=vga dst

@@05:   LODSQ
        CMP     U64 [RDI],RAX
        JE      @@10
        MOV     U64 [RDI],RAX
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        MOV     U64 [R8],RAX
@@10:   ADD     RDI,8
        ADD     R8,8
        DEC     RCX
        JNZ     @@05

        MOV     RAX,U64 SF_ARG1[RBP]
        MOV     U64 [RAX],R8
        MOV     RAX,U64 SF_ARG4[RBP]
        MOV     U64 [RAX],RDI
        MOV     RAX,U64 SF_ARG2[RBP]
        MOV     U64 [RAX],RSI
        POP     RDI
        POP     RSI
        POP     RBP
        RET1    32
//************************************
_GR_UPDATE_LINE64_FLUSH_CACHE::
        PUSH    RBP
        MOV     RBP,RSP
        PUSH    RSI
        PUSH    RDI

        MOV     RAX,U64 SF_ARG2[RBP]
        MOV     RSI,U64 [RAX]           //rsi=src
        MOV     RBX,U64 [&rev_bits_table]
        MOV     RCX,U64 SF_ARG3[RBP]    //rcx=d
        MOV     RAX,U64 SF_ARG4[RBP]
        MOV     RDI,U64 [RAX]           //rdi=image

        MOV     RAX,U64 SF_ARG1[RBP]
        MOV     R8,U64 [RAX]            //rbp=vga dst

@@05:   LODSQ
        MOV     U64 [RDI],RAX
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        XLATB
        ROR     RAX,8
        MOV     U64 [R8],RAX
        ADD     RDI,8
        ADD     R8,8
        DEC     RCX
        JNZ     @@05

        MOV     RAX,U64 SF_ARG1[RBP]
        MOV     U64 [RAX],R8
        MOV     RAX,U64 SF_ARG4[RBP]
        MOV     U64 [RAX],RDI
        MOV     RAX,U64 SF_ARG2[RBP]
        MOV     U64 [RAX],RSI
        POP     RDI
        POP     RSI
        POP     RBP
        RET1    32
//************************************
_DC_BLOT_COLOR4::
        PUSH    RBP
        MOV     RBP,RSP
        PUSH    RSI
        PUSH    RDI
        PUSH    R10

        MOV     RDI,U64 SF_ARG1[RBP]
        MOV     RSI,U64 SF_ARG2[RBP]
        MOV     RBX,U64 SF_ARG3[RBP]
        MOV     RCX,U64 SF_ARG4[RBP]

        MOV     R8,RDI
        ADD     R8,RCX
        MOV     R9,R8
        ADD     R9,RCX
        MOV     R10,R9
        ADD     R10,RCX

@@5:    LODSQ
        MOV     RDX,U64 [RBX]
        CMP     RAX,RDX
        JE      I32 @@10
        MOV     U64 [RBX],RAX

        XOR     RDX,RDX
        BT      RAX,7*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,6*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,5*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,4*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,3*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,2*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,1*8+0
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,0*8+0
        ADC     RDX,0
        MOV     U8 [RDI],DL

        XOR     RDX,RDX
        BT      RAX,7*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,6*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,5*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,4*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,3*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,2*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,1*8+1
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,0*8+1
        ADC     RDX,0
        MOV     U8 [R8],DL

        XOR     RDX,RDX
        BT      RAX,7*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,6*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,5*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,4*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,3*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,2*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,1*8+2
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,0*8+2
        ADC     RDX,0
        MOV     U8 [R9],DL

        XOR     RDX,RDX
        BT      RAX,7*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,6*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,5*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,4*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,3*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,2*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,1*8+3
        ADC     RDX,0
        SHL1    RDX
        BT      RAX,0*8+3
        ADC     RDX,0
        MOV     U8 [R10],DL

@@10:   ADD     RBX,8

        INC     RDI
        INC     R8
        INC     R9
        INC     R10

        DEC     RCX
        JNZ     I32 @@5

        POP     R10
        POP     RDI
        POP     RSI
        POP     RBP
        RET1    32
//************************************
_IS_PIX_COVERED0::
        PUSH    RBP
        MOV     RBP,RSP
#assert FONT_WIDTH==FONT_HEIGHT==8
        MOV     RCX,U64 SF_ARG3[RBP]
        SAR     RCX,3
        MOV     RAX,U64 SF_ARG2[RBP]
        SAR     RAX,3
        MOV     RDX,U64 SF_ARG1[RBP]
        IMUL2   RCX,TEXT_COLS
        MOV     RBX,U64 [&gr.win_z_buf]
        MOV     DX,U16 CTask.win_z_num[RDX]
        ADD     RCX,RAX
        XOR     RAX,RAX
        CMP     DX,U16 [RBX+RCX*2]
        JAE     @@05    //Jump not covered
        INC     RAX
@@05:   POP     RBP
        RET1    24
//************************************
_GR_ROP_EQU_U8_NO_CLIPPING::
//Puts foreground char shape onto gr.dc2.
//ch.u8[1] is color as a whole byte
//ch ATTRf_UNDERLINE attr flag is used.
        PUSH    RBP
        MOV     RBP,RSP
        MOVZX   RAX,U8 SF_ARG1[RBP]
        MOV     RDX,U64 [&text.font]
        MOV     RAX,U64 [RDX+RAX*8]     //RAX is 8x8 char font data, 64-bits
        BT      U64 SF_ARG1[RBP],ATTRf_UNDERLINE
        JNC     @@05
        MOV     RBX,0xFF00000000000000
        OR      RAX,RBX
@@05:   TEST    RAX,RAX
        JZ      I32 @@10

        PUSH    RSI
        PUSH    RDI
        MOVZX   RBX,U8 SF_ARG1+1[RBP]   //Warning color is 8-bit
        MOV     RDX,U64 [&gr.to_8_colors]
        MOV     R8,U64 [RDX+RBX*8]      //R8 is color repeated 8 times.
        MOV     R9,U64 SF_ARG3[RBP]     //R9 is width_internal
        MOV     RDI,U64 SF_ARG2[RBP]
        MOV     RSI,U64 [&gr.to_8_bits] //RSI is gr.to_8_bits

//      m=my_1_to_8_bits[ch&255];ch>>=8;
//      *dst=*dst&~m|c&m;
//      dst(U8 *)+=w1;

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOVZX   RBX,AL
        MOV     RDX,U64 [RSI+RBX*8]
        SHR     RAX,8
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX
        ADD     RDI,R9

        MOV     RDX,U64 [RSI+RAX*8]
        MOV     RBX,U64 [RDI]
        MOV     RCX,RDX
        NOT     RCX
        AND     RDX,R8
        AND     RCX,RBX
        OR      RCX,RDX
        MOV     U64 [RDI],RCX

        POP     RDI
        POP     RSI
@@10:   POP     RBP
        RET1    24
}
_extern _GR_ROP_EQU_U8_NO_CLIPPING U0 GrRopEquU8NoClipping(I64 ch,
        U8 *dst,I64 width_internal);
public _extern _IS_PIX_COVERED0 Bool IsPixCovered0(
        CTask *task,I64 x,I64 y);//No clipping

_extern _GR_UPDATE_LINE64 U0 GrUpdateLine64(
  U64 **_vga,U64 **_src,I64 d,U8 **_dst);
_extern _GR_UPDATE_LINE64_FLUSH_CACHE U0 GrUpdateLine64FlushCache(
  U64 **_vga,U64 **_src,I64 d,U8 **_dst);
_extern _DC_BLOT_COLOR4 U0 DCBlotColor4(
  U8 *dst,I64 *img,I64 *img_cache,I64 cnt);