mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 01:36:02 +08:00
* Add `spine-iOS` SPM package & example app (#1) * Basic Mesh Rendering (#2) * Spine C++ Swift Wrapper (#3) * Load `Atlas` & `SkeletonData` (#4) Load & dispose `Atlas` & `SkeletonData` from bundled files. * Generate Swift classes from `spine-cpp-lite.h` (#5) * Draw `SkeletonData` render commands (#6) - Use `SkeletonData` render commands in the renderer - Simple loop for animation support * Add `BoundsProvider` (#7) - Implement & support `BoundsProvider` classes - Introduce alignment and content mode - Update c to swift script to return optional for find prefixed methods * Support `SpineController` & `Event` callbacks (#8) - Support SpineController callbacks - Support Event callbacks - Apply tint color in renderer * Support `DressUp` sample (#9) - Add `DressUp` sample - Move SpineViewController to SpineUIView - Implement SpineUIView export to image * Remove unused file * Add `Physics` sample (#10) - Add `Physics` sample - Fix offsets in `IKFollowing` sample - Fix `SpineView` background color * Add `DebugRendering` sample (#11) - Add `DebugRendering` sample - Make `SpineUIView` transparent * Move remaining files to SPM package (#12) - Move remaining files to SPM package - Rename `SpineWrapper` to `SpineCppLite` * Load assets from different sources (#13) - Load from bundle, file, http & drawable - Apply correct blend mode & pma in renderer * Add `Obj-C` + `UIKit` sample (#14) - Add `Obj-C` + `UIKit` sample - Update `Spine` to be usable in Obj-C code base * Support CocoaPods (#15) * Metal Best Practices (#16) - Tripple Buffering - Buffer Bindings - Shared Objects * Annotate functions that should return optional (#17) * Add option to disable drawing when out of viewport (#18) - Add option to disable drawing when out of viewport - Move update clock to controller so multiple views can share it * Add docs for public Spine classes/methods (#19) * Fix various regressions (#20) - Fix retain `SpineController` retain cycle - Fix issue wehre images were not rendered
55 lines
2.2 KiB
Swift
55 lines
2.2 KiB
Swift
import Foundation
|
|
import UIKit
|
|
import CoreGraphics
|
|
|
|
public extension SkeletonDrawableWrapper {
|
|
|
|
/// Render the ``Skeleton`` to a `CGImage`
|
|
///
|
|
/// Parameters:
|
|
/// - size: The size of the `CGImage` that should be rendered.
|
|
/// - backgroundColor: the background color of the image
|
|
/// - scaleFactor: The scale factor. Set this to `UIScreen.main.scale` if you want to show the image in a view
|
|
func renderToImage(size: CGSize, backgroundColor: UIColor, scaleFactor: CGFloat = 1) throws -> CGImage? {
|
|
let spineView = SpineUIView(
|
|
controller: SpineController(disposeDrawableOnDeInit: false), // Doesn't own the drawable
|
|
backgroundColor: backgroundColor
|
|
)
|
|
spineView.frame = CGRect(origin: .zero, size: size)
|
|
spineView.isPaused = false
|
|
spineView.enableSetNeedsDisplay = false
|
|
spineView.framebufferOnly = false
|
|
spineView.contentScaleFactor = scaleFactor
|
|
|
|
try spineView.load(drawable: self)
|
|
spineView.renderer?.waitUntilCompleted = true
|
|
|
|
spineView.delegate?.draw(in: spineView)
|
|
|
|
guard let texture = spineView.currentDrawable?.texture else {
|
|
throw "Could not read texture."
|
|
}
|
|
let width = texture.width
|
|
let height = texture.height
|
|
let rowBytes = width * 4
|
|
let data = UnsafeMutableRawPointer.allocate(byteCount: rowBytes * height, alignment: MemoryLayout<UInt8>.alignment)
|
|
defer {
|
|
data.deallocate()
|
|
}
|
|
|
|
let region = MTLRegionMake2D(0, 0, width, height)
|
|
texture.getBytes(data, bytesPerRow: rowBytes, from: region, mipmapLevel: 0)
|
|
|
|
let bitmapInfo = CGBitmapInfo(
|
|
rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue
|
|
).union(.byteOrder32Little)
|
|
|
|
let colorSpace = CGColorSpaceCreateDeviceRGB()
|
|
guard let context = CGContext(data: data, width: width, height: height, bitsPerComponent: 8, bytesPerRow: rowBytes, space: colorSpace, bitmapInfo: bitmapInfo.rawValue),
|
|
let cgImage = context.makeImage() else {
|
|
throw "Could not create image."
|
|
}
|
|
return cgImage
|
|
}
|
|
}
|