Module: HexaPDF::Type::Annotations::BorderStyling

Included in:
Line, PolygonPolyline, SquareCircle, Widget
Defined in:
lib/hexapdf/type/annotations/border_styling.rb

Overview

This module provides a convenience method for getting and setting the border style and is included in the annotations that need it.

See: PDF2.0 s12.5.4

Defined Under Namespace

Classes: BorderStyle

Instance Method Summary collapse

Instance Method Details

#border_style(color: nil, width: nil, style: nil) ⇒ Object

:call-seq:

annot.border_style                                      => border_style
annot.border_style(color: 0, width: 1, style: :solid)   => annot

Returns a BorderStyle instance representing the border style of the annotation when no argument is given. Otherwise sets the border style of the annotation and returns self.

When setting a border style, arguments that are not provided will use the default: a border with a solid, black, 1pt wide line. This also means that multiple invocations will reset all prior values.

color

The color of the border. See HexaPDF::Content::ColorSpace.device_color_from_specification for information on the allowed arguments.

If the special value :transparent is used when setting the color, a transparent is used. A transparent border will return a nil value when getting the border color.

width

The width of the border. If set to 0, no border is shown.

style

Defines how the border is drawn. can be one of the following:

:solid

Draws a solid border.

:beveled

Draws a beveled border.

:inset

Draws an inset border.

:underlined

Draws only the bottom border.

Array

An array specifying a line dash pattern (see HexaPDF::Content::LineDashPattern)



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/hexapdf/type/annotations/border_styling.rb', line 95

def border_style(color: nil, width: nil, style: nil)
  if color || width || style
    color = if color == :transparent
              []
            else
              Content::ColorSpace.device_color_from_specification(color || 0).components
            end
    width ||= 1
    style ||= :solid

    if self[:Subtype] == :Widget
      (self[:MK] ||= {})[:BC] = color
    else
      self[:C] = color
    end
    bs = self[:BS] = {W: width}
    case style
    when :solid then bs[:S] = :S
    when :beveled then bs[:S] = :B
    when :inset then bs[:S] = :I
    when :underlined then bs[:S] = :U
    when Array
      bs[:S] = :D
      bs[:D] = style
    else
      raise ArgumentError, "Unknown value #{style} for style argument"
    end
    self
  else
    result = BorderStyle.new(1, nil, :solid, 0, 0)
    bc = if self[:Subtype] == :Widget
           (ac = self[:MK]) && (bc = ac[:BC])
         else
           self[:C]
         end
    if bc && !bc.empty?
      result.color = Content::ColorSpace.prenormalized_device_color(bc.value)
    end

    if (bs = self[:BS])
      result.width = bs[:W] if bs.key?(:W)
      result.style = case bs[:S]
                     when :S then :solid
                     when :B then :beveled
                     when :I then :inset
                     when :U then :underlined
                     when :D then bs[:D].value
                     else :solid
                     end
    elsif key?(:Border)
      border = self[:Border]
      result.horizontal_corner_radius = border[0]
      result.vertical_corner_radius = border[1]
      result.width = border[2]
      result.style = border[3] if border[3]
    end

    result
  end
end