|
@@ -15,11 +15,11 @@ namespace PixiEditorPrototype.Models.Rendering
|
|
public class WriteableBitmapUpdater
|
|
public class WriteableBitmapUpdater
|
|
{
|
|
{
|
|
private DocumentChangeTracker tracker;
|
|
private DocumentChangeTracker tracker;
|
|
- private Surface? backSurface;
|
|
|
|
private static SKPaint BlendingPaint = new SKPaint() { BlendMode = SKBlendMode.SrcOver };
|
|
private static SKPaint BlendingPaint = new SKPaint() { BlendMode = SKBlendMode.SrcOver };
|
|
private static SKPaint ReplacingPaint = new SKPaint() { BlendMode = SKBlendMode.Src };
|
|
private static SKPaint ReplacingPaint = new SKPaint() { BlendMode = SKBlendMode.Src };
|
|
private static SKPaint SelectionPaint = new SKPaint() { BlendMode = SKBlendMode.SrcOver, Color = new(0xa0FFFFFF) };
|
|
private static SKPaint SelectionPaint = new SKPaint() { BlendMode = SKBlendMode.SrcOver, Color = new(0xa0FFFFFF) };
|
|
private static SKPaint ClearPaint = new SKPaint() { BlendMode = SKBlendMode.Src, Color = SKColors.Transparent };
|
|
private static SKPaint ClearPaint = new SKPaint() { BlendMode = SKBlendMode.Src, Color = SKColors.Transparent };
|
|
|
|
+ private Vector2i oldSize = new(0, 0);
|
|
|
|
|
|
public WriteableBitmapUpdater(DocumentChangeTracker tracker)
|
|
public WriteableBitmapUpdater(DocumentChangeTracker tracker)
|
|
{
|
|
{
|
|
@@ -82,10 +82,9 @@ namespace PixiEditorPrototype.Models.Rendering
|
|
private List<IRenderInfo> Render(IReadOnlyList<IChangeInfo> changes, SKSurface screenSurface, Vector2i screenSize)
|
|
private List<IRenderInfo> Render(IReadOnlyList<IChangeInfo> changes, SKSurface screenSurface, Vector2i screenSize)
|
|
{
|
|
{
|
|
bool redrawEverything = false;
|
|
bool redrawEverything = false;
|
|
- if (backSurface == null || backSurface.Size != screenSize)
|
|
|
|
|
|
+ if (oldSize != screenSize)
|
|
{
|
|
{
|
|
- backSurface?.Dispose();
|
|
|
|
- backSurface = new(screenSize);
|
|
|
|
|
|
+ oldSize = screenSize;
|
|
redrawEverything = true;
|
|
redrawEverything = true;
|
|
}
|
|
}
|
|
HashSet<Vector2i>? chunks = null;
|
|
HashSet<Vector2i>? chunks = null;
|
|
@@ -100,15 +99,14 @@ namespace PixiEditorPrototype.Models.Rendering
|
|
// draw to back surface
|
|
// draw to back surface
|
|
if (redrawEverything)
|
|
if (redrawEverything)
|
|
{
|
|
{
|
|
- RenderScreen(screenSize, backSurface.SkiaSurface, tracker.Document.ReadOnlyStructureRoot);
|
|
|
|
|
|
+ RenderScreen(screenSize, screenSurface);
|
|
infos.Add(new DirtyRect_RenderInfo(new Vector2i(0, 0), screenSize));
|
|
infos.Add(new DirtyRect_RenderInfo(new Vector2i(0, 0), screenSize));
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
foreach (var chunkPos in chunks!)
|
|
foreach (var chunkPos in chunks!)
|
|
{
|
|
{
|
|
- backSurface.SkiaSurface.Canvas.DrawRect(SKRect.Create(chunkPos * ChunkyImage.ChunkSize, new(ChunkyImage.ChunkSize, ChunkyImage.ChunkSize)), ClearPaint);
|
|
|
|
- RenderChunk(chunkPos, backSurface.SkiaSurface);
|
|
|
|
|
|
+ RenderChunk(chunkPos, screenSurface);
|
|
infos.Add(new DirtyRect_RenderInfo(
|
|
infos.Add(new DirtyRect_RenderInfo(
|
|
chunkPos * ChunkyImage.ChunkSize,
|
|
chunkPos * ChunkyImage.ChunkSize,
|
|
new(ChunkyImage.ChunkSize, ChunkyImage.ChunkSize)
|
|
new(ChunkyImage.ChunkSize, ChunkyImage.ChunkSize)
|
|
@@ -116,23 +114,10 @@ namespace PixiEditorPrototype.Models.Rendering
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- // transfer the back surface to the screen surface
|
|
|
|
-
|
|
|
|
- foreach (var info in infos)
|
|
|
|
- {
|
|
|
|
- if (info is DirtyRect_RenderInfo dirtyRect)
|
|
|
|
- {
|
|
|
|
- screenSurface.Canvas.Save();
|
|
|
|
- screenSurface.Canvas.ClipRect(SKRect.Create(dirtyRect.Pos, dirtyRect.Size));
|
|
|
|
- screenSurface.Canvas.DrawSurface(backSurface.SkiaSurface, 0, 0, ReplacingPaint);
|
|
|
|
- screenSurface.Canvas.Restore();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return infos;
|
|
return infos;
|
|
}
|
|
}
|
|
|
|
|
|
- private void RenderScreen(Vector2i screenSize, SKSurface screenSurface, IReadOnlyFolder structureRoot)
|
|
|
|
|
|
+ private void RenderScreen(Vector2i screenSize, SKSurface screenSurface)
|
|
{
|
|
{
|
|
int chunksWidth = (int)Math.Ceiling(screenSize.X / (float)ChunkyImage.ChunkSize);
|
|
int chunksWidth = (int)Math.Ceiling(screenSize.X / (float)ChunkyImage.ChunkSize);
|
|
int chunksHeight = (int)Math.Ceiling(screenSize.Y / (float)ChunkyImage.ChunkSize);
|
|
int chunksHeight = (int)Math.Ceiling(screenSize.Y / (float)ChunkyImage.ChunkSize);
|
|
@@ -149,7 +134,7 @@ namespace PixiEditorPrototype.Models.Rendering
|
|
private void RenderChunk(Vector2i chunkPos, SKSurface screenSurface)
|
|
private void RenderChunk(Vector2i chunkPos, SKSurface screenSurface)
|
|
{
|
|
{
|
|
using Chunk renderedChunk = ChunkRenderer.RenderWholeStructure(chunkPos, tracker.Document.ReadOnlyStructureRoot);
|
|
using Chunk renderedChunk = ChunkRenderer.RenderWholeStructure(chunkPos, tracker.Document.ReadOnlyStructureRoot);
|
|
- screenSurface.Canvas.DrawSurface(renderedChunk.Surface.SkiaSurface, chunkPos * ChunkyImage.ChunkSize, BlendingPaint);
|
|
|
|
|
|
+ screenSurface.Canvas.DrawSurface(renderedChunk.Surface.SkiaSurface, chunkPos * ChunkyImage.ChunkSize, ReplacingPaint);
|
|
|
|
|
|
if (tracker.Document.ReadOnlySelection.ReadOnlyIsEmptyAndInactive)
|
|
if (tracker.Document.ReadOnlySelection.ReadOnlyIsEmptyAndInactive)
|
|
return;
|
|
return;
|