psd 2.1.2 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/psd.rb +8 -6
- data/lib/psd/blend_mode.rb +46 -38
- data/lib/psd/channel_image.rb +9 -5
- data/lib/psd/descriptor.rb +39 -16
- data/lib/psd/header.rb +33 -32
- data/lib/psd/image_formats/rle.rb +4 -10
- data/lib/psd/image_modes/rgb.rb +4 -4
- data/lib/psd/layer.rb +1 -15
- data/lib/psd/layer/blend_modes.rb +12 -12
- data/lib/psd/layer/helpers.rb +8 -10
- data/lib/psd/layer/info.rb +9 -7
- data/lib/psd/layer/position_and_channels.rb +0 -4
- data/lib/psd/layer_info.rb +0 -4
- data/lib/psd/layer_info/blend_clipping_elements.rb +4 -2
- data/lib/psd/layer_info/blend_interior_elements.rb +4 -2
- data/lib/psd/layer_info/fill_opacity.rb +4 -2
- data/lib/psd/layer_info/layer_group.rb +4 -2
- data/lib/psd/layer_info/layer_id.rb +4 -2
- data/lib/psd/layer_info/layer_name_source.rb +4 -2
- data/lib/psd/layer_info/layer_section_divider.rb +4 -2
- data/lib/psd/layer_info/legacy_typetool.rb +5 -3
- data/lib/psd/layer_info/locked.rb +4 -2
- data/lib/psd/layer_info/metadata_setting.rb +4 -2
- data/lib/psd/layer_info/object_effects.rb +4 -2
- data/lib/psd/layer_info/pattern.rb +14 -0
- data/lib/psd/layer_info/placed_layer.rb +4 -2
- data/lib/psd/layer_info/reference_point.rb +4 -2
- data/lib/psd/layer_info/sheet_color.rb +18 -0
- data/lib/psd/layer_info/solid_color.rb +36 -0
- data/lib/psd/layer_info/typetool.rb +4 -2
- data/lib/psd/layer_info/unicode_name.rb +4 -2
- data/lib/psd/layer_info/vector_mask.rb +4 -2
- data/lib/psd/layer_info/vector_origination.rb +14 -0
- data/lib/psd/layer_info/vector_stroke.rb +4 -2
- data/lib/psd/layer_info/vector_stroke_content.rb +4 -2
- data/lib/psd/layer_mask.rb +2 -8
- data/lib/psd/lazy_execute.rb +5 -1
- data/lib/psd/node.rb +112 -48
- data/lib/psd/nodes/ancestry.rb +80 -75
- data/lib/psd/nodes/build_preview.rb +4 -4
- data/lib/psd/nodes/group.rb +35 -0
- data/lib/psd/nodes/layer.rb +40 -0
- data/lib/psd/nodes/root.rb +90 -0
- data/lib/psd/nodes/search.rb +19 -19
- data/lib/psd/path_record.rb +1 -71
- data/lib/psd/renderer.rb +6 -5
- data/lib/psd/renderer/blender.rb +10 -5
- data/lib/psd/renderer/cairo_helpers.rb +46 -0
- data/lib/psd/renderer/canvas.rb +39 -19
- data/lib/psd/renderer/canvas_management.rb +2 -2
- data/lib/psd/renderer/clipping_mask.rb +5 -4
- data/lib/psd/renderer/compose.rb +61 -68
- data/lib/psd/renderer/layer_styles.rb +15 -5
- data/lib/psd/renderer/layer_styles/color_overlay.rb +46 -27
- data/lib/psd/renderer/mask.rb +26 -22
- data/lib/psd/renderer/mask_canvas.rb +12 -0
- data/lib/psd/renderer/vector_shape.rb +239 -0
- data/lib/psd/resource_section.rb +4 -7
- data/lib/psd/resources.rb +4 -19
- data/lib/psd/resources/base.rb +27 -0
- data/lib/psd/resources/guides.rb +6 -4
- data/lib/psd/resources/layer_comps.rb +6 -4
- data/lib/psd/resources/slices.rb +7 -5
- data/lib/psd/version.rb +1 -1
- data/psd.gemspec +1 -2
- data/spec/files/blendmodes.psd +0 -0
- data/spec/hierarchy_spec.rb +5 -0
- metadata +27 -26
- data/lib/psd/layer_info/vector_mask_2.rb +0 -10
- data/lib/psd/node_exporting.rb +0 -20
- data/lib/psd/node_group.rb +0 -86
- data/lib/psd/node_layer.rb +0 -81
- data/lib/psd/node_root.rb +0 -93
- data/lib/psd/nodes/has_children.rb +0 -13
- data/lib/psd/nodes/lock_to_origin.rb +0 -7
- data/lib/psd/nodes/parse_layers.rb +0 -18
- data/lib/psd/renderer/layer_styles/drop_shadow.rb +0 -75
- data/lib/psd/section.rb +0 -26
data/lib/psd/node_root.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
require_relative 'node'
|
2
|
-
|
3
|
-
class PSD::Node
|
4
|
-
# Represents the root node of a Photoshop document
|
5
|
-
class Root < PSD::Node
|
6
|
-
include PSD::HasChildren
|
7
|
-
include PSD::Node::ParseLayers
|
8
|
-
|
9
|
-
attr_accessor :children
|
10
|
-
attr_reader :psd
|
11
|
-
|
12
|
-
# Stores a reference to the parsed PSD and builds the
|
13
|
-
# tree hierarchy.
|
14
|
-
def initialize(psd)
|
15
|
-
@psd = psd
|
16
|
-
build_hierarchy
|
17
|
-
end
|
18
|
-
|
19
|
-
# Recursively exports the hierarchy to a Hash
|
20
|
-
def to_hash
|
21
|
-
{
|
22
|
-
children: children.map(&:to_hash),
|
23
|
-
document: {
|
24
|
-
width: document_width,
|
25
|
-
height: document_height,
|
26
|
-
resources: {
|
27
|
-
layer_comps: @psd.layer_comps,
|
28
|
-
guides: @psd.guides,
|
29
|
-
slices: @psd.slices
|
30
|
-
}
|
31
|
-
}
|
32
|
-
}
|
33
|
-
end
|
34
|
-
|
35
|
-
# Returns the width and height of the entire PSD document.
|
36
|
-
def document_dimensions
|
37
|
-
[document_width, document_height]
|
38
|
-
end
|
39
|
-
|
40
|
-
# The width of the full PSD document as defined in the header.
|
41
|
-
def document_width
|
42
|
-
@psd.header.width.to_i
|
43
|
-
end
|
44
|
-
alias_method :width, :document_width
|
45
|
-
|
46
|
-
# The height of the full PSD document as defined in the header.
|
47
|
-
def document_height
|
48
|
-
@psd.header.height.to_i
|
49
|
-
end
|
50
|
-
alias_method :height, :document_height
|
51
|
-
|
52
|
-
# The root node has no name since it's not an actual layer or group.
|
53
|
-
def name
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
|
57
|
-
# The depth of the root node is always 0.
|
58
|
-
def depth
|
59
|
-
0
|
60
|
-
end
|
61
|
-
|
62
|
-
[:top, :right, :bottom, :left].each do |meth|
|
63
|
-
define_method(meth) { 0 }
|
64
|
-
end
|
65
|
-
|
66
|
-
def opacity; 255; end
|
67
|
-
def fill_opacity; 255; end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def build_hierarchy
|
72
|
-
@children = []
|
73
|
-
result = { layers: [] }
|
74
|
-
parseStack = []
|
75
|
-
|
76
|
-
# First we build the hierarchy
|
77
|
-
@psd.layers.each do |layer|
|
78
|
-
if layer.folder?
|
79
|
-
parseStack << result
|
80
|
-
result = { name: layer.name, layer: layer, layers: [] }
|
81
|
-
elsif layer.folder_end?
|
82
|
-
temp = result
|
83
|
-
result = parseStack.pop
|
84
|
-
result[:layers] << temp
|
85
|
-
else
|
86
|
-
result[:layers] << layer
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
parse_layers(result[:layers])
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class PSD
|
2
|
-
module HasChildren
|
3
|
-
# Returns all group/folder children of this node.
|
4
|
-
def groups
|
5
|
-
@children.select{ |c| c.is_a?(PSD::Group) }
|
6
|
-
end
|
7
|
-
|
8
|
-
# Returns all layer children of this node.
|
9
|
-
def layers
|
10
|
-
@children.select{ |c| c.is_a?(PSD::Layer) }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class PSD::Node
|
2
|
-
module ParseLayers
|
3
|
-
# Organizes the flat layer structure into tree nodes.
|
4
|
-
def parse_layers(layers)
|
5
|
-
@children = []
|
6
|
-
layers.each do |layer|
|
7
|
-
if layer.is_a?(Hash)
|
8
|
-
node = PSD::Node::Group.new(layer)
|
9
|
-
elsif layer.is_a?(PSD::Layer)
|
10
|
-
node = PSD::Node::Layer.new(layer)
|
11
|
-
end
|
12
|
-
|
13
|
-
node.parent = self
|
14
|
-
@children << node
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
class PSD
|
2
|
-
class LayerStyles
|
3
|
-
# Not ready yet.
|
4
|
-
class DropShadow
|
5
|
-
def self.should_apply?(data)
|
6
|
-
#data.has_key?('DrSh')
|
7
|
-
false
|
8
|
-
end
|
9
|
-
|
10
|
-
def initialize(styles)
|
11
|
-
end
|
12
|
-
|
13
|
-
def apply!
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def apply_drop_shadow
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def drop_shadow
|
23
|
-
data['DrSh']
|
24
|
-
end
|
25
|
-
|
26
|
-
def drop_shadow_blend_mode
|
27
|
-
drop_shadow['Md ']
|
28
|
-
end
|
29
|
-
|
30
|
-
def drop_shadow_opacity
|
31
|
-
drop_shadow['Opct'][:value]
|
32
|
-
end
|
33
|
-
|
34
|
-
def drop_shadow_light_angle
|
35
|
-
drop_shadow['lagl'][:value]
|
36
|
-
end
|
37
|
-
|
38
|
-
def drop_shadow_use_global_light?
|
39
|
-
drop_shadow['uglg']
|
40
|
-
end
|
41
|
-
|
42
|
-
def drop_shadow_distance
|
43
|
-
drop_shadow['Dstn'][:value]
|
44
|
-
end
|
45
|
-
|
46
|
-
def drop_shadow_spread
|
47
|
-
drop_shadow['Ckmt'][:value]
|
48
|
-
end
|
49
|
-
|
50
|
-
def drop_shadow_size
|
51
|
-
drop_shadow['blur'][:value]
|
52
|
-
end
|
53
|
-
|
54
|
-
def drop_shadow_noise
|
55
|
-
drop_shadow['Nose'][:value]
|
56
|
-
end
|
57
|
-
|
58
|
-
def drop_shadow_antialiased?
|
59
|
-
drop_shadow['AntA']
|
60
|
-
end
|
61
|
-
|
62
|
-
def drop_shadow_contour
|
63
|
-
drop_shadow['TrnS']['Nm ']
|
64
|
-
end
|
65
|
-
|
66
|
-
def drop_shadow_contour_curve
|
67
|
-
drop_shadow['TrnS']['Crv ']
|
68
|
-
end
|
69
|
-
|
70
|
-
def drop_shadow_knock_out?
|
71
|
-
drop_shadow['layerConceals']
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
data/lib/psd/section.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
class PSD
|
2
|
-
# Helper that lets us track the beginning and ending locations
|
3
|
-
# of each section. This is for debug and error catching purposes,
|
4
|
-
# primarily.
|
5
|
-
module Section
|
6
|
-
attr_reader :section_start, :section_end
|
7
|
-
|
8
|
-
def start_section(section=:all)
|
9
|
-
@section_start = {} unless @section_start
|
10
|
-
@section_start[section] = @file.tell
|
11
|
-
end
|
12
|
-
|
13
|
-
def end_section(section=:all)
|
14
|
-
@section_end = {} unless @section_end
|
15
|
-
@section_end[section] = @file.tell
|
16
|
-
end
|
17
|
-
|
18
|
-
def start_of_section(section=:all)
|
19
|
-
@section_start[section]
|
20
|
-
end
|
21
|
-
|
22
|
-
def end_of_section(section=:all)
|
23
|
-
@section_end[section]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|