summary refs log tree commit diff stats
path: root/lib/impure
diff options
context:
space:
mode:
authordom96 <dominikpicheta@googlemail.com>2012-04-20 22:39:03 +0100
committerdom96 <dominikpicheta@googlemail.com>2012-04-20 22:39:03 +0100
commit263bb377458f1a0467d874fd536afb79cf195752 (patch)
tree08c4d75512eb0d8a2e64663b8fa384c3af77415a /lib/impure
parent8319e2411d07503f8ca1475f1ef9009384560c1c (diff)
downloadNim-263bb377458f1a0467d874fd536afb79cf195752.tar.gz
Fixed graphics.drawLineAA and graphics.withEvents uses WaitEvent instead of PollEvent now.
Diffstat (limited to 'lib/impure')
-rwxr-xr-xlib/impure/graphics.nim107
1 files changed, 64 insertions, 43 deletions
diff --git a/lib/impure/graphics.nim b/lib/impure/graphics.nim
index aa4d08dd8..9ddb69768 100755
--- a/lib/impure/graphics.nim
+++ b/lib/impure/graphics.nim
@@ -406,20 +406,22 @@ proc drawEllipse*(sur: PSurface, CX, CY, XRadius, YRadius: Natural,
       inc(YChange,TwoASquare)
   
 
-proc plotAA(sur: PSurface, x, y, c: float, color: TColor) =
-  if (x.toInt() > 0 and x.toInt() < sur.s.w) and (y.toInt() > 0 and 
-      y.toInt() < sur.s.h):
+proc plotAA(sur: PSurface, x, y: int, c: float, color: TColor) =
+  if (x > 0 and x < sur.s.w) and (y > 0 and 
+      y < sur.s.h):
     var video = cast[PPixels](sur.s.pixels)
     var pitch = sur.s.pitch div ColSize
 
-    var pixColor = getPix(video, pitch, x.toInt, y.toInt)
+    var pixColor = getPix(video, pitch, x, y)
 
-    setPix(video, pitch, x.toInt(), y.toInt(), 
+    setPix(video, pitch, x, y, 
            pixColor.intensity(1.0 - c) + color.intensity(c))
-         
-proc ipart(x: float): float = return x.trunc()
-proc fpart(x: float): float = return x - ipart(x)
-proc rfpart(x: float): float = return 1.0 - fpart(x)
+ 
+
+template ipart(x: expr): expr = floor(x) 
+template cround(x: expr): expr = ipart(x + 0.5)
+template fpart(x: expr): expr = x - ipart(x)
+template rfpart(x: expr): expr = 1.0 - fpart(x)
 
 proc drawLineAA*(sur: PSurface, p1, p2: TPoint, color: TColor) =
   ## Draws a anti-aliased line from ``p1`` to ``p2``, using Xiaolin Wu's 
@@ -428,36 +430,56 @@ proc drawLineAA*(sur: PSurface, p1, p2: TPoint, color: TColor) =
                           p1.y.toFloat(), p2.y.toFloat())
   var dx = x2 - x1
   var dy = y2 - y1
-  if abs(dx) < abs(dy):
+  
+  var ax = dx
+  if ax < 0'f64:
+    ax = 0'f64 - ax
+  var ay = dy
+  if ay < 0'f64:
+    ay = 0'f64 - ay
+  
+  if ax < ay:
     swap(x1, y1)
     swap(x2, y2)
+    swap(dx, dy)
+  
+  template doPlot(x, y: int, c: float, color: TColor): stmt =
+    if ax < ay:
+      sur.PlotAA(y, x, c, color)
+    else:
+      sur.PlotAA(x, y, c, color)
+  
   if x2 < x1:
     swap(x1, x2)
     swap(y1, y2)
-
+  
   var gradient = dy / dx
   # handle first endpoint
-  var xend = x1  # Should be round(x1), but since this is an int anyway..
+  var xend = cround(x1)
   var yend = y1 + gradient * (xend - x1)
   var xgap = rfpart(x1 + 0.5)
-  var xpxl1 = xend # this will be used in the main loop
-  var ypxl1 = ipart(yend)
-  sur.plotAA(xpxl1, ypxl1, rfpart(yend) * xgap, color)
-  sur.plotAA(xpxl1, ypxl1 + 1.0, fpart(yend) * xgap, color)
+  var xpxl1 = int(xend) # this will be used in the main loop
+  var ypxl1 = int(ipart(yend))
+  doPlot(xpxl1, ypxl1, rfpart(yend)*xgap, color)
+  doPlot(xpxl1, ypxl1 + 1, fpart(yend)*xgap, color)
   var intery = yend + gradient # first y-intersection for the main loop
+
   # handle second endpoint
-  xend = x2 # Should be round(x1), but since this is an int anyway..
+  xend = cround(x2)
   yend = y2 + gradient * (xend - x2)
   xgap = fpart(x2 + 0.5)
-  var xpxl2 = xend  # this will be used in the main loop
-  var ypxl2 = ipart(yend)
-  sur.plotAA(xpxl2, ypxl2, rfpart(yend) * xgap, color)
-  sur.plotAA(xpxl2, ypxl2 + 1.0, fpart(yend) * xgap, color)  
+  var xpxl2 = int(xend) # this will be used in the main loop
+  var ypxl2 = int(ipart(yend))
+  doPlot(xpxl2, ypxl2, rfpart(yend) * xgap, color)
+  doPlot(xpxl2, ypxl2 + 1, fpart(yend) * xgap, color)
+
   # main loop
-  for x in xpxl1.toInt + 1..xpxl2.toInt - 1:
-    sur.plotAA(x.toFloat(), ipart(intery), rfpart(intery), color)
-    sur.plotAA(x.toFloat(), ipart(intery) + 1.0, fpart(intery), color)
+  var x = xpxl1 + 1
+  while x <= xpxl2-1:
+    doPlot(x, int(ipart(intery)), rfpart(intery), color)
+    doPlot(x, int(ipart(intery)) + 1, fpart(intery), color)
     intery = intery + gradient
+    inc(x)
 
 proc fillSurface*(sur: PSurface, color: TColor) =
   ## Fills the entire surface with ``color``.
@@ -469,7 +491,7 @@ template withEvents*(surf: PSurface, event: expr, actions: stmt): stmt =
   ## variable containing the TEvent object.
   while True:
     var event: SDL.TEvent
-    if SDL.PollEvent(addr(event)) == 1:
+    if SDL.WaitEvent(addr(event)) == 1:
       actions
 
 if sdl.Init(sdl.INIT_VIDEO) < 0: raiseEGraphics()
@@ -478,9 +500,9 @@ if sdl_ttf.Init() < 0: raiseEGraphics()
 when isMainModule:
   var surf = newScreenSurface(800, 600)
   surf.fillSurface(colWhite)
-  
+
   # Draw the shapes
-  surf.drawLineAA((100, 170), (400, 471), colTan)
+  surf.drawLineAA((150, 170), (400, 471), colTan)
   surf.drawLine((100, 170), (400, 471), colRed)
   
   surf.drawEllipse(200, 300, 200, 30, colSeaGreen)
@@ -496,14 +518,16 @@ when isMainModule:
   surf.drawCircle((600, 500), 60, colRed)
   
   surf.fillRect((50, 50, 100, 100), colFuchsia)
+
+  surf.drawLineAA((592, 160), (592, 280), colPurple)
   
   #surf.drawText((300, 300), "TEST", colMidnightBlue)
   #var textSize = textBounds("TEST")
   #surf.drawText((300, 300 + textSize.height), $textSize.width & ", " &
   #  $textSize.height, colDarkGreen)
   
-  var mouseStartX = 0
-  var mouseStartY = 0
+  var mouseStartX = -1
+  var mouseStartY = -1
   withEvents(surf, event):
     var eventp = addr(event)
     case event.kind:
@@ -518,22 +542,19 @@ when isMainModule:
         echo(evk.keysym.sym)
     of SDL.MOUSEBUTTONDOWN:
       var mbd = sdl.EvMouseButton(eventp)
-      mouseStartX = mbd.x
-      mouseStartY = mbd.y
-      
-    of SDL.MOUSEBUTTONUP:
-      var mbu = sdl.EvMouseButton(eventp)
-      if mouseStartX != 0 and mouseStartY != 0:
-        echo(mouseStartX, "x->", mbu.x)
-        echo(mouseStartY, "y->", mbu.y)
-        surf.drawLineAA((mouseStartX, MouseStartY), 
-          (int(mbu.x), int(mbu.y)), colRed)
-        mouseStartX = 0
-        mouseStartY = 0
-    
+      if mouseStartX == -1 or mouseStartY == -1:
+        mouseStartX = int(mbd.x)
+        mouseStartY = int(mbd.y)
+      else:
+        surf.drawLineAA((mouseStartX, mouseStartY), (int(mbd.x), int(mbd.y)), colPurple)
+        mouseStartX = -1
+        mouseStartY = -1
+        
     of SDL.MouseMotion:
       var mm = sdl.EvMouseMotion(eventp)
-      echo(mm.x, " ", mm.y, " ", mm.yrel)
+      if mouseStartX != -1 and mouseStartY != -1:
+        surf.drawLineAA((mouseStartX, mouseStartY), (int(mm.x), int(mm.y)), colPurple)
+      #echo(mm.x, " ", mm.y, " ", mm.yrel)
     
     else:
       #echo(event.kind)