psd 1.1.1 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2bc299dfcc8a9b41a3f17b16a204c2894668b5cc
4
- data.tar.gz: bf991e614ddb7f6e151c42d6bcc627e7d34a1050
3
+ metadata.gz: 192aac571ad814510b059521913c776ada912bbe
4
+ data.tar.gz: 620ccea660e7c7a23ac20807b051f0bc26bd6d98
5
5
  SHA512:
6
- metadata.gz: 96f2cbfb412549b89d2c4dc0bfa579c31c1c92e3451b0bf498adcbffafcdff48024ddc68625fc2db0c01910f22e195839efaaf84bdb137187bfc6d09411fa8e2
7
- data.tar.gz: aaabac77598af888c915cc9e600c9ac393f7aff6cd1a3ea3e987a7186d7d698204669040f3f5eb2eb476fb1dbc408a148b18459736d721681536d667cff577ab
6
+ metadata.gz: c27e2806fcfd1091bd58b3888abbd082da8f87e80b263feef7ca31b31c32ca7946caffe0fce89d74685304aa1ab6a6cb3a74f8c41409dd243a7b4be044642c9d
7
+ data.tar.gz: 25cea6e8c71c7c707bac8b4a8f8dd8a7505af97e86e9a9d1cf6d9e323d14596888f2eb55fa8e4a4b48d37cf1dd7ce02ce013c57bfea91692a1cd198096e72962
data/README.md CHANGED
@@ -94,7 +94,7 @@ psd.tree.descendant_layers.first.width
94
94
  PSD files also store various pieces of information in "layer info" blocks. Which blocks a layer has varies from layer-to-layer, but to access them you can do:
95
95
 
96
96
  ``` ruby
97
- psd.tree.descendant_layers.first.type.font
97
+ psd.tree.descendant_layers.first.text[:font]
98
98
 
99
99
  # Returns
100
100
  {:name=>"HelveticaNeue-Light",
@@ -184,6 +184,5 @@ PSD.debug = true
184
184
 
185
185
  There are a few features that are currently missing from PSD.rb.
186
186
 
187
- * Individual layer image exporting
188
187
  * More image modes + depths for image exporting
189
188
  * A few layer info blocks
@@ -66,7 +66,7 @@ class PSD
66
66
  end
67
67
 
68
68
  if @channel_data.length != @length
69
- PSD.logger.error "#{channel_data.length} read; expected #{@length}"
69
+ PSD.logger.error "#{@channel_data.length} read; expected #{@length}"
70
70
  end
71
71
 
72
72
  process_image_data
@@ -85,4 +85,4 @@ class PSD
85
85
  end
86
86
  end
87
87
  end
88
- end
88
+ end
data/lib/psd/image.rb CHANGED
@@ -26,22 +26,22 @@ class PSD
26
26
  @num_pixels *= 2 if depth == 16
27
27
 
28
28
  calculate_length
29
- @channel_data = {} # Using a Hash over an NArray, because NArray has problems w/ Ruby 2.0. Hashes are faster than Arrays
29
+ @channel_data = []
30
+ @pixel_data = []
30
31
 
31
32
  @start_pos = @file.tell
32
33
  @end_pos = @start_pos + @length
33
34
 
34
- @pixel_data = []
35
-
36
35
  PSD.logger.debug "Image: #{width}x#{height}, length = #{@length}, mode = #{@header.mode_name}, position = #{@start_pos}"
37
36
 
38
37
  # Each color channel is represented by a unique ID
39
38
  @channels_info = [
40
39
  {id: 0},
41
40
  {id: 1},
42
- {id: 2},
43
- {id: -1}
41
+ {id: 2}
44
42
  ]
43
+
44
+ @channels_info << {id: -1} if channels == 4
45
45
  end
46
46
 
47
47
  # Begins parsing the image by first figuring out the compression format used, and then
@@ -103,6 +103,8 @@ class PSD
103
103
  when 3 then combine_rgb_channel
104
104
  when 4 then combine_cmyk_channel
105
105
  end
106
+
107
+ @channel_data = nil
106
108
  end
107
109
 
108
110
  def pixel_step
@@ -7,26 +7,18 @@ class PSD::Image
7
7
  # Load the image pixels into a PNG file and return a reference to the
8
8
  # data.
9
9
  def to_png
10
- @png ||= (
11
- PSD.logger.debug "Beginning PNG export"
12
- png = ChunkyPNG::Image.new(width.to_i, height.to_i, ChunkyPNG::Color::TRANSPARENT)
10
+ PSD.logger.debug "Beginning PNG export"
11
+ png = ChunkyPNG::Image.new(width.to_i, height.to_i, ChunkyPNG::Color::TRANSPARENT)
13
12
 
14
- i = 0
15
- height.times do |y|
16
- width.times do |x|
17
- png[x,y] = ChunkyPNG::Color.rgba(
18
- @pixel_data[i],
19
- @pixel_data[i+1],
20
- @pixel_data[i+2],
21
- @pixel_data[i+3]
22
- )
23
-
24
- i += 4
25
- end
13
+ i = 0
14
+ height.times do |y|
15
+ width.times do |x|
16
+ png[x,y] = @pixel_data[i]
17
+ i += 1
26
18
  end
19
+ end
27
20
 
28
- png
29
- )
21
+ png
30
22
  end
31
23
  alias :export :to_png
32
24
 
@@ -14,8 +14,10 @@ class PSD
14
14
  end
15
15
 
16
16
  def parse_channel_data!
17
+ @line_index = 0
18
+
17
19
  PSD.logger.debug "Parsing layer RLE channel ##{@ch_info[:id]}: position = #{@chan_pos}"
18
- @chan_pos = decode_rle_channel(@chan_pos, 0)
20
+ decode_rle_channel
19
21
  end
20
22
  end
21
23
  end
@@ -11,30 +11,27 @@ class PSD
11
11
 
12
12
  def parse_byte_counts!
13
13
  byte_counts = []
14
- channels.times do |i|
15
- height.times do |j|
16
- byte_counts << @file.read_short
17
- end
14
+ (channels * height).times do |i|
15
+ byte_counts << @file.read_short
18
16
  end
19
17
 
20
18
  return byte_counts
21
19
  end
22
20
 
23
21
  def parse_channel_data!
24
- chan_pos = 0
25
- line_index = 0
22
+ @chan_pos = 0
23
+ @line_index = 0
26
24
 
27
25
  channels.times do |i|
28
- PSD.logger.debug "Parsing RLE channel ##{i}: position = #{chan_pos}, line = #{line_index}"
29
- chan_pos = decode_rle_channel(chan_pos, line_index)
30
- line_index += height
26
+ PSD.logger.debug "Parsing RLE channel ##{i}: position = #{@chan_pos}, line = #{@line_index}"
27
+ decode_rle_channel
28
+ @line_index += height
31
29
  end
32
30
  end
33
31
 
34
- def decode_rle_channel(chan_pos, line_index)
32
+ def decode_rle_channel
35
33
  height.times do |j|
36
- byte_count = @byte_counts[line_index]
37
- line_index += 1
34
+ byte_count = @byte_counts[@line_index + j]
38
35
  finish = @file.tell + byte_count
39
36
 
40
37
  while @file.tell < finish
@@ -42,26 +39,24 @@ class PSD
42
39
 
43
40
  if len < 128
44
41
  len += 1
45
- (chan_pos...chan_pos+len).each do |k|
42
+ (@chan_pos...@chan_pos+len).each do |k|
46
43
  @channel_data[k] = @file.read(1).bytes.to_a[0]
47
44
  end
48
45
 
49
- chan_pos += len
46
+ @chan_pos += len
50
47
  elsif len > 128
51
48
  len ^= 0xff
52
49
  len += 2
53
50
 
54
51
  val = @file.read(1).bytes.to_a[0]
55
- (chan_pos...chan_pos+len).each do |k|
52
+ (@chan_pos...@chan_pos+len).each do |k|
56
53
  @channel_data[k] = val
57
54
  end
58
55
 
59
- chan_pos += len
56
+ @chan_pos += len
60
57
  end
61
58
  end
62
59
  end
63
-
64
- return chan_pos
65
60
  end
66
61
  end
67
62
  end
@@ -21,7 +21,7 @@ class PSD
21
21
 
22
22
  rgb = PSD::Color.cmyk_to_rgb(255 - c, 255 - m, 255 - y, 255 - k)
23
23
 
24
- @pixel_data.push *rgb.values, a
24
+ @pixel_data.push ChunkyPNG::rgba(*rgb.values, a)
25
25
  end
26
26
  end
27
27
  end
@@ -9,11 +9,11 @@ class PSD
9
9
  alpha = @channel_data[i]
10
10
  grey = @channel_data[@channel_length + i]
11
11
 
12
- @pixel_data.push grey, grey, grey, alpha
12
+ @pixel_data.push ChunkyPNG::Color.greyscale_alpha(grey, alpha)
13
13
  end
14
14
  else
15
15
  (0...@num_pixels).step(pixel_step) do |i|
16
- @pixel_data.push *([@channel_data[i]] * 3), 255
16
+ @pixel_data.push ChunkyPNG::Color.greyscale(@channel_data[i])
17
17
  end
18
18
  end
19
19
  end
@@ -12,7 +12,6 @@ class PSD
12
12
  a = 255
13
13
 
14
14
  @channels_info.each_with_index do |chan, index|
15
- next if channels == 3 && chan[:id] == -1
16
15
  val = @channel_data[i + (@channel_length * index)]
17
16
 
18
17
  case chan[:id]
@@ -23,7 +22,7 @@ class PSD
23
22
  end
24
23
  end
25
24
 
26
- @pixel_data.push r, g, b, a
25
+ @pixel_data.push ChunkyPNG::Color.rgba(r, g, b, a)
27
26
  end
28
27
  end
29
28
  end
data/lib/psd/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class PSD
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
data/spec/image_spec.rb CHANGED
@@ -16,22 +16,20 @@ describe 'Image Exporting' do
16
16
  expect(@psd.image).to_not be_nil
17
17
  expect(@psd.image.width).to eq(1)
18
18
  expect(@psd.image.height).to eq(1)
19
- expect(@psd.image.pixel_data).to eq([0, 100, 200, 255])
19
+ expect(@psd.image.pixel_data).to eq([ChunkyPNG::Color.rgba(0, 100, 200, 255)])
20
20
  end
21
21
 
22
22
  it "should be able to skip to the image" do
23
23
  expect(@psd).to_not be_parsed
24
24
  expect(@psd.image.width).to eq(1)
25
25
  expect(@psd.image.height).to eq(1)
26
- expect(@psd.image.pixel_data).to eq([0, 100, 200, 255])
26
+ expect(@psd.image.pixel_data).to eq([ChunkyPNG::Color.rgba(0, 100, 200, 255)])
27
27
  end
28
28
 
29
29
  describe "as PNG" do
30
30
  it "should produce a valid PNG object" do
31
31
  expect(@psd.image.to_png).to be_an_instance_of(ChunkyPNG::Image)
32
32
 
33
- # Ensure it's cached
34
- expect(@psd.image.to_png).to be @psd.image.to_png
35
33
  expect(@psd.image.to_png.width).to eq(1)
36
34
  expect(@psd.image.to_png.height).to eq(1)
37
35
  expect(
@@ -51,7 +49,7 @@ describe 'Image Exporting' do
51
49
  expect(image.width).to eq(1)
52
50
  expect(image.height).to eq(1)
53
51
 
54
- expect(image.pixel_data).to eq([0, 100, 200, 255])
52
+ expect(image.pixel_data).to eq([ChunkyPNG::Color.rgba(0, 100, 200, 255)])
55
53
  end
56
54
 
57
55
  describe "as PNG" do
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: 1.1.1
4
+ version: 1.2.0
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: 2013-09-11 00:00:00.000000000 Z
12
+ date: 2013-09-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bindata
@@ -211,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  version: '0'
212
212
  requirements: []
213
213
  rubyforge_project:
214
- rubygems_version: 2.0.3
214
+ rubygems_version: 2.0.8
215
215
  signing_key:
216
216
  specification_version: 4
217
217
  summary: General purpose library for parsing Photoshop files