[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