Class: Magick::Geometry

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

Constant Summary collapse

FLAGS =
['', '%', '!', '<', '>', '@', '^']
RFLAGS =
{ '%' => PercentGeometry,
'!' => AspectGeometry,
'<' => LessGeometry,
'>' => GreaterGeometry,
'@' => AreaGeometry,
'^' => MinimumGeometry }
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.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/rmagick_internal.rb', line 65

def initialize(width=nil, height=nil, x=nil, y=nil, flag=nil)
  fail(ArgumentError, "width set to #{width}") if width.is_a? GeometryValue
    fail(ArgumentError, "height set to #{height}") if height.is_a? GeometryValue
    fail(ArgumentError, "x set to #{x}") if x.is_a? GeometryValue
    fail(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.



63
64
65
# File 'lib/rmagick_internal.rb', line 63

def flag
  @flag
end

#heightObject

Returns the value of attribute height.



63
64
65
# File 'lib/rmagick_internal.rb', line 63

def height
  @height
end

#widthObject

Returns the value of attribute width.



63
64
65
# File 'lib/rmagick_internal.rb', line 63

def width
  @width
end

#xObject

Returns the value of attribute x.



63
64
65
# File 'lib/rmagick_internal.rb', line 63

def x
  @x
end

#yObject

Returns the value of attribute y.



63
64
65
# File 'lib/rmagick_internal.rb', line 63

def y
  @y
end

Class Method Details

.from_s(str) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/rmagick_internal.rb', line 100

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
    if str['%']
      flag = PercentGeometry
    end
    Geometry.new(width, height, x, y, flag)
end

Instance Method Details

#to_sObject

Convert object to a geometry string



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/rmagick_internal.rb', line 118

def to_s
  str = ''
    if @width > 0
      fmt = @width.truncate == @width ? '%d' : '%.2f'
      str << sprintf(fmt, @width)
      str << '%' if @flag == PercentGeometry
    end
    
    if (@width > 0 && @flag != PercentGeometry) || (@height > 0)
      str << 'x'
    end
    
    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
    if @flag != PercentGeometry
      str << FLAGS[@flag.to_i]
    end
    str
end