Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement SkCanvas::SaveLayerRec #2962

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

Implement SkCanvas::SaveLayerRec #2962

wants to merge 3 commits into from

Conversation

ahmed605
Copy link

@ahmed605 ahmed605 commented Jul 30, 2024

Description of Change

Implement SkCanvas::SaveLayerRec

Bugs Fixed

API Changes

Added:

class SKCanvas {
    public int SaveLayer (SKCanvasSaveLayerRec rec)
}
public enum SKCanvasSaveLayerRecFlags {
    None = 0,
    PreserveLcdText = 2,
    InitializeWithPrevious = 4,
    F16ColorType = 16,
}
public unsafe class SKCanvasSaveLayerRec {
    public SKRect? Bounds { get; set; }
    public SKPaint? Paint { get; set; }
    public SKImageFilter? Backdrop { get; set; }
    public SKCanvasSaveLayerRecFlags Flags { get; set; }
}

Behavioral Changes

None.

Required skia PR

mono/skia#130

PR Checklist

  • Has tests (if omitted, state reason in description)
  • Rebased on top of main at time of PR
  • Merged related skia PRs
  • Changes adhere to coding standard
  • Updated documentation

@mattleibow
Copy link
Contributor

Not sure my magic with CI is working with the auto detection of the skia branch (probably because I am not doing it right for forks) so maybe just update the submodule here and we can merge in one go later once the skia PR is merged.

binding/SkiaSharp/SKCanvas.cs Outdated Show resolved Hide resolved
binding/SkiaSharp/SKCanvas.cs Outdated Show resolved Hide resolved
@mattleibow
Copy link
Contributor

/azp run

Copy link

Azure Pipelines could not run because the pipeline triggers exclude this branch/path.

@mattleibow mattleibow marked this pull request as ready for review October 28, 2024 16:09
@ramezgerges
Copy link

ramezgerges commented Nov 1, 2024

@mattleibow Hello, I'm an Uno Platform dev and I'm following up on this PR (and the accompanying mono/skia PR). I haven't actually tested the new APIs yet, but here are my thoughts.

@mattleibow
Copy link
Contributor

Thanks for the review @ramezgerges, this makes sense today with the small struct. But, if you look at the latest skia, does your thought still seem valid? The struct is getting fairly large: https://github.com/google/skia/blob/main/include/core/SkCanvas.h#L689 There are new properties to be added - color space, image filters as well as a collection/array of image filters.

Not sure either way here, but at what point to we think a class is better? Will we ever re-use this object for multiple calls?

I was also thinking that due to the large-ish size and potentially fairly complex nature, it should be a class: https://learn.microsoft.com/dotnet/standard/design-guidelines/choosing-between-class-and-struct

However, rules in .NET are just best ideas for most cases, not the law. So, maybe we can break it. But, a struct may still be the best. Not sure if any of this changes anything? Let me know if you still think a struct is better.

@ramezgerges
Copy link

Thanks for getting back to me, @mattleibow. Just to be clear, the struct-vs-class point is merely a suggestion/observation, and I'm okay with the PR either way.

  • I didn't notice the new properties that were added. However, I think the argument is still the same: assuming that 99% of the usescases follow the "Create a SaveLayerRec -> Immediately give it to SaveLayer -> forget about it" pattern, then allocating a new object every time seems wasteful. If we're worried about the cost of copying, then can't we just make SaveLayer take a ref (or a ref readonly) parameter? i.e.
    public int SaveLayer (ref readonly SKCanvasSaveLayerRec rec)

  • If we keep it as a class, can we instead add a Reset method to reset the SaveLayerRec to its initial state? We've had to deal with excessive SKPath/SKPaint allocations in our main loop before and the workaround I did was to use an ObjectPool + a Reset() call to get a "fresh" SKPath/SKPaint.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEATURE] Expose SkCanvas::SaveLayerRec API
3 participants