From 2d3d4c5f951dc50b8e246262596dfbc292d8360a Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <ryan@guzba.com>
Date: Sun, 2 Jan 2022 17:11:55 -0600
Subject: [PATCH 1/3] bugfix

---
 src/pixie/paths.nim | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim
index 34b745b..361dcc5 100644
--- a/src/pixie/paths.nim
+++ b/src/pixie/paths.nim
@@ -1609,6 +1609,9 @@ proc fillShapes(
     pathHeight = min(image.height, (bounds.y + bounds.h).int)
     partitioning = partitionSegments(segments, startY, pathHeight - startY)
 
+  if pathWidth == 0:
+    return
+
   var
     coverages = newSeq[uint8](pathWidth)
     hits = newSeq[(float32, int16)](partitioning.maxEntryCount)

From aae5c07614d300a5538aa5c19d733c7c443d5e4f Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <ryan@guzba.com>
Date: Sun, 2 Jan 2022 18:13:25 -0600
Subject: [PATCH 2/3] demo use windy + boxy

---
 src/pixie/demo.nim | 84 ++++++++++------------------------------------
 1 file changed, 17 insertions(+), 67 deletions(-)

diff --git a/src/pixie/demo.nim b/src/pixie/demo.nim
index ee14dbe..4824cbb 100644
--- a/src/pixie/demo.nim
+++ b/src/pixie/demo.nim
@@ -1,91 +1,41 @@
-import opengl, pixie, pixie/contexts
+import boxy, opengl, pixie, windy
 
-export pixie
-
-import staticglfw except Image
-
-export staticglfw except Image
+export pixie, windy
 
 var
-  dpi: float32 = 1.0
+  window*: Window
   screen*: Image
   ctx*: Context
-  window*: Window
-
-proc getMousePos*(): Vec2 =
-  ## Get the mouse position.
-  var xpos, ypos: float64
-  getCursorPos(window, xpos.addr, ypos.addr)
-  vec2(xpos, ypos) / dpi
-
-proc isMouseDown*(): bool =
-  ## Get if the left mouse button is down.
-  getMouseButton(window, MOUSE_BUTTON_LEFT) == PRESS
-
-proc isKeyDown*(keyCode: int): bool =
-  ## Get if the key is currently being held down.
-  ## See key codes: https://www.glfw.org/docs/3.3/group__keys.html
-  ## Examples: KEY_SPACE, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT
-  getKey(window, keyCode.cint) == PRESS
+  bxy: Boxy
 
 proc tick*() =
   ## Called this every frame in a while loop.
 
-  # Update texture with new pixels from surface.
-  var dataPtr = screen.data[0].addr
-  glTexSubImage2D(
-    GL_TEXTURE_2D, 0, 0, 0,
-    screen.width.GLsizei, screen.height.GLsizei,
-    GL_RGBA, GL_UNSIGNED_BYTE, dataPtr
-  )
+  bxy.addImage("screen", ctx.image, genMipmaps = false)
 
-  # Draw a quad over the whole screen.
-  glClear(GL_COLOR_BUFFER_BIT)
-  glBegin(GL_QUADS)
-  glTexCoord2d(0.0, 0.0); glVertex2d(-1.0, +1.0)
-  glTexCoord2d(1.0, 0.0); glVertex2d(+1.0, +1.0)
-  glTexCoord2d(1.0, 1.0); glVertex2d(+1.0, -1.0)
-  glTexCoord2d(0.0, 1.0); glVertex2d(-1.0, -1.0)
-  glEnd()
+  bxy.beginFrame(window.framebufferSize)
+  bxy.drawRect(rect(vec2(0, 0), window.framebufferSize.vec2), color(1, 1, 1, 1))
+  bxy.drawImage("screen", vec2(0, 0))
+  bxy.endFrame()
 
   swapBuffers(window)
 
   pollEvents()
 
-  if windowShouldClose(window) == 1:
+  if window.closeRequested:
     quit()
 
-  ctx.setTransform(scale(vec2(dpi, dpi)))
+  ctx.setTransform(scale(vec2(window.contentScale, window.contentScale)))
 
-proc start*(title = "Demo", width = 800, height = 600) =
+proc start*(title = "Demo", windowSize = ivec2(800, 600)) =
   ## Start the demo.
-  if init() == 0:
-    quit("Failed to Initialize GLFW.")
+  window = newWindow(title, windowSize)
+  window.style = Decorated
 
-  windowHint(RESIZABLE, false.cint)
-  window = createWindow(width.cint, height.cint, title, nil, nil)
-  if window == nil:
-    quit("Failed to create window.")
   makeContextCurrent(window)
   loadExtensions()
 
-  var xscale, yscale: cfloat
-  window.getWindowContentScale(xscale.addr, yscale.addr)
-  dpi = xscale
-  screen = newImage(int(width.float32 * dpi), int(height.float32 * dpi))
-  window.setWindowSize(screen.width.cint, screen.height.cint)
-  glViewport(0, 0, screen.width.cint, screen.height.cint)
+  let pixelSize = windowSize.vec2 * window.contentScale
+  screen = newImage(pixelSize.x.int, pixelSize.y.int)
   ctx = newContext(screen)
-
-  # Allocate a texture and bind it.
-  var dataPtr = screen.data[0].addr
-  glTexImage2D(
-    GL_TEXTURE_2D, 0, 3,
-    screen.width.GLsizei, screen.height.GLsizei,
-    0, GL_RGBA, GL_UNSIGNED_BYTE, dataPtr
-  )
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
-  glEnable(GL_TEXTURE_2D)
+  bxy = newBoxy()

From 1049e74fecd1458afe5ef12078de2cfe17b46e93 Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <ryan@guzba.com>
Date: Sun, 2 Jan 2022 18:28:39 -0600
Subject: [PATCH 3/3] f

---
 src/pixie/demo.nim | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pixie/demo.nim b/src/pixie/demo.nim
index 4824cbb..150306c 100644
--- a/src/pixie/demo.nim
+++ b/src/pixie/demo.nim
@@ -11,7 +11,7 @@ var
 proc tick*() =
   ## Called this every frame in a while loop.
 
-  bxy.addImage("screen", ctx.image, genMipmaps = false)
+  bxy.addImage("screen", screen, genMipmaps = false)
 
   bxy.beginFrame(window.framebufferSize)
   bxy.drawRect(rect(vec2(0, 0), window.framebufferSize.vec2), color(1, 1, 1, 1))