Difference between revisions of "Igis Snippet: Maintaining a Constant Aspect Ratio"
From Coder Merlin
(Created page) |
m (Minor code improvements) |
||
Line 9: | Line 9: | ||
let frameWidth : Double = 1200 | let frameWidth : Double = 1200 | ||
let frameHeight : Double = 700 | let frameHeight : Double = 700 | ||
let | let backgroundFillStyle = FillStyle(color:Color(.black)) | ||
var scaleTransform = Transform() | var scaleTransform = Transform() | ||
Line 19: | Line 18: | ||
let frameWidthInt = Int(frameWidth) | let frameWidthInt = Int(frameWidth) | ||
let frameHeightInt = Int(frameHeight) | let frameHeightInt = Int(frameHeight) | ||
frame = Path(fillMode:. | frame = Path(fillMode:.clear) | ||
frame.moveTo(Point()) | frame.moveTo(Point()) | ||
frame.lineTo(Point(x:frameWidthInt, y:0)) | frame.lineTo(Point(x:frameWidthInt, y:0)) | ||
Line 34: | Line 33: | ||
if let newCanvasSize = windowSize { | if let newCanvasSize = windowSize { | ||
canvas.canvasSetSize(size:newCanvasSize) | canvas.canvasSetSize(size:newCanvasSize) | ||
let newCanvasWidth = Double(newCanvasSize.width) | let newCanvasWidth = Double(newCanvasSize.width) | ||
let newCanvasHeight = Double(newCanvasSize.height) | let newCanvasHeight = Double(newCanvasSize.height) | ||
Line 49: | Line 47: | ||
scaleTransform = Transform(scale:DoublePoint(x:scale, y:scale), mode:.fromCurrent) | scaleTransform = Transform(scale:DoublePoint(x:scale, y:scale), mode:.fromCurrent) | ||
} | } | ||
windowSize = nil | windowSize = nil | ||
} | } | ||
Line 60: | Line 57: | ||
let canvasRect = Rect(topLeft:Point(), size:canvasSize) | let canvasRect = Rect(topLeft:Point(), size:canvasSize) | ||
let canvasRectangle = Rectangle(rect:canvasRect, fillMode:.fill) | let canvasRectangle = Rectangle(rect:canvasRect, fillMode:.fill) | ||
canvas.render( | canvas.render(backgroundFillStyle, canvasRectangle, offsetTransform, scaleTransform, frame, Clip()) | ||
// Render everything else | // Render everything else | ||
} | } |
Revision as of 21:48, 28 January 2020
Within these castle walls be forged Mavens of Computer Science ...
— Merlin, The Coder
Rendering a Frame with a Constant Aspect Ratio[edit]
import Igis
class Painter : PainterBase {
let frame : Path
let frameWidth : Double = 1200
let frameHeight : Double = 700
let backgroundFillStyle = FillStyle(color:Color(.black))
var scaleTransform = Transform()
var offsetTransform = Transform()
var windowSize : Size?
required init() {
let frameWidthInt = Int(frameWidth)
let frameHeightInt = Int(frameHeight)
frame = Path(fillMode:.clear)
frame.moveTo(Point())
frame.lineTo(Point(x:frameWidthInt, y:0))
frame.lineTo(Point(x:frameWidthInt, y:frameHeightInt))
frame.lineTo(Point(x:0, y:frameHeightInt))
frame.close()
}
override func onWindowResize(size:Size) {
windowSize = size
}
func calculateTransforms(canvas:Canvas) {
if let newCanvasSize = windowSize {
canvas.canvasSetSize(size:newCanvasSize)
let newCanvasWidth = Double(newCanvasSize.width)
let newCanvasHeight = Double(newCanvasSize.height)
if newCanvasWidth / newCanvasHeight >= frameWidth / frameHeight {
let scale = newCanvasHeight / frameHeight
let offset = (newCanvasWidth - frameWidth * scale) * 0.5
offsetTransform = Transform(translate:DoublePoint(x:offset, y:0), mode:.fromIdentity)
scaleTransform = Transform(scale:DoublePoint(x:scale, y:scale), mode:.fromCurrent)
} else {
let scale = newCanvasWidth / frameWidth
let offset = (newCanvasHeight - frameHeight * scale) * 0.5
offsetTransform = Transform(translate:DoublePoint(x:0, y:offset), mode:.fromIdentity)
scaleTransform = Transform(scale:DoublePoint(x:scale, y:scale), mode:.fromCurrent)
}
windowSize = nil
}
}
override func render(canvas:Canvas) {
calculateTransforms(canvas:canvas)
if let canvasSize = canvas.canvasSize {
canvas.render(Transform())
let canvasRect = Rect(topLeft:Point(), size:canvasSize)
let canvasRectangle = Rectangle(rect:canvasRect, fillMode:.fill)
canvas.render(backgroundFillStyle, canvasRectangle, offsetTransform, scaleTransform, frame, Clip())
// Render everything else
}
}
}
print("Starting...")
do {
let igis = Igis()
try igis.run(painterType:Painter.self)
} catch (let error) {
print("Error: \(error)")
}