From dab544a53b18452c6c0bbe326f2eb5d8ab50bbd5 Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Thu, 30 Apr 2015 11:48:21 -0400 Subject: [PATCH] Add ellipse method Also experimenting with using stroke_preserve, which in turn may make the other methods less repetitive. Closes #66 --- CHANGELOG.md | 1 + lib/squib/api/shapes.rb | 28 ++++++++++++++++++++ lib/squib/graphics/cairo_context_wrapper.rb | 3 ++- lib/squib/graphics/shapes.rb | 28 ++++++++++++++++++++ samples/draw_shapes.rb | 5 ++++ spec/data/samples/draw_shapes.rb.txt | 16 +++++++++++ spec/samples/expected/shape_00.png | Bin 22512 -> 26295 bytes spec/spec_helper.rb | 2 +- 8 files changed, 81 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 792814e..431bb43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Features: * Added `data` field to `svg` to allow for manipulating SVG XML data directly. Works nicely with my new `game_icons` [gem](https://github.com/andymeneely/game_icons) (#65) * Added `stroke_width` and `stroke_color` to the `text` method to outlines text. (#51) * Upgraded roo (Excel parsing) to 2.0.0. Nothing major for Squib users, just keeping up with the times. +* Added an `ellipse` method to (you guessed it) draw ellipses. See the draw_shapes.rb sample (#66) Bugs: * Fixed global text hinting (#63) diff --git a/lib/squib/api/shapes.rb b/lib/squib/api/shapes.rb index 7f4051e..3b786f7 100644 --- a/lib/squib/api/shapes.rb +++ b/lib/squib/api/shapes.rb @@ -59,6 +59,34 @@ module Squib end end + # Draw an ellipse + # + # @example + # ellipse x: 0, y: 0, width: 825, height: 1125 + # + # Options support Arrays, see {file:README.md#Arrays_and_Singleton_Expansion Arrays and Singleon Expansion} + # + # @option opts range [Enumerable, :all] (:all) the range of cards over which this will be rendered. See {file:README.md#Specifying_Ranges Specifying Ranges} + # @option opts x [Integer] (0) the x-coordinate to place. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts y [Integer] (0) the y-coordinate to place. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts width [Integer] the width of the rectangle. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts height [Integer] the height of the rectangle. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts fill_color [String] ('#0000') the color with which to fill the rectangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} + # @option opts stroke_color [String] (:black) the color with which to stroke the outside of the rectangle. {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} + # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} + # @return [nil] intended to be void + # @api public + def ellipse(opts = {}) + opts = needs(opts, [:range, :x, :y, :width, :height, + :fill_color, :stroke_color, :stroke_width, :layout]) + opts[:range].each do |i| + @cards[i].ellipse(opts[:x][i], opts[:y][i], opts[:width][i], opts[:height][i], + opts[:fill_color][i], opts[:stroke_color][i], + opts[:stroke_width][i]) + end + end + # Draw a triangle using the given coordinates # # @example diff --git a/lib/squib/graphics/cairo_context_wrapper.rb b/lib/squib/graphics/cairo_context_wrapper.rb index 939a9d0..f5c26ba 100644 --- a/lib/squib/graphics/cairo_context_wrapper.rb +++ b/lib/squib/graphics/cairo_context_wrapper.rb @@ -22,7 +22,8 @@ module Squib :show_pango_layout, :rounded_rectangle, :set_line_width, :stroke, :fill, :set_source, :scale, :render_rsvg_handle, :circle, :triangle, :line_to, :operator=, :show_page, :clip, :transform, :mask, :create_pango_layout, - :antialias=, :curve_to, :matrix, :matrix=, :identity_matrix, :pango_layout_path + :antialias=, :curve_to, :matrix, :matrix=, :identity_matrix, :pango_layout_path, + :stroke_preserve # :nodoc: # @api private diff --git a/lib/squib/graphics/shapes.rb b/lib/squib/graphics/shapes.rb index 115f7c5..1d6b68a 100644 --- a/lib/squib/graphics/shapes.rb +++ b/lib/squib/graphics/shapes.rb @@ -32,6 +32,34 @@ module Squib end end + # Ellipse drawing taken from looking at the control points in Inkscape + # Think of it like a rectangle. Curves go from mid-points of the sides + # of the rectangle. Control points are at 1/4 and 3/4 of the side. + # :nodoc: + # @api private + def ellipse(x, y, w, h, fill_color, stroke_color, stroke_width) + use_cairo do |cc| + cc.move_to(x, y + 0.5*h) # start west + cc.curve_to(x, y + 0.25*h, # west to north + x + 0.25*w, y, + x + 0.5*w, y) + cc.curve_to(x + 0.75*w, y, # north to east + x + w, y + 0.25*h, + x + w, y + 0.5*h) + cc.curve_to(x + w, y + 0.75*h, # east to south + x + 0.75*w, y + h, + x + 0.5*w, y + h) + cc.curve_to(x + 0.25*w, y + h, # south to west + x, y + 0.75*h, + x, y + 0.5*h) + cc.set_source_squibcolor(stroke_color) + cc.set_line_width(stroke_width) + cc.stroke_preserve + cc.set_source_squibcolor(fill_color) + cc.fill + end + end + # :nodoc: # @api private def triangle(x1, y1, x2, y2, x3, y3, fill_color, stroke_color, stroke_width) diff --git a/samples/draw_shapes.rb b/samples/draw_shapes.rb index 186d9b2..31fcb36 100644 --- a/samples/draw_shapes.rb +++ b/samples/draw_shapes.rb @@ -1,6 +1,7 @@ require 'squib' Squib::Deck.new do + background color: :white rect x: 300, y: 300, width: 400, height: 400, fill_color: :blue, stroke_color: :red, stroke_width: 50.0 @@ -20,5 +21,9 @@ Squib::Deck.new do stroke_width: 12.0, stroke_color: :cyan, fill_color: :burgundy + ellipse x: 50, y: 925, width: 200, height: 100, + stroke_width: 5.0, stroke_color: :cyan, + fill_color: :burgundy + save_png prefix: 'shape_' end diff --git a/spec/data/samples/draw_shapes.rb.txt b/spec/data/samples/draw_shapes.rb.txt index d845106..aed053b 100644 --- a/spec/data/samples/draw_shapes.rb.txt +++ b/spec/data/samples/draw_shapes.rb.txt @@ -1,5 +1,9 @@ cairo: antialias=(["subpixel"]) cairo: save([]) +cairo: set_source_color([:white]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) cairo: rounded_rectangle([300, 300, 400, 400, 0, 0]) cairo: set_source_color([:red]) cairo: set_line_width([50.0]) @@ -45,4 +49,16 @@ cairo: curve_to([150, 700, 150, 700, 625, 900]) cairo: set_source_color([:burgundy]) cairo: fill([]) cairo: restore([]) +cairo: save([]) +cairo: move_to([50, 975.0]) +cairo: curve_to([50, 950.0, 100.0, 925, 150.0, 925]) +cairo: curve_to([200.0, 925, 250, 950.0, 250, 975.0]) +cairo: curve_to([250, 1000.0, 200.0, 1025, 150.0, 1025]) +cairo: curve_to([100.0, 1025, 50, 1000.0, 50, 975.0]) +cairo: set_source_color([:cyan]) +cairo: set_line_width([5.0]) +cairo: stroke_preserve([]) +cairo: set_source_color([:burgundy]) +cairo: fill([]) +cairo: restore([]) surface: write_to_png(["_output/shape_00.png"]) diff --git a/spec/samples/expected/shape_00.png b/spec/samples/expected/shape_00.png index da0bf1b555d4ddb1cb6f7de6da24fd2587524790..fc317e4ab6dae25b54f7f69a1b755f5c9a8c4603 100644 GIT binary patch literal 26295 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 literal 22512 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 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d390ac1..2d98218 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -102,7 +102,7 @@ def mock_cairo(strio) update_pango_layout width height show_pango_layout rounded_rectangle set_line_width stroke fill set_source scale render_rsvg_handle circle triangle line_to operator= show_page clip transform mask rectangle - reset_clip antialias= curve_to matrix= pango_layout_path).each do |m| + reset_clip antialias= curve_to matrix= pango_layout_path stroke_preserve).each do |m| allow(cxt).to receive(m) { |*args| strio << scrub_hex("cairo: #{m}(#{args})\n") } end