Option Strict On
Option Explicit On

Imports System
Imports System.Globalization
Imports System.IO
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASImageViewer
#Region "Image Export API"

        Public Function CreateTransformedBitmap() As SKBitmap
            If Not HasImage Then Return Nothing
            Dim rotated As Boolean = (_rotationDegrees Mod 180) <> 0
            Dim width As Integer = If(rotated, _bitmap.Height, _bitmap.Width)
            Dim height As Integer = If(rotated, _bitmap.Width, _bitmap.Height)
            If width <= 0 OrElse height <= 0 Then Return Nothing

            Dim result As New SKBitmap(width, height)
            Using canvas As New SKCanvas(result)
                canvas.Clear(SKColors.Transparent)
                canvas.Translate(width / 2.0F, height / 2.0F)
                canvas.RotateDegrees(CSng(_rotationDegrees))
                canvas.Scale(If(_flippedHorizontal, -1.0F, 1.0F), If(_flippedVertical, -1.0F, 1.0F))
                Using paint As New SKPaint With {.IsAntialias = True, .FilterQuality = SKFilterQuality.High}
                    Dim dest As New SKRect(-_bitmap.Width / 2.0F, -_bitmap.Height / 2.0F, _bitmap.Width / 2.0F, _bitmap.Height / 2.0F)
                    canvas.DrawBitmap(_bitmap, dest, paint)
                End Using
            End Using
            Return result
        End Function

        Public Function ExportTransformedImage(filePath As String,
                                               Optional format As MASImageExportFormat = MASImageExportFormat.Png,
                                               Optional quality As Integer = 100) As Boolean
            If String.IsNullOrWhiteSpace(filePath) OrElse Not HasImage Then Return False
            RaiseExportRequestedSafe()

            Try
                Using transformed As SKBitmap = CreateTransformedBitmap()
                    If transformed Is Nothing Then Return False
                    Using image As SKImage = SKImage.FromBitmap(transformed)
                        If image Is Nothing Then Return False
                        Using encoded As SKData = image.Encode(MASImageViewerVisualPolicy.MapExportFormat(format), MASImageViewerVisualPolicy.NormalizeExportQuality(quality))
                            If encoded Is Nothing Then Return False
                            Using stream As FileStream = File.Open(filePath, FileMode.Create, FileAccess.Write, FileShare.None)
                                encoded.SaveTo(stream)
                            End Using
                        End Using
                    End Using
                End Using
                RaiseImageExportedSafe()
                Return True
            Catch masCaughtException1 As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowFileSystemBoundary(masCaughtException1, "MASImageViewer.ExportTransformedImage")
                Return False
            End Try
        End Function

#End Region

    End Class

End Namespace
