Class: HexaPDF::Layout::Style::Layers

Inherits:
Object
  • Object
show all
Defined in:
lib/hexapdf/layout/style.rb

Overview

Represents layers that can be drawn under or over a box.

There are two ways to specify layers via #add:

  • Directly by providing a callable object.

  • By reference to a callable object or class in the ‘style.layers_map’ configuration option. The reference name is looked up in the configuration option using HexaPDF::Configuration#constantize. If the resulting object is a callable object, it is used; otherwise it is assumed that it is a class and an object is instantiated, passing in any options given on #add.

The object resolved in this way needs to respond to #call(canvas, box) where canvas is the HexaPDF::Content::Canvas object on which it should be drawn and box is a box-like object (e.g. Box or TextFragment). The coordinate system is translated so that the origin is at the bottom-left corner of the box during the drawing operations.

Instance Method Summary collapse

Constructor Details

#initialize(layers = nil) ⇒ Layers

Creates a new Layers object popuplated with the given layers.



400
401
402
403
# File 'lib/hexapdf/layout/style.rb', line 400

def initialize(layers = nil)
  @layers = []
  layers&.each {|name, options| add(name, **(options || {})) }
end

Instance Method Details

#add(name = nil, **options, &block) ⇒ Object

:call-seq:

layers.add {|canvas, box| block}
layers.add(name, **options)

Adds a new layer object.

The layer object can either be specified as a block or by reference to a configured layer object in ‘style.layers_map’. In this case name is used as the reference and the options are passed to layer object if it needs initialization.



420
421
422
423
424
425
426
427
428
# File 'lib/hexapdf/layout/style.rb', line 420

def add(name = nil, **options, &block)
  if block_given? || name.kind_of?(Proc)
    @layers << (block || name)
  elsif name
    @layers << [name, options]
  else
    raise ArgumentError, "Layer object name or block missing"
  end
end

#draw(canvas, x, y, box) ⇒ Object

Draws all layer objects onto the canvas at the position [x, y] for the given box.



431
432
433
434
435
436
437
438
439
# File 'lib/hexapdf/layout/style.rb', line 431

def draw(canvas, x, y, box)
  return if none?

  canvas.translate(x, y) do
    each(canvas.context.document.config) do |layer|
      canvas.save_graphics_state { layer.call(canvas, box) }
    end
  end
end

#each(config) ⇒ Object

Yields all layer objects. Objects that have been specified via a reference are first resolved using the provided configuration object.



443
444
445
446
447
448
449
# File 'lib/hexapdf/layout/style.rb', line 443

def each(config) #:yield: layer
  @layers.each do |obj, options|
    obj = config.constantize('style.layers_map', obj) unless obj.respond_to?(:call)
    obj = obj.new(**options) unless obj.respond_to?(:call)
    yield(obj)
  end
end

#initialize_copy(other) ⇒ Object

Duplicates the array holding the layers.



406
407
408
409
# File 'lib/hexapdf/layout/style.rb', line 406

def initialize_copy(other)
  super
  @layers = @layers.dup
end

#none?Boolean

Returns true if there are no layers defined.

Returns:

  • (Boolean)


452
453
454
# File 'lib/hexapdf/layout/style.rb', line 452

def none?
  @layers.empty?
end