djatoka 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b10e171c15f72747a80d62a9b1d0d5bac5e2d2a8
4
- data.tar.gz: 982a67a18a63f1650315f7e122428b76547226a9
3
+ metadata.gz: 54f7a843ae143b4d2f5aade72d9b56ee09c2c045
4
+ data.tar.gz: 5ee17e4138e0922c4bdfb4358382bc31e56ac70e
5
5
  SHA512:
6
- metadata.gz: eb2062b25b58e8f7818d98d27c2027b9acd22ce4df6cc88fa5d3d1c48c2ed5f9b699b47a60b32b8673bf3207c3da30cdd228dd7e8e9b0de045e29c05c72a43e4
7
- data.tar.gz: 3b0076b8aa40f912d5faea6d847f6cde656c2afbb44a13324c1b3c216f28ceeda79ae54487096d4253e95f9723384a7f9fb8e4bbdd48e65c53d038b335f76a67
6
+ metadata.gz: 4e625b0f1180dc75c17412359799130f6e79664f2e8ee2ac7d20dfe924695b4c109e7882402e69b13ee79b95834797a3eec119ad4fce5b5dbfa0b4df8a3c5673
7
+ data.tar.gz: a53814884c76dc41b74b74ed260ce9f6b1893c76a9edbe125da03b62813c37c7dd2ffd5a3c82f0b5a4314b9e8accdded89b4c1130607299fe7e165b55110f279
data/.gitignore CHANGED
@@ -25,3 +25,5 @@ pkg
25
25
  .ruby-version
26
26
 
27
27
  .rbx
28
+
29
+ Gemfile.lock
data/Rakefile CHANGED
@@ -1,5 +1,10 @@
1
- require 'rubygems'
2
- require 'rake'
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ Bundler::GemHelper.install_tasks
3
8
 
4
9
  require 'rake/testtask'
5
10
  Rake::TestTask.new(:test) do |test|
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{djatoka}
8
- s.version = "0.3.2"
8
+ s.version = "0.4.0"
9
9
  s.authors = ["Jason Ronallo", "Willy Mene"]
10
10
  s.email = %q{jronallo@gmail.com wmene@stanford.edu}
11
11
  s.homepage = %q{http://github.com/jronallo/djatoka}
@@ -23,7 +23,8 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency "mime-types"
24
24
 
25
25
  s.add_dependency "trollop"
26
-
26
+
27
+ s.add_development_dependency "test-unit"
27
28
  s.add_development_dependency "mocha"
28
29
  s.add_development_dependency "fakeweb"
29
30
  s.add_development_dependency "shoulda"
@@ -106,17 +106,37 @@ module Djatoka
106
106
  end
107
107
 
108
108
  region = @resolver.region(@id)
109
- metadata = @resolver.metadata(@id).perform
109
+ offsets = []
110
+ region_dimensions = []
110
111
 
111
- if(@iiif_params[:region] =~ /^(\d+),(\d+),(\d+),(\d+)$/)
112
- region.region("#{$2},#{$1},#{$4},#{$3}")
113
- elsif(@iiif_params[:region] =~ /^pct:([\d\.]+),([\d\.]+),([\d\.]+),([\d\.]+)$/)
112
+ case @iiif_params[:region]
113
+ when 'full'
114
+ # noop
115
+ when 'square'
116
+ w = metadata.width.to_i
117
+ h = metadata.height.to_i
118
+ min, max = [w,h].minmax
119
+
120
+ offset = (max - min) / 2
121
+
122
+ region_dimensions = [min, min]
123
+
124
+ if h >= w
125
+ offsets = [0, offset]
126
+ else
127
+ offsets = [offset, 0]
128
+ end
129
+ when /^(\d+),(\d+),(\d+),(\d+)$/
130
+ offsets = [$1, $2]
131
+ region_dimensions = [$3, $4]
132
+ when /^pct:([\d\.]+),([\d\.]+),([\d\.]+),([\d\.]+)$/
114
133
  x = (($1.to_f / 100.0) * metadata.width.to_f).to_i
115
134
  y = (($2.to_f / 100.0) * metadata.height.to_f).to_i
116
135
  w = (($3.to_f / 100.0) * metadata.width.to_f).to_i
117
136
  h = (($4.to_f / 100.0) * metadata.height.to_f).to_i
118
- region.region([y, x, h, w])
119
- elsif(!(@iiif_params[:region] =~ /^full$/i))
137
+ offsets = [x, y]
138
+ region_dimensions = [w, h]
139
+ else
120
140
  raise IiifInvalidParam.new "region", @iiif_params[:region]
121
141
  end
122
142
 
@@ -127,22 +147,40 @@ module Djatoka
127
147
  s #noop
128
148
  when /^(\d+),$/
129
149
  region.scale( ["#{$1}", "0"] ) #w => w,0
150
+ region.level(djatoka_level((region_dimensions.first || metadata.width).to_i / $1.to_f))
130
151
  when /^,(\d+)$/
131
152
  region.scale( ["0", "#{$1}"] ) #h => 0,h
153
+ region.level(djatoka_level((region_dimensions.last || metadata.height).to_i / $1.to_f))
132
154
  when /^pct:(\d*\.?\d*)$/i
133
155
  dj_scale = $1.to_f / 100.0
134
- region.scale(dj_scale.to_s)
156
+ level = djatoka_level(1 / dj_scale)
157
+ reduce = max_level - level.to_i
158
+ region.scale((dj_scale * 2**reduce).to_s)
159
+ region.level(level)
135
160
  when /^(\d+),(\d+)$/
136
161
  region.scale("#{$1},#{$2}")
162
+ region.level(djatoka_level((region_dimensions.first || metadata.width).to_i / $1.to_f))
137
163
  when /^!(\d+),(\d+)$/
138
- ratio = [$1.to_f / metadata.width.to_f, $2.to_f / metadata.height.to_f].min
139
- width = (ratio * metadata.width.to_f).to_i
140
- height = (ratio * metadata.height.to_f).to_i
141
- region.scale([width, height])
164
+ region_dimensions = [metadata.width.to_f, metadata.height.to_f] if region_dimensions.empty?
165
+ scale = [$1.to_f / region_dimensions.first.to_f, $2.to_f / region_dimensions.last.to_f].min
166
+
167
+ width = region_dimensions.first.to_f * scale
168
+ height = region_dimensions.last.to_f * scale
169
+
170
+ region.scale([width.ceil, height.ceil])
171
+ region.level(djatoka_level(region_dimensions.first.to_f / width))
142
172
  else
143
173
  raise IiifInvalidParam.new "size", s
144
174
  end
145
175
 
176
+ unless offsets.empty?
177
+ reduce = max_level - region.query.fetch(:level, max_level).to_i
178
+ w, h = region_dimensions.map { |d| d.to_i / (2**reduce) }
179
+
180
+ x, y = offsets
181
+ region.region("#{y},#{x},#{h},#{w}")
182
+ end
183
+
146
184
  unless(@iiif_params[:rotation].numeric?)
147
185
  raise IiifInvalidParam.new "rotation", @iiif_params[:rotation]
148
186
  end
@@ -170,6 +208,24 @@ module Djatoka
170
208
 
171
209
  end
172
210
 
211
+ def djatoka_level(ratio)
212
+ return max_level if ratio <= 1
213
+ level = max_level - Math.log2(ratio).to_i
214
+
215
+ if level < 1
216
+ 1
217
+ else
218
+ level
219
+ end
220
+ end
221
+
222
+ def max_level
223
+ @max_level ||= metadata.levels.to_i
224
+ end
225
+
226
+ def metadata
227
+ @metadata ||= @resolver.metadata(@id).perform
228
+ end
173
229
  end
174
230
 
175
231
  end
@@ -39,6 +39,11 @@ class TestDjatokaIiifRequest < Test::Unit::TestCase
39
39
  @req.size('full').rotation('0').quality('default').format('jpg')
40
40
  end
41
41
 
42
+ should 'set square requests' do
43
+ reg = @req.region('square').djatoka_region
44
+ assert_equal '0,874,3372,3372', reg.query.region
45
+ end
46
+
42
47
  should 'set x,y,w,h requests' do
43
48
  reg = @req.region('10,20,50,100').djatoka_region
44
49
  assert_equal '20,10,100,50', reg.query.region
@@ -56,6 +61,68 @@ class TestDjatokaIiifRequest < Test::Unit::TestCase
56
61
  end
57
62
  end
58
63
 
64
+ context 'translates region and size into DWT levels' do
65
+ context 'with a given region' do
66
+ setup do
67
+ @req.region('0,0,800,600').rotation('0').quality('default').format('jpg')
68
+ end
69
+
70
+ should 'set levels to the correct scale value' do
71
+ reg = @req.size('1600,').djatoka_region
72
+ assert_equal '6', reg.query.level
73
+
74
+ reg = @req.size('800,').djatoka_region
75
+ assert_equal '6', reg.query.level
76
+
77
+ reg = @req.size('400,').djatoka_region
78
+ assert_equal '5', reg.query.level
79
+
80
+ reg = @req.size('399,').djatoka_region
81
+ assert_equal '5', reg.query.level
82
+
83
+ reg = @req.size('200,').djatoka_region
84
+ assert_equal '4', reg.query.level
85
+ end
86
+ end
87
+
88
+ context 'with the full image' do
89
+ setup do
90
+ @req.region('full').rotation('0').quality('default').format('jpg')
91
+ end
92
+
93
+ should 'set levels to the correct scale value' do
94
+ reg = @req.size('5120,').djatoka_region
95
+ assert_equal '6', reg.query.level
96
+
97
+ reg = @req.size('399,').djatoka_region
98
+ assert_equal '3', reg.query.level
99
+ end
100
+ end
101
+
102
+ context 'with a pct size' do
103
+ setup do
104
+ @req.region('full').rotation('0').quality('default').format('jpg')
105
+ end
106
+
107
+ should 'set levels to the correct scale value' do
108
+ reg = @req.size('pct:100').djatoka_region
109
+ assert_equal '6', reg.query.level
110
+
111
+ reg = @req.size('pct:125').djatoka_region
112
+ assert_equal '6', reg.query.level
113
+
114
+ reg = @req.size('pct:50').djatoka_region
115
+ assert_equal '5', reg.query.level
116
+
117
+ reg = @req.size('pct:49').djatoka_region
118
+ assert_equal '5', reg.query.level
119
+
120
+ reg = @req.size('pct:23.52').djatoka_region
121
+ assert_equal '4', reg.query.level
122
+ end
123
+ end
124
+ end
125
+
59
126
  context 'translates size parameters' do
60
127
  setup do
61
128
  @req.region('10,20,50,100').rotation('0').quality('default').format('jpg')
@@ -69,17 +136,25 @@ class TestDjatokaIiifRequest < Test::Unit::TestCase
69
136
  should 'set ",h" requests to the correct scale value' do
70
137
  reg = @req.size(',900').djatoka_region
71
138
  assert_equal '0,900', reg.query.scale
139
+ assert_equal '6', reg.query.level
72
140
  end
73
141
 
74
142
  should 'set "pct:n" requests to the correct scale value' do
75
143
  reg = @req.size('pct:75').djatoka_region
76
144
  assert_equal '0.75', reg.query.scale
145
+ assert_equal '6', reg.query.level
77
146
 
78
147
  reg = @req.size('pct:125').djatoka_region
79
148
  assert_equal '1.25', reg.query.scale
149
+ assert_equal '6', reg.query.level
150
+
151
+ reg = @req.size('pct:20').djatoka_region
152
+ assert_equal '0.8', reg.query.scale
153
+ assert_equal '4', reg.query.level
80
154
 
81
155
  reg = @req.size('pct:6.25').djatoka_region
82
- assert_equal '0.0625', reg.query.scale
156
+ assert_equal '1.0', reg.query.scale
157
+ assert_equal '2', reg.query.level
83
158
  end
84
159
 
85
160
  should 'set "w,h" requests to the correct scale value' do
@@ -89,10 +164,10 @@ class TestDjatokaIiifRequest < Test::Unit::TestCase
89
164
 
90
165
  should 'set "!w,h" requests to the correct scale value' do
91
166
  reg = @req.size('!1024,768').djatoka_region
92
- assert_equal '1024,674', reg.query.scale
167
+ assert_equal '384,768', reg.query.scale
93
168
 
94
169
  reg = @req.size('!1024,500').djatoka_region
95
- assert_equal '759,500', reg.query.scale
170
+ assert_equal '250,500', reg.query.scale
96
171
  end
97
172
 
98
173
  should 'raise an exception if the value cannot be parsed into a Float' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: djatoka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Ronallo
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-06 00:00:00.000000000 Z
12
+ date: 2015-10-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -81,6 +81,20 @@ dependencies:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: test-unit
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: mocha
86
100
  requirement: !ruby/object:Gem::Requirement
@@ -149,7 +163,6 @@ files:
149
163
  - ".gitignore"
150
164
  - ".travis.yml"
151
165
  - Gemfile
152
- - Gemfile.lock
153
166
  - LICENSE
154
167
  - README.rdoc
155
168
  - Rakefile
@@ -213,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
226
  version: '0'
214
227
  requirements: []
215
228
  rubyforge_project: djatoka
216
- rubygems_version: 2.4.2
229
+ rubygems_version: 2.4.8
217
230
  signing_key:
218
231
  specification_version: 4
219
232
  summary: Djatoka image server helpers for Ruby and Rails.
@@ -233,4 +246,3 @@ test_files:
233
246
  - test/test_region.rb
234
247
  - test/test_resolver.rb
235
248
  - test/test_view_helpers.rb
236
- has_rdoc:
@@ -1,75 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- djatoka (0.2.4)
5
- addressable
6
- hashie
7
- json
8
- mime-types
9
- trollop
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- activesupport (3.2.13)
15
- i18n (= 0.6.1)
16
- multi_json (~> 1.0)
17
- addressable (2.3.6)
18
- bourne (1.4.0)
19
- mocha (~> 0.13.2)
20
- coderay (1.0.9)
21
- equivalent-xml (0.3.0)
22
- nokogiri (>= 1.4.3)
23
- fakeweb (1.3.0)
24
- ffi (1.6.0-java)
25
- hashie (2.1.1)
26
- i18n (0.6.1)
27
- json (1.7.7)
28
- json (1.7.7-java)
29
- metaclass (0.0.1)
30
- method_source (0.8.1)
31
- mime-types (2.2)
32
- mocha (0.13.3)
33
- metaclass (~> 0.0.1)
34
- multi_json (1.7.2)
35
- nokogiri (1.5.9)
36
- nokogiri (1.5.9-java)
37
- pry (0.9.12)
38
- coderay (~> 1.0.5)
39
- method_source (~> 0.8)
40
- slop (~> 3.4)
41
- pry (0.9.12-java)
42
- coderay (~> 1.0.5)
43
- method_source (~> 0.8)
44
- slop (~> 3.4)
45
- spoon (~> 0.0)
46
- rake (10.0.4)
47
- rb-readline (0.4.2)
48
- rdoc (4.0.1)
49
- json (~> 1.4)
50
- shoulda (3.4.0)
51
- shoulda-context (~> 1.0, >= 1.0.1)
52
- shoulda-matchers (~> 1.0, >= 1.4.1)
53
- shoulda-context (1.0.2)
54
- shoulda-matchers (1.5.4)
55
- activesupport (>= 3.0.0)
56
- bourne (~> 1.3)
57
- slop (3.4.4)
58
- spoon (0.0.3)
59
- ffi
60
- trollop (2.0)
61
-
62
- PLATFORMS
63
- java
64
- ruby
65
-
66
- DEPENDENCIES
67
- djatoka!
68
- equivalent-xml
69
- fakeweb
70
- mocha
71
- pry
72
- rake
73
- rb-readline
74
- rdoc (>= 2.4.2)
75
- shoulda