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.



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

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.



66
67
68
# File 'lib/rmagick_internal.rb', line 66

def flag
  @flag
end

#heightObject

Returns the value of attribute height.



66
67
68
# File 'lib/rmagick_internal.rb', line 66

def height
  @height
end

#widthObject

Returns the value of attribute width.



66
67
68
# File 'lib/rmagick_internal.rb', line 66

def width
  @width
end

#xObject

Returns the value of attribute x.



66
67
68
# File 'lib/rmagick_internal.rb', line 66

def x
  @x
end

#yObject

Returns the value of attribute y.



66
67
68
# File 'lib/rmagick_internal.rb', line 66

def y
  @y
end

Class Method Details

.from_s(str) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/rmagick_internal.rb', line 103

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



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

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