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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/README.md +25 -0
  4. data/lib/psd.rb +24 -17
  5. data/lib/psd/channel_image.rb +2 -0
  6. data/lib/psd/helpers.rb +2 -2
  7. data/lib/psd/image.rb +11 -7
  8. data/lib/psd/layer.rb +12 -1
  9. data/lib/psd/layer/blend_modes.rb +4 -2
  10. data/lib/psd/layer/info.rb +24 -0
  11. data/lib/psd/{layer_info → layer/info}/blend_clipping_elements.rb +0 -0
  12. data/lib/psd/{layer_info → layer/info}/blend_interior_elements.rb +0 -0
  13. data/lib/psd/{layer_info → layer/info}/fill_opacity.rb +0 -0
  14. data/lib/psd/{layer_info → layer/info}/gradient_fill.rb +0 -0
  15. data/lib/psd/{layer_info → layer/info}/layer_group.rb +0 -0
  16. data/lib/psd/{layer_info → layer/info}/layer_id.rb +0 -0
  17. data/lib/psd/{layer_info → layer/info}/layer_name_source.rb +0 -0
  18. data/lib/psd/{layer_info → layer/info}/layer_section_divider.rb +0 -0
  19. data/lib/psd/{layer_info → layer/info}/legacy_typetool.rb +2 -2
  20. data/lib/psd/{layer_info → layer/info}/locked.rb +0 -0
  21. data/lib/psd/{layer_info → layer/info}/metadata_setting.rb +0 -0
  22. data/lib/psd/{layer_info → layer/info}/object_effects.rb +0 -0
  23. data/lib/psd/{layer_info → layer/info}/pattern.rb +0 -0
  24. data/lib/psd/{layer_info → layer/info}/placed_layer.rb +0 -0
  25. data/lib/psd/{layer_info → layer/info}/reference_point.rb +0 -0
  26. data/lib/psd/{layer_info → layer/info}/sheet_color.rb +0 -0
  27. data/lib/psd/{layer_info → layer/info}/solid_color.rb +0 -0
  28. data/lib/psd/{layer_info → layer/info}/typetool.rb +0 -0
  29. data/lib/psd/{layer_info → layer/info}/unicode_name.rb +0 -0
  30. data/lib/psd/{layer_info → layer/info}/vector_mask.rb +0 -0
  31. data/lib/psd/{layer_info → layer/info}/vector_origination.rb +0 -0
  32. data/lib/psd/{layer_info → layer/info}/vector_stroke.rb +0 -0
  33. data/lib/psd/{layer_info → layer/info}/vector_stroke_content.rb +0 -0
  34. data/lib/psd/node.rb +13 -7
  35. data/lib/psd/nodes/ancestry.rb +76 -80
  36. data/lib/psd/nodes/layer.rb +5 -5
  37. data/lib/psd/nodes/search.rb +5 -1
  38. data/lib/psd/renderer.rb +8 -1
  39. data/lib/psd/renderer/canvas.rb +4 -2
  40. data/lib/psd/resources.rb +5 -1
  41. data/lib/psd/resources/base.rb +6 -3
  42. data/lib/psd/slice.rb +39 -0
  43. data/lib/psd/slices.rb +13 -0
  44. data/lib/psd/version.rb +1 -1
  45. data/psd.gemspec +0 -1
  46. metadata +28 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5853601336a5bf10d6b88f63b5531ceb88bdd4aa
4
- data.tar.gz: d7334ea5cf8f8c4ef2ef8ee407ebbe65cffb73db
3
+ metadata.gz: 6c7fc077ce3a8060aa8522a16838388a5a1930fa
4
+ data.tar.gz: 07cd330663d7d94810c89f031d09bc41269610b3
5
5
  SHA512:
6
- metadata.gz: 0ce5801d31518ae76637c103b39847ee2a2fc09bd8ca23b4db7e60b63661e76e9881cbb4e6096a2e35ba21c6b3bd6bb640eab4e08be8af64a588e483114b9923
7
- data.tar.gz: 380ac3504e5de0048aa9d7c229d6bed86da035d3d296dac525231f42ef0bf33c0d02d5656bd2e5aad2c00bbb9b31ead2e1b764b76ed063082470658cff73322c
6
+ metadata.gz: 0b6deef34cb5f66e8c079da3c72ffae7d2f8ad8baed3a91f1f8552d29a8bd6dcead464474bed1f715c60a1927e48e22ecd7583f80aaad580c95e536bc2e86532
7
+ data.tar.gz: 5526dceb6954320be9ae3fd1d3a5a55b9820a8db16e68fea257e07f49f2f1207780010ec09a4cb2a73feca8c11895d112cb4dc16097fc3deff619c90268ebbfd
@@ -3,4 +3,5 @@ rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
5
  - 2.1.0
6
+ - 2.2.1
6
7
  - jruby-19mode
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
- # require "cairo"
5
-
6
- require 'active_support/core_ext/module/delegation'
7
- require 'active_support/concern'
8
-
9
- dir_root = File.dirname(File.absolute_path(__FILE__)) + '/psd'
10
- [
11
- '/image_exports/*',
12
- '/image_formats/*',
13
- '/image_modes/*',
14
- '/nodes/*',
15
- '/layer_info/*',
16
- '/layer/*',
17
- '/**/*'
18
- ].each do |path|
19
- Dir.glob(dir_root + path) { |file| require file if File.file?(file) }
20
- end
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
@@ -1,4 +1,6 @@
1
1
  require 'psd/image'
2
+ require 'psd/image_formats/layer_rle'
3
+ require 'psd/image_formats/layer_raw'
2
4
 
3
5
  class PSD
4
6
  # Represents an image for a single layer, which differs slightly in format from
@@ -45,7 +45,7 @@ class PSD
45
45
  end
46
46
 
47
47
  def slices
48
- resource(:slices).to_a
48
+ @slices ||= resource(:slices).to_a.map { |s| Slice.new(self, s) }
49
49
  end
50
50
  end
51
- end
51
+ end
@@ -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
@@ -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
- delegate :opacity, :visible, :clipped?, to: :blend_mode
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
@@ -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
@@ -1,5 +1,5 @@
1
1
  require 'psd/layer_info'
2
- require 'psd/layer_info/typetool'
2
+ require 'psd/layer/info/typetool'
3
3
 
4
4
  class PSD
5
5
  class LegacyTypeTool < TypeTool
@@ -87,4 +87,4 @@ class PSD
87
87
  ""
88
88
  end
89
89
  end
90
- end
90
+ end
@@ -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
- delegate :psd, to: :parent
24
- delegate :name, to: :layer
25
- delegate :each, to: :children
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'
@@ -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
- extend ActiveSupport::Concern
6
-
7
- included do
8
- # Returns the root node
9
- def root
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
- # Is this node the root node?
15
- def root?
16
- self.is_a?(PSD::Node::Root)
17
- end
18
- alias :is_root? :root?
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
- # Returns all ancestors in the path of this node. This
21
- # does NOT return the root node.
22
- def ancestors
23
- return [] if parent.nil? || parent.is_root?
24
- return parent.ancestors + [parent]
25
- end
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
- # Does this node have any children nodes?
28
- def has_children?
29
- children.length > 0
30
- end
24
+ # Does this node have any children nodes?
25
+ def has_children?
26
+ children.length > 0
27
+ end
31
28
 
32
- # Inverse of has_children?
33
- def childless?
34
- !has_children?
35
- end
29
+ # Inverse of has_children?
30
+ def childless?
31
+ !has_children?
32
+ end
36
33
 
37
- # Returns all sibling nodes including the current node. Can also
38
- # be thought of as all children of the parent of this node.
39
- def siblings
40
- return [] if parent.nil?
41
- parent.children
42
- end
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
- def next_sibling
45
- return nil if parent.nil?
46
- index = siblings.index(self)
47
- siblings[index + 1]
48
- end
41
+ def next_sibling
42
+ return nil if parent.nil?
43
+ index = siblings.index(self)
44
+ siblings[index + 1]
45
+ end
49
46
 
50
- def prev_sibling
51
- return nil if parent.nil?
52
- index = siblings.index(self)
53
- siblings[index - 1]
54
- end
47
+ def prev_sibling
48
+ return nil if parent.nil?
49
+ index = siblings.index(self)
50
+ siblings[index - 1]
51
+ end
55
52
 
56
- # Does this node have any siblings?
57
- def has_siblings?
58
- siblings.length > 1
59
- end
53
+ # Does this node have any siblings?
54
+ def has_siblings?
55
+ siblings.length > 1
56
+ end
60
57
 
61
- # Is this node the only descendant of its parent?
62
- def only_child?
63
- siblings.length == 1
64
- end
58
+ # Is this node the only descendant of its parent?
59
+ def only_child?
60
+ siblings.length == 1
61
+ end
65
62
 
66
- # Recursively get all descendant nodes, not including this node.
67
- def descendants
68
- children.map(&:subtree).flatten
69
- end
63
+ # Recursively get all descendant nodes, not including this node.
64
+ def descendants
65
+ children.map(&:subtree).flatten
66
+ end
70
67
 
71
- # Same as descendants, except it includes this node.
72
- def subtree
73
- [self] + descendants
74
- end
68
+ # Same as descendants, except it includes this node.
69
+ def subtree
70
+ [self] + descendants
71
+ end
75
72
 
76
- # Depth from the root node. Root depth is 0.
77
- def depth
78
- return ancestors.length + 1
79
- end
73
+ # Depth from the root node. Root depth is 0.
74
+ def depth
75
+ return ancestors.length + 1
76
+ end
80
77
 
81
- def path(as_array = false)
82
- path = (ancestors.map(&:name) + [name])
83
- as_array ? path : path.join('/')
84
- end
78
+ def path(as_array = false)
79
+ path = (ancestors.map(&:name) + [name])
80
+ as_array ? path : path.join('/')
81
+ end
85
82
 
86
- def method_missing(method, *args, &block)
87
- test = /^(.+)_(layers|groups)$/.match(method)
88
- if test
89
- m = self.respond_to?(test[1]) ? test[1] : "#{test[1]}s"
90
- self.send(m).select &method("#{test[2]}_only")
91
- else
92
- super
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
- private
93
+ private
97
94
 
98
- def layers_only(d); d.layer?; end
99
- def groups_only(d); d.group?(false); end
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
@@ -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
- [:text, :ref_x, :ref_y, :blending_mode].each do |prop|
9
- delegate prop, to: :@layer
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
@@ -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
@@ -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
@@ -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
- delegate :top, :right, :bottom, :left, to: :node
7
- delegate :[], :[]=, :get_pixel, :set_pixel, to: :canvas
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
@@ -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
@@ -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'
@@ -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
@@ -0,0 +1,13 @@
1
+ require 'psd/slice'
2
+
3
+ class PSD
4
+ module Slices
5
+ def slices_by_name(name)
6
+ slices.select { |s| s.name == name }
7
+ end
8
+
9
+ def slice_by_id(id)
10
+ slices.select { |s| s.id == id }.first
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  class PSD
2
- VERSION = "3.2.4"
2
+ VERSION = "3.3.1"
3
3
  end
@@ -21,7 +21,6 @@ Gem::Specification.new do |gem|
21
21
  gem.add_dependency 'rake'
22
22
  gem.add_dependency 'psd-enginedata', '~> 1'
23
23
  gem.add_dependency 'chunky_png'
24
- gem.add_dependency 'activesupport'
25
24
  gem.add_dependency 'xmp'
26
25
 
27
26
  gem.test_files = Dir.glob("spec/**/*")
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.2.4
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: 2014-10-21 00:00:00.000000000 Z
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.2.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