Current section

Files

Jump to
vivid README.md
Raw

README.md

# Vivid
[![Hex.pm](https://img.shields.io/hexpm/v/vivid.svg)](https://hex.pm/packages/vivid)
Vivid is a simple 2D rendering library.
## Features
- Supports drawing and manipulating a number of basic 2D primitives.
- Supports filling arbitrary polygons.
- Supports arbitrary transformations shape transformations.
- Renders shapes onto a buffer.
- 100% pure Elixir with no dependencies.
- Render to PNG using [vivid_png](https://harton.dev/james/vivid_png).
## Demo
I implemented a simple ASCII renderer for debugging and testing purposes, so at
any time you can pipe almost any Vivid struct to `IO.puts` and the contents of
the buffer will be rendered and printed onto the screen.
### Basic drawing
Frames behave as a simple collection of shapes and colours, which you can simply
push on to.
```elixir
use Vivid
Frame.init(10,10, RGBA.white)
|> Frame.push(Circle.init(Point.init(5,5), 4), RGBA.black)
|> IO.puts
```
```
@@@@ @@@
@@ @@@ @
@@ @@@@@ @
@ @@@@@@@
@ @@@@@@@
@ @@@@@@@
@@ @@@@@ @
@@ @@@ @
@@@@ @@@
@@@@@@@@@@
```
### Transformations
Vivid supports a number of standards transforms which can be applied to a shape
before it is added to a frame. It also makes provision for you to write your own.
```elixir
use Vivid
frame = Frame.init(20, 20, RGBA.white)
shape = Box.init(Point.init(0,0), Point.init(5,5))
|> Transform.rotate(45)
|> Transform.fill(frame)
|> Transform.center(frame)
|> Transform.apply
Frame.push(frame, shape, RGBA.black)
|> IO.puts
```
```
@@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @ @@@@@@@@
@@@@@@@@ @@@ @@@@@@@
@@@@@@@ @@@@@ @@@@@@
@@@@@ @@@@@@@ @@@@@
@@@@ @@@@@@@@@@ @@@@
@@@ @@@@@@@@@@@@ @@@
@@ @@@@@@@@@@@@@@ @@
@ @@@@@@@@@@@@@@@@ @
@@@@@@@@@@@@@@@@@@
@ @@@@@@@@@@@@@@@@ @
@@ @@@@@@@@@@@@@@ @@
@@@ @@@@@@@@@@@@ @@@
@@@@ @@@@@@@@@@ @@@@
@@@@@ @@@@@@@@@ @@@@
@@@@@@ @@@@@@@ @@@@@
@@@@@@@ @@@@@ @@@@@@
@@@@@@@@ @@@ @@@@@@@
@@@@@@@@@ @ @@@@@@@@
@@@@@@@@@@ @@@@@@@@@
```
## Installation
Vivid is [available in Hex](https://hex.pm/packages/vivid), the package can be
installed by adding `vivid` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:vivid, "~> 0.4.4"}
]
end
```
Documentation for the latest release can be found on
[HexDocs](https://hexdocs.pm/vivid).
## Github Mirror
This repository is mirrored [on Github](https://github.com/jimsynz/vivid)
from it's primary location [on my Forgejo instance](https://harton.dev/james/vivid).
Feel free to raise issues and open PRs on Github.
## License
Source code is licensed under the terms of the MIT license, the text of which
is included in the `LICENSE` file in this distribution.
This distribution includes the Hershey vector font from
[The Hershey Fonts](http://sol.gfxile.net/hershey/index.html).
Font use restrictions:
```
This distribution of the Hershey Fonts may be used by anyone for
any purpose, commercial or otherwise, providing that:
1. The following acknowledgements must be distributed with
the font data:
- The Hershey Fonts were originally created by Dr.
A. V. Hershey while working at the U. S.
National Bureau of Standards.
- The format of the Font data in this distribution
was originally created by
James Hurt
Cognition, Inc.
900 Technology Park Drive
Billerica, MA 01821
(mit-eddie!ci-dandelion!hurt)
2. The font data in this distribution may be converted into
any other format *EXCEPT* the format distributed by
the U.S. NTIS (which organization holds the rights
to the distribution and use of the font data in that
particular format). Not that anybody would really
*want* to use their format... each point is described
in eight bytes as "xxx yyy:", where xxx and yyy are
the coordinate values as ASCII numbers.
```
This distribution also includes three subsets of
[Roboto](https://github.com/googlefonts/roboto-2), cut down to the same ten
glyphs and used by the font parser's tests and examples.
`priv/fonts/roboto-subset.ttf` keeps Roboto's original TrueType outlines;
`priv/fonts/roboto-subset.otf` has had those outlines converted to the
PostScript ones a CFF font uses; and `priv/fonts/roboto-subset.woff` is the
first of those in a WOFF container, with each of its tables compressed. Between
them both kinds of outline and both containers can be tested against the same
glyphs. Roboto is copyright Google Inc. and licensed under the Apache License
2.0, the text of which is included in `priv/fonts/LICENSE-Roboto.txt`.
This distribution also includes `priv/fonts/misc-fixed-4x6.bdf`, the ASCII
portion of the X11 `4x6` bitmap font, used by the BDF parser's tests and
examples. Its licence, reproduced in full in `priv/fonts/LICENSE-misc-fixed.txt`,
reads "Public domain font. Share and enjoy."
## Status
This library is now in use in several projects and seems to work well.
Future improvements include:
- Add transformations which can apply rotation matrices directly.
- Add ability to composit multiple frames together.