diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 539701c..378ff5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,15 +8,15 @@ on: - main jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: MIX_ENV: test GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} name: "[${{matrix.otp}}/${{matrix.elixir}}, ${{matrix.rust}}] CI Tests" strategy: matrix: - otp: [22, 23, 24, 25] - elixir: ["1.13.4"] + otp: [24, 25] + elixir: ["1.14.4"] rust: ["stable", "nightly"] steps: - uses: actions/checkout@v2.4.0 diff --git a/.github/workflows/credo.yml b/.github/workflows/credo.yml index 4d6b691..baac400 100644 --- a/.github/workflows/credo.yml +++ b/.github/workflows/credo.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: otp: [24, 25] - elixir: ["1.13.4"] + elixir: ["1.14.4"] steps: - uses: actions/checkout@v2.4.0 diff --git a/examples/bell.ex b/examples/bell.ex new file mode 100644 index 0000000..96d233e --- /dev/null +++ b/examples/bell.ex @@ -0,0 +1,43 @@ +alias Xairo.{Image, Rgba} + +import Xairo + +dot = fn image, x, y -> + old_line_cap = line_cap(image) + old_line_width = line_width(image) + image + |> set_line_cap(:round) + |> set_line_width(0.1) + |> move_to({x, y}) + |> line_to({x, y}) + |> stroke() + |> set_line_width(old_line_width) + |> set_line_cap(old_line_cap) +end + +scale = 100 + +image = + Image.new("examples/bell.png", 60 * scale, 60 * scale) + |> scale(scale, scale) + |> set_source(Rgba.new(0.9, 0.9, 0.9)) + |> paint() + |> set_source(Rgba.new(0.1, 0.1, 0.5, 0.25)) + |> set_line_width(0.1) + +:rand.seed(:exsplus, {1, 2, 3}) + +image = Enum.reduce(1..10_000, image, fn _, image -> + x = (:rand.normal() + 1) * 30 + y = :rand.normal(0, 500) + + if x > 5 && x < 55 && y > 5 && y < 55 do + dot.(image, x, y) + else + image + end +end) + +Image.save(image) + + diff --git a/examples/bell.png b/examples/bell.png new file mode 100644 index 0000000..e70f135 Binary files /dev/null and b/examples/bell.png differ diff --git a/examples/sine.ex b/examples/sine.ex new file mode 100644 index 0000000..7628628 --- /dev/null +++ b/examples/sine.ex @@ -0,0 +1,38 @@ +alias Xairo.{Image, Rgba} + +import Xairo + +scale = 50 + +image = + Image.new("examples/sine.png", 60 * scale, 60 * scale) + |> scale(scale, scale) + |> set_source(Rgba.new(0.6, 0.6, 0.6)) + |> paint() + |> set_source(Rgba.new(0.1, 0.1, 0.2)) + |> set_line_width(0.1) + |> move_to({0, 15 + :math.sin(0) * 2}) + +:rand.seed(:exsplus, {1, 2, 3}) + +1..600 +|> Enum.map(&(&1 / 10)) +|> Enum.reduce(image, fn x, image -> + image + |> line_to({x, 15 + :math.sin(x) * 2 + (:rand.uniform() / 4 - 0.125)}) +end) + +move_to(image, {0, 35 + :math.cos(0) * 2}) + +1..600 +|> Enum.map(&(&1 / 10)) +|> Enum.reduce(image, fn x, image -> + image + |> line_to({x, 35 + :math.cos(x) * 2 + (:rand.uniform() / 4 - 0.125)}) +end) + +stroke(image) + + +Image.save(image) + diff --git a/examples/sine.png b/examples/sine.png new file mode 100644 index 0000000..403398a Binary files /dev/null and b/examples/sine.png differ diff --git a/examples/squares.ex b/examples/squares.ex new file mode 100644 index 0000000..2070d27 --- /dev/null +++ b/examples/squares.ex @@ -0,0 +1,45 @@ +alias Xairo.{Image, Rgba} + +import Xairo + +scale = 50 + +rando = fn -> :rand.uniform() / 4 - 0.125 end + +add_square = fn image, x, y -> rectangle(image, {x, y}, 1.5 + rando.(), 1.5 + rando.()) end + +image = + Image.new("examples/squares.png", 60 * scale, 60 * scale) + |> scale(scale, scale) + |> set_source(Rgba.new(0.6, 0.6, 0.6)) + |> paint() + |> set_source(Rgba.new(0.1, 0.1, 0.2)) + |> set_line_width(0.1) + +:rand.seed(:exsplus, {1, 2, 3}) + +points = + for _ <- 1..800 do + x = :rand.uniform(round(60 / 2 - 6)) + 2 + y = :rand.uniform(round(60 / 2 - 6)) + 2 + {x * 2, y * 2} + end + |> Enum.uniq() + +colors = [ + Rgba.new(0.1, 0.1, 0.2), + Rgba.new(0.5, 0.2, 0.6), + Rgba.new(0.3, 0.5, 0.6), +] + +image = + Enum.reduce(points, image, fn {x, y}, image -> + image = add_square.(image, x, y) + |> set_source(Enum.random(colors)) + case :rand.uniform() > 0.6 do + false -> fill(image) + true -> stroke(image) + end + end) + +Image.save(image) diff --git a/examples/squares.png b/examples/squares.png new file mode 100644 index 0000000..430c32b Binary files /dev/null and b/examples/squares.png differ diff --git a/examples/squiggles.ex b/examples/squiggles.ex new file mode 100644 index 0000000..106658c --- /dev/null +++ b/examples/squiggles.ex @@ -0,0 +1,35 @@ +alias Xairo.{Image, Rgba} + +import Xairo + +scale = 10 + +:rand.seed(:exsplus, {1, 2, 3}) + +image = + Image.new("examples/squiggles.png", 60 * scale, 60 * scale) + |> scale(scale, scale) + |> set_source(Rgba.new(0.6, 0.6, 0.6)) + |> paint() + |> set_source(Rgba.new(0.1, 0.1, 0.2)) + |> set_line_width(0.1) + |> move_to({0, 15 + :math.sin(0) * 2}) + +image = Enum.map(0..360, &(&1 / 3)) +|> Enum.reduce(image, fn i, image -> + move_to(image, {0, i}) + 1..600 + |> Enum.map(&(&1 / 10)) + |> Enum.reduce(image, fn x, image -> + x_tweak = (:rand.uniform() / 16 - 0.03125) + y_tweak = (:rand.uniform() / 12 - 0.0625) + if i > 15 && i < 40 && x > 25 && x < 35 do + move_to(image, {x + x_tweak, i + y_tweak}) + else + line_to(image, {x + x_tweak, i + y_tweak}) + end + end) + stroke(image) +end) + +Image.save(image) diff --git a/examples/squiggles.png b/examples/squiggles.png new file mode 100644 index 0000000..55bb4e4 Binary files /dev/null and b/examples/squiggles.png differ diff --git a/lib/xairo/path.ex b/lib/xairo/path.ex index 687f8cc..01825c3 100644 --- a/lib/xairo/path.ex +++ b/lib/xairo/path.ex @@ -84,7 +84,7 @@ defimpl Enumerable, for: Xairo.Path do def slice(%Path{segments: segments}) do size = length(segments) - {:ok, size, &Enumerable.List.slice(segments, &1, &2, size)} + {:ok, size, fn _ -> segments end} end def reduce(%Path{segments: segments}, acc, fun) do diff --git a/mix.exs b/mix.exs index f81a959..95d9d17 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule Xairo.MixProject do [ app: :xairo, version: "0.1.0", - elixir: "~> 1.13", + elixir: "~> 1.14", start_permanent: Mix.env() == :prod, elixirc_paths: elixirc_paths(Mix.env()), deps: deps(), diff --git a/priv/native/libxairo.so b/priv/native/libxairo.so index bd4c1d7..4415b63 100755 Binary files a/priv/native/libxairo.so and b/priv/native/libxairo.so differ