Files
Pilz/Pilz.UI/PaintingControl/DefaultDrawMethodes.vb

221 lines
9.0 KiB
VB.net

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
Imports Pilz.Drawing
''' <summary>
''' Contains static methods that are used for the standart PaintingObject Types.
''' </summary>
Public Class DefaultDrawMethodes
Public Shared Sub DrawText(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
Dim b As New SolidBrush(obj.TextColor)
Dim p As New PointF
Dim rect As New Rectangle(e.X, e.Y, obj.Width, obj.Height)
Dim f As StringFormat = StringFormat.GenericDefault
f.Alignment = obj.HorizontalTextAlignment
f.LineAlignment = obj.VerticalTextAlignment
Dim zoomFactor As Single
If obj.Parent Is Nothing Then
zoomFactor = 1.0!
Else
zoomFactor = obj.Parent.ZoomFactor.Width
End If
e.Graphics.DrawString(obj.Text, New Font(obj.TextFont.FontFamily, obj.TextFont.Size * zoomFactor, obj.TextFont.Style), b, rect, f)
End Sub
Public Shared Sub DrawPicture(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
Dim objImg As Image
Dim result As RectangleF
Dim image As Bitmap
SyncLock e.PaintingObject.Parent
If obj?.Image Is Nothing Then Return
objImg = obj.Image
End SyncLock
image = obj.BufferedImage
result = CalculateImageResolution(obj, objImg.Size)
If obj.ImageProperties.Rotate = 90 OrElse obj.ImageProperties.Rotate = 270 Then
result = CalculateImageResolution(obj, New SizeF(objImg.Size.Height, objImg.Size.Width))
Else
result = result
End If
If image Is Nothing Then
Dim needRescaleImageBecauseRot As Boolean = False
image = DrawToNewImage(objImg, result.Size)
Select Case obj.ImageProperties.Rotate
Case 90
image.RotateFlip(RotateFlipType.Rotate90FlipNone)
needRescaleImageBecauseRot = True
Case 180
image.RotateFlip(RotateFlipType.Rotate180FlipNone)
Case 270
image.RotateFlip(RotateFlipType.Rotate270FlipNone)
needRescaleImageBecauseRot = True
End Select
If obj.ImageProperties.FlipX Then
image.RotateFlip(RotateFlipType.RotateNoneFlipX)
End If
If obj.ImageProperties.FlipY Then
image.RotateFlip(RotateFlipType.RotateNoneFlipY)
End If
If needRescaleImageBecauseRot Then
result = CalculateImageResolution(obj, New SizeF(objImg.Size.Height, objImg.Size.Width))
image = DrawToNewImage(image, result.Size)
End If
obj.BufferedImage = image
End If
If image IsNot Nothing Then
e.Graphics.DrawImageUnscaled(image, New Rectangle(New Point(obj.Location.X + result.Location.X - e.Offset.X, obj.Location.Y + result.Location.Y - e.Offset.Y), result.Size.ToSize))
End If
End Sub
Private Shared Function DrawToNewImage(image As Bitmap, newSize As SizeF) As Bitmap
Dim bmp As New Bitmap(CInt(newSize.Width), CInt(newSize.Height))
Dim gimage As Graphics = Graphics.FromImage(bmp)
gimage.SmoothingMode = SmoothingMode.HighQuality
gimage.PixelOffsetMode = PixelOffsetMode.HighQuality
gimage.PageUnit = GraphicsUnit.Pixel
gimage.InterpolationMode = InterpolationMode.HighQualityBicubic
gimage.DrawImage(image, New RectangleF(PointF.Empty, newSize))
gimage.Dispose()
Return bmp
End Function
Public Shared Sub DrawLine(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
Dim p2 As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle}
p2.Alignment = PenAlignment.Center
Dim no As PointF = New PointF(e.X, e.Y)
e.Graphics.DrawLine(p2, no, no + obj.Size)
End Sub
Private Shared Function CalculateImageResolution(obj As PaintingObject, imageSize As SizeF) As RectangleF
Dim result As New RectangleF
Dim objrect As New RectangleF(obj.Location, obj.Size)
Dim size As SizeF = imageSize
Dim clientRectangle As RectangleF = objrect
Dim val As Single = clientRectangle.Width / size.Width
clientRectangle = objrect
Dim num As Single = Math.Min(val, clientRectangle.Height / size.Height)
result.Width = CInt(Math.Truncate(size.Width * num))
result.Height = CInt(Math.Truncate(size.Height * num))
clientRectangle = objrect
result.X = (clientRectangle.Width - result.Width) \ 2
clientRectangle = objrect
result.Y = (clientRectangle.Height - result.Height) \ 2
Return result
End Function
Public Shared Sub DrawTriangle(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
If obj.EnableFill Then
Dim b As New SolidBrush(obj.FillColor)
Dim p1 As New Point(obj.Size.Width / 2 + e.X, e.Y)
Dim p2 As New Point(e.X, e.Y + obj.Size.Height)
Dim p3 As New Point(e.X + obj.Size.Width, e.Y + obj.Size.Height)
e.Graphics.FillPolygon(b, {p1, p2, p3})
End If
If obj.EnableOutline Then
Dim lw As Single = obj.OutlineThicknes
Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset}
Dim p1 As New Point(obj.Size.Width / 2 + e.X, e.Y)
Dim p2 As New Point(e.X, e.Y + obj.Size.Height)
Dim p3 As New Point(e.X + obj.Size.Width, e.Y + obj.Size.Height)
e.Graphics.DrawPolygon(p, {p1, p2, p3})
End If
End Sub
Public Shared Sub DrawRectangle(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
Dim hol As Single = obj.OutlineThicknes / 2
If obj.EnableFill Then
Dim b As New SolidBrush(obj.FillColor)
Dim rect As Rectangle = If(obj.EnableOutline,
New Rectangle(e.X + hol, e.Y + hol, obj.Size.Width - hol * 2, obj.Size.Height - hol * 2),
New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height))
e.Graphics.FillRectangle(b, rect)
End If
If obj.EnableOutline Then
Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset}
Dim rect As New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height)
e.Graphics.DrawRectangle(p, rect)
End If
End Sub
Public Shared Sub DrawEllipse(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
If obj.EnableFill Then
Dim b As New SolidBrush(obj.FillColor)
Dim rect As Rectangle = New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height)
e.Graphics.FillEllipse(b, rect)
End If
If obj.EnableOutline Then
Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset}
Dim rect As New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height)
e.Graphics.DrawEllipse(p, rect)
End If
End Sub
Public Shared Sub DrawSelection(e As PaintingObjectPaintEventArgs)
Dim obj As PaintingObject = e.PaintingObject
Dim lw As Single = 2.5!
Dim hlw As Single = lw / 2
Dim hlwphol As Single = hlw '+ hol
Dim hlwpholm2 As Single = hlwphol * 2
Dim p As New Pen(Color.CornflowerBlue, lw) With {.DashStyle = obj.SelectionDashStyle, .Alignment = PenAlignment.Outset}
Dim rect As New Rectangle(e.X - hlwphol, e.Y - hlwphol, obj.Size.Width + hlwpholm2, obj.Size.Height + hlwpholm2)
e.Graphics.DrawRectangle(p, rect)
End Sub
Public Shared Sub DrawGrid(e As PaintEventArgs, pc As PaintingControl, offset As PointF)
Dim p As New Pen(pc.GridColor, 0.5)
Dim curX As Integer = pc.GridChunkSize.Width * pc.ZoomFactor.Width - offset.X
Do While curX < pc.Width
e.Graphics.DrawLine(p, curX, -offset.Y, curX, pc.Height)
curX += (pc.GridChunkSize.Width * pc.ZoomFactor.Width)
Loop
Dim curY As Integer = pc.GridChunkSize.Height * pc.ZoomFactor.Height - offset.Y
Do While curY < pc.Height
e.Graphics.DrawLine(p, -offset.X, curY, pc.Width, curY)
curY += (pc.GridChunkSize.Height * pc.ZoomFactor.Height)
Loop
End Sub
Public Shared Sub DrawAreaSelection(e As PaintEventArgs, pc As PaintingControl, startMousePos As PointF, lastMousePos As PointF)
Dim p As New Pen(pc.AreaSelectionColor)
p.DashStyle = DashStyle.DashDot
p.Width = 3
Dim rectToDraw As RectangleF = HelpfulDrawingFunctions.GetRectangle(startMousePos, lastMousePos)
e.Graphics.DrawRectangle(p, rectToDraw.X, rectToDraw.Y, rectToDraw.Width, rectToDraw.Height)
End Sub
End Class