67 lines
1.9 KiB
Nim
67 lines
1.9 KiB
Nim
import gintro/[glib, gobject, gtk, gio, cairo]
|
|
|
|
const
|
|
Width = 640
|
|
Height = 480
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
|
|
proc draw(area: DrawingArea; context: Context) =
|
|
## Draw the greyscale bars.
|
|
|
|
const
|
|
Black = 0.0
|
|
White = 1.0
|
|
|
|
var y = 0.0
|
|
var nrect = 8
|
|
let rectHeight = Height / 4
|
|
|
|
# Draw quarters.
|
|
for quarter in 0..3:
|
|
let rectWidth = Width / nrect
|
|
var x = 0.0
|
|
var (grey, incr) = if (quarter and 1) == 0: (Black, 1 / nrect) else: (White, -1 / nrect)
|
|
|
|
# Draw rectangles.
|
|
for _ in 1..nrect:
|
|
context.rectangle(x, y, rectWidth, rectHeight)
|
|
context.setSource([grey, grey, grey])
|
|
context.fill()
|
|
x += rectWidth
|
|
grey += incr
|
|
|
|
y += rectHeight
|
|
nrect *= 2
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
|
|
proc onDraw(area: DrawingArea; context: Context; data: pointer): bool =
|
|
## Callback to draw/redraw the drawing area contents.
|
|
|
|
area.draw(context)
|
|
result = true
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
|
|
proc activate(app: Application) =
|
|
## Activate the application.
|
|
|
|
let window = app.newApplicationWindow()
|
|
window.setSizeRequest(Width, Height)
|
|
window.setTitle("Greyscale bars")
|
|
|
|
# Create the drawing area.
|
|
let area = newDrawingArea()
|
|
window.add(area)
|
|
|
|
# Connect the "draw" event to the callback to draw the spiral.
|
|
discard area.connect("draw", ondraw, pointer(nil))
|
|
|
|
window.showAll()
|
|
|
|
#———————————————————————————————————————————————————————————————————————————————————————————————————
|
|
|
|
let app = newApplication(Application, "Rosetta.GreyscaleBars")
|
|
discard app.connect("activate", activate)
|
|
discard app.run()
|