static void Effect_Software_DrawColor(int Width, int Height, int BytesPerPixel, void *EffectBitmapAddress, v4 Color, blend_mode BlendMode) { render_byte_info Bits = Bitmap_ByteInfo(BytesPerPixel); rectangle RenderRegion = {0, 0, Width, Height}; transform_info T; T.BlendMode = BlendMode; for (int32 Y = RenderRegion.Min.y; Y < RenderRegion.Max.y; Y++) { for (int32 X = RenderRegion.Min.x; X < RenderRegion.Max.x; X++) { uint32 Offset = Y*Width*BytesPerPixel + X*BytesPerPixel; uint8 *LayerPixel = (uint8 *)EffectBitmapAddress + Offset; uint32 *R_DestAddress = (uint32 *)(LayerPixel + Bits.ByteOffset * 0); uint32 *G_DestAddress = (uint32 *)(LayerPixel + Bits.ByteOffset * 1); uint32 *B_DestAddress = (uint32 *)(LayerPixel + Bits.ByteOffset * 2); uint32 *A_DestAddress = (uint32 *)(LayerPixel + Bits.ByteOffset * 3); real32 R_Dest = (real32)(*R_DestAddress & Bits.MaskPixel) * Bits.Normalized; real32 G_Dest = (real32)(*G_DestAddress & Bits.MaskPixel) * Bits.Normalized; real32 B_Dest = (real32)(*B_DestAddress & Bits.MaskPixel) * Bits.Normalized; real32 A_Dest = (real32)(*A_DestAddress & Bits.MaskPixel) * Bits.Normalized; real32 R_Col = Color.r; real32 G_Col = Color.g; real32 B_Col = Color.b; real32 A_Col = Color.a; real32 LayerAlpha = A_Col * 1; real32 R_Blend = R_Col; real32 G_Blend = G_Col; real32 B_Blend = B_Col; real32 A_Blend = A_Col; Fallback_Blend(); uint32 R_Out = (uint32)(Normalize(R_Blend) * Bits.Bits); uint32 G_Out = (uint32)(Normalize(G_Blend) * Bits.Bits); uint32 B_Out = (uint32)(Normalize(B_Blend) * Bits.Bits); uint32 A_Out = (uint32)(Normalize(A_Blend) * Bits.Bits); *R_DestAddress = (*R_DestAddress & ~Bits.MaskPixel) | R_Out; *G_DestAddress = (*G_DestAddress & ~Bits.MaskPixel) | G_Out; *B_DestAddress = (*B_DestAddress & ~Bits.MaskPixel) | B_Out; *A_DestAddress = (*A_DestAddress & ~Bits.MaskPixel) | A_Out; } } }