summaryrefslogtreecommitdiff
path: root/prenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'prenderer.cpp')
-rw-r--r--prenderer.cpp71
1 files changed, 36 insertions, 35 deletions
diff --git a/prenderer.cpp b/prenderer.cpp
index 8690f4e..05442f9 100644
--- a/prenderer.cpp
+++ b/prenderer.cpp
@@ -272,6 +272,10 @@ RenderLayers(render_entry Entry) {
{
Fallback_RenderDirect(*(direct_info *)Entry.RenderData, Entry.OutputBuffer, Entry.RenderRegion);
} break;
+ case render_type_notransform_swap:
+ {
+ Fallback_RenderDirect(*(direct_info *)Entry.RenderData, Entry.OutputBuffer, Entry.RenderRegion);
+ } break;
case render_type_brush:
{
PaintTest(*(brush_info *)Entry.RenderData, Entry.OutputBuffer, Entry.RenderRegion);
@@ -322,21 +326,10 @@ Renderer_Check(bool32 *Test, render_type RenderType)
static transform_info
-Transform_Calculate(project_state *State, memory *Memory, project_data *File, block_layer *Layer, block_composition *Comp)
+Transform_Calculate(project_state *State, memory *Memory, project_data *File, block_layer *Layer, block_composition *Comp,
+ int Width, int Height, int BytesPerPixel)
{
transform_info TransformInfo;
- int Width = 0, Height = 0, BytesPerPixel = 0;
- if (!Layer->IsPrecomp) {
- block_source *Source = (block_source *)Memory_Block_AddressAtIndex(Memory, F_Sources, Layer->Block_Source_Index);
- Width = Source->Width;
- Height = Source->Height;
- BytesPerPixel = Source->BytesPerPixel;
- } else {
- block_composition *Precomp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, Layer->Block_Source_Index);
- Width = Precomp->Width;
- Height = Precomp->Height;
- BytesPerPixel = Precomp->BytesPerPixel;
- }
real32 Rotation = Layer->rotation.CurrentValue;
real32 X = Layer->x.CurrentValue;
@@ -552,24 +545,20 @@ Fallback_RenderDirect(direct_info T, void *OutputBuffer, rectangle RenderRegion)
uint16 LYPlus = Ceil(Y+1, (uint32)T.BufferHeight - 1);
uint8 *TexPTR0 = ((uint8 *)T.SourceBuffer + ((uint16)T.BufferPitch * LY) + (LX * (uint16)T.BufferBytesPerPixel));
- uint32 PixelA = *(uint32 *)TexPTR0;
- real32 TexRA = (real32)(*(uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 0) & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 TexGA = (real32)(*(uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 1) & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 TexBA = (real32)(*(uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 2) & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 TexAA = (real32)(*(uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 3) & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
+ uint32 *R_SrcAddress = (uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 0);
+ uint32 *G_SrcAddress = (uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 1);
+ uint32 *B_SrcAddress = (uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 2);
+ uint32 *A_SrcAddress = (uint32 *)(TexPTR0 + T.BufferBits.ByteOffset * 3);
- real32 LayerAlpha = TexAA * 1; // brush opacity
+ real32 R_Src = (real32)(*R_SrcAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 R_Col = TexRA;
- real32 G_Col = TexGA;
- real32 B_Col = TexBA;
- real32 A_Col = TexAA;
+ real32 R_Col = (real32)(*R_SrcAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
+ real32 G_Col = (real32)(*G_SrcAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
+ real32 B_Col = (real32)(*B_SrcAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
+ real32 A_Col = (real32)(*A_SrcAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 R_Blend = TexRA;
- real32 G_Blend = TexGA;
- real32 B_Blend = TexBA;
- real32 A_Blend = TexAA;
+ real32 LayerAlpha = A_Col * 1; // brush opacity
uint8 *DestPixel =((uint8 *)OutputBuffer + ((uint16)Y * (uint16)T.BufferPitch) + ((uint16)X * (uint16)T.BufferBytesPerPixel));
@@ -578,13 +567,21 @@ Fallback_RenderDirect(direct_info T, void *OutputBuffer, rectangle RenderRegion)
uint32 *B_DestAddress = (uint32 *)(DestPixel + T.BufferBits.ByteOffset * 2);
uint32 *A_DestAddress = (uint32 *)(DestPixel + T.BufferBits.ByteOffset * 3);
- if (LayerAlpha != 1.0f || T.BlendMode != blend_normal) {
+ uint32 R_DestInt = (*R_DestAddress & T.BufferBits.MaskPixel);
+ uint32 G_DestInt = (*G_DestAddress & T.BufferBits.MaskPixel);
+ uint32 B_DestInt = (*B_DestAddress & T.BufferBits.MaskPixel);
+ uint32 A_DestInt = (*A_DestAddress & T.BufferBits.MaskPixel);
- real32 R_Dest = (real32)(*R_DestAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 G_Dest = (real32)(*G_DestAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 B_Dest = (real32)(*B_DestAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
- real32 A_Dest = (real32)(*A_DestAddress & T.BufferBits.MaskPixel) * T.BufferBits.Normalized;
+ real32 R_Dest = (real32)(R_DestInt) * T.BufferBits.Normalized;
+ real32 G_Dest = (real32)(G_DestInt) * T.BufferBits.Normalized;
+ real32 B_Dest = (real32)(B_DestInt) * T.BufferBits.Normalized;
+ real32 A_Dest = (real32)(A_DestInt) * T.BufferBits.Normalized;
+ real32 R_Blend = R_Col;
+ real32 G_Blend = G_Col;
+ real32 B_Blend = B_Col;
+ real32 A_Blend = A_Col;
+ if (LayerAlpha != 1.0f || T.BlendMode != blend_normal) {
Fallback_Blend();
}
@@ -593,6 +590,13 @@ Fallback_RenderDirect(direct_info T, void *OutputBuffer, rectangle RenderRegion)
uint32 B_Out = (uint32)(Normalize(B_Blend) * T.BufferBits.Bits);
uint32 A_Out = (uint32)(Normalize(A_Blend) * T.BufferBits.Bits);
+ if (T.SwapActive)
+ {
+ *R_SrcAddress = (*R_SrcAddress & ~T.BufferBits.MaskPixel) | R_DestInt;
+ *G_SrcAddress = (*G_SrcAddress & ~T.BufferBits.MaskPixel) | G_DestInt;
+ *B_SrcAddress = (*B_SrcAddress & ~T.BufferBits.MaskPixel) | B_DestInt;
+ *A_SrcAddress = (*A_SrcAddress & ~T.BufferBits.MaskPixel) | A_DestInt;
+ }
*R_DestAddress = (*R_DestAddress & ~T.BufferBits.MaskPixel) | R_Out;
*G_DestAddress = (*G_DestAddress & ~T.BufferBits.MaskPixel) | G_Out;
*B_DestAddress = (*B_DestAddress & ~T.BufferBits.MaskPixel) | B_Out;
@@ -619,9 +623,6 @@ Fallback_RenderLayer(transform_info T, void *OutputBuffer, rectangle RenderRegio
real32 U = (StartVectorX * T.XAxisPX) + (StartVectorY * T.XAxisPY);
real32 V = (StartVectorX * T.YAxisPX) + (StartVectorY * T.YAxisPY);
- if (X == T.BufferWidth)
- int why = 0;
-
if (U < 1.0f && U >= 0.0f && V < 1.0f && V >= 0.0f) {
real32 TexXFull = U * T.LayerWidth;