Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support of preserve vector data flag for Xcode assets. #82

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,8 @@ The default scaling factor is 1, so the image will have the original size.
The default value is `false`.
- `useAbsoluteBounds`: uses full dimensions of the node.
The default value is `false`.
- `preserveVectorData`: sets `Preserve Vector Data` flag in Xcode assets.
The default value is `false`.


Sample configuration:
Expand Down
12 changes: 11 additions & 1 deletion Sources/Fugen/Commands/ImagesCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,15 @@ final class ImagesCommand: AsyncExecutableCommand, GenerationConfigurableCommand
defaultValue: false
)

let preserveVectorData = Flag(
"--preserveVectorData",
description: """
Set preserve vector data flag in Xcode assets.
By default, Xcode assets will be generated without vector data preserving.
""",
defaultValue: false
)

// MARK: - Initializers

init(generator: ImagesGenerator) {
Expand Down Expand Up @@ -177,7 +186,8 @@ final class ImagesCommand: AsyncExecutableCommand, GenerationConfigurableCommand
format: resolveImageFormat(),
scales: resolveImageScales(),
onlyExportables: onlyExportables.value,
useAbsoluteBounds: useAbsoluteBounds.value
useAbsoluteBounds: useAbsoluteBounds.value,
preserveVectorData: preserveVectorData.value
)
}

Expand Down
3 changes: 2 additions & 1 deletion Sources/Fugen/Generators/Images/DefaultImagesGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ private extension ImagesConfiguration {
assets: assets,
resources: resources,
onlyExportables: onlyExportables,
useAbsoluteBounds: useAbsoluteBounds
useAbsoluteBounds: useAbsoluteBounds,
preserveVectorData: preserveVectorData
)
}
}
10 changes: 8 additions & 2 deletions Sources/Fugen/Models/Configuration/ImagesConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ struct ImagesConfiguration: Decodable {
case scales
case onlyExportables
case useAbsoluteBounds
case preserveVectorData
}

// MARK: - Instance Properties
Expand All @@ -22,6 +23,7 @@ struct ImagesConfiguration: Decodable {
let scales: [ImageScale]
let onlyExportables: Bool
let useAbsoluteBounds: Bool
let preserveVectorData: Bool

// MARK: - Initializers

Expand All @@ -32,7 +34,8 @@ struct ImagesConfiguration: Decodable {
format: ImageFormat,
scales: [ImageScale],
onlyExportables: Bool,
useAbsoluteBounds: Bool
useAbsoluteBounds: Bool,
preserveVectorData: Bool
) {
self.generatation = generatation
self.assets = assets
Expand All @@ -41,6 +44,7 @@ struct ImagesConfiguration: Decodable {
self.scales = scales
self.onlyExportables = onlyExportables
self.useAbsoluteBounds = useAbsoluteBounds
self.preserveVectorData = preserveVectorData
}

init(from decoder: Decoder) throws {
Expand All @@ -53,6 +57,7 @@ struct ImagesConfiguration: Decodable {
scales = try container.decodeIfPresent(forKey: .scales) ?? [.none]
onlyExportables = try container.decodeIfPresent(forKey: .onlyExportables) ?? false
useAbsoluteBounds = try container.decodeIfPresent(forKey: .useAbsoluteBounds) ?? false
preserveVectorData = try container.decodeIfPresent(forKey: .preserveVectorData) ?? false

generatation = try GenerationConfiguration(from: decoder)
}
Expand All @@ -67,7 +72,8 @@ struct ImagesConfiguration: Decodable {
format: format,
scales: scales,
onlyExportables: onlyExportables,
useAbsoluteBounds: useAbsoluteBounds
useAbsoluteBounds: useAbsoluteBounds,
preserveVectorData: preserveVectorData
)
}
}
1 change: 1 addition & 0 deletions Sources/Fugen/Models/Images/ImageAsset.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ struct ImageAsset: Encodable, Hashable {

let name: String
let filePaths: [ImageScale: String]
let preserveVectorData: Bool
}
1 change: 1 addition & 0 deletions Sources/Fugen/Models/Parameters/ImagesParameters.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ struct ImagesParameters {
let resources: String?
let onlyExportables: Bool
let useAbsoluteBounds: Bool
let preserveVectorData: Bool
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ final class DefaultImageAssetsProvider: ImageAssetsProvider {

// MARK: - Instance Methods

private func makeAsset(for node: ImageRenderedNode, format: ImageFormat, folderPath: Path) -> ImageAsset {
private func makeAsset(
for node: ImageRenderedNode,
format: ImageFormat,
preserveVectorData: Bool,
folderPath: Path
) -> ImageAsset {
let name = node.base.name.camelized

let filePaths = node.urls.keys.reduce(into: [:]) { result, scale in
Expand All @@ -29,18 +34,24 @@ final class DefaultImageAssetsProvider: ImageAssetsProvider {
.string
}

return ImageAsset(name: name, filePaths: filePaths)
return ImageAsset(name: name, filePaths: filePaths, preserveVectorData: preserveVectorData)
}

private func makeAssets(
for nodes: [ImageRenderedNode],
format: ImageFormat,
preserveVectorData: Bool,
folderPath: Path
) -> [ImageRenderedNode: ImageAsset] {
var assets: [ImageRenderedNode: ImageAsset] = [:]

nodes.forEach { node in
assets[node] = makeAsset(for: node, format: format, folderPath: folderPath)
assets[node] = makeAsset(
for: node,
format: format,
preserveVectorData: preserveVectorData,
folderPath: folderPath
)
}

return assets
Expand All @@ -50,8 +61,12 @@ final class DefaultImageAssetsProvider: ImageAssetsProvider {
let assetImages = asset.filePaths.map { scale, filePath in
AssetImage(fileName: Path(filePath).lastComponent, scale: scale.assetImageScale)
}

return AssetImageSet(contents: AssetImageSetContents(info: .defaultFugen, images: assetImages))
let contents = AssetImageSetContents(
info: .defaultFugen,
properties: AssetImageProperties(from: asset),
images: assetImages
)
return AssetImageSet(contents: contents)
}

private func makeAssetImageSets(for assets: [ImageRenderedNode: ImageAsset]) -> [String: AssetImageSet] {
Expand Down Expand Up @@ -81,12 +96,14 @@ final class DefaultImageAssetsProvider: ImageAssetsProvider {
func saveImages(
nodes: [ImageRenderedNode],
format: ImageFormat,
preserveVectorData: Bool,
in folderPath: String
) -> Promise<[ImageRenderedNode: ImageAsset]> {
return perform(on: DispatchQueue.global(qos: .userInitiated)) {
self.makeAssets(
for: nodes,
format: format,
preserveVectorData: preserveVectorData,
folderPath: Path(folderPath)
)
}.nest { assets in
Expand Down Expand Up @@ -124,3 +141,13 @@ private extension ImageScale {
}
}
}

private extension AssetImageProperties {

init?(from imageAsset: ImageAsset) {
guard imageAsset.preserveVectorData else {
return nil
}
self.init(preserveVectorRepresentation: imageAsset.preserveVectorData)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ protocol ImageAssetsProvider {
func saveImages(
nodes: [ImageRenderedNode],
format: ImageFormat,
preserveVectorData: Bool,
in folderPath: String
) -> Promise<[ImageRenderedNode: ImageAsset]>
}
9 changes: 8 additions & 1 deletion Sources/Fugen/Providers/Images/DefaultImagesProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,16 @@ final class DefaultImagesProvider: ImagesProvider {
private func saveAssetImagesIfNeeded(
nodes: [ImageRenderedNode],
format: ImageFormat,
preserveVectorData: Bool,
in assets: String?
) -> Promise<[ImageRenderedNode: ImageAsset]> {
return assets.map { folderPath in
imageAssetsProvider.saveImages(nodes: nodes, format: format, in: folderPath)
imageAssetsProvider.saveImages(
nodes: nodes,
format: format,
preserveVectorData: preserveVectorData,
in: folderPath
)
} ?? .value([:])
}

Expand Down Expand Up @@ -133,6 +139,7 @@ final class DefaultImagesProvider: ImagesProvider {
fulfilled: self.saveAssetImagesIfNeeded(
nodes: nodes,
format: parameters.format,
preserveVectorData: parameters.preserveVectorData,
in: parameters.assets
),
self.saveResourceImagesIfNeeded(
Expand Down