# -*- 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-2021 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. # # If the GNU Affero General Public License doesn't fit your need, # commercial licenses are available at . #++ require 'hexapdf/layout/box' module HexaPDF module Layout # An Image box object is used for displaying an image. # # How an image is displayed inside an image box, depends on whether the +width+ and/or +height+ # of the box has been set: # # * If one of them has been set, the other is adjusted to retain the image ratio. # * If both have been set, both are used as is. # * If neither has been set, the image is scaled to fit the available space. # # Also see: HexaPDF::Content::Canvas#image class ImageBox < Box # The image that is shown in the box. attr_reader :image # Creates a new Image box object for the given +image+ argument which needs to be an image # object (e.g. returned by HexaPDF::Document::Images#add). def initialize(image, **kwargs) super(**kwargs, &:unused_draw_block) @image = image end # Fits the image into the available space. def fit(available_width, available_height, _) image_width = @image.width.to_f image_height = @image.height.to_f image_ratio = image_width / image_height if @initial_width > 0 && @initial_height > 0 @width = @initial_width @height = @initial_height elsif @initial_width > 0 @width = @initial_width @height = (@width - reserved_width) / image_ratio + reserved_height elsif @initial_height > 0 @height = @initial_height @width = (@height - reserved_height) * image_ratio + reserved_width else rw = reserved_width rh = reserved_height ratio = [(available_width - rw) / image_width, (available_height - rh) / image_height].min @width = image_width * ratio + rw @height = image_height * ratio + rh end @width <= available_width && @height <= available_height end private # Draws the image onto the canvas at position [x, y]. def draw_content(canvas, x, y) canvas.image(@image, at: [x, y], width: content_width, height: content_height) end end end end