Merge pull request #44 from trilorez/image-layout-info

Add layout info to MathImage
This commit is contained in:
mgriebling
2025-05-22 10:22:16 -04:00
committed by GitHub
2 changed files with 20 additions and 7 deletions

View File

@@ -46,7 +46,16 @@ extension MathImage {
CGSize(width: displayList.width + contentInsets.left + contentInsets.right, CGSize(width: displayList.width + contentInsets.left + contentInsets.right,
height: displayList.ascent + displayList.descent + contentInsets.top + contentInsets.bottom) height: displayList.ascent + displayList.descent + contentInsets.top + contentInsets.bottom)
} }
public mutating func asImage() -> (NSError?, MTImage?) { public struct LayoutInfo {
public var ascent: CGFloat = 0
public var descent: CGFloat = 0
public init(ascent: CGFloat, descent: CGFloat) {
self.ascent = ascent
self.descent = descent
}
}
public mutating func asImage() -> (NSError?, MTImage?, LayoutInfo?) {
func layoutImage(size: CGSize, displayList: MTMathListDisplay) { func layoutImage(size: CGSize, displayList: MTMathListDisplay) {
var textX = CGFloat(0) var textX = CGFloat(0)
switch self.textAlignment { switch self.textAlignment {
@@ -69,7 +78,7 @@ extension MathImage {
guard let mathList = MTMathListBuilder.build(fromString: latex, error: &error), error == nil, guard let mathList = MTMathListBuilder.build(fromString: latex, error: &error), error == nil,
let displayList = MTTypesetter.createLineForMathList(mathList, font: mtfont, style: currentStyle) else { let displayList = MTTypesetter.createLineForMathList(mathList, font: mtfont, style: currentStyle) else {
return (error, nil) return (error, nil, nil)
} }
intrinsicContentSize = intrinsicContentSize(displayList) intrinsicContentSize = intrinsicContentSize(displayList)
@@ -86,7 +95,7 @@ extension MathImage {
displayList.draw(rendererContext.cgContext) displayList.draw(rendererContext.cgContext)
rendererContext.cgContext.restoreGState() rendererContext.cgContext.restoreGState()
} }
return (nil, image) return (nil, image, LayoutInfo(ascent: displayList.ascent, descent: displayList.descent))
#endif #endif
#if os(macOS) #if os(macOS)
let image = NSImage(size: size, flipped: false) { bounds in let image = NSImage(size: size, flipped: false) { bounds in
@@ -96,7 +105,7 @@ extension MathImage {
context.restoreGState() context.restoreGState()
return true return true
} }
return (nil, image) return (nil, image, LayoutInfo(ascent: displayList.ascent, descent: displayList.descent))
#endif #endif
} }
} }

View File

@@ -21,6 +21,7 @@ final class MathImageTests: XCTestCase {
let result = SwiftMathImageResult.useMathImage(latex: latex, font: mathfont, fontSize: fontsize) let result = SwiftMathImageResult.useMathImage(latex: latex, font: mathfont, fontSize: fontsize)
XCTAssertNil(result.error) XCTAssertNil(result.error)
XCTAssertNotNil(result.image) XCTAssertNotNil(result.image)
XCTAssertNotNil(result.layoutInfo)
if result.error == nil, let image = result.image, let imageData = image.pngData() { if result.error == nil, let image = result.image, let imageData = image.pngData() {
safeImage(fileName: "test", pngData: imageData) safeImage(fileName: "test", pngData: imageData)
let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()) let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory())
@@ -38,6 +39,7 @@ final class MathImageTests: XCTestCase {
result = SwiftMathImageResult.useMathImage(latex: latex, font: mathfont, fontSize: fontsize) result = SwiftMathImageResult.useMathImage(latex: latex, font: mathfont, fontSize: fontsize)
XCTAssertNil(result.error) XCTAssertNil(result.error)
XCTAssertNotNil(result.image) XCTAssertNotNil(result.image)
XCTAssertNotNil(result.layoutInfo)
if result.error == nil, let image = result.image, let imageData = image.pngData() { if result.error == nil, let image = result.image, let imageData = image.pngData() {
safeImage(fileName: "\(caseNumber)", pngData: imageData) safeImage(fileName: "\(caseNumber)", pngData: imageData)
//let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()) //let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory())
@@ -87,6 +89,7 @@ final class MathImageTests: XCTestCase {
let result = SwiftMathImageResult.useMathImage(latex: latex, font: mathfont, fontSize: fontsize) let result = SwiftMathImageResult.useMathImage(latex: latex, font: mathfont, fontSize: fontsize)
XCTAssertNil(result.error) XCTAssertNil(result.error)
XCTAssertNotNil(result.image) XCTAssertNotNil(result.image)
XCTAssertNotNil(result.layoutInfo)
if result.error == nil, let image = result.image, let imageData = image.pngData() { if result.error == nil, let image = result.image, let imageData = image.pngData() {
self?.safeImage(fileName: "\(count)", pngData: imageData) self?.safeImage(fileName: "\(count)", pngData: imageData)
} }
@@ -114,6 +117,7 @@ final class MathImageTests: XCTestCase {
public struct SwiftMathImageResult { public struct SwiftMathImageResult {
let error: NSError? let error: NSError?
let image: MTImage? let image: MTImage?
let layoutInfo: MathImage.LayoutInfo?
} }
extension SwiftMathImageResult { extension SwiftMathImageResult {
public static func useMTMathImage(latex: String, font: MathFont, fontSize: CGFloat, textColor: MTColor = MTColor.black) -> SwiftMathImageResult { public static func useMTMathImage(latex: String, font: MathFont, fontSize: CGFloat, textColor: MTColor = MTColor.black) -> SwiftMathImageResult {
@@ -123,7 +127,7 @@ extension SwiftMathImageResult {
labelMode: .text, textAlignment: alignment) labelMode: .text, textAlignment: alignment)
formatter.font = font.mtfont(size: fontSize) formatter.font = font.mtfont(size: fontSize)
let (error, image) = formatter.asImage() let (error, image) = formatter.asImage()
return SwiftMathImageResult(error: error, image: image) return SwiftMathImageResult(error: error, image: image, layoutInfo: nil)
} }
public static func useMathImage(latex: String, font: MathFont, fontSize: CGFloat, textColor: MTColor = MTColor.black) -> SwiftMathImageResult { public static func useMathImage(latex: String, font: MathFont, fontSize: CGFloat, textColor: MTColor = MTColor.black) -> SwiftMathImageResult {
let alignment = MTTextAlignment.left let alignment = MTTextAlignment.left
@@ -131,8 +135,8 @@ extension SwiftMathImageResult {
textColor: textColor, textColor: textColor,
labelMode: .text, textAlignment: alignment) labelMode: .text, textAlignment: alignment)
formatter.font = font formatter.font = font
let (error, image) = formatter.asImage() let (error, image, layoutInfo) = formatter.asImage()
return SwiftMathImageResult(error: error, image: image) return SwiftMathImageResult(error: error, image: image, layoutInfo: layoutInfo)
} }
} }
#if os(macOS) #if os(macOS)