Fork of Pixie for nimskull and with extra features
Go to file
2021-02-24 22:22:33 -06:00
.github/workflows Initial commit 2020-11-19 18:41:32 -08:00
examples fill and stroke helpers 2021-02-19 12:06:16 -06:00
experiments update svg_cairo 2021-02-23 17:58:16 -06:00
src add missing pixelScale 2021-02-24 22:22:33 -06:00
tests move proc, more tests 2021-02-24 22:19:09 -06:00
tools Add line example. 2021-02-18 10:14:55 -08:00
.gitignore ignore dll 2020-12-09 23:49:00 -06:00
LICENSE First commit 2020-11-19 18:45:26 -08:00
pixie.nimble 0.0.21 2021-02-18 13:24:08 -06:00
README.md fill and stroke helpers 2021-02-19 12:06:16 -06:00

Pixie - A full-featured 2D graphics library for Nim

⚠️ WARNING: This library is still in heavy development. ⚠️

Pixie is a 2D graphics library similar to Cairo and Skia written (almost) entirely in Nim.

This library is being actively developed and is not yet ready for use. Since you've managed to stumble onto it, give it a star and check back soon!

nimble install pixie

Features:

  • Drawing paths, shapes and curves, with even-odd and non-zero windings.
  • Strokes with joins and caps.
  • Shadows, glows and blurs.
  • Complex masking: Subtract, Intersect, Exclude.
  • Complex blends: Darken, Multiply, Color Dodge, Hue, Luminosity... etc.
  • Pixel perfect AA quality.
  • Supported file formats: PNG, BMP, JPG, SVG + more in development.

Testing

nimble test

Examples

Square

examples/square.nim

let
  pos = vec2(50, 50)
  wh = vec2(100, 100)

image.fillRect(rect(pos, wh), rgba(255, 0, 0, 255))

example output

Line

examples/line.nim

let
  start = vec2(25, 25)
  stop = vec2(175, 175)
  color = parseHtmlColor("#FF5C00").rgba

image.strokeSegment(segment(start, stop), color, strokeWidth = 10)

example output

Rounded rectangle

examples/rounded_rectangle.nim

let
  pos = vec2(50, 50)
  wh = vec2(100, 100)
  r = 25.0

image.fillRoundedRect(rect(pos, wh), r, rgba(0, 255, 0, 255))

example output

Heart

examples/heart.nim

image.fillPath(
  """
    M 20 60
    A 40 40 90 0 1 100 60
    A 40 40 90 0 1 180 60
    Q 180 120 100 180
    Q 20 120 20 60
    z
  """,
  parseHtmlColor("#FC427B").rgba
)

example output

Shadow

examples/shadow.nim

let polygonImage = newImage(200, 200)
polygonImage.fillPolygon(
  vec2(100, 100),
  70,
  sides = 8,
  rgba(255, 255, 255, 255)
)

let shadow = polygonImage.shadow(
  offset = vec2(2, 2),
  spread = 2,
  blur = 10,
  color = rgba(0, 0, 0, 200)
)

image.draw(shadow)
image.draw(polygonImage)

example output

Blur

examples/blur.nim

let mask = newMask(200, 200)
mask.fillPolygon(vec2(100, 100), 70, sides = 6)

blur.blur(20)
blur.draw(mask, blendMode = bmMask)

image.draw(trees)
image.draw(blur)

example output

Tiger

examples/tiger.nim

let tiger = readImage("examples/data/tiger.svg")

image.draw(
  tiger,
  translate(vec2(100, 100)) *
  scale(vec2(0.2, 0.2)) *
  translate(vec2(-450, -450))
)

example output