Skip to content

Commit

Permalink
Cropped layer previews finished?wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Equbuxu committed May 14, 2023
1 parent 0274a78 commit 27f1ae3
Show file tree
Hide file tree
Showing 9 changed files with 476 additions and 235 deletions.
35 changes: 25 additions & 10 deletions src/ChunkyImageLib/ChunkyImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,25 +160,40 @@ public ChunkyImage(VecI size)
}

/// <exception cref="ObjectDisposedException">This image is disposed</exception>
public RectI? FindTightCommittedBounds(ChunkResolution precision = ChunkResolution.Full)
public RectI? FindTightCommittedBounds(ChunkResolution requestedResolution = ChunkResolution.Full)
{
lock (lockObject)
{
ThrowIfDisposed();

var chunkSize = precision.PixelSize();
var chunkSize = requestedResolution.PixelSize();
var multiplier = requestedResolution.Multiplier();

RectI? preciseBounds = null;
foreach (var (chunkPos, chunk) in committedChunks[precision])
foreach (var (chunkPos, fullResChunk) in committedChunks[ChunkResolution.Full])
{
RectI? chunkPreciseBounds = chunk.FindPreciseBounds();
if(chunkPreciseBounds is null)
continue;
RectI globalChunkBounds = chunkPreciseBounds.Value.Offset(chunkPos * chunkSize);
if (committedChunks[requestedResolution].TryGetValue(chunkPos, out Chunk? requestedResChunk))
{
RectI? chunkPreciseBounds = requestedResChunk.FindPreciseBounds();
if (chunkPreciseBounds is null)
continue;
RectI globalChunkBounds = chunkPreciseBounds.Value.Offset(chunkPos * chunkSize);

preciseBounds ??= globalChunkBounds;
preciseBounds = preciseBounds.Value.Union(globalChunkBounds);
}
else
{
RectI? chunkPreciseBounds = fullResChunk.FindPreciseBounds();
if (chunkPreciseBounds is null)
continue;
RectI globalChunkBounds = (RectI)chunkPreciseBounds.Value.Scale(multiplier).Offset(chunkPos * chunkSize).RoundOutwards();

preciseBounds ??= globalChunkBounds;
preciseBounds = preciseBounds.Value.Union(globalChunkBounds);
preciseBounds ??= globalChunkBounds;
preciseBounds = preciseBounds.Value.Union(globalChunkBounds);
}
}
preciseBounds = (RectI?)preciseBounds?.Scale(precision.InvertedMultiplier()).RoundOutwards();
preciseBounds = (RectI?)preciseBounds?.Scale(requestedResolution.InvertedMultiplier()).RoundOutwards();
preciseBounds = preciseBounds?.Intersect(new RectI(preciseBounds.Value.Pos, CommittedSize));

return preciseBounds;
Expand Down
4 changes: 2 additions & 2 deletions src/PixiEditor.DrawingApi.Core/Numerics/RectI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -271,9 +271,9 @@ public readonly bool ContainsExclusive(int x, int y)
return x > left && x < right && y > top && y < bottom;
}

public readonly bool ContainsExclusive(RectI rect)
public readonly bool ContainsInclusive(RectI rect)
{
return ContainsExclusive(rect.TopLeft) && ContainsExclusive(rect.BottomRight);
return ContainsInclusive(rect.TopLeft) && ContainsInclusive(rect.BottomRight);
}

public readonly bool ContainsPixel(VecI pixelTopLeft) => ContainsPixel(pixelTopLeft.X, pixelTopLeft.Y);
Expand Down
10 changes: 4 additions & 6 deletions src/PixiEditor/Models/DocumentModels/ActionAccumulator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,8 @@ private void LockPreviewBitmaps(FolderViewModel root)
{
foreach (var child in root.Children)
{
child.PreviewBitmap.Lock();
if (child.MaskPreviewBitmap is not null)
child.MaskPreviewBitmap.Lock();
child.PreviewBitmap?.Lock();
child.MaskPreviewBitmap?.Lock();
if (child is FolderViewModel innerFolder)
LockPreviewBitmaps(innerFolder);
}
Expand All @@ -169,9 +168,8 @@ private void UnlockPreviewBitmaps(FolderViewModel root)
{
foreach (var child in root.Children)
{
child.PreviewBitmap.Unlock();
if (child.MaskPreviewBitmap is not null)
child.MaskPreviewBitmap.Unlock();
child.PreviewBitmap?.Unlock();
child.MaskPreviewBitmap?.Unlock();
if (child is FolderViewModel innerFolder)
UnlockPreviewBitmaps(innerFolder);
}
Expand Down
67 changes: 5 additions & 62 deletions src/PixiEditor/Models/DocumentModels/DocumentUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,16 +249,7 @@ private void ProcessStructureMemberBlendMode(StructureMemberBlendMode_ChangeInfo
private void ProcessStructureMemberMask(StructureMemberMask_ChangeInfo info)
{
StructureMemberViewModel? memberVm = doc.StructureHelper.FindOrThrow(info.GuidValue);
memberVm.MaskPreviewSurface?.Dispose();
memberVm.MaskPreviewSurface = null;
memberVm.MaskPreviewBitmap = null;

if (info.HasMask)
{
VecI size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
memberVm.MaskPreviewBitmap = CreateBitmap(size);
memberVm.MaskPreviewSurface = CreateDrawingSurface(memberVm.MaskPreviewBitmap);
}
memberVm.InternalSetHasMask(info.HasMask);
memberVm.RaisePropertyChanged(nameof(memberVm.MaskPreviewBitmap));
if (!info.HasMask && memberVm is LayerViewModel layer)
Expand All @@ -275,32 +266,6 @@ private void ProcessRemoveViewport(RemoveViewport_PassthroughAction info)
helper.State.Viewports.Remove(info.GuidValue);
}

private void UpdateMemberBitmapsRecursively(FolderViewModel folder, VecI newSize)
{
foreach (StructureMemberViewModel? member in folder.Children)
{
member.PreviewSurface.Dispose();
member.PreviewBitmap = CreateBitmap(newSize);
member.PreviewSurface = CreateDrawingSurface(member.PreviewBitmap);
member.RaisePropertyChanged(nameof(member.PreviewBitmap));

member.MaskPreviewSurface?.Dispose();
member.MaskPreviewSurface = null;
member.MaskPreviewBitmap = null;
if (member.HasMaskBindable)
{
member.MaskPreviewBitmap = CreateBitmap(newSize);
member.MaskPreviewSurface = CreateDrawingSurface(member.MaskPreviewBitmap);
}
member.RaisePropertyChanged(nameof(member.MaskPreviewBitmap));

if (member is FolderViewModel innerFolder)
{
UpdateMemberBitmapsRecursively(innerFolder, newSize);
}
}
}

private void ProcessSize(Size_ChangeInfo info)
{
VecI oldSize = doc.SizeBindable;
Expand All @@ -309,8 +274,8 @@ private void ProcessSize(Size_ChangeInfo info)
foreach ((ChunkResolution res, DrawingSurface surf) in doc.Surfaces)
{
surf.Dispose();
newBitmaps[res] = CreateBitmap((VecI)(info.Size * res.Multiplier()));
doc.Surfaces[res] = CreateDrawingSurface(newBitmaps[res]);
newBitmaps[res] = StructureMemberViewModel.CreateBitmap((VecI)(info.Size * res.Multiplier()));
doc.Surfaces[res] = StructureMemberViewModel.CreateDrawingSurface(newBitmaps[res]);
}

doc.LazyBitmaps = newBitmaps;
Expand All @@ -319,32 +284,17 @@ private void ProcessSize(Size_ChangeInfo info)
doc.InternalSetVerticalSymmetryAxisX(info.VerticalSymmetryAxisX);
doc.InternalSetHorizontalSymmetryAxisY(info.HorizontalSymmetryAxisY);

VecI previewSize = StructureMemberViewModel.CalculatePreviewSize(info.Size);
VecI documentPreviewSize = StructureMemberViewModel.CalculatePreviewSize(info.Size);
doc.PreviewSurface.Dispose();
doc.PreviewBitmap = CreateBitmap(previewSize);
doc.PreviewSurface = CreateDrawingSurface(doc.PreviewBitmap);
doc.PreviewBitmap = StructureMemberViewModel.CreateBitmap(documentPreviewSize);
doc.PreviewSurface = StructureMemberViewModel.CreateDrawingSurface(doc.PreviewBitmap);

doc.RaisePropertyChanged(nameof(doc.LazyBitmaps));
doc.RaisePropertyChanged(nameof(doc.PreviewBitmap));

UpdateMemberBitmapsRecursively(doc.StructureRoot, previewSize);

doc.InternalRaiseSizeChanged(new(doc, oldSize, info.Size));
}

private WriteableBitmap CreateBitmap(VecI size)
{
return new WriteableBitmap(Math.Max(size.X, 1), Math.Max(size.Y, 1), 96, 96, PixelFormats.Pbgra32, null);
}

private DrawingSurface CreateDrawingSurface(WriteableBitmap bitmap)
{
return DrawingSurface.Create(
new ImageInfo(bitmap.PixelWidth, bitmap.PixelHeight, ColorType.Bgra8888, AlphaType.Premul, ColorSpace.CreateSrgb()),
bitmap.BackBuffer,
bitmap.BackBufferStride);
}

private void ProcessCreateStructureMember(CreateStructureMember_ChangeInfo info)
{
FolderViewModel? parentFolderVM = (FolderViewModel)doc.StructureHelper.FindOrThrow(info.ParentGuid);
Expand All @@ -371,13 +321,6 @@ private void ProcessCreateStructureMember(CreateStructureMember_ChangeInfo info)
memberVM.InternalSetMaskIsVisible(info.MaskIsVisible);
memberVM.InternalSetBlendMode(info.BlendMode);

if (info.HasMask)
{
VecI size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
memberVM.MaskPreviewBitmap = CreateBitmap(size);
memberVM.MaskPreviewSurface = CreateDrawingSurface(memberVM.MaskPreviewBitmap);
}

parentFolderVM.Children.Insert(info.Index, memberVM);

if (info is CreateFolder_ChangeInfo folderInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PixiEditor.Parser;
using PixiEditor.ViewModels.SubViewModels.Document;

namespace PixiEditor.Models.DocumentModels.Public;
Expand Down
Loading

0 comments on commit 27f1ae3

Please sign in to comment.