djatoka 0.3.2 → 0.4.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: 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