Merge branch 'mlin/PR/UpdateSpriteParser'

This commit is contained in:
Michelle Linington 2021-11-15 12:59:30 -08:00
commit f424de37eb
2 changed files with 20 additions and 19 deletions

View File

@ -8,6 +8,7 @@ import CoreServices
@objc
public class BadgeAssets: NSObject {
private let scale: Int
private let remoteSourceUrl: URL
private let localAssetDirectory: URL
@ -30,6 +31,7 @@ public class BadgeAssets: NSObject {
case dark16
case dark24
case dark36
case universal112
case universal160
var pointSize: CGSize {
@ -37,12 +39,14 @@ public class BadgeAssets: NSObject {
case .light16, .dark16: return CGSize(width: 16, height: 16)
case .light24, .dark24: return CGSize(width: 24, height: 24)
case .light36, .dark36: return CGSize(width: 36, height: 36)
case .universal112: return CGSize(width: 112, height: 112)
case .universal160: return CGSize(width: 160, height: 160)
}
}
}
required init(remoteSourceUrl: URL, localAssetDirectory: URL) {
required init(scale: Int, remoteSourceUrl: URL, localAssetDirectory: URL) {
self.scale = scale
self.remoteSourceUrl = remoteSourceUrl
self.localAssetDirectory = localAssetDirectory
}
@ -126,7 +130,7 @@ public class BadgeAssets: NSObject {
throw OWSAssertionError("Couldn't load image")
}
let spriteParser = try DefaultSpriteSheetParser(spritesheet: rawImage)
let spriteParser = DefaultSpriteSheetParser(spritesheet: rawImage, scale: scale)
try Variant.allCases.forEach { variant in
let destinationUrl = fileUrlForVariant(variant)
@ -151,6 +155,7 @@ extension BadgeAssets {
@objc public var dark16: UIImage? { imageForVariant(.dark16) }
@objc public var dark24: UIImage? { imageForVariant(.dark24) }
@objc public var dark36: UIImage? { imageForVariant(.dark36) }
@objc public var universal112: UIImage? { imageForVariant(.universal112) }
@objc public var universal160: UIImage? { imageForVariant(.universal160) }
private func imageForVariant(_ variant: Variant) -> UIImage? {
@ -183,17 +188,9 @@ private class DefaultSpriteSheetParser {
let scale: Int
let spritesheet: CGImage
init(spritesheet: CGImage) throws {
init(spritesheet: CGImage, scale: Int) {
self.scale = scale
self.spritesheet = spritesheet
// API contract specifies spritesheets have a constant format. Sheets will always be the same
// size with sprites in the same location. If this ever changes we'll want to be more intelligent here.
switch (spritesheet.width, spritesheet.height) {
case (232, 162): scale = 1
case (456, 322): scale = 2
case (680, 482): scale = 3
default: throw OWSAssertionError("Invalid spritesheet")
}
}
// I've tried various ways of representing these origin points. These could be computed by
@ -202,13 +199,14 @@ private class DefaultSpriteSheetParser {
// Since these sprites should never change, I've just hardcoded each origin into a dictionary
// mapping spriteType -> [1x, 2x, 3x] origins
static let spriteOrigins: [BadgeAssets.Variant: [CGPoint]] = [
.universal160: [CGPoint(x: 1, y: 1), CGPoint(x: 1, y: 1), CGPoint(x: 1, y: 1)],
.light16: [CGPoint(x: 163, y: 1), CGPoint(x: 323, y: 1), CGPoint(x: 483, y: 1)],
.light24: [CGPoint(x: 163, y: 19), CGPoint(x: 323, y: 35), CGPoint(x: 483, y: 51)],
.light36: [CGPoint(x: 189, y: 1), CGPoint(x: 373, y: 1), CGPoint(x: 557, y: 1)],
.dark16: [CGPoint(x: 189, y: 39), CGPoint(x: 373, y: 75), CGPoint(x: 557, y: 111)],
.dark24: [CGPoint(x: 207, y: 39), CGPoint(x: 407, y: 75), CGPoint(x: 607, y: 111)],
.dark36: [CGPoint(x: 163, y: 57), CGPoint(x: 323, y: 109), CGPoint(x: 483, y: 161)]
.dark36: [CGPoint(x: 163, y: 57), CGPoint(x: 323, y: 109), CGPoint(x: 483, y: 161)],
.universal112: [CGPoint(x: 163, y: 57), CGPoint(x: 323, y: 109), CGPoint(x: 483, y: 161)],
.universal160: [CGPoint(x: 223, y: 1), CGPoint(x: 457, y: 1), CGPoint(x: 681, y: 1)]
]
func copySprite(variant: BadgeAssets.Variant) -> CGImage? {

View File

@ -92,11 +92,11 @@ extension ProfileBadge {
case xhdpi
case xxhdpi
var intendedScale: Float {
var intendedScale: Int {
switch self {
case .mdpi: return 1.0
case .xhdpi: return 2.0
case .xxhdpi: return 3.0
case .mdpi: return 1
case .xhdpi: return 2
case .xxhdpi: return 3
}
}
@ -215,7 +215,10 @@ public class BadgeStore: NSObject {
} else if let cachedAssets = assetCache[badge.resourcePath] {
badge.assets = cachedAssets
} else {
badge.assets = BadgeAssets(remoteSourceUrl: badge.remoteAssetUrl, localAssetDirectory: badge.localAssetDir)
badge.assets = BadgeAssets(
scale: badge.badgeVariant.intendedScale,
remoteSourceUrl: badge.remoteAssetUrl,
localAssetDirectory: badge.localAssetDir)
assetCache[badge.resourcePath] = badge.assets
}
owsAssertDebug(badge.assets != nil)