Skip to content
Clipping

Clipping

Restrict drawing to stacked rectangular clip regions.

Clipping

Usage

from canvas.color import Color
from canvas.buffer import Canvas
from canvas.shapes.rects import draw_rect
from canvas.shapes.lines import draw_line
from canvas.shapes.circles import fill_circle_aa
from canvas.io.bmp import write_bmp
from canvas.io.png import write_png


def main() raises:
    var c = Canvas(900, 600, Color(255, 255, 255))

    # mark the plot area's boundary before clipping anything; drawn
    # unclipped, so it stays a crisp full rectangle
    draw_rect(c, 150, 150, 600, 300, Color(180, 180, 180))

    c.push_clip(150, 150, 600, 300)

    # both of these are sized/positioned to spill well past the clip
    # boundary on every side
    fill_circle_aa(c, 450, 300, 270, Color(40, 100, 200))
    draw_line(c, 0, 0, 899, 599, Color(220, 60, 40))

    # a nested clip, deliberately larger than its parent on every side
    # -- still confined to the parent's region, not its own
    c.push_clip(0, 0, 900, 600)
    fill_circle_aa(c, 300, 180, 105, Color(230, 200, 40))
    c.pop_clip()  # back to just the outer clip

    c.pop_clip()  # back to no clip

    write_bmp(c, "examples/out_clipping.bmp")
    write_png(c, "examples/out_clipping.png")
    print("wrote examples/out_clipping.bmp and .png")