Source: ruby-rmagick
Version: 2.13.2-4
Severity: wishlist
Tags: patch
User: [email protected]
Usertags: randomness timestamps
X-Debbugs-Cc: [email protected]
Hi,
While working on the "reproducible builds" effort [1], we have noticed
that ruby-rmagick could not be built reproducibly.
This is due to:
- Inherent randomness in some of the documentation images. For example,
using fractals and/or random noise.
- Examples using timestamps as image captions.
In order to fix the former, I needed to expose ImageMagick's
SeedPseudoRandomGenerator method via the RMagick interface itself and
then ensure it is called in the right documentation fragments. To fix
the later, I simply hardcoded the image captions.
Patch attached. Once applied, ruby-rmagick can be built reproducibly
in our reproducible toolchain.
[1]: https://wiki.debian.org/ReproducibleBuilds
Regards,
--
,''`.
: :' : Chris Lamb
`. `'` [email protected] / chris-lamb.co.uk
`-
diff --git a/doc/ex/add_noise.rb b/doc/ex/add_noise.rb
index 4756efe..1fff60d 100644
--- a/doc/ex/add_noise.rb
+++ b/doc/ex/add_noise.rb
@@ -1,5 +1,6 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
# Demonstrate the Image#add_noise method
NOISE_TYPES = [Magick::UniformNoise, Magick::GaussianNoise,
diff --git a/doc/ex/enhance.rb b/doc/ex/enhance.rb
index fd76795..e9daac3 100644
--- a/doc/ex/enhance.rb
+++ b/doc/ex/enhance.rb
@@ -1,5 +1,6 @@
#!/usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
# Demonstrate the Image#enhance method
diff --git a/doc/ex/matte_fill_to_border.rb b/doc/ex/matte_fill_to_border.rb
index 3ae1a15..05a2412 100644
--- a/doc/ex/matte_fill_to_border.rb
+++ b/doc/ex/matte_fill_to_border.rb
@@ -1,6 +1,7 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
img = Magick::Image.new(200,200)
img.compression = Magick::LZWCompression
diff --git a/doc/ex/matte_floodfill.rb b/doc/ex/matte_floodfill.rb
index e528d11..b101024 100644
--- a/doc/ex/matte_floodfill.rb
+++ b/doc/ex/matte_floodfill.rb
@@ -1,6 +1,7 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
img = Magick::Image.new(200,200)
img.compression = Magick::LZWCompression
diff --git a/doc/ex/matte_replace.rb b/doc/ex/matte_replace.rb
index fa047cd..655bd0f 100644
--- a/doc/ex/matte_replace.rb
+++ b/doc/ex/matte_replace.rb
@@ -1,6 +1,7 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
img = Magick::Image.new(200,200)
img.compression = Magick::LZWCompression
diff --git a/doc/ex/median_filter.rb b/doc/ex/median_filter.rb
index 70dc899..7202b4e 100644
--- a/doc/ex/median_filter.rb
+++ b/doc/ex/median_filter.rb
@@ -1,5 +1,6 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
# Demonstrate the Image#median_filter method
diff --git a/doc/ex/polaroid.rb b/doc/ex/polaroid.rb
index 026af47..23f3ebc 100644
--- a/doc/ex/polaroid.rb
+++ b/doc/ex/polaroid.rb
@@ -5,7 +5,7 @@ require 'date'
# Demonstrate the Image#polaroid method
img = Magick::Image.read('images/Flower_Hat.jpg').first
-img[:Caption] = "\nLosha\n" + Date.today.to_s
+img[:Caption] = "\nLosha\nPlus hat"
begin
picture = img.polaroid do
diff --git a/doc/ex/reduce_noise.rb b/doc/ex/reduce_noise.rb
index 05615e4..b139c2d 100644
--- a/doc/ex/reduce_noise.rb
+++ b/doc/ex/reduce_noise.rb
@@ -1,5 +1,6 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
# Demonstrate the Image#reduce_noise method
diff --git a/doc/ex/sketch.rb b/doc/ex/sketch.rb
index f4e7eda..f263c86 100644
--- a/doc/ex/sketch.rb
+++ b/doc/ex/sketch.rb
@@ -1,6 +1,7 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
img = Magick::Image.read('images/Flower_Hat.jpg').first
diff --git a/doc/ex/spread.rb b/doc/ex/spread.rb
index 7bf9d96..fd4d86d 100644
--- a/doc/ex/spread.rb
+++ b/doc/ex/spread.rb
@@ -1,5 +1,6 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
# Demonstrate the Image#spread method
diff --git a/doc/ex/transparent.rb b/doc/ex/transparent.rb
index 3280021..8fdc887 100644
--- a/doc/ex/transparent.rb
+++ b/doc/ex/transparent.rb
@@ -1,5 +1,6 @@
#! /usr/local/bin/ruby -w
require 'RMagick'
+Magick::seed_pseudo_random_generator 0
# Demonstrate the Image#transparent method.
# Change all black pixels in the image to transparent.
diff --git a/ext/RMagick/rmagick.c b/ext/RMagick/rmagick.c
index 661f95f..5c81108 100644
--- a/ext/RMagick/rmagick.c
+++ b/ext/RMagick/rmagick.c
@@ -392,3 +392,24 @@ Magick_set_log_format(VALUE class, VALUE format)
return class;
}
+
+/**
+ * Sets the pseudo-random number generator secret key
+ *
+ * Ruby usage:
+ * - @verbatim Magick.seed_pseudo_random_generator(seed) @endverbatim
+ *
+ * Notes:
+ * - singleton method
+ *
+ * @param class the class on which the method is run.
+ * @param seed the secret key
+ * @return the class.
+ */
+VALUE
+Magick_seed_pseudo_random_generator(VALUE class, VALUE seed)
+{
+ unsigned long s = NUM2ULONG(seed);
+ (void) SeedPseudoRandomGenerator(s);
+ return class;
+}
diff --git a/ext/RMagick/rmagick.h b/ext/RMagick/rmagick.h
index 8aa6f3f..30c4f38 100644
--- a/ext/RMagick/rmagick.h
+++ b/ext/RMagick/rmagick.h
@@ -676,6 +676,7 @@ extern VALUE Magick_limit_resource(int, VALUE *, VALUE);
extern VALUE Magick_set_cache_threshold(VALUE, VALUE);
extern VALUE Magick_set_log_event_mask(int, VALUE *, VALUE);
extern VALUE Magick_set_log_format(VALUE, VALUE);
+extern VALUE Magick_seed_pseudo_random_generator(VALUE, VALUE);
// rmdraw.c
ATTR_WRITER(Draw, affine)
diff --git a/ext/RMagick/rmmain.c b/ext/RMagick/rmmain.c
index e5ebc92..6fc465c 100644
--- a/ext/RMagick/rmmain.c
+++ b/ext/RMagick/rmmain.c
@@ -184,6 +184,7 @@ Init_RMagick2(void)
rb_define_module_function(Module_Magick, "set_cache_threshold",
Magick_set_cache_threshold, 1);
rb_define_module_function(Module_Magick, "set_log_event_mask",
Magick_set_log_event_mask, -1);
rb_define_module_function(Module_Magick, "set_log_format",
Magick_set_log_format, 1);
+ rb_define_module_function(Module_Magick, "seed_pseudo_random_generator",
Magick_seed_pseudo_random_generator, 1);
/*-----------------------------------------------------------------------*/
/* Class Magick::Image methods */
_______________________________________________
Pkg-ruby-extras-maintainers mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-ruby-extras-maintainers