psd 3.2.4 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
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