Skip to content

mtrudel/ex_paint

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ExPaint

Build Status Hex.pm

ExPaint is a simple 2D rasterizer, based (for now, at least) on the egd library. Available primitives include lines, rectangles, arcs, polygons, and simple bitmap font support. Dumping of the resulting bitmap is supported in a few forms, including a 4-bit greyscale format as used by devices such as SSD1322 based OLED displays.

The library leans heavily on egd for now, but the eventual intent is to implement an optimized retained mode backing store using something like a piece table of binaries to provide performant compositing / dumping.

Usage

alias ExPaint.{Font, Color}

{:ok, image} = ExPaint.create(128, 64)
font = Font.load("Helvetica20")

ExPaint.clear(image)

ExPaint.text(image, {10, 30}, font, "Hello World", Color.black())
ExPaint.filled_rect(image, {10, 10}, {20,20}, %Color{r: 230, g: 12, b: 34})
ExPaint.filled_ellipse(image, {50, 10}, {20,20}, %Color{r: 12, g: 12, b: 230})
ExPaint.filled_triangle(image, {90, 30}, {100, 10}, {110, 30}, %Color{r: 230, g: 230, b: 34})

# Write to a png
{:ok, png_data} = ExPaint.render(image, ExPaint.PNGRasterizer)
File.write("foo.png", png_data)

# If you're in iTerm, display inline
ExPaint.render(image, ExPaint.InlineRasterizer)

# If you're pairing with https://github.com/mtrudel/ssd1322
{:ok, four_bit_data} = ExPaint.render(image, ExPaint.FourBitGreyscaleRasterizer)
SSD1322.draw(session, four_bit_data)

will render the following image:

foo

Installation

This package can be installed by adding ex_paint and egd to your list of dependencies in mix.exs:

def deps do
  [
    {:ex_paint, "~> 0.2.0"},
    {:egd, github: "erlang/egd"}
  ]
end

Docs can be found at https://hexdocs.pm/ex_paint.

Credits

For ease of installation, this package includes the contents of this collection of fonts in the /priv/fonts/ folder.