# -*- encoding: utf-8; frozen_string_literal: true -*- # #-- # This file is part of HexaPDF. # # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby # Copyright (C) 2014-2018 Thomas Leitner # # HexaPDF is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License version 3 as # published by the Free Software Foundation with the addition of the # following permission added to Section 15 as permitted in Section 7(a): # FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY # THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON # INFRINGEMENT OF THIRD PARTY RIGHTS. # # HexaPDF is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public # License for more details. # # You should have received a copy of the GNU Affero General Public License # along with HexaPDF. If not, see . # # The interactive user interfaces in modified source and object code # versions of HexaPDF must display Appropriate Legal Notices, as required # under Section 5 of the GNU Affero General Public License version 3. # # In accordance with Section 7(b) of the GNU Affero General Public # License, a covered work must retain the producer line in every PDF that # is created or manipulated using HexaPDF. #++ require 'hexapdf/layout/box' module HexaPDF module Layout # An InlineBox wraps a regular Box so that it can be used as an item for a Line. This enables # inline graphics. # # The wrapped box *must* have a fixed size! class InlineBox # Creates an InlineBox that wraps a basic Box. All arguments (except +valign+) and the block # are passed to Box::new. # # See ::new for the +valign+ argument. def self.create(valign: :baseline, **args, &block) new(Box.new(**args, &block), valign: valign) end # The vertical alignment of the box. # # Can be any supported value except :text - see Line for all possible values. attr_reader :valign # The wrapped Box object. attr_reader :box # Creates a new InlineBox object wrapping +box+. # # The +valign+ argument can be used to specify the vertical alignment of the box relative to # other items in the Line. def initialize(box, valign: :baseline) @box = box @valign = valign end # Returns +true+ if this inline box is just a placeholder without drawing operations. def empty? box.empty? end # Returns the width of the wrapped box plus its left and right margins. def width box.width + box.style.margin.left + box.style.margin.right end # Returns the height of the wrapped box plus its top and bottom margins. def height box.height + box.style.margin.top + box.style.margin.bottom end # Draws the wrapped box. If the box has margins specified, the x and y offsets are correctly # adjusted. def draw(canvas, x, y) box.draw(canvas, x + box.style.margin.left, y + box.style.margin.bottom) end # The minimum x-coordinate which is always 0. def x_min 0 end # The maximum x-coordinate which is equivalent to the width of the inline box. def x_max width end end end end