chunky_png 1.0.0.beta2 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/.infinity_test +1 -1
  2. data/README.rdoc +2 -2
  3. data/chunky_png.gemspec +4 -4
  4. data/lib/chunky_png.rb +14 -8
  5. data/lib/chunky_png/canvas.rb +110 -38
  6. data/lib/chunky_png/canvas/drawing.rb +175 -34
  7. data/lib/chunky_png/canvas/masking.rb +91 -0
  8. data/lib/chunky_png/canvas/operations.rb +141 -112
  9. data/lib/chunky_png/canvas/png_decoding.rb +13 -13
  10. data/lib/chunky_png/canvas/resampling.rb +42 -0
  11. data/lib/chunky_png/color.rb +252 -11
  12. data/lib/chunky_png/compatibility.rb +5 -5
  13. data/lib/chunky_png/dimension.rb +106 -0
  14. data/lib/chunky_png/point.rb +110 -0
  15. data/lib/chunky_png/vector.rb +92 -0
  16. data/spec/chunky_png/canvas/drawing_spec.rb +107 -14
  17. data/spec/chunky_png/canvas/masking_spec.rb +51 -0
  18. data/spec/chunky_png/canvas/operations_spec.rb +142 -75
  19. data/spec/chunky_png/canvas/resampling_spec.rb +31 -0
  20. data/spec/chunky_png/canvas/stream_exporting_spec.rb +20 -0
  21. data/spec/chunky_png/canvas/stream_importing_spec.rb +22 -0
  22. data/spec/chunky_png/canvas_spec.rb +151 -22
  23. data/spec/chunky_png/color_spec.rb +53 -0
  24. data/spec/chunky_png/dimension_spec.rb +43 -0
  25. data/spec/chunky_png/point_spec.rb +71 -0
  26. data/spec/chunky_png/vector_spec.rb +58 -0
  27. data/spec/resources/circles.png +0 -0
  28. data/spec/resources/clock_nn_xdown_ydown.png +0 -0
  29. data/spec/resources/clock_nn_xdown_yup.png +0 -0
  30. data/spec/resources/clock_nn_xup_yup.png +0 -0
  31. data/spec/resources/lines.png +0 -0
  32. data/spec/resources/partial_circles.png +0 -0
  33. data/spec/resources/polygon_filled_horizontal.png +0 -0
  34. data/spec/resources/polygon_filled_vertical.png +0 -0
  35. data/spec/resources/polygon_triangle_filled.png +0 -0
  36. data/spec/resources/polygon_unfilled.png +0 -0
  37. data/spec/resources/rect.png +0 -0
  38. metadata +31 -9
  39. data/spec/resources/clock_flip_horizontally.png +0 -0
  40. data/spec/resources/clock_flip_vertically.png +0 -0
  41. data/spec/resources/clock_rotate_180.png +0 -0
  42. data/spec/resources/clock_rotate_left.png +0 -0
  43. data/spec/resources/clock_rotate_right.png +0 -0
  44. data/spec/resources/clock_stubbed.png +0 -0
@@ -0,0 +1,42 @@
1
+ module ChunkyPNG
2
+ class Canvas
3
+
4
+ # The ChunkyPNG::Canvas::Resampling module defines methods to perform image resampling to
5
+ # a {ChunkyPNG::Canvas}.
6
+ #
7
+ # Currently, only the nearest neighbor algorithm is implemented. Bilinear and cubic
8
+ # algorithms may be added later on.
9
+ #
10
+ # @see ChunkyPNG::Canvas
11
+ module Resampling
12
+
13
+ # Resamples the canvas.
14
+ # @param [Integer] new_width The width of the resamples canvas.
15
+ # @param [Integer] new_height The height of the resamples canvas.
16
+ # @param [ChunkyPNG::Canvas] A new canvas instance with the resamples pixels.
17
+ def resample_nearest_neighbor(new_width, new_height)
18
+
19
+ resampled_image = self.class.new(new_width.to_i, new_height.to_i)
20
+
21
+ width_ratio = width.to_f / new_width.to_f
22
+ height_ratio = height.to_f / new_height.to_f
23
+
24
+ for y in 1..new_height do
25
+ source_y = (y - 0.5) * height_ratio + 0.5
26
+ input_y = source_y.to_i
27
+
28
+ for x in 1..new_width do
29
+ source_x = (x - 0.5) * width_ratio + 0.5
30
+ input_x = source_x.to_i
31
+
32
+ resampled_image.set_pixel(x - 1, y - 1, get_pixel([input_x - 1, 0].max, [input_y - 1, 0].max))
33
+ end
34
+ end
35
+
36
+ return resampled_image
37
+ end
38
+
39
+ alias_method :resample, :resample_nearest_neighbor
40
+ end
41
+ end
42
+ end
@@ -1,4 +1,48 @@
1
1
  module ChunkyPNG
2
+
3
+ # Factory method to return a color value, based on the arguments given.
4
+ #
5
+ # - When given 1 argument, it can either be a color integer, which is returned as is,
6
+ # or it can be a HTML named color or a color in hex notation.
7
+ # - When given 2 arguments, the 1st argument is parsed as color value and the second
8
+ # argument is used as opacity value (range: 0-255)
9
+ #
10
+ # @overload Color(r, g, b, a)
11
+ # @param (see ChunkyPNG::Color.rgba)
12
+ # @return [Integer] The rgba color value.
13
+ #
14
+ # @overload Color(r, g, b)
15
+ # @param (see ChunkyPNG::Color.rgb)
16
+ # @return [Integer] The rgb color value.
17
+ #
18
+ # @overload Color(hex_value, opacity = nil)
19
+ # @param (see ChunkyPNG::Color.from_hex)
20
+ # @return [Integer] The hex color value, with the opacity applied if one was given.
21
+ #
22
+ # @overload Color(color_name, opacity = nil)
23
+ # @param (see ChunkyPNG::Color.html_color)
24
+ # @return [Integer] The hex color value, with the opacity applied if one was given.
25
+ #
26
+ # @overload Color(color_value, opacity = nil)
27
+ # @param [Integer, :to_i] The color value.
28
+ # @return [Integer] The color value, with the opacity applied if one was given.
29
+ #
30
+ # @raise [ChunkyPNG::ExpectationFailed] if the arguments weren't understood as a color.
31
+ def self.Color(*args)
32
+ case args.length
33
+ when 4; ChunkyPNG::Color.rgba(*args)
34
+ when 3; ChunkyPNG::Color.rgb(*args)
35
+ when 2; (ChunkyPNG::Color(args[0]) & 0xffffff00) | args[1].to_i
36
+ when 1
37
+ case source = args.first.to_s
38
+ when Integer, /^\d+$/; source.to_i
39
+ when ChunkyPNG::Color::HEX_COLOR_REGEXP; ChunkyPNG::Color.from_hex(source)
40
+ when ChunkyPNG::Color::HTML_COLOR_REGEXP; ChunkyPNG::Color.html_color(source)
41
+ else raise ChunkyPNG::ExpectationFailed; "Don't know how to create a color from #{source.inspect}!"
42
+ end
43
+ else raise ChunkyPNG::ExpectationFailed; "Don't know how to create a color from #{args.inspect}!"
44
+ end
45
+ end
2
46
 
3
47
  # The Color module defines methods for handling colors. Within the ChunkyPNG
4
48
  # library, the concepts of pixels and colors are both used, and they are
@@ -16,32 +60,48 @@ module ChunkyPNG
16
60
  module Color
17
61
  extend self
18
62
 
19
- # The maximum value of each color component.
63
+ # @return [Integer] The maximum value of each color component.
20
64
  MAX = 0xff
21
-
65
+
66
+ # @return [Regexp] The regexp to parse hex color values.
67
+ HEX_COLOR_REGEXP = /^(?:#|0x)?([0-9a-f]{6})([0-9a-f]{2})?$/i
68
+
69
+ # @return [Regexp] The regexp to parse named color values.
70
+ HTML_COLOR_REGEXP = /^([a-z][a-z_ ]+[a-z])(?:\ ?\@\ ?(1\.0|0\.\d+))?$/i
71
+
22
72
  ####################################################################
23
73
  # CONSTRUCTING COLOR VALUES
24
74
  ####################################################################
25
75
 
26
76
  # Creates a new color using an r, g, b triple and an alpha value.
77
+ # @param [Integer] r The r-component (0-255)
78
+ # @param [Integer] g The r-component (0-255)
79
+ # @param [Integer] b The r-component (0-255)
80
+ # @param [Integer] a The opacity (0-255)
27
81
  # @return [Integer] The newly constructed color value.
28
82
  def rgba(r, g, b, a)
29
83
  r << 24 | g << 16 | b << 8 | a
30
84
  end
31
85
 
32
86
  # Creates a new color using an r, g, b triple.
87
+ # @param [Integer] r The r-component (0-255)
88
+ # @param [Integer] g The r-component (0-255)
89
+ # @param [Integer] b The r-component (0-255)
33
90
  # @return [Integer] The newly constructed color value.
34
91
  def rgb(r, g, b)
35
92
  r << 24 | g << 16 | b << 8 | 0xff
36
93
  end
37
94
 
38
95
  # Creates a new color using a grayscale teint.
96
+ # @param [Integer] teint The grayscale teint (0-255), will be used as r, g, and b value.
39
97
  # @return [ChunkyPNG::Color] The newly constructed color value.
40
98
  def grayscale(teint)
41
99
  teint << 24 | teint << 16 | teint << 8 | 0xff
42
100
  end
43
101
 
44
102
  # Creates a new color using a grayscale teint and alpha value.
103
+ # @param [Integer] teint The grayscale teint (0-255), will be used as r, g, and b value.
104
+ # @param [Integer] a The opacity (0-255)
45
105
  # @return [Integer] The newly constructed color value.
46
106
  def grayscale_alpha(teint, a)
47
107
  teint << 24 | teint << 16 | teint << 8 | a
@@ -77,12 +137,17 @@ module ChunkyPNG
77
137
  # Color strings may include the prefix "0x" or "#".
78
138
  #
79
139
  # @param [String] str The color in hex notation. @return [Integer] The
80
- # converted color value.
81
- def from_hex(str)
82
- case str
83
- when /^(?:#|0x)?([0-9a-f]{6})$/i; ($1.hex << 8) | 0xff
84
- when /^(?:#|0x)?([0-9a-f]{8})$/i; $1.hex
85
- else raise ChunkyPNG::ExpectationFailed, "Not a valid hex color notation: #{str.inspect}!"
140
+ # converted color value.
141
+ # @param [Integer] opacity The opacity value for the color. Overrides any
142
+ # opacity value given in the hex value if given.
143
+ # @return [Integer] The color value.
144
+ def from_hex(hex_value, opacity = nil)
145
+ if HEX_COLOR_REGEXP =~ hex_value
146
+ base_color = $1.hex << 8
147
+ opacity ||= $2 ? $2.hex : 0xff
148
+ base_color | opacity
149
+ else
150
+ raise ChunkyPNG::ExpectationFailed, "Not a valid hex color notation: #{hex_value.inspect}!"
86
151
  end
87
152
  end
88
153
 
@@ -373,13 +438,189 @@ module ChunkyPNG
373
438
  # COLOR CONSTANTS
374
439
  ####################################################################
375
440
 
376
- # Black pixel/color
441
+ # @return [Hash<Symbol, Integer>] All the prefined color names in HTML.
442
+ PREDEFINED_COLORS = {
443
+ :aliceblue => 0xf0f8ff00,
444
+ :antiquewhite => 0xfaebd700,
445
+ :aqua => 0x00ffff00,
446
+ :aquamarine => 0x7fffd400,
447
+ :azure => 0xf0ffff00,
448
+ :beige => 0xf5f5dc00,
449
+ :bisque => 0xffe4c400,
450
+ :black => 0x00000000,
451
+ :blanchedalmond => 0xffebcd00,
452
+ :blue => 0x0000ff00,
453
+ :blueviolet => 0x8a2be200,
454
+ :brown => 0xa52a2a00,
455
+ :burlywood => 0xdeb88700,
456
+ :cadetblue => 0x5f9ea000,
457
+ :chartreuse => 0x7fff0000,
458
+ :chocolate => 0xd2691e00,
459
+ :coral => 0xff7f5000,
460
+ :cornflowerblue => 0x6495ed00,
461
+ :cornsilk => 0xfff8dc00,
462
+ :crimson => 0xdc143c00,
463
+ :cyan => 0x00ffff00,
464
+ :darkblue => 0x00008b00,
465
+ :darkcyan => 0x008b8b00,
466
+ :darkgoldenrod => 0xb8860b00,
467
+ :darkgray => 0xa9a9a900,
468
+ :darkgrey => 0xa9a9a900,
469
+ :darkgreen => 0x00640000,
470
+ :darkkhaki => 0xbdb76b00,
471
+ :darkmagenta => 0x8b008b00,
472
+ :darkolivegreen => 0x556b2f00,
473
+ :darkorange => 0xff8c0000,
474
+ :darkorchid => 0x9932cc00,
475
+ :darkred => 0x8b000000,
476
+ :darksalmon => 0xe9967a00,
477
+ :darkseagreen => 0x8fbc8f00,
478
+ :darkslateblue => 0x483d8b00,
479
+ :darkslategray => 0x2f4f4f00,
480
+ :darkslategrey => 0x2f4f4f00,
481
+ :darkturquoise => 0x00ced100,
482
+ :darkviolet => 0x9400d300,
483
+ :deeppink => 0xff149300,
484
+ :deepskyblue => 0x00bfff00,
485
+ :dimgray => 0x69696900,
486
+ :dimgrey => 0x69696900,
487
+ :dodgerblue => 0x1e90ff00,
488
+ :firebrick => 0xb2222200,
489
+ :floralwhite => 0xfffaf000,
490
+ :forestgreen => 0x228b2200,
491
+ :fuchsia => 0xff00ff00,
492
+ :gainsboro => 0xdcdcdc00,
493
+ :ghostwhite => 0xf8f8ff00,
494
+ :gold => 0xffd70000,
495
+ :goldenrod => 0xdaa52000,
496
+ :gray => 0x80808000,
497
+ :grey => 0x80808000,
498
+ :green => 0x00800000,
499
+ :greenyellow => 0xadff2f00,
500
+ :honeydew => 0xf0fff000,
501
+ :hotpink => 0xff69b400,
502
+ :indianred => 0xcd5c5c00,
503
+ :indigo => 0x4b008200,
504
+ :ivory => 0xfffff000,
505
+ :khaki => 0xf0e68c00,
506
+ :lavender => 0xe6e6fa00,
507
+ :lavenderblush => 0xfff0f500,
508
+ :lawngreen => 0x7cfc0000,
509
+ :lemonchiffon => 0xfffacd00,
510
+ :lightblue => 0xadd8e600,
511
+ :lightcoral => 0xf0808000,
512
+ :lightcyan => 0xe0ffff00,
513
+ :lightgoldenrodyellow => 0xfafad200,
514
+ :lightgray => 0xd3d3d300,
515
+ :lightgrey => 0xd3d3d300,
516
+ :lightgreen => 0x90ee9000,
517
+ :lightpink => 0xffb6c100,
518
+ :lightsalmon => 0xffa07a00,
519
+ :lightseagreen => 0x20b2aa00,
520
+ :lightskyblue => 0x87cefa00,
521
+ :lightslategray => 0x77889900,
522
+ :lightslategrey => 0x77889900,
523
+ :lightsteelblue => 0xb0c4de00,
524
+ :lightyellow => 0xffffe000,
525
+ :lime => 0x00ff0000,
526
+ :limegreen => 0x32cd3200,
527
+ :linen => 0xfaf0e600,
528
+ :magenta => 0xff00ff00,
529
+ :maroon => 0x80000000,
530
+ :mediumaquamarine => 0x66cdaa00,
531
+ :mediumblue => 0x0000cd00,
532
+ :mediumorchid => 0xba55d300,
533
+ :mediumpurple => 0x9370d800,
534
+ :mediumseagreen => 0x3cb37100,
535
+ :mediumslateblue => 0x7b68ee00,
536
+ :mediumspringgreen => 0x00fa9a00,
537
+ :mediumturquoise => 0x48d1cc00,
538
+ :mediumvioletred => 0xc7158500,
539
+ :midnightblue => 0x19197000,
540
+ :mintcream => 0xf5fffa00,
541
+ :mistyrose => 0xffe4e100,
542
+ :moccasin => 0xffe4b500,
543
+ :navajowhite => 0xffdead00,
544
+ :navy => 0x00008000,
545
+ :oldlace => 0xfdf5e600,
546
+ :olive => 0x80800000,
547
+ :olivedrab => 0x6b8e2300,
548
+ :orange => 0xffa50000,
549
+ :orangered => 0xff450000,
550
+ :orchid => 0xda70d600,
551
+ :palegoldenrod => 0xeee8aa00,
552
+ :palegreen => 0x98fb9800,
553
+ :paleturquoise => 0xafeeee00,
554
+ :palevioletred => 0xd8709300,
555
+ :papayawhip => 0xffefd500,
556
+ :peachpuff => 0xffdab900,
557
+ :peru => 0xcd853f00,
558
+ :pink => 0xffc0cb00,
559
+ :plum => 0xdda0dd00,
560
+ :powderblue => 0xb0e0e600,
561
+ :purple => 0x80008000,
562
+ :red => 0xff000000,
563
+ :rosybrown => 0xbc8f8f00,
564
+ :royalblue => 0x4169e100,
565
+ :saddlebrown => 0x8b451300,
566
+ :salmon => 0xfa807200,
567
+ :sandybrown => 0xf4a46000,
568
+ :seagreen => 0x2e8b5700,
569
+ :seashell => 0xfff5ee00,
570
+ :sienna => 0xa0522d00,
571
+ :silver => 0xc0c0c000,
572
+ :skyblue => 0x87ceeb00,
573
+ :slateblue => 0x6a5acd00,
574
+ :slategray => 0x70809000,
575
+ :slategrey => 0x70809000,
576
+ :snow => 0xfffafa00,
577
+ :springgreen => 0x00ff7f00,
578
+ :steelblue => 0x4682b400,
579
+ :tan => 0xd2b48c00,
580
+ :teal => 0x00808000,
581
+ :thistle => 0xd8bfd800,
582
+ :tomato => 0xff634700,
583
+ :turquoise => 0x40e0d000,
584
+ :violet => 0xee82ee00,
585
+ :wheat => 0xf5deb300,
586
+ :white => 0xffffff00,
587
+ :whitesmoke => 0xf5f5f500,
588
+ :yellow => 0xffff0000,
589
+ :yellowgreen => 0x9acd3200
590
+ }
591
+
592
+ # Gets a color value based on a HTML color name.
593
+ #
594
+ # The color name is flexible. E.g. <tt>'yellowgreen'</tt>, <tt>'Yellow green'</tt>,
595
+ # <tt>'YellowGreen'</tt>, <tt>'YELLOW_GREEN'</tt> and <tt>:yellow_green</tt> will
596
+ # all return the same color value.
597
+ #
598
+ # You can include a opacity level in the color name (e.g. <tt>'red @ 0.5'</tt>) or give
599
+ # an explit opacity value as second argument. If no opacity value is given, the color
600
+ # will be fully opaque.
601
+ #
602
+ # @param [Symbol, String] color_name The color name. It may include an opacity specifier
603
+ # like <tt>@ 0.8</tt> to set the color's opacity.
604
+ # @param [Integer] opacity The opacity value for the color between 0 and 255. Overrides
605
+ # any opacity value given in the color name.
606
+ # @return [Integer] The color value.
607
+ # @raise [ChunkyPNG::Exception] If the color name was not recognized.
608
+ def html_color(color_name, opacity = nil)
609
+ if color_name.to_s =~ HTML_COLOR_REGEXP
610
+ opacity ||= $2 ? ($2.to_f * 255.0).round : 0xff
611
+ base_color_name = $1.gsub(/[^a-z]+/i, '').downcase.to_sym
612
+ return PREDEFINED_COLORS[base_color_name] | opacity if PREDEFINED_COLORS.has_key?(base_color_name)
613
+ end
614
+ raise ChunkyPNG::Exception, "Unknown color name #{color_name}!"
615
+ end
616
+
617
+ # @return [Integer] Black pixel/color
377
618
  BLACK = rgb( 0, 0, 0)
378
619
 
379
- # White pixel/color
620
+ # @return [Integer] White pixel/color
380
621
  WHITE = rgb(255, 255, 255)
381
622
 
382
- # Fully transparent pixel/color
623
+ # @return [Integer] Fully transparent pixel/color
383
624
  TRANSPARENT = rgba(0, 0, 0, 0)
384
625
 
385
626
  ####################################################################
@@ -1,3 +1,4 @@
1
+ # Define the byte-operators on a string if they're not defined (Ruby 1.8)
1
2
 
2
3
  class String
3
4
  alias_method :getbyte, :[] unless method_defined?(:getbyte)
@@ -5,11 +6,10 @@ class String
5
6
  alias_method :bytesize, :size unless method_defined?(:bytesize)
6
7
  end
7
8
 
8
- class Object
9
- unless method_defined?(:tap)
10
- def tap(&block)
11
- yield(self) if block_given?
12
- return self
9
+ module Enumerable
10
+ unless method_defined?(:minmax)
11
+ def minmax
12
+ [min, max]
13
13
  end
14
14
  end
15
15
  end
@@ -0,0 +1,106 @@
1
+ module ChunkyPNG
2
+
3
+ # Creates a {ChunkyPNG::Dimension} instance using arguments that can be interpreted
4
+ # as width and height.
5
+ #
6
+ # @overload Dimension(width, height)
7
+ # @param [Integer] width The width-component of the dimension.
8
+ # @param [Integer] height The height-component of the dimension.
9
+ # @return [ChunkyPNG::Dimension] The instantiated dimension.
10
+ #
11
+ # @overload Dimension(string)
12
+ # @param [String] string A string from which a width and height value can be parsed, e.g.
13
+ # <tt>'10x20'</tt> or <tt>'[10, 20]'</tt>.
14
+ # @return [ChunkyPNG::Dimension] The instantiated dimension.
15
+ #
16
+ # @overload Dimension(ary)
17
+ # @param [Array] ary An array with the desired width as first element and the
18
+ # desired height as second element, e.g. <tt>[10, 20]</tt>.
19
+ # @return [ChunkyPNG::Dimension] The instantiated dimension.
20
+ #
21
+ # @overload Dimension(hash)
22
+ # @param [Hash] hash An hash with a <tt>'height'</tt> or <tt>:height</tt> key for the
23
+ # desired height and with a <tt>'width'</tt> or <tt>:width</tt> key for the desired
24
+ # width.
25
+ # @return [ChunkyPNG::Dimension] The instantiated dimension.
26
+ #
27
+ # @see ChunkyPNG::Dimension
28
+ def self.Dimension(*args)
29
+
30
+ case args.length
31
+ when 2; ChunkyPNG::Dimension.new(*args)
32
+ when 1; case source = args.first
33
+ when ChunkyPNG::Dimension; source
34
+ when ChunkyPNG::Point; ChunkyPNG::Dimension.new(source.x, source.y)
35
+ when Array; ChunkyPNG::Dimension.new(source[0], source[1])
36
+ when Hash; ChunkyPNG::Dimension.new(source[:width] || source['width'], source[:height] || source['height'])
37
+ when /^[\(\[\{]?(\d+)\s*[x,]?\s*(\d+)[\)\]\}]?$/; ChunkyPNG::Dimension.new($1, $2)
38
+ else
39
+ if source.respond_to?(:width) && source.respond_to?(:height)
40
+ ChunkyPNG::Dimension.new(source.width, source.height)
41
+ else
42
+ raise ChunkyPNG::ExpectationFailed, "Don't know how to construct a point from #{source.inspect}!"
43
+ end
44
+ end
45
+ else raise ChunkyPNG::ExpectationFailed, "Don't know how to construct a point from #{args.inspect}!"
46
+ end
47
+ end
48
+
49
+ # Class that represents the dimension of something, e.g. a {ChunkyPNG::Canvas}.
50
+ #
51
+ # This class contains some methods to simplify performing dimension related checks.
52
+ class Dimension
53
+
54
+ # @return [Integer] The width-compontent of this dimension.
55
+ attr_accessor :width
56
+
57
+ # @return [Integer] The height-compontent of this dimension.
58
+ attr_accessor :height
59
+
60
+ # Initializes a new dimension instance.
61
+ # @param [Integer] width The width-compontent of the new dimension.
62
+ # @param [Integer] height The height-compontent of the new dimension.
63
+ def initialize(width, height)
64
+ @width, @height = width.to_i, height.to_i
65
+ end
66
+
67
+ # Returns the area of this dimension.
68
+ # @return [Integer] The area in number of pixels.
69
+ def area
70
+ width * height
71
+ end
72
+
73
+ # Checks whether a point is within bounds of this dimension.
74
+ # @param [ChunkyPNG::Point, ...] A point-like to bounds-check.
75
+ # @return [true, false] True iff the the x and y coordinate fall in this dimension.
76
+ def include?(*point_like)
77
+ point = ChunkyPNG::Point(*point_like)
78
+ point.x >= 0 && point.x < width && point.y >= 0 && point.y < height
79
+ end
80
+
81
+ # Checks whether 2 dimensions are identical.
82
+ # @param [ChunkyPNG::Dimension] The dimension to compare with.
83
+ # @return [true, false] <tt>true</tt> iff width and height match.
84
+ def eql?(other)
85
+ other.width == width && other.height == height
86
+ end
87
+
88
+ alias_method :==, :eql?
89
+
90
+ # Compares the size of 2 dimensions.
91
+ # @param [ChunkyPNG::Dimension] The dimension to compare with.
92
+ # @return [-1, 0, 1] -1 if the other dimension has a larger area, 1 of this
93
+ # dimension is larger, 0 if both are identical in size.
94
+ def <=>(other)
95
+ other.area <=> area
96
+ end
97
+
98
+ # Casts this dimension into an array.
99
+ # @return [Array<Integer>] <tt>[width, height]</tt> for this dimension.
100
+ def to_a
101
+ [width, height]
102
+ end
103
+
104
+ alias_method :to_ary, :to_a
105
+ end
106
+ end