File: transformation_stack.rb

package info (click to toggle)
ruby-prawn 2.5.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,528 kB
  • sloc: ruby: 17,688; sh: 43; makefile: 20
file content (63 lines) | stat: -rw-r--r-- 1,815 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# frozen_string_literal: true

require 'matrix'

module Prawn
  # Stores the transformations that have been applied to the document.
  # @private
  module TransformationStack
    # rubocop: disable Metrics/ParameterLists, Naming/MethodParameterName

    # Add transformation to the stack.
    #
    # @param a [Number]
    # @param b [Number]
    # @param c [Number]
    # @param d [Number]
    # @param e [Number]
    # @param f [Number]
    # @return [void]
    def add_to_transformation_stack(a, b, c, d, e, f)
      @transformation_stack ||= [[]]
      @transformation_stack.last.push([a, b, c, d, e, f].map { |i| Float(i) })
    end

    # Save transformation stack.
    #
    # @return [void]
    def save_transformation_stack
      @transformation_stack ||= [[]]
      @transformation_stack.push(@transformation_stack.last.dup)
    end

    # Restore previous transformation.
    #
    # Effectively pops the last transformation off of the transformation stack.
    #
    # @return [void]
    def restore_transformation_stack
      @transformation_stack&.pop
    end

    # Get current transformation matrix. It's a result of multiplication of the
    # whole transformation stack with additional translation.
    #
    # @param x [Number]
    # @param y [Number]
    # @return [Array(Number, Number, Number, Number, Number, Number)]
    def current_transformation_matrix_with_translation(x = 0, y = 0)
      transformations = (@transformation_stack || [[]]).last

      matrix = Matrix.identity(3)

      transformations.each do |a, b, c, d, e, f|
        matrix *= Matrix[[a, c, e], [b, d, f], [0, 0, 1]]
      end

      matrix *= Matrix[[1, 0, x], [0, 1, y], [0, 0, 1]]

      matrix.to_a[0..1].transpose.flatten
    end
    # rubocop: enable Metrics/ParameterLists, Naming/MethodParameterName
  end
end