class StumpyCore::Canvas

Overview

A canvas is 2D array of RGBA pixels

To create a canvas of size 400 x 200

canvas = StumpyCore::Canvas.new(400, 200)

The default background color is transparent, but it can be passed in as a parameter or as a block that returns the color value for each {x, y} pair.

canvas2 = StumpyCore::Canvas.new(400, 200, RGBA::WHITE)
canvas3 = StumpyCore::Canvas.new(256, 256) do |x, y|
  RGBA.from_rgb_n(x, y, 255, 8)
end

image

Because of the way pixels are stored in a Slice, Canvases are limited to Int32::MAX = 2147483647 pixels in total, e.g. a maximal size of 46340x46340 for a square image.

Defined in:

stumpy_core/canvas.cr

Constructors

Instance Method Summary

Constructor Detail

def self.new(width : Int32, height : Int32, background = RGBA.new(0_u16, 0_u16, 0_u16, 0_u16)) #

[View source]
def self.new(width : Int32, height : Int32, &) #

[View source]

Instance Method Detail

def ==(other) #

Two canvases are considered equal if they are of equal size and all their pixels are equal


[View source]
def [](x, y) #

Short form for #get


[View source]
def []=(x, y, color) #

Short form for #set


[View source]
def each_row(&) #

Iterate over each row of the canvas (a Slice(RGBA) of size @width). The main usecase for this is writing code that encodes images in some file format.


[View source]
def get(x, y) #

Get the value of pixel (x, y) without checking if (x, y) is a valid position.


[View source]
def height : Int32 #

[View source]
def includes_pixel?(x, y) #

Check if pixel (x, y) is part of this canvas.


[View source]
def map(&) #

Same as #map!, but instead of mutating the current canvas, a new one is created and returned


[View source]
def map!(&) #

Modify pixels by applying a function (color, x, y) -> new_color to each pixel of the current canvas, e.g. to invert colors


[View source]
def map_with_index(&) #

Same as #map but passes along a fourth parameter with the index in the #pixels slice


[View source]
def map_with_index!(&) #

Same as #map! but passes along a fourth parameter with the index in the #pixels slice


[View source]
def paste(canvas : Canvas, x, y) #

Past the contents of a second Canvas into this one, starting at position (x, y). The pixels are combined using the RGBA#over function.


[View source]
def pixels : Slice(RGBA) #

[View source]
def safe_get(x : Int32, y : Int32) : RGBA | Nil #

Same as #get, but returns nil if (x, y) are outside of the canvas


[View source]
def safe_set(x : Int32, y : Int32, color : RGBA) : Bool #

Same as #set, but only sets the pixel, if it is part of the canvas. Returns true if the pixel was set successfully, false if it was outside of the canvas.


[View source]
def set(x, y, color) #

Set the value of pixel (x, y) to color without checking if (x, y) is a valid position.


[View source]
def width : Int32 #

[View source]
def wrapping_get(x : Int32, y : Int32) : RGBA #

Same as #get, but if x ore y are outside of the canvas, wrap them over at the edges. E.g. #wrapping_get(300, 250) on a 200x200 canvas returns the pixel at (100, 50).


[View source]
def wrapping_set(x : Int32, y : Int32, color : RGBA) #

Same as #set, but wrapping along the canvas edges. See #wrapping_get for an example.


[View source]