Swift 6.4 migration and exhancements (#1)
This PR contains the work done to update the library and the attached example project to use the Swift 6.4 computer as a minimum supported version and also, to use the latest features introduced in it. Reviewed-on: #1 Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
This commit was merged in pull request #1.
This commit is contained in:
@@ -1,18 +1,12 @@
|
||||
extension Graphics.Bitmap {
|
||||
/// The bitmap's dimensions, row stride, and raw pixel/mask storage.
|
||||
/// The pointers are owned by the bitmap.
|
||||
public struct Data {
|
||||
/// The bitmap's width, in pixels.
|
||||
/// A bitmap's layout. Read pixels with `withPixelData(_:)` and `withMaskData(_:)`.
|
||||
public struct Data: Sendable {
|
||||
/// Width, in pixels.
|
||||
public let width: Int
|
||||
/// The bitmap's height, in pixels.
|
||||
/// Height, in pixels.
|
||||
public let height: Int
|
||||
/// The stride of one row of pixel data, in bytes.
|
||||
/// Row stride of the pixel and mask data, in bytes.
|
||||
public let rowBytes: Int
|
||||
/// The bitmap's mask data, or `nil` if it has no mask. One bit per
|
||||
/// pixel; rows are `rowBytes` wide.
|
||||
public let mask: UnsafeMutablePointer<UInt8>?
|
||||
/// The bitmap's pixel data. One bit per pixel; rows are `rowBytes`
|
||||
/// wide.
|
||||
public let data: UnsafeMutablePointer<UInt8>?
|
||||
public let hasMask: Bool
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
internal import CPlaydate
|
||||
|
||||
extension Graphics {
|
||||
/// A page of glyphs within a font. Wraps `LCDFontPage`.
|
||||
/// Keep the font alive while using its pages.
|
||||
/// A page of 256 glyphs in a font. Wraps `LCDFontPage`. Retains its font.
|
||||
public struct FontPage {
|
||||
let pointer: OpaquePointer
|
||||
let font: Font
|
||||
|
||||
/// The glyph for `codepoint` within this page, with its bitmap and advance.
|
||||
/// `nil` if `codepoint` isn't on this page. The bitmap doesn't retain the font.
|
||||
public func glyph(for codepoint: UInt32) -> (glyph: Glyph, bitmap: Bitmap?, advance: Int)? {
|
||||
var bitmap: OpaquePointer?
|
||||
var advance: Int32 = 0
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
internal import CPlaydate
|
||||
|
||||
extension Graphics {
|
||||
/// A single glyph within a font. Wraps `LCDFontGlyph`.
|
||||
/// Keep the font alive while using its glyphs.
|
||||
/// A glyph in a font. Wraps `LCDFontGlyph`. Retains its font.
|
||||
public struct Glyph {
|
||||
let pointer: OpaquePointer
|
||||
let font: Font
|
||||
|
||||
/// The kerning adjustment between this glyph and the next character.
|
||||
/// Kerning adjustment between `glyphCode` and `nextCode`.
|
||||
public func kerning(glyphCode: UInt32, nextCode: UInt32) -> Int {
|
||||
Int(gfx.pointee.getGlyphKerning.unsafelyUnwrapped(pointer, glyphCode, nextCode))
|
||||
}
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
internal import CPlaydate
|
||||
|
||||
extension Graphics {
|
||||
/// An integer rectangle mirroring `LCDRect`. `right` and `bottom` are
|
||||
/// not inclusive.
|
||||
/// A rectangle, in pixels. Mirrors `LCDRect`: `right` and `bottom` are exclusive.
|
||||
public struct Rect: Sendable {
|
||||
public var left: Int
|
||||
/// Exclusive.
|
||||
public var right: Int
|
||||
public var top: Int
|
||||
/// Exclusive.
|
||||
public var bottom: Int
|
||||
|
||||
/// Creates a rect from its edges. `right` and `bottom` are not
|
||||
/// inclusive.
|
||||
public init(left: Int, right: Int, top: Int, bottom: Int) {
|
||||
self.left = left
|
||||
self.right = right
|
||||
@@ -18,7 +17,7 @@ extension Graphics {
|
||||
self.bottom = bottom
|
||||
}
|
||||
|
||||
/// Creates a rect from an origin and size.
|
||||
/// `(x, y)` is the upper-left corner.
|
||||
public init(x: Int, y: Int, width: Int, height: Int) {
|
||||
self.init(left: x, right: x + width, top: y, bottom: y + height)
|
||||
}
|
||||
@@ -33,13 +32,10 @@ extension Graphics {
|
||||
top: Int32(top), bottom: Int32(bottom))
|
||||
}
|
||||
|
||||
/// The rect's width.
|
||||
public var width: Int { right - left }
|
||||
|
||||
/// The rect's height.
|
||||
public var height: Int { bottom - top }
|
||||
|
||||
/// Returns the rect offset by (dx, dy).
|
||||
public func translated(dx: Int, dy: Int) -> Rect {
|
||||
Rect(left: left + dx, right: right + dx, top: top + dy, bottom: bottom + dy)
|
||||
}
|
||||
|
||||
@@ -1,21 +1,44 @@
|
||||
extension Graphics {
|
||||
/// An 8×8 two-color pattern: 8 rows of image data followed by 8 rows of mask.
|
||||
/// An 8×8 pattern. Mirrors `LCDPattern`: 8 image rows then 8 mask rows,
|
||||
/// one byte per row, one bit per pixel.
|
||||
public struct Pattern: Sendable {
|
||||
/// The pattern's 8 rows of image data followed by 8 rows of mask,
|
||||
/// one byte per row.
|
||||
public var bytes: (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8,
|
||||
UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8)
|
||||
|
||||
/// Creates a pattern from 8 rows of image data and 8 rows of mask.
|
||||
public init(bytes: (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8,
|
||||
UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8)) {
|
||||
self.bytes = bytes
|
||||
}
|
||||
|
||||
/// Creates an opaque pattern from 8 rows of image data.
|
||||
/// An opaque pattern (mask rows all `0xff`).
|
||||
public init(rows r: (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8)) {
|
||||
bytes = (r.0, r.1, r.2, r.3, r.4, r.5, r.6, r.7,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// InlineArray needs macOS 26 on the host; device and Linux are unrestricted.
|
||||
// Conversions reinterpret the same 16 bytes.
|
||||
@available(macOS 26, *)
|
||||
extension Graphics.Pattern {
|
||||
public init(bytes: [16 of UInt8]) {
|
||||
self.init(bytes: unsafeBitCast(bytes, to: Bytes.self))
|
||||
}
|
||||
|
||||
/// An opaque pattern (mask rows all `0xff`).
|
||||
public init(rows: [8 of UInt8]) {
|
||||
self.init(bytes: [16 of UInt8] { $0 < 8 ? rows[$0] : 0xff })
|
||||
}
|
||||
|
||||
/// `bytes` as an inline array.
|
||||
public var inlineBytes: [16 of UInt8] {
|
||||
get { unsafeBitCast(bytes, to: [16 of UInt8].self) }
|
||||
set { bytes = unsafeBitCast(newValue, to: Bytes.self) }
|
||||
}
|
||||
}
|
||||
|
||||
extension Graphics.Pattern {
|
||||
typealias Bytes = (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8,
|
||||
UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user