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: PDF1.7 s8.4.1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeGraphicsState

Initializes the graphics state parameters to their default values.



443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
# File 'lib/hexapdf/content/graphics_state.rb', line 443

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.



355
356
357
# File 'lib/hexapdf/content/graphics_state.rb', line 355

def alpha_source
  @alpha_source
end

#blend_modeObject

The current blend mode for the transparent imaging model.



341
342
343
# File 'lib/hexapdf/content/graphics_state.rb', line 341

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.



371
372
373
# File 'lib/hexapdf/content/graphics_state.rb', line 371

def character_spacing
  @character_spacing
end

#ctmObject

The current transformation matrix.



310
311
312
# File 'lib/hexapdf/content/graphics_state.rb', line 310

def ctm
  @ctm
end

#fill_alphaObject

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



351
352
353
# File 'lib/hexapdf/content/graphics_state.rb', line 351

def fill_alpha
  @fill_alpha
end

#fill_colorObject

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



316
317
318
# File 'lib/hexapdf/content/graphics_state.rb', line 316

def fill_color
  @fill_color
end

#fontObject

The font for the text.



389
390
391
# File 'lib/hexapdf/content/graphics_state.rb', line 389

def font
  @font
end

#font_sizeObject

The font size.



392
393
394
# File 'lib/hexapdf/content/graphics_state.rb', line 392

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.



381
382
383
# File 'lib/hexapdf/content/graphics_state.rb', line 381

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.



386
387
388
# File 'lib/hexapdf/content/graphics_state.rb', line 386

def leading
  @leading
end

#line_cap_styleObject

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



322
323
324
# File 'lib/hexapdf/content/graphics_state.rb', line 322

def line_cap_style
  @line_cap_style
end

#line_dash_patternObject

The line dash pattern (see LineDashPattern).



331
332
333
# File 'lib/hexapdf/content/graphics_state.rb', line 331

def line_dash_pattern
  @line_dash_pattern
end

#line_join_styleObject

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



325
326
327
# File 'lib/hexapdf/content/graphics_state.rb', line 325

def line_join_style
  @line_join_style
end

#line_widthObject

The current line width in user space units.



319
320
321
# File 'lib/hexapdf/content/graphics_state.rb', line 319

def line_width
  @line_width
end

#miter_limitObject

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



328
329
330
# File 'lib/hexapdf/content/graphics_state.rb', line 328

def miter_limit
  @miter_limit
end

#rendering_intentObject

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



335
336
337
# File 'lib/hexapdf/content/graphics_state.rb', line 335

def rendering_intent
  @rendering_intent
end

#scaled_character_spacingObject (readonly)

The scaled character spacing used in glyph displacement calculations.

This returns the value T_c multiplied by #scaled_horizontal_scaling.

See PDF1.7 s9.4.4



418
419
420
# File 'lib/hexapdf/content/graphics_state.rb', line 418

def scaled_character_spacing
  @scaled_character_spacing
end

#scaled_font_sizeObject (readonly)

The scaled font size used in glyph displacement calculations.

This returns the value T_fs / 1000 multiplied by #scaled_horizontal_scaling.

See PDF1.7 s9.4.4



432
433
434
# File 'lib/hexapdf/content/graphics_state.rb', line 432

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 PDF1.7 s9.4.4



440
441
442
# File 'lib/hexapdf/content/graphics_state.rb', line 440

def scaled_horizontal_scaling
  @scaled_horizontal_scaling
end

#scaled_word_spacingObject (readonly)

The scaled word spacing used in glyph displacement calculations.

This returns the value T_w multiplied by #scaled_horizontal_scaling.

See PDF1.7 s9.4.4



425
426
427
# File 'lib/hexapdf/content/graphics_state.rb', line 425

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.



345
346
347
# File 'lib/hexapdf/content/graphics_state.rb', line 345

def soft_mask
  @soft_mask
end

#stroke_adjustmentObject

The stroke adjustment for very small line width.



338
339
340
# File 'lib/hexapdf/content/graphics_state.rb', line 338

def stroke_adjustment
  @stroke_adjustment
end

#stroke_alphaObject

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



348
349
350
# File 'lib/hexapdf/content/graphics_state.rb', line 348

def stroke_alpha
  @stroke_alpha
end

#stroke_colorObject

The current color used for stroking operations during painting.



313
314
315
# File 'lib/hexapdf/content/graphics_state.rb', line 313

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).



411
412
413
# File 'lib/hexapdf/content/graphics_state.rb', line 411

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).



398
399
400
# File 'lib/hexapdf/content/graphics_state.rb', line 398

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.



404
405
406
# File 'lib/hexapdf/content/graphics_state.rb', line 404

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.



365
366
367
# File 'lib/hexapdf/content/graphics_state.rb', line 365

def tlm
  @tlm
end

#tmObject

The text matrix.

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



360
361
362
# File 'lib/hexapdf/content/graphics_state.rb', line 360

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.



376
377
378
# File 'lib/hexapdf/content/graphics_state.rb', line 376

def word_spacing
  @word_spacing
end

Instance Method Details

#fill_color_spaceObject

:nodoc:



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

def fill_color_space
  @fill_color.color_space
end

#fill_color_space=(color_space) ⇒ Object

:nodoc:



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

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.



495
496
497
498
499
500
501
502
503
504
505
506
507
# File 'lib/hexapdf/content/graphics_state.rb', line 495

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.



480
481
482
483
484
485
486
487
488
489
490
# File 'lib/hexapdf/content/graphics_state.rb', line 480

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)


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

def saved_states?
  !@stack.empty?
end

#stroke_color_spaceObject

:nodoc:



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

def stroke_color_space
  @stroke_color.color_space
end

#stroke_color_space=(color_space) ⇒ Object

:nodoc:



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

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