#help_index "Graphics/Misc"
asm {
//************************************
_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                 _DC_BLOT_COLOR4                         U0       DCBlotColor4(U8 *dst, I64 *img, I64 *img_cache, I64 count);