Setup the scene
We first create a new scene with a graphic block that has color fill.
let scene = try engine.scene.create()
let page = try engine.block.create(.page) try engine.block.setWidth(page, value: 800) try engine.block.setHeight(page, value: 600) try engine.block.appendChild(to: scene, child: page)
let block = try engine.block.create(.graphic) try engine.block.setShape(block, shape: engine.block.createShape(.rect)) try engine.block.setPositionX(block, value: 350) try engine.block.setPositionY(block, value: 400) try engine.block.setWidth(block, value: 100) try engine.block.setHeight(block, value: 100)
let fill = try engine.block.createFill(.color) try engine.block.setFill(block, fill: fill)
Create colors
Here we instantiate a few colors with RGB and CMYK color spaces. We also define two spot colors, one with an RGB approximation and another with a CMYK approximation. Note that a spot colors can have both color space approximations.
let rgbaBlue = Color.rgba(r: 0, g: 0, b: 1, a: 1) let cmykRed = Color.cmyk(c: 0, m: 1, y: 1, k: 0, tint: 1) let cmykPartialRed = Color.cmyk(c: 0, m: 1, y: 1, k: 0, tint: 0.5)
engine.editor.setSpotColor(name: "Pink-Flamingo", r: 0.988, g: 0.455, b: 0.992) engine.editor.setSpotColor(name: "Yellow", c: 0, m: 0, y: 1, k: 0) let spotPinkFlamingo = Color.spot(name: "Pink-Flamingo", tint: 1.0, externalReference: "Crayola") let spotPartialYellow = Color.spot(name: "Yellow", tint: 0.3, externalReference: "")
Applying colors to a block
We can use the defined colors to modify certain properties of a fill or properties of a shape.
Here we apply it to 'fill/color/value'
, 'stroke/color'
and 'dropShadow/color'
.
try engine.block.setColor(fill, property: "fill/color/value", color: rgbaBlue)try engine.block.setColor(fill, property: "fill/color/value", color: cmykRed)try engine.block.setColor(block, property: "stroke/color", color: cmykPartialRed)try engine.block.setColor(fill, property: "fill/color/value", color: spotPinkFlamingo)try engine.block.setColor(block, property: "dropShadow/color", color: spotPartialYellow)
Converting colors
Using the utility function convertColorToColorSpace
we create a new color in the CMYK color space by converting the rgbaBlue
color to the CMYK color space.
We also create a new color in the RGB color space by converting the spotPinkFlamingo
color to the RGB color space.
let cmykBlueConverted = try engine.editor.convertColorToColorSpace(color: rgbaBlue, colorSpace: .cmyk)let rgbaPinkFlamingoConverted = try engine.editor.convertColorToColorSpace( color: spotPinkFlamingo, colorSpace: .sRGB)
Listing spot colors
This function returns the list of currently defined spot colors.
engine.editor.findAllSpotColors() // ["Crayola-Pink-Flamingo", "Yellow"]
Redefine a spot color
We can re-define the RGB and CMYK approximations of an already defined spot color.
Doing so will change the rendered color of the blocks.
We change it for the CMYK approximation of 'Yellow'
and make it a bit greenish.
The properties that have 'Yellow'
as their spot color will change when re-rendered.
engine.editor.setSpotColor(name: "Yellow", c: 0.2, m: 0, y: 1, k: 0)
Removing the definition of a spot color
We can undefine a spot color.
Doing so will make all the properties still referring to that spot color ('Yellow'
in this case) use the default magenta RGB approximation.
try engine.editor.removeSpotColor(name: "Yellow")
Full Code
Here’s the full code:
import Foundationimport IMGLYEngine
@MainActorfunc colors(engine: Engine) async throws { let scene = try engine.scene.create()
let page = try engine.block.create(.page) try engine.block.setWidth(page, value: 800) try engine.block.setHeight(page, value: 600) try engine.block.appendChild(to: scene, child: page)
let block = try engine.block.create(.graphic) try engine.block.setShape(block, shape: engine.block.createShape(.rect)) try engine.block.setPositionX(block, value: 350) try engine.block.setPositionY(block, value: 400) try engine.block.setWidth(block, value: 100) try engine.block.setHeight(block, value: 100)
let fill = try engine.block.createFill(.color) try engine.block.setFill(block, fill: fill)
let rgbaBlue = Color.rgba(r: 0, g: 0, b: 1, a: 1) let cmykRed = Color.cmyk(c: 0, m: 1, y: 1, k: 0, tint: 1) let cmykPartialRed = Color.cmyk(c: 0, m: 1, y: 1, k: 0, tint: 0.5)
engine.editor.setSpotColor(name: "Pink-Flamingo", r: 0.988, g: 0.455, b: 0.992) engine.editor.setSpotColor(name: "Yellow", c: 0, m: 0, y: 1, k: 0) let spotPinkFlamingo = Color.spot(name: "Pink-Flamingo", tint: 1.0, externalReference: "Crayola") let spotPartialYellow = Color.spot(name: "Yellow", tint: 0.3, externalReference: "")
try engine.block.setColor(fill, property: "fill/color/value", color: rgbaBlue) try engine.block.setColor(fill, property: "fill/color/value", color: cmykRed) try engine.block.setColor(block, property: "stroke/color", color: cmykPartialRed) try engine.block.setColor(fill, property: "fill/color/value", color: spotPinkFlamingo) try engine.block.setColor(block, property: "dropShadow/color", color: spotPartialYellow)
let cmykBlueConverted = try engine.editor.convertColorToColorSpace(color: rgbaBlue, colorSpace: .cmyk) let rgbaPinkFlamingoConverted = try engine.editor.convertColorToColorSpace( color: spotPinkFlamingo, colorSpace: .sRGB )
engine.editor.findAllSpotColors() // ["Crayola-Pink-Flamingo", "Yellow"]
engine.editor.setSpotColor(name: "Yellow", c: 0.2, m: 0, y: 1, k: 0)
try engine.editor.removeSpotColor(name: "Yellow")}