[macruby-changes] [687] MacRuby/trunk/sample-macruby/HotCocoa

source_changes at macosforge.org source_changes at macosforge.org
Wed Oct 29 22:04:05 PDT 2008


Revision: 687
          http://trac.macosforge.org/projects/ruby/changeset/687
Author:   rich at infoether.com
Date:     2008-10-29 22:04:05 -0700 (Wed, 29 Oct 2008)
Log Message:
-----------
adding graphics tests...but not really tests...

Added Paths:
-----------
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/color.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/drawing.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/hotcocoa.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/image.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/GV.1539.pdf
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-drawing.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-blendmodes.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-colors.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-effects.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-moving.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-iterating.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-particles.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-randomize.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-rope-hair.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-rope-ribbon.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-text-spirograph.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/italy.jpg
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/lightning.jpg
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/testrcg.pdf
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/testrcg.png
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/v2.jpg
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/iterate.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/particle.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/pdf.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/randomize.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/rope.rb
    MacRuby/trunk/sample-macruby/HotCocoa/graphics/text.rb

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/color.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/color.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/color.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,124 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+PRECISION = 0.0000001
+
+class TestHSB < Test::Unit::TestCase
+  
+  def test_hsba
+    
+    # new named color
+    c = Color.blue
+    assert_in_delta(c.hue, 0.6666666, PRECISION)
+    assert_in_delta(c.saturation,1.0, PRECISION)
+    assert_in_delta(c.brightness,1.0, PRECISION)
+    assert_in_delta(c.a,1.0, PRECISION)
+    
+    # new HSBA color
+    c = Color.hsb(0.5,0.4,0.3,0.2)
+    assert_in_delta(c.hue, 0.5, PRECISION)
+    assert_in_delta(c.saturation, 0.4, PRECISION)
+    assert_in_delta(c.brightness, 0.3, PRECISION)
+    assert_in_delta(c.a, 0.2, PRECISION)
+    
+    # new RGBA color
+    c = Color.new(0.5,0.4,0.3,1.0)
+    assert_in_delta(c.hue, 0.08333333, PRECISION)
+    assert_in_delta(c.saturation, 0.3999999, PRECISION)
+    assert_in_delta(c.brightness, 0.5, PRECISION)
+    assert_in_delta(c.a, 1.0, PRECISION)
+    
+    # darken
+    c = Color.blue
+    c.darken(0.1)
+    assert_in_delta(c.hue, 0.6666666, PRECISION)
+    assert_in_delta(c.saturation,1.0, PRECISION)
+    assert_in_delta(c.brightness, 0.8999999, PRECISION)
+    assert_in_delta(c.a,1.0, PRECISION)
+    
+    # lighten
+    c = Color.new(0.5,0.4,0.3,1.0)
+    c.lighten(0.1)
+    assert_in_delta(c.hue, 0.08333333, PRECISION)
+    assert_in_delta(c.saturation, 0.4, PRECISION)
+    assert_in_delta(c.brightness, 0.6, PRECISION)
+    assert_in_delta(c.a, 1.0, PRECISION)
+  
+    # saturate
+    c = Color.new(0.5,0.4,0.3,1.0)
+    c.saturate(0.1)
+    assert_in_delta(c.hue, 0.08333333, PRECISION)
+    assert_in_delta(c.saturation, 0.5, PRECISION)
+    assert_in_delta(c.brightness, 0.5, PRECISION)
+    assert_in_delta(c.a, 1.0, PRECISION)
+    
+    # desaturate
+    c = Color.new(0.5,0.4,0.3,1.0)
+    c.desaturate(0.1)
+    assert_in_delta(c.hue, 0.08333333, PRECISION)
+    assert_in_delta(c.saturation, 0.2999999, PRECISION)
+    assert_in_delta(c.brightness, 0.5, PRECISION)
+    assert_in_delta(c.a, 1.0, PRECISION)
+    
+    # set HSB
+    c.set_hsb(0.5,0.4,0.3,0.2)
+    assert_in_delta(c.hue, 0.5, PRECISION)
+    assert_in_delta(c.saturation, 0.4, PRECISION)
+    assert_in_delta(c.brightness, 0.3, PRECISION)
+    assert_in_delta(c.a, 0.2, PRECISION)
+    
+    # get HSB
+    h,s,b,a = c.get_hsb
+    assert_in_delta(h, 0.5, PRECISION)
+    assert_in_delta(s, 0.4, PRECISION)
+    assert_in_delta(b, 0.3, PRECISION)
+    assert_in_delta(a, 0.2, PRECISION)
+    
+    # adjust HSB
+    c.adjust_hsb(0.1,0.1,0.1,0.1)
+    assert_in_delta(c.hue, 0.6, PRECISION)
+    assert_in_delta(c.saturation, 0.5, PRECISION)
+    assert_in_delta(c.brightness, 0.4, PRECISION)
+    assert_in_delta(c.a, 0.3, PRECISION)
+    
+  end
+  
+  def test_rgba
+    
+    # new named color
+    c = Color.blue
+    assert_in_delta(c.r, 0.0, PRECISION)
+    assert_in_delta(c.g, 0.0, PRECISION)
+    assert_in_delta(c.b, 1.0, PRECISION)
+    assert_in_delta(c.a, 1.0, PRECISION)
+    
+    # new RGBA color
+    c = Color.new(0.5,0.4,0.3,0.2)
+    assert_in_delta(c.r, 0.5, PRECISION)
+    assert_in_delta(c.g, 0.4, PRECISION)
+    assert_in_delta(c.b, 0.3, PRECISION)
+    assert_in_delta(c.a, 0.2, PRECISION)
+
+    # new RGBA color
+    c = Color.rgb(0.5,0.4,0.3,0.2)
+    assert_in_delta(c.r, 0.5, PRECISION)
+    assert_in_delta(c.g, 0.4, PRECISION)
+    assert_in_delta(c.b, 0.3, PRECISION)
+    assert_in_delta(c.a, 0.2, PRECISION)
+
+    # adjust RGBA
+    c.adjust_rgb(0.1,0.1,0.1,0.1)
+    assert_in_delta(c.r, 0.6, PRECISION)
+    assert_in_delta(c.g, 0.5, PRECISION)
+    assert_in_delta(c.b, 0.4, PRECISION)
+    assert_in_delta(c.a, 0.3, PRECISION)
+
+    
+  end
+  
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/color.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/drawing.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/drawing.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/drawing.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,135 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+class TestDrawing < Test::Unit::TestCase
+  
+  def test_save_png
+    c = Canvas.for_image(:size => [400,400], :filename =>'images/test-png.png') do
+      background(Color.white)
+      fill(Color.black)
+      text("Hello PNG!",150,200)
+    end
+    assert(true, c.save)
+    #c.open
+  end
+  
+  def test_save_pdf
+    c = Canvas.for_image(:size => [400,400], :filename =>'images/test-pdf.pdf')
+    c.background(Color.white)
+    c.fill(Color.black)
+    c.text("Hello PDF!",150,200)
+    assert(true, c.save)
+   # c.open
+  end
+  
+  def test_drawing
+    # specify canvas dimensions and output file (pdf, png, tif, gif)
+    File.delete('images/test-drawing.png') if File.exists?('images/test-drawing.png')
+    c = Canvas.for_image(:size => [400,400], :filename =>'images/test-drawing.png') do
+      # set the background fill color
+      background(Color.white)
+      # draw a reference grid
+      cartesian
+
+      # SET CANVAS OPTIONS
+      #translate(200,200)     # set initial drawing point
+      #antialias(false)       # turn off antialiasing for some crazy reason
+      #alpha(0.5)             # set transparency for drawing operations
+      #fill(Color.blue.dark)  # set the fill color
+      #nofill                 # disable fill
+
+      # SET CANVAS LINE STYLE
+      nofill
+      stroke(Color.black)
+      strokewidth(5)
+      linecap(:round)         # render line endings as :round, :butt, or :square 
+      linejoin(:round)        # render line joins as :round, :bevel (flat), or :miter (pointy)
+
+      # DRAW LINES ON CANVAS
+      arc(200,200,50,-45,180)           # an arc of a circle with center x,y with radius, start angle, end angle
+      line(0,0,200,200)                 # a line with start X, start Y, end X, end Y
+      lines([[400,400],[300,400],[200,300],[400,300],[400,400]])  # array of points
+      qcurve(200,200,0,0,400,0)         # a quadratic bezier curve with control point cpx,cpy and endpoints x1,y1,x2,y2
+      curve(200,200,200,400,0,0,0,400)  # a bezier curve with control points cp1x,cp1y,cp2x,cp2y and endpoints x1,y1,x2,y2
+
+      # CONSTRUCT COMPLEX PATHS DIRECTLY ON CANVAS
+      fill(Color.red)                   # set the fill color for the new path
+      autoclosepath(true)               # automatically close the path when calling `endpath`
+      new_path 50, 300 do
+        curveto(150,250,150,200,50,200)
+        lineto(0,250)
+        #moveto(25,250)
+        qcurveto(25,300,50,250)
+        arcto(50,225,100,225,20)
+      end
+
+      # CONSTRUCT A REUSABLE PATH OBJECT
+      p = Path.new
+      p.scale(0.75)
+      p.translate(350,0)
+      p.moveto(50,300)
+      p.curveto(150,250,150,200,50,200)
+      p.lineto(0,250)
+      p.qcurveto(25,300,50,250)
+      #p.moveto(25,250)
+      p.arcto(50,225,100,225,20)
+      p.endpath
+      p.contains(100,250)   # doesn't work?
+      strokewidth(1)
+      fill(Color.orange.darken)
+      draw(p)     # draw it to the canvas
+
+      # CONSTRUCT A PATH WITH SHAPES
+      p2 = Path.new
+      p2.rect(0,0,50,50)
+      p2.oval(-50,-50,50,50)
+      fill(Color.blue)
+      draw(p2,50,100)           # draw the path at x,y (or current point)
+      draw(p2,150,100)          # draw the path at x,y (or current point)
+
+      # GET PATH INFO
+      puts "path bounding box at [#{p.x},#{p.y}] with dimensions #{p.width}x#{p.height}, current point is #{p.currentpoint}"
+
+      # DRAW TEXT
+      # save the previous drawing state (font, colors, position, etc)
+      new_state do
+        font('Times-Bold')
+        fontsize(20)
+        translate(150,350)
+        text("bzzzzt",0,10)
+        # restore the previous drawing state
+      end
+
+      # DRAW GRADIENTS, CLIPPING PATHS
+      new_state do                        # save the previous state
+        translate(300,300)          # move to a new drawing location
+
+        # create gradient
+        g = Gradient.new([Color.yellow,Color.violet.darken.a(0.5),Color.orange])  # create a gradient
+
+        # linear:
+        m = Path.new                  # create a new path to use for clipping
+        m.oval(-50,-50,100,100)       # draw a circle in the path
+        beginclip(m) do                # tell the canvas to use the clipping path
+          gradient(g,0,-50,0,50)      # draw a linear gradient between the two points
+        end                           # tell the canvas to stop using the clipping path
+
+        # radial:
+        translate(0,-200)           # move down a bit
+        beginclip(m) do              # begin clipping again
+          radial(g,0,0,50)          # draw radial gradient starting at x,y using radius
+        end                         # end clipping
+      end                           # restore the previous state
+    end
+    
+
+    # SAVE THE CANVAS TO OUTPUT FILE
+    assert(true,c.save)
+    #assert_equal('', `diff images/test-drawing.png images/fixture-drawing.png`)
+    #c.open
+  end
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/drawing.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/hotcocoa.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/hotcocoa.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/hotcocoa.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,10 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa'
+include HotCocoa
+
+ at table = table_view(
+  :columns => [ 
+    column(:id => :klass, :text => "Class"),
+    column(:id => :ancestors, :text => "Ancestors") 
+  ]  )
\ No newline at end of file

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/image.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/image.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/image.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,332 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+#PRECISION = 0.000000000000001
+PRECISION = 0.0000001
+
+class TestImage < Test::Unit::TestCase
+  
+  def test_image_moving
+    
+    # setup the canvas
+    File.delete('images/test-image-moving.png') if File.exists?('images/test-image-moving.png')
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-image-moving.png')
+    canvas.background(Color.white)
+    canvas.font('Skia')
+    canvas.fontsize(14)
+    canvas.fill(Color.black)
+    canvas.stroke(Color.red)
+
+    # load an image
+    img = Image.new('images/v2.jpg')
+
+    # SCALE (multiply both dimensions by a scaling factor)
+    img.scale(0.2)
+    canvas.draw(img,0,240)  # draw the image at the specified coordinates
+    canvas.text("scale to 20%",0,220)
+
+    # FIT (scale to fit within the given dimensions, maintaining original aspect ratio)
+    img.reset               # first reset the image to its original size
+    img.fit(100,100)
+    canvas.fill(Color.white)
+    canvas.rect(120,240,100,100)
+    canvas.fill(Color.black)
+    canvas.draw(img,133,240)
+    canvas.text("fit into 100x100",120,220)
+
+    # RESIZE (scale to fit exactly within the given dimensions)
+    img.reset
+    img.resize(100,100)
+    canvas.draw(img,240,240)
+    canvas.text("resize to 100x100",240,220)
+
+    # CROP (to the largest square containing image data)
+    img.reset
+    img.scale(0.2).crop
+    canvas.draw(img,0,100)
+    canvas.text("crop max square",0,80)
+
+    # CROP (within a rectangle starting at x,y with width,height)
+    img.reset
+    img.scale(0.3).crop(0,0,100,100)
+    canvas.draw(img,120,100)
+    canvas.text("crop to 100x100",120,80)
+
+    # ROTATE
+    img.origin(:center)
+    img.rotate(45)           
+    canvas.draw(img,300,140)
+    canvas.text("rotate 45 degrees",250,50)
+
+    #img.origin(:center)   # center the image
+    #img.translate(0,-150)    # move the image
+
+    assert(true, canvas.save)
+    assert_equal('', `diff images/test-image-moving.png images/fixture-image-moving.png`)
+    #canvas.open
+  end
+  
+  def test_image_effects
+    # set up the canvas
+    File.delete('images/test-image-effects.png') if File.exists?('images/test-image-effects.png')
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-image-effects.png')
+    canvas.background(Color.white)
+    canvas.font('Skia')
+    canvas.fontsize(14)
+    canvas.fill(Color.black)
+
+    # load image file
+    img = Image.new('images/v2.jpg')
+
+    # set image width/height, starting position, and increment position
+    w,h = [100,100]
+    x,y = [0,290]
+    xoffset = 105
+    yoffset = 130
+
+    # ORIGINAL image, resized to fit within w,h:
+    img.fit(w,h)
+    canvas.draw(img,x,y)
+    canvas.text("original",x,y-15)
+    x += xoffset
+
+    # CRYSTALLIZE: apply a "crystallize" effect with the given radius
+    img.reset.fit(w,h)
+    img.crystallize(5.0)
+    canvas.draw(img,x,y)
+    canvas.text("crystallize",x,y-15)
+    x += xoffset
+
+    # BLOOM: apply a "bloom" effect with the given radius and intensity
+    img.reset.fit(w,h)
+    img.bloom(10, 1.0)
+    canvas.draw(img,x,y)
+    canvas.text("bloom",x,y-15)
+    x += xoffset
+
+    # EDGES: detect edges
+    img.reset.fit(w,h)
+    img.edges(10)
+    canvas.draw(img,x,y)
+    canvas.text("edges",x,y-15)
+    x += xoffset
+
+    # (go to next row)
+    x = 0
+    y -= yoffset
+
+    # POSTERIZE: reduce image to the specified number of colors
+    img.reset.fit(w,h)
+    img.posterize(8)
+    canvas.draw(img,x,y)
+    canvas.text("posterize",x,y-15)
+    x += xoffset
+
+    # TWIRL: rotate around x,y with radius and angle
+    img.reset.fit(w,h)
+    img.twirl(35,50,40,90)
+    canvas.draw(img,x,y)
+    canvas.text("twirl",x,y-15)
+    x += xoffset
+
+    # EDGEWORK: simulate a woodcut print
+    img.reset.fit(w,h)
+    canvas.rect(x,y,img.width,img.height) # needs a black background
+    img.edgework(0.5)
+    canvas.draw(img,x,y)
+    canvas.text("edgework",x,y-15)
+    x += xoffset
+
+    # DISPLACEMENT: use a second image as a displacement map
+    img.reset.fit(w,h)
+    img2 = Image.new('images/italy.jpg').resize(img.width,img.height)
+    img.displacement(img2, 30.0)
+    canvas.draw(img,x,y)
+    canvas.text("displacement",x,y-15)
+    x += xoffset
+
+    # (go to next row)
+    x = 0
+    y -= yoffset
+
+    # DOTSCREEN: simulate a dot screen: center point, angle(0-360), width(1-50), and sharpness(0-1)
+    img.reset.fit(w,h)
+    img.dotscreen(0,0,45,5,0.7)
+    canvas.draw(img,x,y)
+    canvas.text("dotscreen",x,y-15)
+    x += xoffset
+
+    # SHARPEN: sharpen using the given radius and intensity
+    img.reset.fit(w,h)
+    img.sharpen(2.0,2.0)
+    canvas.draw(img,x,y)
+    canvas.text("sharpen",x,y-15)
+    x += xoffset
+
+    # BLUR: apply a gaussian blur with the given radius
+    img.reset.fit(w,h)
+    img.blur(3.0)
+    canvas.draw(img,x,y)
+    canvas.text("blur",x,y-15)
+    x += xoffset
+
+    # MOTION BLUR: apply a motion blur with the given radius and angle
+    img.reset.fit(w,h)
+    img.motionblur(10.0,90)
+    canvas.draw(img,x,y)
+    canvas.text("motion blur",x,y-15)
+    x += xoffset
+
+    # save the canvas
+    assert(true, canvas.save)
+    assert_equal('', `diff images/test-image-effects.png images/fixture-image-effects.png`)
+    #canvas.open
+  end
+  
+  def test_image_colors
+    
+    # set up the canvas
+    File.delete('images/test-image-colors.png') if File.exists?('images/test-image-colors.png')
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-image-colors.png')
+    canvas.background(Color.white)
+    canvas.font('Skia')
+    canvas.fontsize(14)
+    canvas.fill(Color.black)
+
+    # LOAD IMAGE
+    img = Image.new('images/v2.jpg')
+
+    w,h = [100,100]
+    x,y = [0,290]
+    xoffset = 105
+    yoffset = 130
+
+    # ORIGINAL image, resized to fit within w,h:
+    img.fit(w,h)
+    canvas.draw(img,x,y)
+    canvas.text("original",x,y-15)
+    x += xoffset
+
+    # HUE: rotate color wheel by degrees
+    img.reset.fit(w,h)
+    img.hue(45)
+    canvas.draw(img,x,y)
+    canvas.text("hue",x,y-15)
+    x += xoffset
+    
+    # EXPOSURE: increase/decrease exposure by f-stops
+    img.reset.fit(w,h)
+    img.exposure(1.0)
+    canvas.draw(img,x,y)
+    canvas.text("exposure",x,y-15)
+    x += xoffset
+    
+    # SATURATION: adjust saturation by multiplier
+    img.reset.fit(w,h)
+    img.saturation(2.0)
+    canvas.draw(img,x,y)
+    canvas.text("saturation",x,y-15)
+    x += xoffset
+    
+    # (go to next row)
+    x = 0
+    y -= yoffset
+    
+    # CONTRAST: adjust contrast by multiplier
+    img.reset.fit(w,h)
+    img.contrast(2.0)
+    canvas.draw(img,x,y)
+    canvas.text("contrast",x,y-15)
+    x += xoffset
+    
+    # BRIGHTNESS: adjust brightness
+    img.reset.fit(w,h)
+    img.brightness(0.5)
+    canvas.draw(img,x,y)
+    canvas.text("brightness",x,y-15)
+    x += xoffset
+    
+    # MONOCHROME: convert to a monochrome image
+    img.reset.fit(w,h)
+    img.monochrome(Color.orange)
+    canvas.draw(img,x,y)
+    canvas.text("monochrome",x,y-15)
+    x += xoffset
+    
+    # WHITEPOINT: remap the white point
+    img.reset.fit(w,h)
+    img.whitepoint(Color.whiteish)
+    canvas.draw(img,x,y)
+    canvas.text("white point",x,y-15)
+    x += xoffset
+    
+    # (go to next row)
+    x = 0
+    y -= yoffset
+    
+    # CHAINING: apply multiple effects at once
+    img.reset.fit(w,h)
+    img.hue(60).saturation(2.0).contrast(2.5)
+    canvas.draw(img,x,y)
+    canvas.text("multi effects",x,y-15)
+    x += xoffset
+    
+    # COLORS: sample random colors from the image and render as a gradient
+    img.reset.fit(w,h)              # reset the image and scale to fit within w,h
+    colors = img.colors(10).sort!   # select 10 random colors and sort by brightness
+    # gradient
+    gradient = Gradient.new(colors) # create a new gradient using the selected colors
+    rect = Path.new.rect(x,y,img.width,img.height) # create a rectangle the size of the image
+    canvas.beginclip(rect)          # begin clipping so the gradient will only fill the rectangle
+    canvas.gradient(gradient,x,y,x+img.width,y+img.height) # draw the gradient between opposite corners of the rectangle
+    canvas.endclip                  # end clipping so we can draw on the rest of the canvas
+    canvas.text("get colors",x,y-15)    # add text label
+    x += xoffset
+
+    assert(true, canvas.save)
+    # hmm, can't use an image fixture if we're doing randomized things
+    # assert_equal('', `diff images/test-image-colors.png images/fixture-image-colors.png`)
+  end
+  
+  def test_image_blendmodes
+    
+    canvas = Canvas.for_image(:size => [400,730], :filename => 'images/test-image-blendmodes.png')
+    canvas.background(Color.white)
+    canvas.font('Skia')
+    canvas.fontsize(14)
+
+    # set image width,height
+    w,h = [95,95]
+
+    # set initial drawing position
+    x,y = [0,canvas.height - h - 10]
+
+    # load and resize two images
+    imgA = Image.new('images/v2.jpg').resize(w,h)
+    imgB = Image.new('images/italy.jpg').resize(w,h)
+
+    # add image B to image A using each blending mode, and draw to canvas
+    [:normal,:multiply,:screen,:overlay,:darken,:lighten,
+      :colordodge,:colorburn,:softlight,:hardlight,:difference,:exclusion,
+      :hue,:saturation,:color,:luminosity,:maximum,:minimum,:add,:atop,
+      :in,:out,:over].each do |blendmode|
+      imgA.reset.resize(w,h)
+      imgA.blend(imgB, blendmode)
+      canvas.draw(imgA,x,y)
+      canvas.text(blendmode,x,y-15)
+      x += w + 5
+      if (x > canvas.width - w + 5)
+        x = 0
+        y -= h + 25
+      end
+    end
+    canvas.save
+    
+  end
+  
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/image.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/GV.1539.pdf
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/GV.1539.pdf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-drawing.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-drawing.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-blendmodes.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-blendmodes.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-colors.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-colors.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-effects.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-effects.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-moving.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-image-moving.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-iterating.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-iterating.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-particles.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-particles.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-randomize.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-randomize.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-rope-hair.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-rope-hair.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-rope-ribbon.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-rope-ribbon.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-text-spirograph.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/fixture-text-spirograph.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/italy.jpg
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/italy.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/lightning.jpg
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/lightning.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/testrcg.pdf
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/testrcg.pdf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/testrcg.png
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/testrcg.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/v2.jpg
===================================================================
(Binary files differ)


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/images/v2.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/iterate.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/iterate.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/iterate.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,45 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+class TestIterate < Test::Unit::TestCase
+  
+  def test_iterate
+
+    # create a new 400×400 pixel canvas to draw on
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-iterating.png') do
+      background(Color.white)
+
+      # create a petal shape with base at (0,0), size 40×150, and bulge at 30px
+      shape = Path.new
+      shape.petal(0,0,40,150,30)
+      # add a circle
+      shape.oval(-10,20,20,20)
+      # color it red
+      shape.fill(Color.red)
+
+      # increment shape parameters by the specified amount each iteration,
+      # or by a random value selected from the specified range
+      shape.increment(:rotation, 5.0)
+      #shape.increment(:scale, 0.95)
+      shape.increment(:scalex, 0.99)
+      shape.increment(:scaley, 0.96)
+      shape.increment(:x, 10.0)
+      shape.increment(:y, 12.0)
+      shape.increment(:hue,-0.02..0.02)
+      shape.increment(:saturation, -0.1..0.1)
+      shape.increment(:brightness, -0.1..0.1)
+      shape.increment(:alpha, -0.1..0.1)
+
+      # draw 200 petals on the canvas starting at location 50,200
+      translate(50,220)
+      draw(shape,0,0,200)
+      save
+    end
+    
+  end
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/iterate.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/particle.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/particle.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/particle.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,76 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+include Math
+
+class TestParticle < Test::Unit::TestCase
+  
+  def test_particle
+
+    # initialize canvas
+    canvas = Canvas.for_image(:size => [1920,1200], :filename => 'images/test-particles.png')
+    canvas.background(Color.black)
+
+    # load images and grab colors
+    img = Image.new('images/italy.jpg').saturation(1.9)
+    redcolors = img.colors(100)
+    img = Image.new('images/v2.jpg').saturation(1.9)
+    bluecolors = img.colors(100)
+
+    # create flower head shape
+    head = Path.new.oval(0,0,10,10,:center)
+    petals = 3
+    petals.times do
+      head.rotate(360/petals)
+      head.oval(0,10,5,5,:center)
+      head.oval(0,17,2,2,:center)
+    end
+    # randomize head attributes
+    head.randomize(:fill,redcolors)
+    head.randomize(:stroke,bluecolors)
+    head.randomize(:scale,0.2..2.0)
+    head.randomize(:rotation,0..360)
+
+    # create particles
+    numparticles = 200
+    numframes = 200
+    particles = []
+    numparticles.times do |i|
+      # start particle at random point at bottom of canvas
+      x = random(canvas.width/2 - 50,canvas.width/2 + 50)
+      p = Particle.new(x,0)
+      p.velocity_x = random(-0.5,0.5)   # set initial x velocity
+      p.velocity_y = random(1.0,3.0)    # set initial y velocity
+      p.acceleration = 0.1            # set drag or acceleration
+      particles[i] = p          # add particle to array
+    end
+
+    # animate particles
+    numframes.times do |frame|
+      numparticles.times do |i|
+        particles[i].move
+      end
+    end
+
+    # draw particle trails and heads
+    numparticles.times do |i|
+      canvas.push
+      # choose a stem color
+      color = choose(bluecolors).a(0.7).analog(20,0.7)
+      canvas.stroke(color)
+      canvas.strokewidth(random(0.5,2.0))
+      # draw the particle
+      particles[i].draw(canvas)
+      # go to the last particle position and draw the flower head
+      canvas.translate(particles[i].points[-1][0],particles[i].points[-1][1])
+      canvas.draw(head)
+      canvas.pop
+    end
+
+    canvas.save   
+  end
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/particle.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/pdf.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/pdf.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/pdf.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,48 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+class TestPdf < Test::Unit::TestCase
+  
+  # def test_pdf
+  #   pdf_to_png('/Volumes/catalog/inprocess/GV/lookinsides/GV.1505.pdf','/Volumes/catalog/inprocess/GV/converted')
+   # end
+  #Mon Jul 28 19:53:55 toastmacbook-3.local macruby[16693] <Error>: CGBitmapContextCreateImage: failed to allocate 144365952 bytes.
+  #Mon Jul 28 19:53:55 toastmacbook-3.local macruby[16693] <Error>: CGImageCreate: invalid image provider: NULL.
+  
+  def test_parse_dir
+    scale = 3.0
+    sourcedir = '/Volumes/catalog/inprocess/GV/lookinsides'
+    destdir = '/Volumes/catalog/inprocess/GV/converted'
+    for file in Dir.entries(sourcedir)
+      next unless File.extname(file).downcase == '.pdf'
+      pdf_to_png(File.join(sourcedir,file),destdir,scale)
+    end
+  end
+  
+end
+
+def pdf_to_png(file,destdir,scale=3.0)
+  puts file
+  newfilename = File.basename(file, File.extname(file))
+  newfilename, pagenum = newfilename.split('_')
+  pagenum ||= 0
+  pagenum = sprintf("%02d", pagenum)
+  pdf = Pdf.new(file)
+  pages = pdf.pages
+  w = pdf.width * scale
+  h = pdf.height * scale
+  for p in 1..pages do
+    pdisplay = sprintf("%02d", p)
+    canvas = Canvas.for_image(:size => [400,400], :filename => "#{destdir}/#{newfilename}_#{pagenum}-#{pdisplay}.png")
+    canvas.background(Color.white)
+    canvas.draw(pdf,0,0,w,h,p)
+    canvas.save
+    canvas = nil
+    GC.start
+  end
+
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/pdf.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/randomize.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/randomize.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/randomize.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,46 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+class TestRandomize < Test::Unit::TestCase
+  
+  def test_randomize
+
+    # create a new 400×400 pixel canvas to draw on
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-randomize.png')
+    canvas.background(Color.white)
+
+    # create a flower shape
+    shape = Path.new
+    petals = 5
+    for i in 1..petals do
+      shape.petal(0,0,40,100)       # petal at x,y with width,height
+      shape.rotate(360 / petals)    # rotate by 1/5th
+    end
+
+    # randomize shape parameters
+    shape.randomize(:fill, Color.blue.complementary)
+    shape.randomize(:stroke, Color.blue.complementary)
+    shape.randomize(:strokewidth, 1.0..10.0)
+    shape.randomize(:rotation, 0..360)
+    shape.randomize(:scale, 0.5..1.0)
+    shape.randomize(:scalex, 0.5..1.0)
+    shape.randomize(:scaley, 0.5..1.0)
+    shape.randomize(:alpha, 0.5..1.0)
+    # shape.randomize(:hue, 0.5..0.8)
+    shape.randomize(:saturation, 0.0..1.0)
+    shape.randomize(:brightness, 0.0..1.0)
+    shape.randomize(:x, -100.0..100.0)
+    shape.randomize(:y, -100.0..100.0)
+
+    # draw 50 flowers starting at the center of the canvas
+    canvas.translate(200,200)
+    canvas.draw(shape,0,0,100)
+    canvas.save
+    
+  end
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/randomize.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/rope.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/rope.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/rope.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,81 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+class TestRope < Test::Unit::TestCase
+  
+  def test_rope_hair
+
+    # initialize the canvas
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-rope-hair.png')
+
+    # choose a random color and set the background to a darker variant
+    clr = Color.random.a(0.5)
+    canvas.background(clr.copy.darken(0.6))
+
+    # create a new rope with 200 fibers
+    rope = Rope.new(canvas, :width => 100, :fibers => 200, :strokewidth => 0.4, :roundness => 3.0)
+
+    # randomly rotate the canvas from its center
+    canvas.translate(canvas.width/2,canvas.height/2)
+    canvas.rotate(random(0,360))
+    canvas.translate(-canvas.width/2,-canvas.height/2)
+
+    # draw 20 ropes
+    ropes = 20
+    ropes.times do
+      canvas.stroke(clr.copy.analog(20, 0.8))   # rotate hue up to 20 deg left/right, vary brightness/saturation by up to 70%
+      rope.x0 = -100                            # start rope off bottom left of canvas
+      rope.y0 = -100
+      rope.x1 = canvas.width + 100              # end rope off top right of canvas
+      rope.y1 = canvas.height + 100
+      rope.hair                                 # draw rope in organic “hair” style
+    end
+
+    # save the canvas
+    canvas.save
+    
+  end
+  
+  
+  def test_rope_ribbon
+    
+    # initialize the canvas
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-rope-ribbon.png')
+
+    # choose a random color and set the background to a darker variant
+    clr = Color.random.a(0.5)
+    canvas.background(clr.copy.darken(0.6))
+
+    # create a new rope with 200 fibers
+    rope = Rope.new(canvas, :width => 500, :fibers => 200, :strokewidth => 1.0, :roundness => 1.5)
+
+    # randomly rotate the canvas from its center
+    canvas.translate(canvas.width/2,canvas.height/2)
+    canvas.rotate(random(0,360))
+    canvas.translate(-canvas.width/2,-canvas.height/2)
+
+    # draw 20 ropes
+    ropes = 20
+    for i in 0..ropes do
+        canvas.stroke(clr.copy.analog(10, 0.7))   # rotate hue up to 10 deg left/right, vary brightness/saturation by up to 70%
+        rope.x0 = -100                            # start rope off bottom left of canvas
+        rope.y0 = -100
+        rope.x1 = canvas.width + 200              # end rope off top right of canvas
+        rope.y1 = canvas.height + 200
+        rope.ribbon                               # draw rope in smooth “ribbon” style
+    end
+
+    # save the canvas
+    canvas.save
+    
+  end
+  
+  
+  
+  
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/rope.rb
___________________________________________________________________
Added: svn:executable
   + *

Added: MacRuby/trunk/sample-macruby/HotCocoa/graphics/text.rb
===================================================================
--- MacRuby/trunk/sample-macruby/HotCocoa/graphics/text.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/HotCocoa/graphics/text.rb	2008-10-30 05:04:05 UTC (rev 687)
@@ -0,0 +1,37 @@
+#!/usr/bin/env macruby
+
+require 'hotcocoa/graphics'
+require 'test/unit'
+include HotCocoa::Graphics
+
+
+class TestText < Test::Unit::TestCase
+  
+  def test_text_spirograph
+    
+    # set up the canvas and font
+    canvas = Canvas.for_image(:size => [400,400], :filename => 'images/test-text-spirograph.png') do
+      background(Color.beige)
+      fill(Color.black)
+      font('Book Antiqua')
+      fontsize(12)
+      translate(200,200)
+
+      # rotate, draw text, repeat
+      180.times do |frame|
+        new_state do
+          rotate((frame*2) + 120)
+          translate(70,0)
+          text('going...', 80, 0)
+          rotate(frame * 6)
+          text('Around and', 20, 0)
+        end
+      end
+    end
+
+    # save the canvas
+    canvas.save
+    
+  end
+  
+end
\ No newline at end of file


Property changes on: MacRuby/trunk/sample-macruby/HotCocoa/graphics/text.rb
___________________________________________________________________
Added: svn:executable
   + *
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081029/dd6ef186/attachment-0001.html>


More information about the macruby-changes mailing list