# encoding: utf-8
#
# soft_mask.rb : Implements soft-masking
#
# Copyright September 2012, Alexander Mankuta. All Rights Reserved.
#
# This is free software. Please see the LICENSE and COPYING files for details.
#
module Prawn
# The Prawn::SoftMask module is used to create arbitrary transparency in
# document. Using a soft mask allows creaing more visually rich documents.
#
# You must group soft mask and graphics it's applied to under
# save_graphics_state because soft mask is a part of graphic state in PDF.
#
# Example:
# pdf.save_graphics_state do
# pdf.soft_mask do
# pdf.fill_color "444444"
# pdf.fill_polygon [0, 40], [60, 10], [120, 40], [60, 68]
# end
# pdf.fill_color '000000'
# pdf.fill_rectangle [0, 50], 120, 68
# end
#
module SoftMask
def soft_mask(&block)
min_version(1.4)
group_attrs = ref!({
:Type => :Group,
:S => :Transparency,
:CS => :DeviceRGB,
:I => false,
:K => false
})
group = ref!({
:Type => :XObject,
:Subtype => :Form,
:BBox => state.page.dimensions,
:Group => group_attrs,
})
state.page.stamp_stream(group, &block)
mask = ref!({
:Type => :Mask,
:S => :Luminosity,
:G => group
})
g_state = ref!({
:Type => :ExtGState,
:SMask => mask,
:AIS => false,
:BM => :Normal,
:OP => false,
:op => false,
:OPM => 1,
:SA => true,
})
registry_key = {
:bbox => state.page.dimensions,
:mask => group.stream,
:page => state.page_count,
}.hash
if soft_mask_registry[registry_key]
[g_state, mask, group, group_attrs].each { |ref| ref.live = false }
add_content "/#{soft_mask_registry[registry_key]} gs"
else
masks = page.resources[:ExtGState] ||= {}
id = masks.empty? ? 'GS1' : masks.keys.sort.last.succ
masks[id] = g_state
soft_mask_registry[registry_key] = id
add_content "/#{id} gs"
end
end
private
def soft_mask_registry
@soft_mask_registry ||= {}
end
end
end