Class: HexaPDF::Content::GraphicsState

Inherits:
Object
  • Object
show all
Defined in:
lib/hexapdf/content/graphics_state.rb

Overview

A GraphicsState object holds all the graphic control parameters needed for correct operation when parsing or creating a content stream with a Processor object.

While a content stream is parsed/created, operations may use the current parameters or modify them.

The device-dependent graphics state parameters have not been implemented!

See: PDF2.0 s8.4.1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeGraphicsState

Initializes the graphics state parameters to their default values.



580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
# File 'lib/hexapdf/content/graphics_state.rb', line 580

def initialize
  @ctm = TransformationMatrix.new
  @stroke_color = @fill_color =
    GlobalConfiguration.constantize('color_space.map', :DeviceGray).new.default_color
  @line_width = 1.0
  @line_cap_style = LineCapStyle::BUTT_CAP
  @line_join_style = LineJoinStyle::MITER_JOIN
  @miter_limit = 10.0
  @line_dash_pattern = LineDashPattern.new
  @rendering_intent = RenderingIntent::RELATIVE_COLORIMETRIC
  @stroke_adjustment = false
  @blend_mode = :Normal
  @soft_mask = :None
  @stroke_alpha = @fill_alpha = 1.0
  @alpha_source = false

  @tm = nil
  @tlm = nil
  @character_spacing = 0
  @word_spacing = 0
  @horizontal_scaling = 100
  @leading = 0
  @font = nil
  @font_size = 0
  @text_rendering_mode = TextRenderingMode::FILL
  @text_rise = 0
  @text_knockout = true

  @scaled_character_spacing = 0
  @scaled_word_spacing = 0
  @scaled_font_size = 0
  @scaled_horizontal_scaling = 1

  @stack = []
end

Instance Attribute Details

#alpha_sourceObject

A boolean specifying whether the current soft mask and alpha parameters should be interpreted as shape values or opacity values.



490
491
492
# File 'lib/hexapdf/content/graphics_state.rb', line 490

def alpha_source
  @alpha_source
end

#blend_modeObject

The current blend mode for the transparent imaging model.



476
477
478
# File 'lib/hexapdf/content/graphics_state.rb', line 476

def blend_mode
  @blend_mode
end

#character_spacingObject

The character spacing in unscaled text units.

It specifies the additional spacing used for the horizontal or vertical displacement of glyphs.



506
507
508
# File 'lib/hexapdf/content/graphics_state.rb', line 506

def character_spacing
  @character_spacing
end

#ctmObject

The current transformation matrix.



445
446
447
# File 'lib/hexapdf/content/graphics_state.rb', line 445

def ctm
  @ctm
end

#fill_alphaObject

The alpha constant for non-stroking operations in the transparent imaging model.



486
487
488
# File 'lib/hexapdf/content/graphics_state.rb', line 486

def fill_alpha
  @fill_alpha
end

#fill_colorObject

The current color used for all other (i.e. non-stroking) painting operations.



451
452
453
# File 'lib/hexapdf/content/graphics_state.rb', line 451

def fill_color
  @fill_color
end

#fontObject

The font for the text.



524
525
526
# File 'lib/hexapdf/content/graphics_state.rb', line 524

def font
  @font
end

#font_sizeObject

The font size.



527
528
529
# File 'lib/hexapdf/content/graphics_state.rb', line 527

def font_size
  @font_size
end

#horizontal_scalingObject

The horizontal text scaling.

The value specifies the percentage of the normal width that should be used.



516
517
518
# File 'lib/hexapdf/content/graphics_state.rb', line 516

def horizontal_scaling
  @horizontal_scaling
end

#leadingObject

The leading in unscaled text units.

It specifies the distance between the baselines of adjacent lines of text.



521
522
523
# File 'lib/hexapdf/content/graphics_state.rb', line 521

def leading
  @leading
end

#line_cap_styleObject

The current line cap style (for the available values see LineCapStyle).



457
458
459
# File 'lib/hexapdf/content/graphics_state.rb', line 457

def line_cap_style
  @line_cap_style
end

#line_dash_patternObject

The line dash pattern (see LineDashPattern).



466
467
468
# File 'lib/hexapdf/content/graphics_state.rb', line 466

def line_dash_pattern
  @line_dash_pattern
end

#line_join_styleObject

The current line join style (for the available values see LineJoinStyle).



460
461
462
# File 'lib/hexapdf/content/graphics_state.rb', line 460

def line_join_style
  @line_join_style
end

#line_widthObject

The current line width in user space units.



454
455
456
# File 'lib/hexapdf/content/graphics_state.rb', line 454

def line_width
  @line_width
end

#miter_limitObject

The maximum line length of mitered line joins for stroked paths.



463
464
465
# File 'lib/hexapdf/content/graphics_state.rb', line 463

def miter_limit
  @miter_limit
end

#rendering_intentObject

The rendering intent (only used for CIE-based colors; for the available values see RenderingIntent).



470
471
472
# File 'lib/hexapdf/content/graphics_state.rb', line 470

def rendering_intent
  @rendering_intent
end

#scaled_character_spacingObject (readonly)

The scaled character spacing used in glyph displacement calculations.

This returns the character spacing multiplied by #scaled_horizontal_scaling.

See PDF2.0 s9.4.4



553
554
555
# File 'lib/hexapdf/content/graphics_state.rb', line 553

def scaled_character_spacing
  @scaled_character_spacing
end

#scaled_font_sizeObject (readonly)

The scaled font size used in glyph displacement calculations.

This returns the font size multiplied by the scaling factor from glyph space to text space (0.001 for all fonts except Type3 fonts or the scaling specified in /FontMatrix for Type3 fonts) and multiplied by #scaled_horizontal_scaling.

See PDF2.0 s9.4.4, HexaPDF::Type::FontType3



569
570
571
# File 'lib/hexapdf/content/graphics_state.rb', line 569

def scaled_font_size
  @scaled_font_size
end

#scaled_horizontal_scalingObject (readonly)

The scaled horizontal scaling used in glyph displacement calculations.

Since the horizontal scaling attribute is stored in percent of 100, this method returns the correct value for calculations.

See PDF2.0 s9.4.4



577
578
579
# File 'lib/hexapdf/content/graphics_state.rb', line 577

def scaled_horizontal_scaling
  @scaled_horizontal_scaling
end

#scaled_word_spacingObject (readonly)

The scaled word spacing used in glyph displacement calculations.

This returns the word spacing multiplied by #scaled_horizontal_scaling.

See PDF2.0 s9.4.4



560
561
562
# File 'lib/hexapdf/content/graphics_state.rb', line 560

def scaled_word_spacing
  @scaled_word_spacing
end

#soft_maskObject

The soft mask specifying the mask shape or mask opacity value to be used in the transparent imaging model.



480
481
482
# File 'lib/hexapdf/content/graphics_state.rb', line 480

def soft_mask
  @soft_mask
end

#stroke_adjustmentObject

The stroke adjustment for very small line width.



473
474
475
# File 'lib/hexapdf/content/graphics_state.rb', line 473

def stroke_adjustment
  @stroke_adjustment
end

#stroke_alphaObject

The alpha constant for stroking operations in the transparent imaging model.



483
484
485
# File 'lib/hexapdf/content/graphics_state.rb', line 483

def stroke_alpha
  @stroke_alpha
end

#stroke_colorObject

The current color used for stroking operations during painting.



448
449
450
# File 'lib/hexapdf/content/graphics_state.rb', line 448

def stroke_color
  @stroke_color
end

#text_knockoutObject

The text knockout, a boolean value.

It specifies whether each glyph should be treated as separate elementary object for the purpose of color compositing in the transparent imaging model (knockout = false) or if all glyphs together are treated as one elementary object (knockout = true).



546
547
548
# File 'lib/hexapdf/content/graphics_state.rb', line 546

def text_knockout
  @text_knockout
end

#text_rendering_modeObject

The text rendering mode.

It determines if and how the glyphs of a text should be shown (for all available values see TextRenderingMode).



533
534
535
# File 'lib/hexapdf/content/graphics_state.rb', line 533

def text_rendering_mode
  @text_rendering_mode
end

#text_riseObject

The text rise distance in unscaled text units.

It specifies the distance that the baseline should be moved up or down from its default location.



539
540
541
# File 'lib/hexapdf/content/graphics_state.rb', line 539

def text_rise
  @text_rise
end

#tlmObject

The text line matrix which captures the state of the text matrix at the beginning of a line.

As with the text matrix the text line matrix is non-nil only when inside a text object.



500
501
502
# File 'lib/hexapdf/content/graphics_state.rb', line 500

def tlm
  @tlm
end

#tmObject

The text matrix.

This attribute is non-nil only when inside a text object.



495
496
497
# File 'lib/hexapdf/content/graphics_state.rb', line 495

def tm
  @tm
end

#word_spacingObject

The word spacing in unscaled text units.

It works like the character spacing but is only applied to the ASCII space character.



511
512
513
# File 'lib/hexapdf/content/graphics_state.rb', line 511

def word_spacing
  @word_spacing
end

Instance Method Details

#fill_color_spaceObject

:nodoc:



671
672
673
# File 'lib/hexapdf/content/graphics_state.rb', line 671

def fill_color_space
  @fill_color.color_space
end

#fill_color_space=(color_space) ⇒ Object

:nodoc:



675
676
677
# File 'lib/hexapdf/content/graphics_state.rb', line 675

def fill_color_space=(color_space) #:nodoc:
  self.fill_color = color_space.default_color
end

#restoreObject

Restores the graphics state from the internal stack.

Raises an error if the stack is empty.



632
633
634
635
636
637
638
639
640
641
642
643
644
# File 'lib/hexapdf/content/graphics_state.rb', line 632

def restore
  if @stack.empty?
    raise HexaPDF::Error, "Can't restore graphics state because the stack is empty"
  end
  @ctm, @stroke_color, @fill_color,
    @line_width, @line_cap_style, @line_join_style, @miter_limit, @line_dash_pattern,
    @rendering_intent, @stroke_adjustment, @blend_mode,
    @soft_mask, @stroke_alpha, @fill_alpha, @alpha_source,
    @character_spacing, @word_spacing, @horizontal_scaling, @leading,
    @font, @font_size, @text_rendering_mode, @text_rise, @text_knockout,
    @scaled_character_spacing, @scaled_word_spacing, @scaled_font_size,
    @scaled_horizontal_scaling = @stack.pop
end

#saveObject

Saves the current graphics state on the internal stack.



617
618
619
620
621
622
623
624
625
626
627
# File 'lib/hexapdf/content/graphics_state.rb', line 617

def save
  @stack.push([@ctm, @stroke_color, @fill_color,
               @line_width, @line_cap_style, @line_join_style, @miter_limit,
               @line_dash_pattern, @rendering_intent, @stroke_adjustment, @blend_mode,
               @soft_mask, @stroke_alpha, @fill_alpha, @alpha_source,
               @character_spacing, @word_spacing, @horizontal_scaling, @leading,
               @font, @font_size, @text_rendering_mode, @text_rise, @text_knockout,
               @scaled_character_spacing, @scaled_word_spacing, @scaled_font_size,
               @scaled_horizontal_scaling])
  @ctm = @ctm.dup
end

#saved_states?Boolean

Returns true if the internal stack of saved graphic states contains entries.

Returns:

  • (Boolean)


647
648
649
# File 'lib/hexapdf/content/graphics_state.rb', line 647

def saved_states?
  !@stack.empty?
end

#stroke_color_spaceObject

:nodoc:



657
658
659
# File 'lib/hexapdf/content/graphics_state.rb', line 657

def stroke_color_space
  @stroke_color.color_space
end

#stroke_color_space=(color_space) ⇒ Object

:nodoc:



661
662
663
# File 'lib/hexapdf/content/graphics_state.rb', line 661

def stroke_color_space=(color_space) # :nodoc:
  self.stroke_color = color_space.default_color
end