Class: Magick::RVG::Utility::GraphicContext

Inherits:
Object
  • Object
show all
Defined in:
lib/rvg/misc.rb

Overview

class TextAttributes

Constant Summary collapse

FONT_STRETCH =
{
  normal: Magick::NormalStretch,
  ultra_condensed: Magick::UltraCondensedStretch,
  extra_condensed: Magick::ExtraCondensedStretch,
  condensed: Magick::CondensedStretch,
  semi_condensed: Magick::SemiCondensedStretch,
  semi_expanded: Magick::SemiExpandedStretch,
  expanded: Magick::ExpandedStretch,
  extra_expanded: Magick::ExtraExpandedStretch,
  ultra_expanded: Magick::UltraExpandedStretch
}.freeze
FONT_STYLE =
{
  normal: Magick::NormalStyle,
  italic: Magick::ItalicStyle,
  oblique: Magick::ObliqueStyle
}.freeze
FONT_WEIGHT =
{
  normal: Magick::NormalWeight,
  bold: Magick::BoldWeight,
  bolder: Magick::BolderWeight,
  lighter: Magick::LighterWeight
}.freeze
TEXT_ANCHOR =
{
  start: Magick::StartAnchor,
  middle: Magick::MiddleAnchor,
  end: Magick::EndAnchor
}.freeze
ANCHOR_TO_ALIGN =
{
  start: Magick::LeftAlign,
  middle: Magick::CenterAlign,
  end: Magick::RightAlign
}.freeze
TEXT_DECORATION =
{
  none: Magick::NoDecoration,
  underline: Magick::UnderlineDecoration,
  overline: Magick::OverlineDecoration,
  line_through: Magick::LineThroughDecoration
}.freeze
TEXT_STRATEGIES =
{
  'lr-tb' => LRTextStrategy,
  'lr' => LRTextStrategy,
  'rt-tb' => RLTextStrategy,
  'rl' => RLTextStrategy,
  'tb-rl' => TBTextStrategy,
  'tb' => TBTextStrategy
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeGraphicContext

Returns a new instance of GraphicContext.



501
502
503
504
505
506
507
# File 'lib/rvg/misc.rb', line 501

def initialize
  @gc = Magick::Draw.new
  @shadow = []
  @shadow << Magick::Draw.new
  @text_attrs = TextAttributes.new
  init_matrix
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth_id, *args) ⇒ Object



509
510
511
# File 'lib/rvg/misc.rb', line 509

def method_missing(meth_id, *args, &)
  @gc.__send__(meth_id, *args, &)
end

Instance Attribute Details

#gcObject (readonly)

Returns the value of attribute gc.



499
500
501
# File 'lib/rvg/misc.rb', line 499

def gc
  @gc
end

#text_attrsObject (readonly)

Returns the value of attribute text_attrs.



499
500
501
# File 'lib/rvg/misc.rb', line 499

def text_attrs
  @text_attrs
end

Class Method Details

.degrees_to_radians(deg) ⇒ Object



473
474
475
# File 'lib/rvg/misc.rb', line 473

def self.degrees_to_radians(deg)
  Math::PI * (deg % 360.0) / 180.0
end

Instance Method Details

#affine(sx, rx, ry, sy, tx, ty) ⇒ Object



513
514
515
516
517
518
# File 'lib/rvg/misc.rb', line 513

def affine(sx, rx, ry, sy, tx, ty)
  sx, rx, ry, sy, tx, ty = Magick::RVG.convert_to_float(sx, rx, ry, sy, tx, ty)
  @gc.affine(sx, rx, ry, sy, tx, ty)
  @text_attrs.set_affine(sx, rx, ry, sy, tx, ty)
  nil
end

#baseline_shift(value) ⇒ Object



520
521
522
523
524
525
526
527
528
529
530
# File 'lib/rvg/misc.rb', line 520

def baseline_shift(value)
  @text_attrs.baseline_shift = case value
                               when 'baseline', 'sub', 'super'
                                 value.to_sym
                               when /[-+]?\d+%/, Numeric
                                 value
                               else
                                 :baseline
                               end
  nil
end

#font(name) ⇒ Object



532
533
534
535
536
# File 'lib/rvg/misc.rb', line 532

def font(name)
  @gc.font(name)
  @shadow[-1].font = name
  nil
end

#font_family(name) ⇒ Object



538
539
540
541
542
# File 'lib/rvg/misc.rb', line 538

def font_family(name)
  @gc.font_family(name)
  @shadow[-1].font_family = name
  nil
end

#font_size(points) ⇒ Object



544
545
546
547
548
# File 'lib/rvg/misc.rb', line 544

def font_size(points)
  @gc.font_size(points)
  @shadow[-1].pointsize = points
  nil
end

#font_stretch(stretch) ⇒ Object



550
551
552
553
554
555
# File 'lib/rvg/misc.rb', line 550

def font_stretch(stretch)
  stretch = FONT_STRETCH.fetch(stretch.to_sym, Magick::NormalStretch)
  @gc.font_stretch(stretch)
  @shadow[-1].font_stretch = stretch
  nil
end

#font_style(style) ⇒ Object



557
558
559
560
561
562
# File 'lib/rvg/misc.rb', line 557

def font_style(style)
  style = FONT_STYLE.fetch(style.to_sym, Magick::NormalStyle)
  @gc.font_style(style)
  @shadow[-1].font_style = style
  nil
end

#font_weight(weight) ⇒ Object



564
565
566
567
568
569
570
# File 'lib/rvg/misc.rb', line 564

def font_weight(weight)
  # If the arg is not in the hash use it directly. Handles numeric values.
  weight = FONT_WEIGHT.fetch(weight.to_sym, Magick::NormalWeight) unless weight.is_a?(Numeric)
  @gc.font_weight(weight)
  @shadow[-1].font_weight = weight
  nil
end

#glyph_orientation_horizontal(deg) ⇒ Object



572
573
574
575
576
# File 'lib/rvg/misc.rb', line 572

def glyph_orientation_horizontal(deg)
  deg = Magick::RVG.convert_one_to_float(deg)
  @text_attrs.glyph_orientation_horizontal = (deg % 360) / 90 * 90
  nil
end

#glyph_orientation_vertical(deg) ⇒ Object



578
579
580
581
582
# File 'lib/rvg/misc.rb', line 578

def glyph_orientation_vertical(deg)
  deg = Magick::RVG.convert_one_to_float(deg)
  @text_attrs.glyph_orientation_vertical = (deg % 360) / 90 * 90
  nil
end

#inspectObject



584
585
586
# File 'lib/rvg/misc.rb', line 584

def inspect
  @gc.inspect
end

#letter_spacing(value) ⇒ Object



588
589
590
591
# File 'lib/rvg/misc.rb', line 588

def letter_spacing(value)
  @text_attrs.letter_spacing = Magick::RVG.convert_one_to_float(value)
  nil
end

#popObject



600
601
602
603
604
605
# File 'lib/rvg/misc.rb', line 600

def pop
  @gc.pop
  @shadow.pop
  @text_attrs.pop
  nil
end

#pushObject



593
594
595
596
597
598
# File 'lib/rvg/misc.rb', line 593

def push
  @gc.push
  @shadow.push(@shadow.last.dup)
  @text_attrs.push
  nil
end

#rotate(degrees) ⇒ Object



607
608
609
610
611
612
613
614
615
616
# File 'lib/rvg/misc.rb', line 607

def rotate(degrees)
  degrees = Magick::RVG.convert_one_to_float(degrees)
  @gc.rotate(degrees)
  @sx =  Math.cos(GraphicContext.degrees_to_radians(degrees))
  @rx =  Math.sin(GraphicContext.degrees_to_radians(degrees))
  @ry = -Math.sin(GraphicContext.degrees_to_radians(degrees))
  @sy =  Math.cos(GraphicContext.degrees_to_radians(degrees))
  concat_matrix
  nil
end

#scale(sx, sy) ⇒ Object



618
619
620
621
622
623
624
625
# File 'lib/rvg/misc.rb', line 618

def scale(sx, sy)
  sx, sy = Magick::RVG.convert_to_float(sx, sy)
  @gc.scale(sx, sy)
  @sx = sx
  @sy = sy
  concat_matrix
  nil
end

#shadowObject



627
628
629
# File 'lib/rvg/misc.rb', line 627

def shadow
  @shadow.last
end

#skewX(degrees) ⇒ Object



631
632
633
634
635
636
637
# File 'lib/rvg/misc.rb', line 631

def skewX(degrees)
  degrees = Magick::RVG.convert_one_to_float(degrees)
  @gc.skewx(degrees)
  @ry = Math.tan(GraphicContext.degrees_to_radians(degrees))
  concat_matrix
  nil
end

#skewY(degrees) ⇒ Object



639
640
641
642
643
644
645
# File 'lib/rvg/misc.rb', line 639

def skewY(degrees)
  degrees = Magick::RVG.convert_one_to_float(degrees)
  @gc.skewy(degrees)
  @rx = Math.tan(GraphicContext.degrees_to_radians(degrees))
  concat_matrix
  nil
end

#stroke_width(width) ⇒ Object



647
648
649
650
651
652
# File 'lib/rvg/misc.rb', line 647

def stroke_width(width)
  width = Magick::RVG.convert_one_to_float(width)
  @gc.stroke_width(width)
  @shadow[-1].stroke_width = width
  nil
end

#text(x, y, text) ⇒ Object



654
655
656
657
658
659
660
661
662
663
664
# File 'lib/rvg/misc.rb', line 654

def text(x, y, text)
  return if text.empty?

  text_renderer = if @text_attrs.non_default?
                    TEXT_STRATEGIES[@text_attrs.writing_mode].new(self)
                  else
                    DefaultTextStrategy.new(self)
                  end

  text_renderer.render(x, y, text)
end

#text_anchor(anchor) ⇒ Object



666
667
668
669
670
671
672
673
674
# File 'lib/rvg/misc.rb', line 666

def text_anchor(anchor)
  anchor = anchor.to_sym
  anchor_enum = TEXT_ANCHOR.fetch(anchor, Magick::StartAnchor)
  @gc.text_anchor(anchor_enum)
  align = ANCHOR_TO_ALIGN.fetch(anchor, Magick::LeftAlign)
  @shadow[-1].align = align
  @text_attrs.text_anchor = anchor
  nil
end

#text_decoration(decoration) ⇒ Object



676
677
678
679
680
681
# File 'lib/rvg/misc.rb', line 676

def text_decoration(decoration)
  decoration = TEXT_DECORATION.fetch(decoration.to_sym, Magick::NoDecoration)
  @gc.decorate(decoration)
  @shadow[-1].decorate = decoration
  nil
end

#translate(tx, ty) ⇒ Object



683
684
685
686
687
688
689
690
# File 'lib/rvg/misc.rb', line 683

def translate(tx, ty)
  tx, ty = Magick::RVG.convert_to_float(tx, ty)
  @gc.translate(tx, ty)
  @tx = tx
  @ty = ty
  concat_matrix
  nil
end

#word_spacing(value) ⇒ Object



692
693
694
695
# File 'lib/rvg/misc.rb', line 692

def word_spacing(value)
  @text_attrs.word_spacing = Magick::RVG.convert_one_to_float(value)
  nil
end

#writing_mode(mode) ⇒ Object



697
698
699
700
# File 'lib/rvg/misc.rb', line 697

def writing_mode(mode)
  @text_attrs.writing_mode = mode
  nil
end