Skip to content

Instantly share code, notes, and snippets.

@chmike
Last active December 3, 2021 13:47
Show Gist options
  • Save chmike/49e834ffba725bfecf8dc3be91999c4f to your computer and use it in GitHub Desktop.
Save chmike/49e834ffba725bfecf8dc3be91999c4f to your computer and use it in GitHub Desktop.

Revisions

  1. chmike revised this gist Dec 3, 2021. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions GIODrawCheckBoard.go
    Original file line number Diff line number Diff line change
    @@ -40,9 +40,9 @@ func loop(w *app.Window) error {
    return e.Err
    case system.FrameEvent:
    gtx := layout.NewContext(&ops, e)
    // draw black background
    // draw black background
    paint.Fill(&ops, color.NRGBA{A: 255})
    // Draw red and white checkboard
    // draw red and white checkboard
    DrawCheckBoard(&ops, f32.Pt(10, 10), f32.Pt(150, 150), 10,
    color.NRGBA{R: 255, G: 255, B: 255, A: 255}, color.NRGBA{R: 255, A: 255})
    // render the drawing
  2. chmike created this gist Dec 3, 2021.
    101 changes: 101 additions & 0 deletions GIODrawCheckBoard.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,101 @@
    package main

    import (
    "image/color"
    "log"
    "os"
    "strings"

    "gioui.org/app"
    "gioui.org/f32"
    "gioui.org/io/system"
    "gioui.org/layout"
    "gioui.org/op"
    "gioui.org/op/clip"
    "gioui.org/op/paint"
    "gioui.org/unit"
    )

    func main() {
    go func() {
    w := app.NewWindow(app.Size(unit.Dp(200), unit.Dp(200)))
    if err := loop(w); err != nil {
    log.Fatal(err)
    }
    os.Exit(0)
    }()
    app.Main()
    }

    func loop(w *app.Window) error {
    var ops op.Ops
    // load the desired font
    goregular, err := opentype.Parse(goregular.TTF)
    if err != nil {
    return err
    }
    for e := range w.Events() {
    switch e := e.(type) {
    case system.DestroyEvent:
    return e.Err
    case system.FrameEvent:
    gtx := layout.NewContext(&ops, e)
    // draw black background
    paint.Fill(&ops, color.NRGBA{A: 255})
    // Draw red and white checkboard
    DrawCheckBoard(&ops, f32.Pt(10, 10), f32.Pt(150, 150), 10,
    color.NRGBA{R: 255, G: 255, B: 255, A: 255}, color.NRGBA{R: 255, A: 255})
    // render the drawing
    e.Frame(gtx.Ops)
    }
    }
    return nil
    }

    func DrawCheckBoard(ops *op.Ops, pos, size f32.Point, sqSize float32, clr1, clr2 color.NRGBA) {
    var path clip.Path
    // offset origin at pos
    defer op.Offset(pos).Push(ops).Pop()
    // set the global clipping region and paint with clr1
    path.Begin(ops)
    path.LineTo(f32.Pt(size.X, 0))
    path.LineTo(size)
    path.LineTo(f32.Pt(0, size.Y))
    path.Close()
    defer clip.Outline{Path: path.End()}.Op().Push(ops).Pop()
    paint.Fill(ops, clr1)
    // create the square path
    path.Begin(ops)
    path.LineTo(f32.Pt(sqSize, 0))
    path.LineTo(f32.Pt(sqSize, sqSize))
    path.LineTo(f32.Pt(0, sqSize))
    path.Close()
    square := clip.Outline{Path: path.End()}.Op()
    // create macro painting a square with clr2
    drawSquareRec := op.Record(ops)
    s := square.Push(ops)
    paint.Fill(ops, clr2)
    s.Pop()
    drawSquare := drawSquareRec.Stop()
    // create a macro painting a row of squares
    drawSquareRowRec := op.Record(ops)
    for x := float32(0); x < size.X+sqSize; x += 2 * sqSize {
    s := op.Offset(f32.Pt(x, 0)).Push(ops)
    drawSquare.Add(ops)
    paint.Fill(ops, clr2)
    s.Pop()
    }
    drawSquareRow := drawSquareRowRec.Stop()
    // draw all even rows
    for y := float32(0); y < size.Y+sqSize; y += 2 * sqSize {
    s := op.Offset(f32.Pt(0, y)).Push(ops)
    drawSquareRow.Add(ops)
    s.Pop()
    }
    // draw all odd rows
    for y := sqSize; y < size.Y+sqSize; y += 2 * sqSize {
    s := op.Offset(f32.Pt(sqSize, y)).Push(ops)
    drawSquareRow.Add(ops)
    s.Pop()
    }
    }