RotatedText2.vb
''
'' This code is part of Document Solutions for PDF demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing
Imports System.Numerics

'' Shows how to use GcPdfGraphics.Transform to rotate a text string
'' (alternative way using matrix multiplication).
'' See also RotatedText.
Public Class RotatedText2
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' Rotation angle, degrees clockwise:
        Dim angle = -45.0F
        ''
        Dim doc = New GcPdfDocument()
        Dim g = doc.NewPage().Graphics
        '' Create a text layout, pick a font and font size:
        Dim tl = g.CreateTextLayout()
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 24
        '' Add a text, and perform layout:
        tl.Append("Rotated text.")
        tl.PerformLayout(True)
        '' Text insertion point at (1",1"):
        Dim ip = New PointF(72, 72)
        '' Now that we have text size, create text rectangle with top left at insertion point:
        Dim rect = New RectangleF(ip.X, ip.Y, tl.ContentWidth, tl.ContentHeight)
        '' Rotation center point in the middel of text bounding rectangle:
        Dim center = New PointF(ip.X + tl.ContentWidth / 2, ip.Y + tl.ContentHeight / 2)
        '' Transformations can be combined by multiplying matrices.
        '' Note that matrix multiplication is not commutative - 
        '' the sequence of operands is important, and is applied from last to first
        '' matrices being multiplied:
        '' 3) Translate the origin back to (0,0):
        '' 2) Rotate around new origin by the specified angle:
        '' 1) Translate the origin from default (0,0) to rotation center:
        g.Transform =
            Matrix3x2.CreateTranslation(-center.X, -center.Y) *
            Matrix3x2.CreateRotation((angle * Math.PI) / 180.0F) *
            Matrix3x2.CreateTranslation(center.X, center.Y)
        '' Draw rotated text and bounding rectangle:
        g.DrawTextLayout(tl, ip)
        g.DrawRectangle(rect, Color.Black, 1)
        '' Remove transformation and draw the bounding rectangle where the non-rotated text would have been:
        g.Transform = Matrix3x2.Identity
        g.DrawRectangle(rect, Color.ForestGreen, 1)
        ''
        '' Done:
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class