Class: Geometry
- Inherits:
-
Object
- Object
- Geometry
- Defined in:
- lib/geometry.rb
Overview
This Geometry class was yanked from RMagick. However, it lets ImageMagick handle the actual change_geometry. Use #new_dimensions_for to get new dimensons Used so I can use spiffy RMagick geometry strings with ImageScience
Constant Summary collapse
- FLAGS =
! and @ are removed until support for them is added
['', '%', '<', '>']
- RFLAGS =
{ '%' => :percent, '!' => :aspect, '<' => :>, '>' => :<, '@' => :area }
- RE =
Construct an object from a geometry string
/\A(\d*)(?:x(\d+))?([-+]\d+)?([-+]\d+)?([%!<>@]?)\Z/
Instance Attribute Summary collapse
-
#flag ⇒ Object
Returns the value of attribute flag.
-
#height ⇒ Object
Returns the value of attribute height.
-
#width ⇒ Object
Returns the value of attribute width.
-
#x ⇒ Object
Returns the value of attribute x.
-
#y ⇒ Object
Returns the value of attribute y.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(width = nil, height = nil, x = nil, y = nil, flag = nil) ⇒ Geometry
constructor
A new instance of Geometry.
-
#new_dimensions_for(orig_width, orig_height) ⇒ Object
attempts to get new dimensions for the current geometry string given these old dimensions.
-
#to_s ⇒ Object
Convert object to a geometry string.
Constructor Details
#initialize(width = nil, height = nil, x = nil, y = nil, flag = nil) ⇒ Geometry
Returns a new instance of Geometry.
15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/geometry.rb', line 15 def initialize(width=nil, height=nil, x=nil, y=nil, flag=nil) # Support floating-point width and height arguments so Geometry # objects can be used to specify Image#density= arguments. raise ArgumentError, "width must be >= 0: #{width}" if width < 0 raise ArgumentError, "height must be >= 0: #{height}" if height < 0 @width = width.to_f @height = height.to_f @x = x.to_i @y = y.to_i @flag = flag end |
Instance Attribute Details
#flag ⇒ Object
Returns the value of attribute flag.
13 14 15 |
# File 'lib/geometry.rb', line 13 def flag @flag end |
#height ⇒ Object
Returns the value of attribute height.
13 14 15 |
# File 'lib/geometry.rb', line 13 def height @height end |
#width ⇒ Object
Returns the value of attribute width.
13 14 15 |
# File 'lib/geometry.rb', line 13 def width @width end |
#x ⇒ Object
Returns the value of attribute x.
13 14 15 |
# File 'lib/geometry.rb', line 13 def x @x end |
#y ⇒ Object
Returns the value of attribute y.
13 14 15 |
# File 'lib/geometry.rb', line 13 def y @y end |
Class Method Details
.from_s(str) ⇒ Object
30 31 32 33 34 35 36 37 38 |
# File 'lib/geometry.rb', line 30 def self.from_s(str) raise(ArgumentError, "no geometry string specified") unless str if m = RE.match(str) new(m[1].to_i, m[2].to_i, m[3].to_i, m[4].to_i, RFLAGS[m[5]]) else raise ArgumentError, "invalid geometry format" end end |
Instance Method Details
#new_dimensions_for(orig_width, orig_height) ⇒ Object
attempts to get new dimensions for the current geometry string given these old dimensions. This doesn’t implement the aspect flag (!) or the area flag (@). PDI
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/geometry.rb', line 52 def new_dimensions_for(orig_width, orig_height) new_width = orig_width new_height = orig_height case @flag when :percent scale_x = @width.zero? ? 100 : @width scale_y = @height.zero? ? @width : @height new_width = scale_x.to_f * (orig_width.to_f / 100.0) new_height = scale_y.to_f * (orig_height.to_f / 100.0) when :<, :>, nil scale_factor = if new_width.zero? || new_height.zero? 1.0 else if @width.nonzero? && @height.nonzero? [@width.to_f / new_width.to_f, @height.to_f / new_height.to_f].min else @width.nonzero? ? (@width.to_f / new_width.to_f) : (@height.to_f / new_height.to_f) end end new_width = scale_factor * new_width.to_f new_height = scale_factor * new_height.to_f new_width = orig_width if @flag && orig_width.send(@flag, new_width) new_height = orig_height if @flag && orig_height.send(@flag, new_height) end [new_width, new_height].collect! { |v| v.round } end |
#to_s ⇒ Object
Convert object to a geometry string
41 42 43 44 45 46 47 48 |
# File 'lib/geometry.rb', line 41 def to_s str = '' str << "%g" % @width if @width > 0 str << 'x' if (@width > 0 || @height > 0) str << "%g" % @height if @height > 0 str << "%+d%+d" % [@x, @y] if (@x != 0 || @y != 0) str << FLAGS[@flag.to_i] end |