Class: LogoSoup::Core::VisualCenterTransform

Inherits:
Object
  • Object
show all
Defined in:
lib/logosoup/core/visual_center_transform.rb

Overview

Computes a CSS translate() transform to align by visual center.

Class Method Summary collapse

Class Method Details

.call(features:, normalized_width:, normalized_height:, align_by:, intrinsic_width:, intrinsic_height:) ⇒ String?

Parameters:

  • features (Hash)
  • normalized_width (Numeric)
  • normalized_height (Numeric)
  • align_by (String, Symbol)
  • intrinsic_width (Numeric)
  • intrinsic_height (Numeric)

Returns:

  • (String, nil)


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
# File 'lib/logosoup/core/visual_center_transform.rb', line 16

def self.call(features:, normalized_width:, normalized_height:, align_by:, intrinsic_width:, intrinsic_height:)
  mode = align_by.to_s.strip
  return nil if mode.empty? || mode == "bounds"

  offset_x = features[:visual_center_offset_x]
  offset_y = features[:visual_center_offset_y]
  return nil unless offset_x.is_a?(Numeric) && offset_y.is_a?(Numeric)

  content_w = features[:content_box_width].to_f
  content_h = features[:content_box_height].to_f
  content_w = intrinsic_width.to_f if content_w <= 0
  content_h = intrinsic_height.to_f if content_h <= 0
  return nil if content_w <= 0 || content_h <= 0

  scale_x = normalized_width.to_f / content_w
  scale_y = normalized_height.to_f / content_h

  dx = %w[visual-center visual-center-x].include?(mode) ? (-offset_x.to_f * scale_x) : 0.0
  dy = %w[visual-center visual-center-y].include?(mode) ? (-offset_y.to_f * scale_y) : 0.0

  dx_fmt = Css.fmt_tenth_px(dx)
  dy_fmt = Css.fmt_tenth_px(dy)
  return nil if dx_fmt == "0" && dy_fmt == "0"

  "translate(#{dx_fmt}px, #{dy_fmt}px)"
end