#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);
