hydra-derivatives 2.0.0 → 3.0.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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/History.md +43 -0
  4. data/README.md +23 -38
  5. data/VERSION +1 -1
  6. data/hydra-derivatives.gemspec +0 -1
  7. data/lib/hydra/derivatives.rb +23 -123
  8. data/lib/hydra/derivatives/io_decorator.rb +7 -1
  9. data/lib/hydra/derivatives/processors.rb +19 -0
  10. data/lib/hydra/derivatives/processors/audio.rb +6 -0
  11. data/lib/hydra/derivatives/processors/document.rb +28 -0
  12. data/lib/hydra/derivatives/processors/ffmpeg.rb +22 -0
  13. data/lib/hydra/derivatives/processors/full_text.rb +60 -0
  14. data/lib/hydra/derivatives/processors/image.rb +58 -0
  15. data/lib/hydra/derivatives/processors/jpeg2k_image.rb +129 -0
  16. data/lib/hydra/derivatives/processors/processor.rb +38 -0
  17. data/lib/hydra/derivatives/processors/raw_image.rb +37 -0
  18. data/lib/hydra/derivatives/processors/shell_based_processor.rb +108 -0
  19. data/lib/hydra/derivatives/{video.rb → processors/video.rb} +1 -1
  20. data/lib/hydra/derivatives/{video → processors/video}/config.rb +1 -1
  21. data/lib/hydra/derivatives/{video → processors/video}/processor.rb +2 -8
  22. data/lib/hydra/derivatives/runners/audio_derivatives.rb +7 -0
  23. data/lib/hydra/derivatives/runners/document_derivatives.rb +7 -0
  24. data/lib/hydra/derivatives/runners/full_text_extract.rb +16 -0
  25. data/lib/hydra/derivatives/runners/image_derivatives.rb +16 -0
  26. data/lib/hydra/derivatives/runners/jpeg2k_image_derivatives.rb +15 -0
  27. data/lib/hydra/derivatives/runners/pdf_derivatives.rb +6 -0
  28. data/lib/hydra/derivatives/runners/runner.rb +52 -0
  29. data/lib/hydra/derivatives/runners/video_derivatives.rb +7 -0
  30. data/lib/hydra/derivatives/services/mime_type_service.rb +10 -0
  31. data/lib/hydra/derivatives/services/persist_basic_contained_output_file_service.rb +23 -8
  32. data/lib/hydra/derivatives/services/persist_output_file_service.rb +4 -5
  33. data/lib/hydra/derivatives/services/retrieve_source_file_service.rb +8 -6
  34. data/spec/processors/full_text.rb +61 -0
  35. data/spec/{units → processors}/image_spec.rb +7 -17
  36. data/spec/{units → processors}/jpeg2k_spec.rb +9 -11
  37. data/spec/processors/processor_spec.rb +36 -0
  38. data/spec/processors/shell_based_processor_spec.rb +19 -0
  39. data/spec/processors/video_spec.rb +40 -0
  40. data/spec/services/audio_derivatives_spec.rb +76 -0
  41. data/spec/services/persist_basic_contained_output_file_service_spec.rb +4 -3
  42. data/spec/services/retrieve_source_file_service_spec.rb +16 -12
  43. data/spec/units/derivatives_spec.rb +18 -26
  44. data/spec/units/io_decorator_spec.rb +33 -0
  45. data/spec/units/transcoding_spec.rb +109 -86
  46. metadata +42 -44
  47. data/lib/hydra/derivatives/audio.rb +0 -19
  48. data/lib/hydra/derivatives/document.rb +0 -56
  49. data/lib/hydra/derivatives/extract_metadata.rb +0 -27
  50. data/lib/hydra/derivatives/ffmpeg.rb +0 -31
  51. data/lib/hydra/derivatives/image.rb +0 -73
  52. data/lib/hydra/derivatives/jpeg2k_image.rb +0 -136
  53. data/lib/hydra/derivatives/processor.rb +0 -33
  54. data/lib/hydra/derivatives/railtie.rb +0 -9
  55. data/lib/hydra/derivatives/raw_image.rb +0 -45
  56. data/lib/hydra/derivatives/shell_based_processor.rb +0 -81
  57. data/spec/lib/hydra/derivatives/extract_metadata_spec.rb +0 -39
  58. data/spec/units/extract_spec.rb +0 -22
  59. data/spec/units/processor_spec.rb +0 -61
  60. data/spec/units/shell_based_processor_spec.rb +0 -22
  61. data/spec/units/video_spec.rb +0 -50
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra-derivatives
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-07 00:00:00.000000000 Z
11
+ date: 2015-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '9.0'
83
- - !ruby/object:Gem::Dependency
84
- name: hydra-file_characterization
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.3'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '0.3'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: mini_magick
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -179,26 +165,35 @@ files:
179
165
  - lib/color_profiles/license.txt
180
166
  - lib/color_profiles/sRGB_IEC61966-2-1_no_black_scaling.icc
181
167
  - lib/hydra/derivatives.rb
182
- - lib/hydra/derivatives/audio.rb
183
168
  - lib/hydra/derivatives/config.rb
184
- - lib/hydra/derivatives/document.rb
185
- - lib/hydra/derivatives/extract_metadata.rb
186
- - lib/hydra/derivatives/ffmpeg.rb
187
- - lib/hydra/derivatives/image.rb
188
169
  - lib/hydra/derivatives/io_decorator.rb
189
- - lib/hydra/derivatives/jpeg2k_image.rb
190
170
  - lib/hydra/derivatives/logger.rb
191
- - lib/hydra/derivatives/processor.rb
192
- - lib/hydra/derivatives/railtie.rb
193
- - lib/hydra/derivatives/raw_image.rb
171
+ - lib/hydra/derivatives/processors.rb
172
+ - lib/hydra/derivatives/processors/audio.rb
173
+ - lib/hydra/derivatives/processors/document.rb
174
+ - lib/hydra/derivatives/processors/ffmpeg.rb
175
+ - lib/hydra/derivatives/processors/full_text.rb
176
+ - lib/hydra/derivatives/processors/image.rb
177
+ - lib/hydra/derivatives/processors/jpeg2k_image.rb
178
+ - lib/hydra/derivatives/processors/processor.rb
179
+ - lib/hydra/derivatives/processors/raw_image.rb
180
+ - lib/hydra/derivatives/processors/shell_based_processor.rb
181
+ - lib/hydra/derivatives/processors/video.rb
182
+ - lib/hydra/derivatives/processors/video/config.rb
183
+ - lib/hydra/derivatives/processors/video/processor.rb
184
+ - lib/hydra/derivatives/runners/audio_derivatives.rb
185
+ - lib/hydra/derivatives/runners/document_derivatives.rb
186
+ - lib/hydra/derivatives/runners/full_text_extract.rb
187
+ - lib/hydra/derivatives/runners/image_derivatives.rb
188
+ - lib/hydra/derivatives/runners/jpeg2k_image_derivatives.rb
189
+ - lib/hydra/derivatives/runners/pdf_derivatives.rb
190
+ - lib/hydra/derivatives/runners/runner.rb
191
+ - lib/hydra/derivatives/runners/video_derivatives.rb
192
+ - lib/hydra/derivatives/services/mime_type_service.rb
194
193
  - lib/hydra/derivatives/services/persist_basic_contained_output_file_service.rb
195
194
  - lib/hydra/derivatives/services/persist_output_file_service.rb
196
195
  - lib/hydra/derivatives/services/retrieve_source_file_service.rb
197
196
  - lib/hydra/derivatives/services/tempfile_service.rb
198
- - lib/hydra/derivatives/shell_based_processor.rb
199
- - lib/hydra/derivatives/video.rb
200
- - lib/hydra/derivatives/video/config.rb
201
- - lib/hydra/derivatives/video/processor.rb
202
197
  - spec/fixtures/FlashPix.ppt
203
198
  - spec/fixtures/adobe1998.tif
204
199
  - spec/fixtures/countdown.avi
@@ -214,21 +209,22 @@ files:
214
209
  - spec/fixtures/test.xls
215
210
  - spec/fixtures/test.xlsx
216
211
  - spec/fixtures/world.png
217
- - spec/lib/hydra/derivatives/extract_metadata_spec.rb
212
+ - spec/processors/full_text.rb
213
+ - spec/processors/image_spec.rb
214
+ - spec/processors/jpeg2k_spec.rb
215
+ - spec/processors/processor_spec.rb
216
+ - spec/processors/shell_based_processor_spec.rb
217
+ - spec/processors/video_spec.rb
218
+ - spec/services/audio_derivatives_spec.rb
218
219
  - spec/services/persist_basic_contained_output_file_service_spec.rb
219
220
  - spec/services/retrieve_source_file_service_spec.rb
220
221
  - spec/services/tempfile_service_spec.rb
221
222
  - spec/spec_helper.rb
222
223
  - spec/units/config_spec.rb
223
224
  - spec/units/derivatives_spec.rb
224
- - spec/units/extract_spec.rb
225
- - spec/units/image_spec.rb
226
- - spec/units/jpeg2k_spec.rb
225
+ - spec/units/io_decorator_spec.rb
227
226
  - spec/units/logger_spec.rb
228
- - spec/units/processor_spec.rb
229
- - spec/units/shell_based_processor_spec.rb
230
227
  - spec/units/transcoding_spec.rb
231
- - spec/units/video_spec.rb
232
228
  homepage: https://github.com/projecthydra/hydra-derivatives
233
229
  licenses:
234
230
  - APACHE2
@@ -249,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
245
  version: '0'
250
246
  requirements: []
251
247
  rubyforge_project:
252
- rubygems_version: 2.4.5
248
+ rubygems_version: 2.4.5.1
253
249
  signing_key:
254
250
  specification_version: 4
255
251
  summary: Derivative generation plugin for hydra
@@ -269,18 +265,20 @@ test_files:
269
265
  - spec/fixtures/test.xls
270
266
  - spec/fixtures/test.xlsx
271
267
  - spec/fixtures/world.png
272
- - spec/lib/hydra/derivatives/extract_metadata_spec.rb
268
+ - spec/processors/full_text.rb
269
+ - spec/processors/image_spec.rb
270
+ - spec/processors/jpeg2k_spec.rb
271
+ - spec/processors/processor_spec.rb
272
+ - spec/processors/shell_based_processor_spec.rb
273
+ - spec/processors/video_spec.rb
274
+ - spec/services/audio_derivatives_spec.rb
273
275
  - spec/services/persist_basic_contained_output_file_service_spec.rb
274
276
  - spec/services/retrieve_source_file_service_spec.rb
275
277
  - spec/services/tempfile_service_spec.rb
276
278
  - spec/spec_helper.rb
277
279
  - spec/units/config_spec.rb
278
280
  - spec/units/derivatives_spec.rb
279
- - spec/units/extract_spec.rb
280
- - spec/units/image_spec.rb
281
- - spec/units/jpeg2k_spec.rb
281
+ - spec/units/io_decorator_spec.rb
282
282
  - spec/units/logger_spec.rb
283
- - spec/units/processor_spec.rb
284
- - spec/units/shell_based_processor_spec.rb
285
283
  - spec/units/transcoding_spec.rb
286
- - spec/units/video_spec.rb
284
+ has_rdoc:
@@ -1,19 +0,0 @@
1
- module Hydra
2
- module Derivatives
3
- class Audio < Processor
4
- include Ffmpeg
5
-
6
- protected
7
-
8
- def new_mime_type(format)
9
- case format
10
- when 'mp3'
11
- "audio/mpeg"
12
- else
13
- "audio/#{format}"
14
- end
15
- end
16
- end
17
- end
18
- end
19
-
@@ -1,56 +0,0 @@
1
- module Hydra
2
- module Derivatives
3
- class Document < Processor
4
- include ShellBasedProcessor
5
-
6
- def self.encode(path, options, output_file)
7
- format = File.extname(output_file).sub('.', '')
8
- outdir = File.dirname(output_file)
9
- execute "#{Hydra::Derivatives.libreoffice_path} --invisible --headless --convert-to #{format} --outdir #{outdir} #{path}"
10
- end
11
-
12
- def encode_file(destination_name, file_suffix, mime_type, options = { })
13
- new_output = ''
14
- Hydra::Derivatives::TempfileService.create(source_file) do |f|
15
- if mime_type == 'image/jpeg'
16
- temp_file = File.join(Hydra::Derivatives.temp_file_base, [File.basename(f.path).sub(File.extname(f.path), ''), 'pdf'].join('.'))
17
- new_output = File.join(Hydra::Derivatives.temp_file_base, [File.basename(temp_file).sub(File.extname(temp_file), ''), file_suffix].join('.'))
18
- self.class.encode(f.path, options, temp_file)
19
- self.class.encode(temp_file, options, output_file(file_suffix))
20
- File.unlink(temp_file)
21
- else
22
- self.class.encode(f.path, options, output_file(file_suffix))
23
- new_output = File.join(Hydra::Derivatives.temp_file_base, [File.basename(f.path).sub(File.extname(f.path), ''), file_suffix].join('.'))
24
- end
25
- end
26
- out_file = Hydra::Derivatives::IoDecorator.new(File.open(new_output, "rb"))
27
- out_file.mime_type = mime_type
28
- output_file_service.call(object, out_file, destination_name)
29
- File.unlink(out_file)
30
- end
31
-
32
- def output_file(file_suffix)
33
- Dir::Tmpname.create(["#{object.id.gsub('/', '_')}-content.", ".#{file_suffix}"], Hydra::Derivatives.temp_file_base){}
34
- end
35
-
36
- def new_mime_type(format)
37
- case format
38
- when 'pdf'
39
- 'application/pdf'
40
- when 'odf'
41
- 'application/vnd.oasis.opendocument.text'
42
- when 'docx'
43
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
44
- when 'xslx'
45
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
46
- when 'pptx'
47
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
48
- when 'jpg'
49
- 'image/jpeg'
50
- else
51
- raise "I don't know about the format '#{format}'"
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,27 +0,0 @@
1
- require 'hydra-file_characterization'
2
- require 'mime/types'
3
-
4
- module Hydra
5
- module Derivatives
6
- module ExtractMetadata
7
-
8
- def extract_metadata
9
- return unless has_content?
10
- Hydra::FileCharacterization.characterize(content, filename_for_characterization.join(""), :fits) do |config|
11
- config[:fits] = Hydra::Derivatives.fits_path
12
- end
13
- end
14
-
15
- protected
16
-
17
- def filename_for_characterization
18
- registered_mime_type = MIME::Types[mime_type].first
19
- Logger.warn "Unable to find a registered mime type for #{mime_type.inspect} on #{uri}" unless registered_mime_type
20
- extension = registered_mime_type ? ".#{registered_mime_type.extensions.first}" : ''
21
- version_id = 1 # TODO fixme
22
- m = /\/([^\/]*)$/.match(uri)
23
- ["#{m[1]}-#{version_id}", "#{extension}"]
24
- end
25
- end
26
- end
27
- end
@@ -1,31 +0,0 @@
1
- # An abstract class for asyncronous jobs that transcode files using FFMpeg
2
-
3
- require 'tmpdir'
4
- require 'open3'
5
-
6
- module Hydra
7
- module Derivatives
8
- module Ffmpeg
9
- extend ActiveSupport::Concern
10
-
11
- INPUT_OPTIONS=:input_options
12
- OUTPUT_OPTIONS=:output_options
13
-
14
- included do
15
- include ShellBasedProcessor
16
- end
17
-
18
-
19
- module ClassMethods
20
-
21
- def encode(path, options, output_file)
22
- inopts = options[INPUT_OPTIONS] ||= "-y"
23
- outopts = options[OUTPUT_OPTIONS] ||= ""
24
- execute "#{Hydra::Derivatives.ffmpeg_path} #{inopts} -i \"#{path}\" #{outopts} #{output_file}"
25
- end
26
- end
27
-
28
- end
29
- end
30
- end
31
-
@@ -1,73 +0,0 @@
1
- require 'mini_magick'
2
-
3
- module Hydra
4
- module Derivatives
5
- class Image < Processor
6
- class_attribute :timeout
7
-
8
- def process
9
- timeout ? process_with_timeout : process_without_timeout
10
- end
11
-
12
- def process_with_timeout
13
- status = Timeout::timeout(timeout) do
14
- process_without_timeout
15
- end
16
- rescue Timeout::Error => ex
17
- raise Hydra::Derivatives::TimeoutError, "Unable to process image derivative\nThe command took longer than #{timeout} seconds to execute"
18
- end
19
-
20
- def process_without_timeout
21
- directives.each do |name, args|
22
- opts = args.kind_of?(Hash) ? args : {size: args}
23
- format = opts.fetch(:format, 'png')
24
- destination_name = output_filename_for(name, opts)
25
- create_resized_image(destination_name, opts[:size], format)
26
- end
27
- end
28
-
29
- def output_filename_for(name, opts = {})
30
- if opts.has_key? :datastream
31
- Deprecation.warn Hydra::Derivatives::Image, 'The :datastream option is deprecated and will be removed in a future release.'
32
- end
33
- opts.fetch(:datastream, output_file_id(name))
34
- end
35
-
36
- protected
37
-
38
- def new_mime_type(format)
39
- MIME::Types.type_for(format).first.to_s
40
- end
41
-
42
- def create_resized_image(destination_name, size, format, quality=nil)
43
- create_image(destination_name, format, quality) do |xfrm|
44
- xfrm.resize(size) if size.present?
45
- end
46
- end
47
-
48
- def create_image(destination_name, format, quality=nil)
49
- xfrm = load_image_transformer
50
- yield(xfrm) if block_given?
51
- xfrm.format(format)
52
- xfrm.quality(quality.to_s) if quality
53
- write_image(destination_name, format, xfrm)
54
- end
55
-
56
- def write_image(destination_name, format, xfrm)
57
- output_io = Hydra::Derivatives::IoDecorator.new(StringIO.new)
58
- output_io.mime_type = new_mime_type(format)
59
-
60
- xfrm.write(output_io)
61
- output_io.rewind
62
-
63
- output_file_service.call(object, output_io, destination_name)
64
- end
65
-
66
- # Override this method if you want a different transformer, or need to load the
67
- # raw image from a different source (e.g. external file)
68
- def load_image_transformer
69
- MiniMagick::Image.read(source_file.content)
70
- end
71
- end
72
- end
73
- end
@@ -1,136 +0,0 @@
1
- require 'mini_magick'
2
- require 'nokogiri'
3
-
4
-
5
- module Hydra
6
- module Derivatives
7
- class Jpeg2kImage < Processor
8
- include ShellBasedProcessor
9
-
10
- def process
11
- image = MiniMagick::Image.read(source_file.content)
12
- quality = image['%[channels]'] == 'gray' ? 'gray' : 'color'
13
- directives.each do |name, args|
14
- long_dim = self.class.long_dim(image)
15
- file_path = self.class.tmp_file('.tif')
16
- to_srgb = args.fetch(:to_srgb, true)
17
- if args[:resize] || to_srgb
18
- preprocess(image, resize: args[:resize], to_srgb: to_srgb, src_quality: quality)
19
- end
20
- image.write file_path
21
- recipe = self.class.kdu_compress_recipe(args, quality, long_dim)
22
- output_file_name = args[:datastream] || output_file_id(name)
23
- encode_file(output_file_name, recipe, file_path: file_path)
24
- File.unlink(file_path) unless file_path.nil?
25
- end
26
- end
27
-
28
- def encode_file(destination_name, recipe, opts={})
29
- output_file = self.class.tmp_file('.jp2')
30
- if opts[:file_path]
31
- self.class.encode(opts[:file_path], recipe, output_file)
32
- else
33
- Hydra::Derivatives::TempfileService.create(source_file) do |f|
34
- self.class.encode(f.path, recipe, output_file)
35
- end
36
- end
37
- out_file = Hydra::Derivatives::IoDecorator.new(File.open(output_file, "rb"))
38
- out_file.mime_type = "image/jp2"
39
- output_file_service.call(object, out_file, destination_name)
40
-
41
- File.unlink(output_file)
42
- end
43
-
44
- protected
45
- def preprocess(image, opts={})
46
- # resize: <geometry>, to_srgb: <bool>, src_quality: 'color'|'gray'
47
- image.combine_options do |c|
48
- c.resize(opts[:resize]) if opts[:resize]
49
- c.profile self.class.srgb_profile_path if opts[:src_quality] == 'color' && opts[:to_srgb]
50
- end
51
- image
52
- end
53
-
54
- def self.encode(path, recipe, output_file)
55
- kdu_compress = Hydra::Derivatives.kdu_compress_path
56
- execute "#{kdu_compress} -i #{path} -o #{output_file} #{recipe}"
57
- end
58
-
59
- def self.srgb_profile_path
60
- File.join [
61
- File.expand_path('../../../', __FILE__),
62
- 'color_profiles',
63
- 'sRGB_IEC61966-2-1_no_black_scaling.icc'
64
- ]
65
- end
66
-
67
- def self.tmp_file(ext)
68
- Dir::Tmpname.create(['sufia', ext], Hydra::Derivatives.temp_file_base){}
69
- end
70
-
71
- def self.long_dim(image)
72
- [image[:width], image[:height]].max
73
- end
74
-
75
- def self.kdu_compress_recipe(args, quality, long_dim)
76
- if args[:recipe].is_a? Symbol
77
- recipe = [args[:recipe].to_s, quality].join('_').to_sym
78
- if Hydra::Derivatives.kdu_compress_recipes.has_key? recipe
79
- return Hydra::Derivatives.kdu_compress_recipes[recipe]
80
- else
81
- Logger.warn "No JP2 recipe for :#{args[:recipe].to_s} ('#{recipe}') found in configuration. Using best guess."
82
- return Hydra::Derivatives::Jpeg2kImage.calculate_recipe(args,quality,long_dim)
83
- end
84
- elsif args[:recipe].is_a? String
85
- return args[:recipe]
86
- else
87
- return Hydra::Derivatives::Jpeg2kImage.calculate_recipe(args, quality, long_dim)
88
- end
89
- end
90
-
91
- def self.calculate_recipe(args, quality, long_dim)
92
- levels_arg = args.fetch(:levels, Hydra::Derivatives::Jpeg2kImage.level_count_for_size(long_dim))
93
- rates_arg = Hydra::Derivatives::Jpeg2kImage.layer_rates(args.fetch(:layers, 8), args.fetch(:compression, 10))
94
- tile_size = args.fetch(:tile_size, 1024)
95
- tiles_arg = "#{tile_size},#{tile_size}"
96
- jp2_space_arg = quality == 'gray' ? 'sLUM' : 'sRGB'
97
-
98
- %Q{-rate #{rates_arg}
99
- -jp2_space #{jp2_space_arg}
100
- -double_buffering 10
101
- -num_threads 4
102
- -no_weights
103
- Clevels=#{levels_arg}
104
- "Stiles={#{tiles_arg}}"
105
- "Cblk={64,64}"
106
- Cuse_sop=yes
107
- Cuse_eph=yes
108
- Corder=RPCL
109
- ORGgen_plt=yes
110
- ORGtparts=R }.gsub(/\s+/, " ").strip
111
- end
112
-
113
- def self.level_count_for_size(long_dim)
114
- levels = 0
115
- level_size = long_dim
116
- while level_size >= 96
117
- level_size = level_size/2
118
- levels+=1
119
- end
120
- levels-1
121
- end
122
-
123
- def self.layer_rates(layer_count,compression_numerator)
124
- #e.g. if compression_numerator = 10 then compression is 10:1
125
- rates = []
126
- cmp = 24.0/compression_numerator
127
- layer_count.times do
128
- rates << cmp
129
- cmp = (cmp/1.618).round(8)
130
- end
131
- rates.map(&:to_s ).join(',')
132
- end
133
-
134
- end
135
- end
136
- end