Class: PDF::Reader::Rectangle

Inherits:
Object
  • Object
show all
Defined in:
lib/pdf/reader/rectangle.rb

Overview

PDFs represent rectangles all over the place. They’re 4 element arrays, like this:

[A, B, C, D]

Four element arrays are yucky to work with though, so here’s a class that’s better. Initialize it with the 4 elements, and get utility functions (width, height, etc) for free.

By convention the first two elements are x1, y1, the co-ords for the bottom left corner of the rectangle. The third and fourth elements are x2, y2, the co-ords for the top left corner of the rectangle. It’s valid for the alternative corners to be used though, so we don’t assume which is which.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(x1, y1, x2, y2) ⇒ Rectangle

Returns a new instance of Rectangle.



25
26
27
# File 'lib/pdf/reader/rectangle.rb', line 25

def initialize(x1, y1, x2, y2)
  set_corners(x1, y1, x2, y2)
end

Instance Attribute Details

#bottom_leftObject (readonly)

Returns the value of attribute bottom_left.



23
24
25
# File 'lib/pdf/reader/rectangle.rb', line 23

def bottom_left
  @bottom_left
end

#bottom_rightObject (readonly)

Returns the value of attribute bottom_right.



23
24
25
# File 'lib/pdf/reader/rectangle.rb', line 23

def bottom_right
  @bottom_right
end

#top_leftObject (readonly)

Returns the value of attribute top_left.



23
24
25
# File 'lib/pdf/reader/rectangle.rb', line 23

def top_left
  @top_left
end

#top_rightObject (readonly)

Returns the value of attribute top_right.



23
24
25
# File 'lib/pdf/reader/rectangle.rb', line 23

def top_right
  @top_right
end

Class Method Details

.from_array(arr) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/pdf/reader/rectangle.rb', line 29

def self.from_array(arr)
  if arr.size != 4
    raise ArgumentError, "Only 4-element Arrays can be converted to a Rectangle"
  end

  PDF::Reader::Rectangle.new(
    arr[0].to_f,
    arr[1].to_f,
    arr[2].to_f,
    arr[3].to_f,
  )
end

Instance Method Details

#==(other) ⇒ Object



42
43
44
# File 'lib/pdf/reader/rectangle.rb', line 42

def ==(other)
  to_a == other.to_a
end

#apply_rotation(degrees) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/pdf/reader/rectangle.rb', line 69

def apply_rotation(degrees)
  return if degrees != 90 && degrees != 180 && degrees != 270

  if degrees == 90
    new_x1 = bottom_left.x
    new_y1 = bottom_left.y - width
    new_x2 = bottom_left.x + height
    new_y2 = bottom_left.y
  elsif degrees == 180
    new_x1 = bottom_left.x - width
    new_y1 = bottom_left.y - height
    new_x2 = bottom_left.x
    new_y2 = bottom_left.y
  elsif degrees == 270
    new_x1 = bottom_left.x - height
    new_y1 = bottom_left.y
    new_x2 = bottom_left.x
    new_y2 = bottom_left.y + width
  end
  set_corners(new_x1 || 0, new_y1 || 0, new_x2 || 0, new_y2 || 0)
end

#contains?(point) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
# File 'lib/pdf/reader/rectangle.rb', line 54

def contains?(point)
  point.x >= bottom_left.x && point.x <= top_right.x &&
    point.y >= bottom_left.y && point.y <= top_right.y
end

#heightObject



46
47
48
# File 'lib/pdf/reader/rectangle.rb', line 46

def height
  top_right.y - bottom_right.y
end

#to_aObject

A pdf-style 4-number array



60
61
62
63
64
65
66
67
# File 'lib/pdf/reader/rectangle.rb', line 60

def to_a
  [
    bottom_left.x,
    bottom_left.y,
    top_right.x,
    top_right.y,
  ]
end

#widthObject



50
51
52
# File 'lib/pdf/reader/rectangle.rb', line 50

def width
  bottom_right.x - bottom_left.x
end