fixed Sprite TextureAccess mode and image row length

This commit is contained in:
Noel Berry 2020-05-27 22:56:03 -07:00
parent d2ce347caa
commit 08c117f0dc

View File

@ -418,7 +418,6 @@ namespace Strawberry
private void CelToFrame(Frame frame, Cel cel) private void CelToFrame(Frame frame, Cel cel)
{ {
let opacity = (uint8)((cel.Alpha * cel.Layer.Alpha) * 255); let opacity = (uint8)((cel.Alpha * cel.Layer.Alpha) * 255);
var pxLen = frame.PixelsLength;
var blend = BlendModes[0]; var blend = BlendModes[0];
if (cel.Layer.BlendMode < BlendModes.Count) if (cel.Layer.BlendMode < BlendModes.Count)
@ -431,7 +430,7 @@ namespace Strawberry
for (int sy = Math.Max(0, -cel.Y), int bottom = Math.Min(cel.Height, Height - cel.Y); sy < bottom; sy++, dy += Width) for (int sy = Math.Max(0, -cel.Y), int bottom = Math.Min(cel.Height, Height - cel.Y); sy < bottom; sy++, dy += Width)
{ {
if (dx + dy >= 0 && dx + dy < pxLen) if (dx + dy >= 0 && dx + dy < frame.Bytes)
blend(frame.Pixels, (dx + dy) * 4, cel.Pixels[sx + sy * cel.Width], opacity); blend(frame.Pixels, (dx + dy) * 4, cel.Pixels[sx + sy * cel.Width], opacity);
} }
} }
@ -442,19 +441,25 @@ namespace Strawberry
public class Frame public class Frame
{ {
public SDL.Texture* Texture; public SDL.Texture* Texture;
public int Width;
public int Height;
public float Duration; public float Duration;
public uint8* Pixels; public uint8* Pixels;
public int32 PixelsLength; public int32 BytesPerRow;
public int32 Bytes;
private List<Cel> cels; private List<Cel> cels;
public this(int w, int h) public this(int w, int h)
{ {
Texture = SDL.CreateTexture(Game.Renderer, (uint32)SDL.PIXELFORMAT_RGBA8888, (int32)SDL.TextureAccess.Static, (int32)w, (int32)h); Texture = SDL.CreateTexture(Game.Renderer, (uint32)SDL.PIXELFORMAT_RGBA8888, (int32)SDL.TextureAccess.Streaming, (int32)w, (int32)h);
Width = w;
Height = h;
void* ptr; void* ptr;
SDL.LockTexture(Texture, null, out ptr, out PixelsLength); SDL.LockTexture(Texture, null, out ptr, out BytesPerRow);
Pixels = (uint8*)ptr; Pixels = (uint8*)ptr;
Bytes = (int32)(BytesPerRow * Height);
cels = new List<Cel>(); cels = new List<Cel>();
} }
@ -577,17 +582,17 @@ namespace Strawberry
{ {
if (src.A != 0) if (src.A != 0)
{ {
int r = dest[index]; int r = dest[index + 0];
int g = dest[index + 1]; int g = dest[index + 1];
int b = dest[index + 2]; int b = dest[index + 2];
int a = dest[index + 3]; int a = dest[index + 3];
if (a == 0) if (a == 0)
{ {
a = src.A;
r = src.R; r = src.R;
g = src.G; g = src.G;
b = src.B; b = src.B;
a = src.A;
} }
else else
{ {
@ -600,7 +605,7 @@ namespace Strawberry
a = ra; a = ra;
} }
dest[index] = (uint8)r; dest[index + 0] = (uint8)r;
dest[index + 1] = (uint8)g; dest[index + 1] = (uint8)g;
dest[index + 2] = (uint8)b; dest[index + 2] = (uint8)b;
dest[index + 3] = (uint8)a; dest[index + 3] = (uint8)a;