psd 3.2.4 → 3.3.1
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/.travis.yml +1 -0
- data/README.md +25 -0
- data/lib/psd.rb +24 -17
- data/lib/psd/channel_image.rb +2 -0
- data/lib/psd/helpers.rb +2 -2
- data/lib/psd/image.rb +11 -7
- data/lib/psd/layer.rb +12 -1
- data/lib/psd/layer/blend_modes.rb +4 -2
- data/lib/psd/layer/info.rb +24 -0
- data/lib/psd/{layer_info → layer/info}/blend_clipping_elements.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/blend_interior_elements.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/fill_opacity.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/gradient_fill.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/layer_group.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/layer_id.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/layer_name_source.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/layer_section_divider.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/legacy_typetool.rb +2 -2
- data/lib/psd/{layer_info → layer/info}/locked.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/metadata_setting.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/object_effects.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/pattern.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/placed_layer.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/reference_point.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/sheet_color.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/solid_color.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/typetool.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/unicode_name.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/vector_mask.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/vector_origination.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/vector_stroke.rb +0 -0
- data/lib/psd/{layer_info → layer/info}/vector_stroke_content.rb +0 -0
- data/lib/psd/node.rb +13 -7
- data/lib/psd/nodes/ancestry.rb +76 -80
- data/lib/psd/nodes/layer.rb +5 -5
- data/lib/psd/nodes/search.rb +5 -1
- data/lib/psd/renderer.rb +8 -1
- data/lib/psd/renderer/canvas.rb +4 -2
- data/lib/psd/resources.rb +5 -1
- data/lib/psd/resources/base.rb +6 -3
- data/lib/psd/slice.rb +39 -0
- data/lib/psd/slices.rb +13 -0
- data/lib/psd/version.rb +1 -1
- data/psd.gemspec +0 -1
- metadata +28 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c7fc077ce3a8060aa8522a16838388a5a1930fa
|
4
|
+
data.tar.gz: 07cd330663d7d94810c89f031d09bc41269610b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b6deef34cb5f66e8c079da3c72ffae7d2f8ad8baed3a91f1f8552d29a8bd6dcead464474bed1f715c60a1927e48e22ecd7583f80aaad580c95e536bc2e86532
|
7
|
+
data.tar.gz: 5526dceb6954320be9ae3fd1d3a5a55b9820a8db16e68fea257e07f49f2f1207780010ec09a4cb2a73feca8c11895d112cb4dc16097fc3deff619c90268ebbfd
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -219,6 +219,31 @@ psd.tree.filter_by_comp("Version A").save_as_png('./Version A.png')
|
|
219
219
|
psd.tree.children_at_path("Group 1").first.to_png
|
220
220
|
```
|
221
221
|
|
222
|
+
### Slices
|
223
|
+
|
224
|
+
Because slices are relative to the full document, you can access them directly on the `psd` object. Use `psd.slices` to get an array of all slices in the document.
|
225
|
+
|
226
|
+
``` ruby
|
227
|
+
slices = psd.slices
|
228
|
+
slices.first.name #=> "Logo"
|
229
|
+
slices.first.left #=> 20
|
230
|
+
slices.first.width #=> 200
|
231
|
+
```
|
232
|
+
|
233
|
+
You can also search for slices if you know their name or ID. Because slice names do not need to be unique, `slices_by_name` will always return an array of all matches.
|
234
|
+
|
235
|
+
``` ruby
|
236
|
+
psd.slice_by_id(2)
|
237
|
+
psd.slices_by_name('Logo')
|
238
|
+
```
|
239
|
+
|
240
|
+
Finally, you can export slices as PNGs.
|
241
|
+
|
242
|
+
``` ruby
|
243
|
+
psd.slices.first.to_png #=> ChunkyPNG canvas
|
244
|
+
psd.slices_by_name('Logo').first.save_as_png('Logo.png') #=> writes Logo.png
|
245
|
+
```
|
246
|
+
|
222
247
|
### Debugging
|
223
248
|
|
224
249
|
If you run into any problems parsing a PSD, you can enable debug logging via the `PSD_DEBUG` environment variable. For example:
|
data/lib/psd.rb
CHANGED
@@ -1,23 +1,29 @@
|
|
1
|
+
require 'forwardable'
|
1
2
|
require 'psd/enginedata'
|
2
3
|
require 'chunky_png'
|
3
4
|
require 'xmp'
|
4
|
-
|
5
|
-
|
6
|
-
require '
|
7
|
-
require '
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
5
|
+
|
6
|
+
require 'psd/blend_mode'
|
7
|
+
require 'psd/channel_image'
|
8
|
+
require 'psd/color'
|
9
|
+
require 'psd/descriptor'
|
10
|
+
require 'psd/file'
|
11
|
+
require 'psd/header'
|
12
|
+
require 'psd/helpers'
|
13
|
+
require 'psd/image'
|
14
|
+
require 'psd/layer'
|
15
|
+
require 'psd/layer_info'
|
16
|
+
require 'psd/layer_mask'
|
17
|
+
require 'psd/lazy_execute'
|
18
|
+
require 'psd/logger'
|
19
|
+
require 'psd/mask'
|
20
|
+
require 'psd/node'
|
21
|
+
require 'psd/path_record'
|
22
|
+
require 'psd/renderer'
|
23
|
+
require 'psd/resources'
|
24
|
+
require 'psd/slices'
|
25
|
+
require 'psd/util'
|
26
|
+
require 'psd/version'
|
21
27
|
|
22
28
|
# A general purpose parser for Photoshop files. PSDs are broken up in to 4 logical sections:
|
23
29
|
# the header, resources, the layer mask (including layers), and the preview image. We parse
|
@@ -25,6 +31,7 @@ end
|
|
25
31
|
class PSD
|
26
32
|
include Logger
|
27
33
|
include Helpers
|
34
|
+
include Slices
|
28
35
|
|
29
36
|
attr_reader :file, :opts
|
30
37
|
alias :options :opts
|
data/lib/psd/channel_image.rb
CHANGED
data/lib/psd/helpers.rb
CHANGED
data/lib/psd/image.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
require 'psd/image_formats/raw'
|
2
|
+
require 'psd/image_formats/rle'
|
3
|
+
require 'psd/image_modes/cmyk'
|
4
|
+
require 'psd/image_modes/greyscale'
|
5
|
+
require 'psd/image_modes/rgb'
|
6
|
+
require 'psd/image_exports/png'
|
7
|
+
|
1
8
|
class PSD
|
2
9
|
# Parses the full preview image at the end of the PSD document.
|
3
10
|
class Image
|
11
|
+
extend Forwardable
|
4
12
|
include ImageFormat::RAW
|
5
13
|
include ImageFormat::RLE
|
6
14
|
include ImageMode::CMYK
|
@@ -11,6 +19,9 @@ class PSD
|
|
11
19
|
attr_reader :pixel_data, :opacity, :has_mask
|
12
20
|
alias :has_mask? :has_mask
|
13
21
|
|
22
|
+
# We delegate a few useful methods to the header.
|
23
|
+
def_delegators :@header, :height, :width, :channels, :depth, :mode
|
24
|
+
|
14
25
|
# All of the possible compression formats Photoshop uses.
|
15
26
|
COMPRESSIONS = [
|
16
27
|
'Raw',
|
@@ -60,13 +71,6 @@ class PSD
|
|
60
71
|
return self
|
61
72
|
end
|
62
73
|
|
63
|
-
# We delegate a few useful methods to the header.
|
64
|
-
[:height, :width, :channels, :depth, :mode].each do |attribute|
|
65
|
-
define_method attribute do
|
66
|
-
@header.send(attribute)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
74
|
private
|
71
75
|
|
72
76
|
def set_channels_info
|
data/lib/psd/layer.rb
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
require 'psd/layer/blend_modes'
|
2
|
+
require 'psd/layer/blending_ranges'
|
3
|
+
require 'psd/layer/channel_image'
|
4
|
+
require 'psd/layer/exporting'
|
5
|
+
require 'psd/layer/helpers'
|
6
|
+
require 'psd/layer/info'
|
7
|
+
require 'psd/layer/mask'
|
8
|
+
require 'psd/layer/name'
|
9
|
+
require 'psd/layer/path_components'
|
10
|
+
require 'psd/layer/position_and_channels'
|
11
|
+
|
1
12
|
class PSD
|
2
13
|
# Represents a single layer and all of the data associated with
|
3
14
|
# that layer.
|
@@ -60,4 +71,4 @@ class PSD
|
|
60
71
|
self.send(val)
|
61
72
|
end
|
62
73
|
end
|
63
|
-
end
|
74
|
+
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
class PSD
|
2
2
|
class Layer
|
3
3
|
module BlendModes
|
4
|
+
extend Forwardable
|
5
|
+
|
4
6
|
attr_reader :blend_mode
|
5
7
|
|
6
|
-
|
8
|
+
def_delegators :blend_mode, :opacity, :visible, :clipped?
|
7
9
|
alias_method :visible?, :visible
|
8
10
|
|
9
11
|
# Is this layer hidden?
|
@@ -27,4 +29,4 @@ class PSD
|
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
30
|
-
end
|
32
|
+
end
|
data/lib/psd/layer/info.rb
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
require 'psd/layer/info/blend_clipping_elements'
|
2
|
+
require 'psd/layer/info/blend_interior_elements'
|
3
|
+
require 'psd/layer/info/fill_opacity'
|
4
|
+
require 'psd/layer/info/gradient_fill'
|
5
|
+
require 'psd/layer/info/layer_group'
|
6
|
+
require 'psd/layer/info/layer_id'
|
7
|
+
require 'psd/layer/info/layer_name_source'
|
8
|
+
require 'psd/layer/info/layer_section_divider'
|
9
|
+
require 'psd/layer/info/legacy_typetool'
|
10
|
+
require 'psd/layer/info/locked'
|
11
|
+
require 'psd/layer/info/metadata_setting'
|
12
|
+
require 'psd/layer/info/object_effects'
|
13
|
+
require 'psd/layer/info/pattern'
|
14
|
+
require 'psd/layer/info/placed_layer'
|
15
|
+
require 'psd/layer/info/reference_point'
|
16
|
+
require 'psd/layer/info/sheet_color'
|
17
|
+
require 'psd/layer/info/solid_color'
|
18
|
+
require 'psd/layer/info/typetool'
|
19
|
+
require 'psd/layer/info/unicode_name'
|
20
|
+
require 'psd/layer/info/vector_mask'
|
21
|
+
require 'psd/layer/info/vector_origination'
|
22
|
+
require 'psd/layer/info/vector_stroke'
|
23
|
+
require 'psd/layer/info/vector_stroke_content'
|
24
|
+
|
1
25
|
class PSD
|
2
26
|
class Layer
|
3
27
|
module Info
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/psd/node.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'psd/nodes/ancestry'
|
2
|
+
require 'psd/nodes/build_preview'
|
2
3
|
require 'psd/nodes/search'
|
3
4
|
require 'psd/nodes/layer_comps'
|
4
|
-
require 'psd/nodes/build_preview'
|
5
5
|
|
6
6
|
# Internal structure to help us build trees of a Photoshop documents.
|
7
7
|
# A lot of method names borrowed from the Ruby ancestry gem.
|
8
8
|
class PSD
|
9
9
|
module Node
|
10
10
|
class Base
|
11
|
+
extend Forwardable
|
12
|
+
|
11
13
|
include Enumerable
|
12
14
|
include Ancestry
|
13
15
|
include Search
|
@@ -17,13 +19,12 @@ class PSD
|
|
17
19
|
# Default properties that all nodes contain
|
18
20
|
PROPERTIES = [:name, :left, :right, :top, :bottom, :height, :width]
|
19
21
|
|
20
|
-
attr_reader :name, :parent
|
22
|
+
attr_reader :id, :name, :parent
|
21
23
|
attr_accessor :children, :layer, :force_visible, :top_offset, :left_offset
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
delegate :document_dimensions, to: :parent
|
25
|
+
def_delegators :parent, :psd, :document_dimensions
|
26
|
+
def_delegator :layer, :name
|
27
|
+
def_delegator :children, :each
|
27
28
|
|
28
29
|
def initialize(layer, parent = nil)
|
29
30
|
@layer = layer
|
@@ -32,6 +33,7 @@ class PSD
|
|
32
33
|
@parent = parent
|
33
34
|
@children = []
|
34
35
|
|
36
|
+
@id = begin layer.layer_id.id rescue nil end
|
35
37
|
@force_visible = nil
|
36
38
|
@top = @layer.top.to_i
|
37
39
|
@bottom = @layer.bottom.to_i
|
@@ -141,4 +143,8 @@ class PSD
|
|
141
143
|
end
|
142
144
|
end
|
143
145
|
end
|
144
|
-
end
|
146
|
+
end
|
147
|
+
|
148
|
+
require 'psd/nodes/group'
|
149
|
+
require 'psd/nodes/layer'
|
150
|
+
require 'psd/nodes/root'
|
data/lib/psd/nodes/ancestry.rb
CHANGED
@@ -2,102 +2,98 @@ class PSD
|
|
2
2
|
module Node
|
3
3
|
# Collection of methods to help in traversing the PSD tree structure.
|
4
4
|
module Ancestry
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
return self if is_root?
|
11
|
-
return parent.root
|
12
|
-
end
|
5
|
+
# Returns the root node
|
6
|
+
def root
|
7
|
+
return self if is_root?
|
8
|
+
return parent.root
|
9
|
+
end
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
# Is this node the root node?
|
12
|
+
def root?
|
13
|
+
self.is_a?(PSD::Node::Root)
|
14
|
+
end
|
15
|
+
alias :is_root? :root?
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
# Returns all ancestors in the path of this node. This
|
18
|
+
# does NOT return the root node.
|
19
|
+
def ancestors
|
20
|
+
return [] if parent.nil? || parent.is_root?
|
21
|
+
return parent.ancestors + [parent]
|
22
|
+
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
# Does this node have any children nodes?
|
25
|
+
def has_children?
|
26
|
+
children.length > 0
|
27
|
+
end
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
# Inverse of has_children?
|
30
|
+
def childless?
|
31
|
+
!has_children?
|
32
|
+
end
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
# Returns all sibling nodes including the current node. Can also
|
35
|
+
# be thought of as all children of the parent of this node.
|
36
|
+
def siblings
|
37
|
+
return [] if parent.nil?
|
38
|
+
parent.children
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
def next_sibling
|
42
|
+
return nil if parent.nil?
|
43
|
+
index = siblings.index(self)
|
44
|
+
siblings[index + 1]
|
45
|
+
end
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
47
|
+
def prev_sibling
|
48
|
+
return nil if parent.nil?
|
49
|
+
index = siblings.index(self)
|
50
|
+
siblings[index - 1]
|
51
|
+
end
|
55
52
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
# Does this node have any siblings?
|
54
|
+
def has_siblings?
|
55
|
+
siblings.length > 1
|
56
|
+
end
|
60
57
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
# Is this node the only descendant of its parent?
|
59
|
+
def only_child?
|
60
|
+
siblings.length == 1
|
61
|
+
end
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
# Recursively get all descendant nodes, not including this node.
|
64
|
+
def descendants
|
65
|
+
children.map(&:subtree).flatten
|
66
|
+
end
|
70
67
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
68
|
+
# Same as descendants, except it includes this node.
|
69
|
+
def subtree
|
70
|
+
[self] + descendants
|
71
|
+
end
|
75
72
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
73
|
+
# Depth from the root node. Root depth is 0.
|
74
|
+
def depth
|
75
|
+
return ancestors.length + 1
|
76
|
+
end
|
80
77
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
78
|
+
def path(as_array = false)
|
79
|
+
path = (ancestors.map(&:name) + [name])
|
80
|
+
as_array ? path : path.join('/')
|
81
|
+
end
|
85
82
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
end
|
83
|
+
def method_missing(method, *args, &block)
|
84
|
+
test = /^(.+)_(layers|groups)$/.match(method)
|
85
|
+
if test
|
86
|
+
m = self.respond_to?(test[1]) ? test[1] : "#{test[1]}s"
|
87
|
+
self.send(m).select &method("#{test[2]}_only")
|
88
|
+
else
|
89
|
+
super
|
94
90
|
end
|
91
|
+
end
|
95
92
|
|
96
|
-
|
93
|
+
private
|
97
94
|
|
98
|
-
|
99
|
-
|
100
|
-
end
|
95
|
+
def layers_only(d); d.layer?; end
|
96
|
+
def groups_only(d); d.group?(false); end
|
101
97
|
end
|
102
98
|
end
|
103
|
-
end
|
99
|
+
end
|
data/lib/psd/nodes/layer.rb
CHANGED
@@ -3,12 +3,12 @@ require 'psd/node'
|
|
3
3
|
class PSD
|
4
4
|
module Node
|
5
5
|
class Layer < PSD::Node::Base
|
6
|
+
extend Forwardable
|
7
|
+
|
6
8
|
attr_reader :layer
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
delegate "#{prop}=", to: :@layer
|
11
|
-
end
|
10
|
+
def_delegators :@layer, :text, :ref_x, :ref_y, :blending_mode
|
11
|
+
def_delegators :@layer, :text=, :ref_x=, :ref_y=, :blending_mode=
|
12
12
|
|
13
13
|
def empty?
|
14
14
|
width == 0 || height == 0
|
@@ -42,4 +42,4 @@ class PSD
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
45
|
-
end
|
45
|
+
end
|
data/lib/psd/nodes/search.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
class PSD
|
2
2
|
module Node
|
3
3
|
module Search
|
4
|
+
def find_by_id(id)
|
5
|
+
subtree.select { |n| n.id == id }.first
|
6
|
+
end
|
7
|
+
|
4
8
|
# Searches the tree structure for a node at the given path. The path is
|
5
9
|
# defined by the layer/folder names. Because the PSD format does not
|
6
10
|
# require unique layer/folder names, we always return an array of all
|
@@ -27,4 +31,4 @@ class PSD
|
|
27
31
|
alias :children_with_path :children_at_path
|
28
32
|
end
|
29
33
|
end
|
30
|
-
end
|
34
|
+
end
|
data/lib/psd/renderer.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
+
require 'psd/renderer/blender'
|
2
|
+
require 'psd/renderer/canvas'
|
1
3
|
require 'psd/renderer/canvas_management'
|
4
|
+
require 'psd/renderer/clipping_mask'
|
5
|
+
require 'psd/renderer/compose'
|
6
|
+
require 'psd/renderer/layer_styles'
|
7
|
+
require 'psd/renderer/mask'
|
8
|
+
require 'psd/renderer/mask_canvas'
|
2
9
|
|
3
10
|
class PSD
|
4
11
|
class Renderer
|
@@ -92,4 +99,4 @@ class PSD
|
|
92
99
|
@node_stack.last
|
93
100
|
end
|
94
101
|
end
|
95
|
-
end
|
102
|
+
end
|
data/lib/psd/renderer/canvas.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
class PSD
|
2
2
|
class Renderer
|
3
3
|
class Canvas
|
4
|
+
extend Forwardable
|
5
|
+
|
4
6
|
attr_reader :canvas, :node, :opts, :width, :height, :opacity, :fill_opacity
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
def_delegators :node, :top, :right, :bottom, :left
|
9
|
+
def_delegators :canvas, :[], :[]=, :get_pixel, :set_pixel
|
8
10
|
|
9
11
|
def initialize(node, width = nil, height = nil, opts = {})
|
10
12
|
@node = node
|
data/lib/psd/resources.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'psd/resource_section'
|
2
|
+
require 'psd/resource'
|
3
|
+
require 'psd/resources/base'
|
4
|
+
|
1
5
|
class PSD
|
2
6
|
# Parses and reads all of the Resource records in the document.
|
3
7
|
class Resources
|
@@ -51,4 +55,4 @@ class PSD
|
|
51
55
|
@length ||= @file.read_int
|
52
56
|
end
|
53
57
|
end
|
54
|
-
end
|
58
|
+
end
|
data/lib/psd/resources/base.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'psd/resources/base'
|
2
|
-
|
3
1
|
class PSD
|
4
2
|
class Resource
|
5
3
|
module Section
|
@@ -24,4 +22,9 @@ class PSD
|
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
27
|
-
end
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'psd/resources/guides'
|
28
|
+
require 'psd/resources/layer_comps'
|
29
|
+
require 'psd/resources/slices'
|
30
|
+
require 'psd/resources/xmp_metadata'
|
data/lib/psd/slice.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
class PSD
|
2
|
+
class Slice
|
3
|
+
attr_reader :id, :group_id, :origin, :associated_layer_id, :name, :type,
|
4
|
+
:bounds, :url, :target, :message, :alt, :cell_text_is_html,
|
5
|
+
:cell_text, :horizontal_alignment, :vertical_alignment,
|
6
|
+
:color
|
7
|
+
|
8
|
+
def initialize(psd, data)
|
9
|
+
@psd = psd
|
10
|
+
data.each do |k, v|
|
11
|
+
instance_variable_set("@#{k}", v)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
[:left, :top, :right, :bottom].each do |dir|
|
16
|
+
define_method(dir) { @bounds[dir] }
|
17
|
+
end
|
18
|
+
|
19
|
+
def width
|
20
|
+
right - left
|
21
|
+
end
|
22
|
+
|
23
|
+
def height
|
24
|
+
bottom - top
|
25
|
+
end
|
26
|
+
|
27
|
+
def associated_layer
|
28
|
+
@psd.tree.find_by_id(associated_layer_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_png
|
32
|
+
@png ||= @psd.image.to_png.crop(left, top, width, height)
|
33
|
+
end
|
34
|
+
|
35
|
+
def save_as_png(file)
|
36
|
+
@png.save(file, :fast_rgba)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/psd/slices.rb
ADDED
data/lib/psd/version.rb
CHANGED
data/psd.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: psd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan LeFevre
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-03-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -53,20 +53,6 @@ dependencies:
|
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: activesupport
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
59
|
-
requirements:
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0'
|
63
|
-
type: :runtime
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
56
|
- !ruby/object:Gem::Dependency
|
71
57
|
name: xmp
|
72
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,34 +164,34 @@ files:
|
|
178
164
|
- lib/psd/layer/exporting.rb
|
179
165
|
- lib/psd/layer/helpers.rb
|
180
166
|
- lib/psd/layer/info.rb
|
167
|
+
- lib/psd/layer/info/blend_clipping_elements.rb
|
168
|
+
- lib/psd/layer/info/blend_interior_elements.rb
|
169
|
+
- lib/psd/layer/info/fill_opacity.rb
|
170
|
+
- lib/psd/layer/info/gradient_fill.rb
|
171
|
+
- lib/psd/layer/info/layer_group.rb
|
172
|
+
- lib/psd/layer/info/layer_id.rb
|
173
|
+
- lib/psd/layer/info/layer_name_source.rb
|
174
|
+
- lib/psd/layer/info/layer_section_divider.rb
|
175
|
+
- lib/psd/layer/info/legacy_typetool.rb
|
176
|
+
- lib/psd/layer/info/locked.rb
|
177
|
+
- lib/psd/layer/info/metadata_setting.rb
|
178
|
+
- lib/psd/layer/info/object_effects.rb
|
179
|
+
- lib/psd/layer/info/pattern.rb
|
180
|
+
- lib/psd/layer/info/placed_layer.rb
|
181
|
+
- lib/psd/layer/info/reference_point.rb
|
182
|
+
- lib/psd/layer/info/sheet_color.rb
|
183
|
+
- lib/psd/layer/info/solid_color.rb
|
184
|
+
- lib/psd/layer/info/typetool.rb
|
185
|
+
- lib/psd/layer/info/unicode_name.rb
|
186
|
+
- lib/psd/layer/info/vector_mask.rb
|
187
|
+
- lib/psd/layer/info/vector_origination.rb
|
188
|
+
- lib/psd/layer/info/vector_stroke.rb
|
189
|
+
- lib/psd/layer/info/vector_stroke_content.rb
|
181
190
|
- lib/psd/layer/mask.rb
|
182
191
|
- lib/psd/layer/name.rb
|
183
192
|
- lib/psd/layer/path_components.rb
|
184
193
|
- lib/psd/layer/position_and_channels.rb
|
185
194
|
- lib/psd/layer_info.rb
|
186
|
-
- lib/psd/layer_info/blend_clipping_elements.rb
|
187
|
-
- lib/psd/layer_info/blend_interior_elements.rb
|
188
|
-
- lib/psd/layer_info/fill_opacity.rb
|
189
|
-
- lib/psd/layer_info/gradient_fill.rb
|
190
|
-
- lib/psd/layer_info/layer_group.rb
|
191
|
-
- lib/psd/layer_info/layer_id.rb
|
192
|
-
- lib/psd/layer_info/layer_name_source.rb
|
193
|
-
- lib/psd/layer_info/layer_section_divider.rb
|
194
|
-
- lib/psd/layer_info/legacy_typetool.rb
|
195
|
-
- lib/psd/layer_info/locked.rb
|
196
|
-
- lib/psd/layer_info/metadata_setting.rb
|
197
|
-
- lib/psd/layer_info/object_effects.rb
|
198
|
-
- lib/psd/layer_info/pattern.rb
|
199
|
-
- lib/psd/layer_info/placed_layer.rb
|
200
|
-
- lib/psd/layer_info/reference_point.rb
|
201
|
-
- lib/psd/layer_info/sheet_color.rb
|
202
|
-
- lib/psd/layer_info/solid_color.rb
|
203
|
-
- lib/psd/layer_info/typetool.rb
|
204
|
-
- lib/psd/layer_info/unicode_name.rb
|
205
|
-
- lib/psd/layer_info/vector_mask.rb
|
206
|
-
- lib/psd/layer_info/vector_origination.rb
|
207
|
-
- lib/psd/layer_info/vector_stroke.rb
|
208
|
-
- lib/psd/layer_info/vector_stroke_content.rb
|
209
195
|
- lib/psd/layer_mask.rb
|
210
196
|
- lib/psd/lazy_execute.rb
|
211
197
|
- lib/psd/logger.rb
|
@@ -239,6 +225,8 @@ files:
|
|
239
225
|
- lib/psd/resources/layer_comps.rb
|
240
226
|
- lib/psd/resources/slices.rb
|
241
227
|
- lib/psd/resources/xmp_metadata.rb
|
228
|
+
- lib/psd/slice.rb
|
229
|
+
- lib/psd/slices.rb
|
242
230
|
- lib/psd/util.rb
|
243
231
|
- lib/psd/version.rb
|
244
232
|
- psd.gemspec
|
@@ -285,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
285
273
|
version: '0'
|
286
274
|
requirements: []
|
287
275
|
rubyforge_project:
|
288
|
-
rubygems_version: 2.
|
276
|
+
rubygems_version: 2.4.5
|
289
277
|
signing_key:
|
290
278
|
specification_version: 4
|
291
279
|
summary: General purpose library for parsing Photoshop files
|