travertine 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -1,2 +1,48 @@
1
- module Travertine
1
+ class Travertine
2
+
3
+ # This is the correct size for Google maps tiles
4
+ DEFAULT_TILE_SIZE = 256
5
+
6
+ def self.cut_tiles(img, max_zoom, tile_size = DEFAULT_TILE_SIZE)
7
+ tile_sets = []
8
+ (0..max_zoom).collect.reverse.each do |zoom|
9
+ tiles = []
10
+ resize_to_zoom_level(img, zoom, tile_size)
11
+ tile_coordinates_for_zoom(zoom).each do |x,y|
12
+ tiles << cut_tile(img, x, y, tile_size)
13
+ end
14
+
15
+ tile_sets << tiles
16
+ end
17
+
18
+ tile_sets.reverse
19
+ end
20
+
21
+ def self.cut_tile(img, x, y, tile_size = DEFAULT_TILE_SIZE)
22
+ tile = Magick::Image.new(tile_size, tile_size)
23
+
24
+ img_x = x * tile_size
25
+ img_y = y * tile_size
26
+
27
+ tile.import_pixels(0, 0, tile_size, tile_size, "RGBA",img.export_pixels(img_x, img_y, tile_size, tile_size, "RGBA"))
28
+ end
29
+
30
+ def self.tile_coordinates_for_zoom(zoom_level)
31
+ [].tap do |coords|
32
+ (0..((2 ** zoom_level) - 1)).each do |x|
33
+ (0..((2 ** zoom_level) - 1)).each do |y|
34
+ coords << [x,y]
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def self.resize_to_zoom_level(img, zoom_level, tile_size = DEFAULT_TILE_SIZE)
41
+ size = zoom_image_size(zoom_level, tile_size)
42
+ img.resize!(size, size)
43
+ end
44
+
45
+ def self.zoom_image_size(zoom_level, tile_size = DEFAULT_TILE_SIZE)
46
+ tile_size * (2 ** zoom_level )
47
+ end
2
48
  end
@@ -2,4 +2,23 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
 
4
4
  require 'rspec'
5
+ require 'rmagick'
5
6
  require 'travertine'
7
+
8
+ def load_test_image(filename)
9
+ Magick::ImageList.new(File.join(File.dirname(__FILE__), 'data', 'images', filename)).first
10
+ end
11
+
12
+ RSpec::Matchers.define :be_same_image_as do |expected|
13
+ match do |actual|
14
+ if !((actual.columns == expected.columns) && (actual.rows == expected.rows))
15
+ false
16
+ else
17
+ mean_error_per_pixel, normalized_mean_error, normalized_max_error = actual.difference(expected)
18
+
19
+ # I'm not sure what a good normalized mean should be...
20
+ # The difference between kensing.jpeg and kensing_defaced.jpeg is 0.0156
21
+ normalized_mean_error - 0.005 < 0
22
+ end
23
+ end
24
+ end
@@ -1,7 +1,68 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Travertine do
4
- it "should be true" do
5
- true.should be_true
4
+ let(:kensing) { load_test_image('kensing.jpeg') }
5
+ let(:kensing_defaced) { load_test_image('kensing_defaced.jpeg') }
6
+ let(:kensing_512) { load_test_image('kensing_512.jpeg') }
7
+ let(:kensing_256) { load_test_image('kensing_256.jpeg') }
8
+ let(:kensing_2048) { load_test_image('kensing_2048.jpeg') }
9
+ let(:kensing_tile_2_0_2) { load_test_image('kensing_tile_2_0_2.jpeg') }
10
+
11
+ describe "#cut_tiles" do
12
+ it "should cut all tiles" do
13
+ tile_sets = Travertine.cut_tiles(kensing, 2)
14
+ tile_sets.size.should == 3
15
+
16
+ tile_sets[0].size.should == 1
17
+ tile_sets[1].size.should == 4
18
+ tile_sets[2].size.should == 16
19
+
20
+ tile_sets[2][2].should be_same_image_as(kensing_tile_2_0_2)
21
+ end
22
+ end
23
+
24
+ describe "#cut_tile" do
25
+ it "should cut the tile" do
26
+ Travertine.cut_tile(kensing, 0, 2).should be_same_image_as(kensing_tile_2_0_2)
27
+ end
28
+ end
29
+
30
+ describe "#tile_coordinates_for_zoom" do
31
+ it "should calculate all the x,y pairs for a given zoom" do
32
+ Travertine.tile_coordinates_for_zoom(0).should == [[0,0]]
33
+ Travertine.tile_coordinates_for_zoom(1).should =~ [[0,0], [0,1], [1,0], [1,1]]
34
+
35
+ Travertine.tile_coordinates_for_zoom(2).size.should == 16
36
+ Travertine.tile_coordinates_for_zoom(2)[0..4].should =~ [[0,0], [0,1], [0,2], [0,3], [1,0]]
37
+
38
+ Travertine.tile_coordinates_for_zoom(4).size.should == 256
39
+ Travertine.tile_coordinates_for_zoom(4)[16..20].should =~ [[1,0], [1,1], [1,2], [1,3], [1,4]]
40
+ end
41
+ end
42
+
43
+ describe "#zoom_image_size" do
44
+ it "should calculate the size in pixels that the source image must be resized to" do
45
+ Travertine.zoom_image_size(0).should == Travertine::DEFAULT_TILE_SIZE
46
+ Travertine.zoom_image_size(2).should == Travertine::DEFAULT_TILE_SIZE * 4
47
+ Travertine.zoom_image_size(4).should == Travertine::DEFAULT_TILE_SIZE * 16
48
+
49
+ Travertine.zoom_image_size(2, 100).should == 100 * 4
50
+ Travertine.zoom_image_size(4, 1000).should == 1000 * 16
51
+ end
52
+ end
53
+
54
+ describe "#resize_to_zoom_level" do
55
+ it "should resize an image to the proper dimensions for the given zoom level" do
56
+ Travertine.resize_to_zoom_level(kensing, 1, 256).should be_same_image_as(kensing_512)
57
+ Travertine.resize_to_zoom_level(kensing, 3, 256).should be_same_image_as(kensing_2048)
58
+
59
+ # Just a sanity check to make sure the image compare isn't crazy.
60
+ Travertine.resize_to_zoom_level(kensing, 2, 256).should_not be_same_image_as(kensing_defaced)
61
+ end
62
+
63
+ it "should do an in-place resize, modifying the original image" do
64
+ Travertine.resize_to_zoom_level(kensing, 3, 256).columns.should == 2048
65
+ Travertine.resize_to_zoom_level(kensing, 3, 256).rows.should == 2048
66
+ end
6
67
  end
7
68
  end
@@ -0,0 +1,65 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{travertine}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Micah Wedemeyer"]
12
+ s.date = %q{2011-09-25}
13
+ s.description = %q{Image tiling with Ruby}
14
+ s.email = %q{me@micahwedemeyer.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/travertine.rb",
28
+ "spec/data/images/kensing.jpeg",
29
+ "spec/data/images/kensing_2048.jpeg",
30
+ "spec/data/images/kensing_256.jpeg",
31
+ "spec/data/images/kensing_512.jpeg",
32
+ "spec/data/images/kensing_defaced.jpeg",
33
+ "spec/data/images/kensing_tile_2_0_2.jpeg",
34
+ "spec/spec_helper.rb",
35
+ "spec/travertine/travertine_spec.rb",
36
+ "travertine.gemspec"
37
+ ]
38
+ s.homepage = %q{http://github.com/micahwedemeyer/travertine}
39
+ s.licenses = ["MIT"]
40
+ s.require_paths = ["lib"]
41
+ s.rubygems_version = %q{1.6.2}
42
+ s.summary = %q{Image tiling with Ruby}
43
+
44
+ if s.respond_to? :specification_version then
45
+ s.specification_version = 3
46
+
47
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_runtime_dependency(%q<rmagick>, [">= 0"])
49
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
50
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
51
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
52
+ else
53
+ s.add_dependency(%q<rmagick>, [">= 0"])
54
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
55
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
56
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
57
+ end
58
+ else
59
+ s.add_dependency(%q<rmagick>, [">= 0"])
60
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
61
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
62
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
63
+ end
64
+ end
65
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: travertine
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Micah Wedemeyer
@@ -98,8 +98,15 @@ files:
98
98
  - Rakefile
99
99
  - VERSION
100
100
  - lib/travertine.rb
101
+ - spec/data/images/kensing.jpeg
102
+ - spec/data/images/kensing_2048.jpeg
103
+ - spec/data/images/kensing_256.jpeg
104
+ - spec/data/images/kensing_512.jpeg
105
+ - spec/data/images/kensing_defaced.jpeg
106
+ - spec/data/images/kensing_tile_2_0_2.jpeg
101
107
  - spec/spec_helper.rb
102
108
  - spec/travertine/travertine_spec.rb
109
+ - travertine.gemspec
103
110
  has_rdoc: true
104
111
  homepage: http://github.com/micahwedemeyer/travertine
105
112
  licenses: