Class: Magick::Geometry

Inherits:
Object
  • Object
show all
Defined in:
lib/rmagick_internal.rb

Constant Summary collapse

FLAGS =
['', '%', '!', '<', '>', '@', '^'].freeze
RFLAGS =
{
  '%' => PercentGeometry,
  '!' => AspectGeometry,
  '<' => LessGeometry,
  '>' => GreaterGeometry,
  '@' => AreaGeometry,
  '^' => MinimumGeometry
}.freeze
W =

Construct an object from a geometry string

/(\d+\.\d+%?)|(\d*%?)/
H =
W
X =
/(?:([-+]\d+))?/
Y =
X
RE =
/\A#{W}x?#{H}#{X}#{Y}([!<>@\^]?)\Z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(width = nil, height = nil, x = nil, y = nil, flag = nil) ⇒ Geometry

Returns a new instance of Geometry.

Raises:

  • (ArgumentError)


88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/rmagick_internal.rb', line 88

def initialize(width = nil, height = nil, x = nil, y = nil, flag = nil)
  raise(ArgumentError, "width set to #{width}") if width.is_a? GeometryValue
  raise(ArgumentError, "height set to #{height}") if height.is_a? GeometryValue
  raise(ArgumentError, "x set to #{x}") if x.is_a? GeometryValue
  raise(ArgumentError, "y set to #{y}") if y.is_a? GeometryValue

  # Support floating-point width and height arguments so Geometry
  # objects can be used to specify Image#density= arguments.
  if width.nil?
    @width = 0
  elsif width.to_f >= 0.0
    @width = width.to_f
  else
    Kernel.raise ArgumentError, "width must be >= 0: #{width}"
  end
  if height.nil?
    @height = 0
  elsif height.to_f >= 0.0
    @height = height.to_f
  else
    Kernel.raise ArgumentError, "height must be >= 0: #{height}"
  end

  @x    = x.to_i
  @y    = y.to_i
  @flag = flag
end

Instance Attribute Details

#flagObject

Returns the value of attribute flag.



86
87
88
# File 'lib/rmagick_internal.rb', line 86

def flag
  @flag
end

#heightObject

Returns the value of attribute height.



86
87
88
# File 'lib/rmagick_internal.rb', line 86

def height
  @height
end

#widthObject

Returns the value of attribute width.



86
87
88
# File 'lib/rmagick_internal.rb', line 86

def width
  @width
end

#xObject

Returns the value of attribute x.



86
87
88
# File 'lib/rmagick_internal.rb', line 86

def x
  @x
end

#yObject

Returns the value of attribute y.



86
87
88
# File 'lib/rmagick_internal.rb', line 86

def y
  @y
end

Class Method Details

.from_s(str) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/rmagick_internal.rb', line 123

def self.from_s(str)
  m = RE.match(str)
  if m
    width  = (m[1] || m[2]).to_f
    height = (m[3] || m[4]).to_f
    x      = m[5].to_i
    y      = m[6].to_i
    flag   = RFLAGS[m[7]]
  else
    Kernel.raise ArgumentError, 'invalid geometry format'
  end
  flag = PercentGeometry if str['%']
  Geometry.new(width, height, x, y, flag)
end

Instance Method Details

#to_sObject

Convert object to a geometry string



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/rmagick_internal.rb', line 139

def to_s
  str = +''
  if @width > 0
    fmt = @width.truncate == @width ? '%d' : '%.2f'
    str << sprintf(fmt, @width)
    str << '%' if @flag == PercentGeometry
  end

  str << 'x' if (@width > 0 && @flag != PercentGeometry) || (@height > 0)

  if @height > 0
    fmt = @height.truncate == @height ? '%d' : '%.2f'
    str << sprintf(fmt, @height)
    str << '%' if @flag == PercentGeometry
  end
  str << sprintf('%+d%+d', @x, @y) if @x != 0 || @y != 0
  str << FLAGS[@flag.to_i] if @flag != PercentGeometry
  str
end