spittle 0.9.1.7 → 0.9.1.8

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.
data/README.rdoc CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  It takes your PNG's, chews them up and spits out sprites!
15
15
 
16
- point bin/spittle at a directory, and watch it sprite away!
16
+ point bin/sprite at a directory, and watch it sprite away!
17
17
 
18
18
  == Installation - standalone
19
19
 
@@ -51,7 +51,6 @@ Check out examples/sprites if you want to see what spittle can do without doing
51
51
 
52
52
  == Limitations
53
53
 
54
- - supports RGB and RGBA color types only (and they must be the same for all images in a sprite)
55
54
  - does not support color profiles (can cause a slight change in color from the source image)
56
55
  - does not support reading interlaced PNGs.
57
56
 
@@ -64,10 +63,12 @@ Check out examples/sprites if you want to see what spittle can do without doing
64
63
  - Supports varying dimensions in source images
65
64
  - Does not regenerate sprites that have not changed
66
65
  - Supports all PNG filter types to improve image compression
66
+ - supports mixing RGB and RGBA color types
67
67
 
68
68
  == Roadmap - by priority
69
69
 
70
70
  - Reading interlaced images
71
+ - Translate between png color spaces automatically.
71
72
  - allow a global css template override
72
73
  - allow per-sprite and global configuration
73
74
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.1.7
1
+ 0.9.1.8
@@ -1,5 +1,10 @@
1
+ require 'enumerator'
2
+
1
3
  module Spittle
2
4
  class ImageData
5
+ RGB_WIDTH = 3
6
+ RGBA_WIDTH = 4
7
+
3
8
  def initialize(options = {})
4
9
  @data = (options.delete :data) || []
5
10
  @properties = options
@@ -46,6 +51,27 @@ module Spittle
46
51
  img
47
52
  end
48
53
 
54
+ def to_rgba( alpha_value=255 )
55
+ # test that conversion updates pixel width, scanline width
56
+
57
+ return self if pixel_width == RGBA_WIDTH
58
+
59
+ # so ruby 1.9 has different ideas then 1.8 on how Enumerable should work
60
+ # 1.9 returns Enumerable object if no block given
61
+ # 1.8 complains if no block, unless using enum_x methods
62
+ slice_method = (RUBY_VERSION.include?( "1.9" )) ? :each_slice : :enum_slice
63
+
64
+ rgba_data = @data.map do |row|
65
+ pixels = row.send( slice_method, RGB_WIDTH )
66
+ pixels.inject([]){|result, pixel| result + pixel + [alpha_value] }
67
+ end
68
+
69
+ ImageData.new( :data => rgba_data,
70
+ :pixel_width => 4,
71
+ :scanline_width => (@properties[:scanline_width] / RGB_WIDTH) * RGBA_WIDTH,
72
+ :name => name)
73
+ end
74
+
49
75
  def [](row)
50
76
  @data[row]
51
77
  end
@@ -1,37 +1,47 @@
1
1
  module PNG
2
-
3
2
  class Image
4
- def self.default_filter_type
5
- 4 # paeth
6
- end
3
+ #color types
4
+ RGB = 2
5
+ RGBA = 6
6
+
7
+ class << self
8
+ def image_data( file_name, options={} )
9
+ image_options = {:rgba => true}.merge( options )
7
10
 
8
- def self.open( file_name )
9
- name = File.basename( file_name, ".png" )
11
+ png = open(file_name)
10
12
 
11
- File.open(file_name, "r") do |f|
12
- ihdr, idat = Parser.go!( f )
13
- Image.new( ihdr, idat, name )
13
+ return png.to_image unless image_options[:rgba]
14
+ png.to_image.to_rgba
14
15
  end
15
- end
16
-
17
- #TODO - rename this 'image_data'
18
- def self.image_data( file_name )
19
- png = open(file_name)
20
- png.to_image
21
- end
22
16
 
23
- def self.write( file_name, data, options = {} )
24
- ihdr = PNG::IHDR.new(data.width, data.height, 8, color_type_of(data.pixel_width))
25
- Image.new(ihdr, nil, file_name, :rows => data).write( file_name, options)
26
- end
17
+ def open( file_name )
18
+ name = File.basename( file_name, ".png" )
19
+
20
+ File.open(file_name, "r") do |f|
21
+ ihdr, idat = Parser.go!( f )
22
+ Image.new( ihdr, idat, name )
23
+ end
24
+ end
25
+
26
+ def write( file_name, data, options = {} )
27
+ ihdr = PNG::IHDR.new(data.width, data.height, 8, color_type_of(data.pixel_width))
28
+
29
+ Image.new(ihdr, nil, file_name, :rows => data).write( file_name, options)
30
+ end
31
+
32
+ def default_filter_type
33
+ 4 # paeth
34
+ end
27
35
 
28
- #TODO - Nieve We should only store RBGA
29
- def self.color_type_of(pixel_width)
30
- case pixel_width
31
- when 3
32
- RGB
33
- when 4
34
- RGBA
36
+ private # class methods
37
+
38
+ def color_type_of(pixel_width)
39
+ case pixel_width
40
+ when 3
41
+ RGB
42
+ when 4
43
+ RGBA
44
+ end
35
45
  end
36
46
  end
37
47
 
@@ -56,29 +66,11 @@ module PNG
56
66
  end
57
67
  end
58
68
 
59
- def to_s
60
- inspect
61
- end
62
-
63
- #color types
64
- RGB = 2
65
- RGBA = 3
66
-
67
69
  # check for RGB or RGBA
68
70
  def pixel_width
69
71
  ( color_type == RGB ? 3 : 4)
70
72
  end
71
73
 
72
-
73
- def scanline_width
74
- # + 1 adds filter byte
75
- (width * pixel_width) + 1
76
- end
77
-
78
- def rows
79
- @rows ||= to_image
80
- end
81
-
82
74
  def filter_encoded_rows(filter_type)
83
75
  out = Array.new(height)
84
76
  rows.each_with_index do |row, scanline|
@@ -106,11 +98,25 @@ module PNG
106
98
  n_out
107
99
  end
108
100
 
101
+ def to_s
102
+ inspect
103
+ end
104
+
109
105
  def inspect
110
106
  "#{@name} (#{height} x #{width}) [color type: #{color_type}, depth: #{depth}]"
111
107
  end
108
+
112
109
  private
113
110
 
111
+ def scanline_width
112
+ # + 1 adds filter byte
113
+ (width * pixel_width) + 1
114
+ end
115
+
116
+ def rows
117
+ @rows ||= to_image
118
+ end
119
+
114
120
  def decode(current, row, data, pixel_width)
115
121
  filter_type = row.shift
116
122
  decode_row(row, data.last_scanline(current), filter_type, pixel_width)
@@ -46,4 +46,18 @@ describe Spittle::ImageData do
46
46
  it "will return the last scanline given a current index" do
47
47
  @id.last_scanline(1).should == [1,2,3]
48
48
  end
49
+
50
+ describe "RGBA conversion" do
51
+ it "updates pixel width" do
52
+ @id.to_rgba.pixel_width.should == 4 # RGBA pixel width
53
+ end
54
+
55
+ it "updates scanline width" do
56
+ @id.to_rgba.scanline_width.should == 4
57
+ end
58
+
59
+ it "puts in an alpha byte with a default value of 255" do
60
+ @id.to_rgba[0].should == [1,2,3,255]
61
+ end
62
+ end
49
63
  end
@@ -15,8 +15,8 @@ describe 'PNG' do
15
15
  end
16
16
 
17
17
  it 'can merge one PNG on the left of another' do
18
- one = PNG::Image.image_data("#{@img_dir}/lightening.png")
19
- two = PNG::Image.image_data("#{@img_dir}/lightening.png")
18
+ one = PNG::Image.image_data("#{@img_dir}/lightening.png", :rgba => false)
19
+ two = PNG::Image.image_data("#{@img_dir}/lightening.png", :rgba => false)
20
20
  merged = one.merge_left two
21
21
  PNG::Image.write("#{@tmp_dir}/merge_right_test.png", merged, :filter_type => 0)
22
22
  read("#{@expected_dir}/merge_right_test.png").should == read("#{@tmp_dir}/merge_right_test.png")
data/spittle.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{spittle}
8
- s.version = "0.9.1.7"
8
+ s.version = "0.9.1.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["aberant", "tjennings"]
12
- s.date = %q{2010-01-01}
12
+ s.date = %q{2010-01-04}
13
13
  s.description = %q{Spittle is a pure ruby PNG spriting library. It can be used standalone or as a Rails plugin, see the readme for details.}
14
14
  s.email = ["qzzzq1@gmail.com", "tyler.jennings@gmail.com"]
15
15
  s.executables = ["png_info", "sprite"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spittle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1.7
4
+ version: 0.9.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - aberant
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2010-01-01 00:00:00 -06:00
13
+ date: 2010-01-04 00:00:00 -06:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency