rmagick 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rmagick might be problematic. Click here for more details.
- data/ChangeLog +232 -0
- data/Makefile.in +28 -0
- data/README.html +404 -0
- data/README.txt +397 -0
- data/configure +8554 -0
- data/configure.ac +497 -0
- data/doc/comtasks.html +241 -0
- data/doc/constants.html +1195 -0
- data/doc/css/doc.css +299 -0
- data/doc/css/popup.css +34 -0
- data/doc/draw.html +3108 -0
- data/doc/ex/Adispatch.rb +43 -0
- data/doc/ex/Zconstitute.rb +9 -0
- data/doc/ex/adaptive_threshold.rb +19 -0
- data/doc/ex/add_noise.rb +18 -0
- data/doc/ex/affine.rb +48 -0
- data/doc/ex/affine_transform.rb +20 -0
- data/doc/ex/arc.rb +47 -0
- data/doc/ex/arcpath.rb +33 -0
- data/doc/ex/average.rb +15 -0
- data/doc/ex/axes.rb +64 -0
- data/doc/ex/bilevel_channel.rb +20 -0
- data/doc/ex/blur_image.rb +12 -0
- data/doc/ex/border.rb +10 -0
- data/doc/ex/bounding_box.rb +48 -0
- data/doc/ex/cbezier1.rb +40 -0
- data/doc/ex/cbezier2.rb +40 -0
- data/doc/ex/cbezier3.rb +40 -0
- data/doc/ex/cbezier4.rb +41 -0
- data/doc/ex/cbezier5.rb +41 -0
- data/doc/ex/cbezier6.rb +51 -0
- data/doc/ex/channel.rb +26 -0
- data/doc/ex/channel_threshold.rb +48 -0
- data/doc/ex/charcoal.rb +12 -0
- data/doc/ex/chop.rb +29 -0
- data/doc/ex/circle.rb +31 -0
- data/doc/ex/clip_path.rb +56 -0
- data/doc/ex/coalesce.rb +60 -0
- data/doc/ex/color_fill_to_border.rb +29 -0
- data/doc/ex/color_floodfill.rb +28 -0
- data/doc/ex/color_histogram.rb +60 -0
- data/doc/ex/color_reset.rb +11 -0
- data/doc/ex/colorize.rb +16 -0
- data/doc/ex/colors.rb +65 -0
- data/doc/ex/composite.rb +135 -0
- data/doc/ex/contrast.rb +37 -0
- data/doc/ex/crop.rb +31 -0
- data/doc/ex/crop_with_gravity.rb +46 -0
- data/doc/ex/cycle_colormap.rb +21 -0
- data/doc/ex/demo.rb +324 -0
- data/doc/ex/drawcomp.rb +42 -0
- data/doc/ex/drop_shadow.rb +60 -0
- data/doc/ex/edge.rb +11 -0
- data/doc/ex/ellipse.rb +43 -0
- data/doc/ex/emboss.rb +11 -0
- data/doc/ex/enhance.rb +28 -0
- data/doc/ex/equalize.rb +11 -0
- data/doc/ex/flatten_images.rb +38 -0
- data/doc/ex/flip.rb +11 -0
- data/doc/ex/flop.rb +11 -0
- data/doc/ex/fonts.rb +20 -0
- data/doc/ex/frame.rb +12 -0
- data/doc/ex/gaussian_blur.rb +11 -0
- data/doc/ex/get_multiline_type_metrics.rb +53 -0
- data/doc/ex/get_pixels.rb +48 -0
- data/doc/ex/get_type_metrics.rb +140 -0
- data/doc/ex/gradientfill.rb +27 -0
- data/doc/ex/grav.rb +44 -0
- data/doc/ex/gravity.rb +80 -0
- data/doc/ex/hatchfill.rb +27 -0
- data/doc/ex/images/Ballerina.jpg +0 -0
- data/doc/ex/images/Ballerina3.jpg +0 -0
- data/doc/ex/images/Button_0.gif +0 -0
- data/doc/ex/images/Button_1.gif +0 -0
- data/doc/ex/images/Button_2.gif +0 -0
- data/doc/ex/images/Button_3.gif +0 -0
- data/doc/ex/images/Button_4.gif +0 -0
- data/doc/ex/images/Button_5.gif +0 -0
- data/doc/ex/images/Button_6.gif +0 -0
- data/doc/ex/images/Button_7.gif +0 -0
- data/doc/ex/images/Button_8.gif +0 -0
- data/doc/ex/images/Button_9.gif +0 -0
- data/doc/ex/images/Button_A.gif +0 -0
- data/doc/ex/images/Button_B.gif +0 -0
- data/doc/ex/images/Button_C.gif +0 -0
- data/doc/ex/images/Button_D.gif +0 -0
- data/doc/ex/images/Button_E.gif +0 -0
- data/doc/ex/images/Button_F.gif +0 -0
- data/doc/ex/images/Button_G.gif +0 -0
- data/doc/ex/images/Button_H.gif +0 -0
- data/doc/ex/images/Button_I.gif +0 -0
- data/doc/ex/images/Button_J.gif +0 -0
- data/doc/ex/images/Button_K.gif +0 -0
- data/doc/ex/images/Button_L.gif +0 -0
- data/doc/ex/images/Button_M.gif +0 -0
- data/doc/ex/images/Button_N.gif +0 -0
- data/doc/ex/images/Button_O.gif +0 -0
- data/doc/ex/images/Button_P.gif +0 -0
- data/doc/ex/images/Button_Q.gif +0 -0
- data/doc/ex/images/Button_R.gif +0 -0
- data/doc/ex/images/Button_S.gif +0 -0
- data/doc/ex/images/Button_T.gif +0 -0
- data/doc/ex/images/Button_U.gif +0 -0
- data/doc/ex/images/Button_V.gif +0 -0
- data/doc/ex/images/Button_W.gif +0 -0
- data/doc/ex/images/Button_X.gif +0 -0
- data/doc/ex/images/Button_Y.gif +0 -0
- data/doc/ex/images/Button_Z.gif +0 -0
- data/doc/ex/images/Cheetah.jpg +0 -0
- data/doc/ex/images/Coffee.wmf +0 -0
- data/doc/ex/images/Flower_Hat.jpg +0 -0
- data/doc/ex/images/Gold_Statue.jpg +0 -0
- data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
- data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
- data/doc/ex/images/No.wmf +0 -0
- data/doc/ex/images/Polynesia.jpg +0 -0
- data/doc/ex/images/Red_Rocks.jpg +0 -0
- data/doc/ex/images/Shorts.jpg +0 -0
- data/doc/ex/images/Snake.wmf +0 -0
- data/doc/ex/images/Violin.jpg +0 -0
- data/doc/ex/images/graydient230x6.gif +0 -0
- data/doc/ex/images/logo400x83.gif +0 -0
- data/doc/ex/images/model.miff +0 -0
- data/doc/ex/images/notimplemented.gif +0 -0
- data/doc/ex/images/smile.miff +0 -0
- data/doc/ex/images/spin.gif +0 -0
- data/doc/ex/implode.rb +32 -0
- data/doc/ex/level.rb +12 -0
- data/doc/ex/level_channel.rb +33 -0
- data/doc/ex/line.rb +40 -0
- data/doc/ex/map.rb +28 -0
- data/doc/ex/map_f.rb +15 -0
- data/doc/ex/matte_fill_to_border.rb +42 -0
- data/doc/ex/matte_floodfill.rb +35 -0
- data/doc/ex/matte_replace.rb +42 -0
- data/doc/ex/median_filter.rb +28 -0
- data/doc/ex/modulate.rb +11 -0
- data/doc/ex/mono.rb +23 -0
- data/doc/ex/morph.rb +26 -0
- data/doc/ex/mosaic.rb +35 -0
- data/doc/ex/motion_blur.rb +11 -0
- data/doc/ex/negate.rb +11 -0
- data/doc/ex/negate_channel.rb +19 -0
- data/doc/ex/normalize.rb +11 -0
- data/doc/ex/oil_paint.rb +11 -0
- data/doc/ex/opacity.rb +38 -0
- data/doc/ex/opaque.rb +14 -0
- data/doc/ex/ordered_dither.rb +11 -0
- data/doc/ex/path.rb +62 -0
- data/doc/ex/pattern1.rb +25 -0
- data/doc/ex/pattern2.rb +26 -0
- data/doc/ex/polygon.rb +24 -0
- data/doc/ex/polyline.rb +23 -0
- data/doc/ex/posterize.rb +19 -0
- data/doc/ex/preview.rb +16 -0
- data/doc/ex/qbezierpath.rb +49 -0
- data/doc/ex/quantize-m.rb +25 -0
- data/doc/ex/radial_blur.rb +19 -0
- data/doc/ex/raise.rb +11 -0
- data/doc/ex/random_channel_threshold.rb +17 -0
- data/doc/ex/random_threshold_channel.rb +18 -0
- data/doc/ex/rectangle.rb +33 -0
- data/doc/ex/reduce_noise.rb +28 -0
- data/doc/ex/roll.rb +9 -0
- data/doc/ex/rotate.rb +43 -0
- data/doc/ex/rotate_f.rb +14 -0
- data/doc/ex/roundrect.rb +32 -0
- data/doc/ex/rubyname.rb +31 -0
- data/doc/ex/segment.rb +11 -0
- data/doc/ex/shade.rb +11 -0
- data/doc/ex/shave.rb +15 -0
- data/doc/ex/shear.rb +10 -0
- data/doc/ex/skewx.rb +50 -0
- data/doc/ex/skewy.rb +45 -0
- data/doc/ex/smile.rb +124 -0
- data/doc/ex/solarize.rb +11 -0
- data/doc/ex/splice.rb +16 -0
- data/doc/ex/spread.rb +11 -0
- data/doc/ex/stegano.rb +50 -0
- data/doc/ex/stroke_dasharray.rb +41 -0
- data/doc/ex/stroke_linecap.rb +44 -0
- data/doc/ex/stroke_linejoin.rb +48 -0
- data/doc/ex/stroke_width.rb +47 -0
- data/doc/ex/swirl.rb +17 -0
- data/doc/ex/text.rb +32 -0
- data/doc/ex/text_align.rb +36 -0
- data/doc/ex/text_antialias.rb +33 -0
- data/doc/ex/text_undercolor.rb +26 -0
- data/doc/ex/texture_fill_to_border.rb +34 -0
- data/doc/ex/texture_floodfill.rb +31 -0
- data/doc/ex/texturefill.rb +25 -0
- data/doc/ex/threshold.rb +13 -0
- data/doc/ex/to_blob.rb +14 -0
- data/doc/ex/translate.rb +37 -0
- data/doc/ex/transparent.rb +38 -0
- data/doc/ex/trim.rb +25 -0
- data/doc/ex/unsharp_mask.rb +28 -0
- data/doc/ex/viewex.rb +36 -0
- data/doc/ex/wave.rb +9 -0
- data/doc/ilist.html +1592 -0
- data/doc/image1.html +3009 -0
- data/doc/image2.html +2169 -0
- data/doc/image3.html +2815 -0
- data/doc/imageattrs.html +1319 -0
- data/doc/imusage.html +403 -0
- data/doc/index.html +418 -0
- data/doc/info.html +949 -0
- data/doc/magick.html +439 -0
- data/doc/scripts/doc.js +9 -0
- data/doc/struct.html +1334 -0
- data/doc/usage.html +1318 -0
- data/examples/describe.rb +44 -0
- data/examples/histogram.rb +289 -0
- data/examples/image_opacity.rb +29 -0
- data/examples/import_export.rb +31 -0
- data/examples/pattern_fill.rb +38 -0
- data/examples/rotating_text.rb +47 -0
- data/examples/thumbnail.rb +65 -0
- data/examples/vignette.rb +79 -0
- data/ext/RMagick/MANIFEST +239 -0
- data/ext/RMagick/extconf.rb.in +21 -0
- data/ext/RMagick/rmagick.h +938 -0
- data/ext/RMagick/rmagick_config.h.in +170 -0
- data/ext/RMagick/rmdraw.c +1308 -0
- data/ext/RMagick/rmfill.c +609 -0
- data/ext/RMagick/rmilist.c +685 -0
- data/ext/RMagick/rmimage.c +7980 -0
- data/ext/RMagick/rminfo.c +982 -0
- data/ext/RMagick/rmmain.c +1497 -0
- data/ext/RMagick/rmutil.c +2685 -0
- data/install.rb +1015 -0
- data/lib/RMagick.rb +1486 -0
- data/metaconfig.in +6 -0
- data/post-clean.rb +12 -0
- data/post-install.rb +36 -0
- data/post-setup.rb +245 -0
- data/rmagick.gemspec +22 -0
- data/uninstall.rb +71 -0
- metadata +286 -0
data/doc/ex/edge.rb
ADDED
data/doc/ex/ellipse.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
require 'RMagick'
|
3
|
+
|
4
|
+
imgl = Magick::ImageList.new
|
5
|
+
imgl.new_image(360, 250, Magick::HatchFill.new('white','LightCyan2'))
|
6
|
+
|
7
|
+
gc = Magick::Draw.new
|
8
|
+
|
9
|
+
gc.fill_opacity(0)
|
10
|
+
gc.stroke('red').stroke_width(3)
|
11
|
+
|
12
|
+
# Draw ellipse
|
13
|
+
gc.ellipse(180,125, 150,75, 0, 270)
|
14
|
+
|
15
|
+
# Draw horizontal width line
|
16
|
+
gc.stroke('gray50').stroke_width(1)
|
17
|
+
gc.line(180-150, 125, 180, 125)
|
18
|
+
|
19
|
+
# Draw vertical height line
|
20
|
+
gc.line(180, 125-75, 180, 125)
|
21
|
+
gc.fill_opacity(0)
|
22
|
+
|
23
|
+
# Draw arcStart circle
|
24
|
+
gc.circle(180+150, 125, 180+150+3, 125+3)
|
25
|
+
|
26
|
+
# Draw arcEnd circle
|
27
|
+
gc.circle(180, 125-75, 180+3, 125-75+3)
|
28
|
+
|
29
|
+
# Annotate
|
30
|
+
gc.fill_opacity(1)
|
31
|
+
gc.circle(180,125, 183,128)
|
32
|
+
gc.fill('black')
|
33
|
+
gc.stroke('transparent')
|
34
|
+
gc.text(187,125, "'180,125'")
|
35
|
+
gc.text(253, 118, "'Start 0 degrees'")
|
36
|
+
gc.text(187, 50, "'End 270 degrees'")
|
37
|
+
gc.text(120, 100, "'Height=75'")
|
38
|
+
gc.text(85, 140, "'Width=150'")
|
39
|
+
gc.draw(imgl)
|
40
|
+
|
41
|
+
imgl.border!(1,1, "LightCyan2")
|
42
|
+
|
43
|
+
imgl.write("ellipse.gif")
|
data/doc/ex/emboss.rb
ADDED
data/doc/ex/enhance.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
require 'RMagick'
|
3
|
+
|
4
|
+
# Demonstrate the Image#enhance method
|
5
|
+
|
6
|
+
img = Magick::Image.read('images/Flower_Hat.jpg').first
|
7
|
+
img = img.add_noise(Magick::UniformNoise)
|
8
|
+
|
9
|
+
eimg = img.enhance
|
10
|
+
|
11
|
+
# Zoom in so we can see the change
|
12
|
+
img.resize!(3)
|
13
|
+
eimg.resize!(3)
|
14
|
+
|
15
|
+
# Make a before-and-after composite
|
16
|
+
eimg.crop!(Magick::EastGravity, eimg.columns/2, eimg.rows)
|
17
|
+
img = img.composite(eimg, Magick::EastGravity, Magick::OverCompositeOp)
|
18
|
+
|
19
|
+
# Draw a black line between the before and after parts.
|
20
|
+
line = Magick::Draw.new
|
21
|
+
line.line(img.columns/2, 0, img.columns/2, img.rows)
|
22
|
+
line.draw(img)
|
23
|
+
|
24
|
+
# Crop everything but the face.
|
25
|
+
img.crop!(Magick::CenterGravity, 250, 200)
|
26
|
+
|
27
|
+
img.write('enhance.jpg')
|
28
|
+
exit
|
data/doc/ex/equalize.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# Demonstrate flatten_images method. Create an image with a drop-shadow effect.
|
4
|
+
|
5
|
+
require 'RMagick'
|
6
|
+
|
7
|
+
RMagick = 'RMagick'
|
8
|
+
|
9
|
+
i = Magick::ImageList.new
|
10
|
+
|
11
|
+
# Create a background image with a gradient fill
|
12
|
+
i.new_image(200, 100, Magick::GradientFill.new(100,50, 100, 50, "khaki1", "turquoise"))
|
13
|
+
|
14
|
+
# Create a transparent image for the text shadow
|
15
|
+
i.new_image(200, 100) { self.background_color = 'transparent' }
|
16
|
+
primitives = Magick::Draw.new
|
17
|
+
primitives.annotate i, 0, 0, 2, 2, RMagick do
|
18
|
+
self.pointsize = 32
|
19
|
+
self.font = "Helvetica"
|
20
|
+
self.fill = "gray50"
|
21
|
+
self.gravity = Magick::CenterGravity
|
22
|
+
end
|
23
|
+
|
24
|
+
# Create another transparent image for the text itself
|
25
|
+
i.new_image(200, 100) { self.background_color = 'transparent' }
|
26
|
+
primitives = Magick::Draw.new
|
27
|
+
primitives.annotate i, 0, 0, -2, -2, RMagick do
|
28
|
+
self.pointsize = 32
|
29
|
+
self.font = "Helvetica"
|
30
|
+
self.fill = "red"
|
31
|
+
self.stroke = "black"
|
32
|
+
self.gravity = Magick::CenterGravity
|
33
|
+
end
|
34
|
+
|
35
|
+
# Flatten all 3 into a single image.
|
36
|
+
# i.display
|
37
|
+
i.flatten_images.write "flatten_images.gif"
|
38
|
+
exit
|
data/doc/ex/flip.rb
ADDED
data/doc/ex/flop.rb
ADDED
data/doc/ex/fonts.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
require 'RMagick'
|
3
|
+
|
4
|
+
# Compute column widths
|
5
|
+
name_length = 0
|
6
|
+
family_length = 0
|
7
|
+
Magick::fonts { |font|
|
8
|
+
if font.name.length > name_length
|
9
|
+
name_length = font.name.length
|
10
|
+
end
|
11
|
+
if font.family.length > family_length
|
12
|
+
family_length = font.family.length
|
13
|
+
end
|
14
|
+
}
|
15
|
+
|
16
|
+
# Print all fonts
|
17
|
+
Magick::fonts { |font|
|
18
|
+
printf("%-*s %-*s %d %s\t%s\n", name_length, font.name,
|
19
|
+
family_length, font.family, font.weight, font.style, font.stretch)
|
20
|
+
}
|
data/doc/ex/frame.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
require 'RMagick'
|
3
|
+
|
4
|
+
include Magick
|
5
|
+
|
6
|
+
TEXT = 'get\nmultiline\ntype\nmetrics'
|
7
|
+
|
8
|
+
background = Image.new(200, 200)
|
9
|
+
gc = Draw.new
|
10
|
+
|
11
|
+
# Draw the text centered on the background
|
12
|
+
gc.annotate(background, 0, 0, 0, 0, TEXT) do |gc|
|
13
|
+
gc.font_family = 'Verdana'
|
14
|
+
gc.pointsize = 36
|
15
|
+
gc.gravity = CenterGravity
|
16
|
+
gc.stroke = 'none'
|
17
|
+
end
|
18
|
+
|
19
|
+
begin
|
20
|
+
|
21
|
+
# Get the metrics
|
22
|
+
metrics = gc.get_multiline_type_metrics(background, TEXT)
|
23
|
+
|
24
|
+
# Compute the corners for a rectangle surrounding the text
|
25
|
+
x = (background.columns - metrics.width) / 2
|
26
|
+
y = (background.rows - metrics.height) / 2
|
27
|
+
|
28
|
+
# Draw 2 rectangles over the text.
|
29
|
+
gc = Draw.new
|
30
|
+
gc.stroke('red')
|
31
|
+
gc.stroke_width(5)
|
32
|
+
gc.stroke_linejoin('round')
|
33
|
+
gc.fill('cyan')
|
34
|
+
gc.fill_opacity(0.10)
|
35
|
+
gc.rectangle(x, y, x+metrics.width, y+metrics.height)
|
36
|
+
|
37
|
+
gc.stroke('white')
|
38
|
+
gc.stroke_width(1)
|
39
|
+
gc.fill('none')
|
40
|
+
gc.rectangle(x, y, x+metrics.width, y+metrics.height)
|
41
|
+
gc.draw(background)
|
42
|
+
|
43
|
+
background.border!(1,1, 'blue')
|
44
|
+
|
45
|
+
# Substitute the standard "Not Implemented" image
|
46
|
+
rescue NotImplementedError
|
47
|
+
not_implemented = Magick::Image.read("images/notimplemented.gif").first
|
48
|
+
not_implemented.resize!(background.columns, background.rows)
|
49
|
+
background = not_implemented
|
50
|
+
end
|
51
|
+
|
52
|
+
background.write('get_multiline_type_metrics.gif')
|
53
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
require 'RMagick'
|
3
|
+
|
4
|
+
# Demonstrate partial transparency and the get_pixels and
|
5
|
+
# store_pixels methods by creating an image that goes from
|
6
|
+
# full-color on the left to monochrome on the right.
|
7
|
+
|
8
|
+
# Read the colorful picture of a rock formation. Scale
|
9
|
+
# it to 300 pixels high because we don't want a big picture.
|
10
|
+
rocks = Magick::Image.read('images/Red_Rocks.jpg').first
|
11
|
+
rocks.scale!(250.0/rocks.rows)
|
12
|
+
|
13
|
+
# Make a monochrome copy. See Image#quantize for details
|
14
|
+
grayrocks = rocks.quantize(256, Magick::GRAYColorspace)
|
15
|
+
|
16
|
+
rows = grayrocks.rows
|
17
|
+
cols = grayrocks.columns
|
18
|
+
|
19
|
+
# Create an array of opacity values, proceeding from
|
20
|
+
# transparent to opaque. The array should have as many
|
21
|
+
# elements as there are columns in the image. The first
|
22
|
+
# element should be TransparentOpacity and each succeeding
|
23
|
+
# element slightly more opaque than its predecessor.
|
24
|
+
step = Magick::TransparentOpacity / cols.to_f
|
25
|
+
opacity_steps = Array.new(cols)
|
26
|
+
cols.times { |x|
|
27
|
+
opacity_steps[x] = Magick::TransparentOpacity - Integer(x * step)
|
28
|
+
if opacity_steps[x] < Magick::OpaqueOpacity
|
29
|
+
opacity_steps[x] = Magick::OpaqueOpacity
|
30
|
+
end
|
31
|
+
}
|
32
|
+
|
33
|
+
# Get each row of pixels from the mono image.
|
34
|
+
# Copy the pre-computed opacity values to the pixels.
|
35
|
+
# Store the pixels back.
|
36
|
+
rows.times { |y|
|
37
|
+
pixels = grayrocks.get_pixels(0, y, cols, 1)
|
38
|
+
pixels.each_with_index { |p,x| p.opacity = opacity_steps[x] }
|
39
|
+
grayrocks.store_pixels(0, y, cols, 1, pixels)
|
40
|
+
}
|
41
|
+
|
42
|
+
# Composite the mono version of the image over the color version.
|
43
|
+
grayrocks.matte = true
|
44
|
+
combine = rocks.composite(grayrocks, Magick::CenterGravity, Magick::OverCompositeOp)
|
45
|
+
#combine.display
|
46
|
+
combine.write 'get_pixels.jpg'
|
47
|
+
exit
|
48
|
+
|
@@ -0,0 +1,140 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
require 'RMagick'
|
3
|
+
include Magick
|
4
|
+
|
5
|
+
# Add a method for drawing braces.
|
6
|
+
class Draw
|
7
|
+
|
8
|
+
# (w,h) - width & height of rectangle enclosing brace.
|
9
|
+
# Normally the brace is drawn with its opening to the
|
10
|
+
# left and its lower point on the origin.
|
11
|
+
#
|
12
|
+
# Set w < 0 to draw right-opening brace. Set h < 0 to
|
13
|
+
# position top point at origin.
|
14
|
+
#
|
15
|
+
# The placement & orientation is affected by the
|
16
|
+
# current user coordinate system.
|
17
|
+
def brace(w, h)
|
18
|
+
raise(ArgumentError, "width must be != 0") unless w != 0
|
19
|
+
raise(ArgumentError, "height must be != 0") unless h != 0
|
20
|
+
path("M0,0 Q#{w},0 #{w/2.0},#{-h/4.0} T#{w},#{-h/2.0}" +
|
21
|
+
"Q0,#{-h/2.0} #{w/2.0},#{-(3.0*h/4.0)} T0,#{-h}")
|
22
|
+
end
|
23
|
+
|
24
|
+
end # class Draw
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
Origin_x = 110
|
30
|
+
Origin_y = 220
|
31
|
+
Glyph = 'g'
|
32
|
+
|
33
|
+
canvas = Image.new(410,300,HatchFill.new('white', 'lightcyan2'))
|
34
|
+
|
35
|
+
# Draw a big lowercase 'g' on the canvas. Leave room on all sides for
|
36
|
+
# the labels. Use 'undercolor' to set off the glyph.
|
37
|
+
glyph = Draw.new
|
38
|
+
glyph.annotate(canvas, 0, 0, Origin_x, Origin_y, Glyph) do |opts|
|
39
|
+
opts.pointsize = 124
|
40
|
+
opts.stroke = 'none'
|
41
|
+
opts.fill = 'black'
|
42
|
+
opts.font_family = 'Times'
|
43
|
+
opts.undercolor = '#ffff00c0'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Call get_type_metrics. This is what this example's all about.
|
47
|
+
metrics = glyph.get_type_metrics(canvas, Glyph)
|
48
|
+
|
49
|
+
gc = Draw.new
|
50
|
+
|
51
|
+
# Draw the origin as a big red dot.
|
52
|
+
gc.stroke('red')
|
53
|
+
gc.fill('red')
|
54
|
+
gc.circle(Origin_x, Origin_y, Origin_x, Origin_y+2)
|
55
|
+
|
56
|
+
# All our lines will be medium-gray, dashed, and thin.
|
57
|
+
gc.stroke('gray50')
|
58
|
+
gc.stroke_dasharray(5,2)
|
59
|
+
gc.stroke_width(1)
|
60
|
+
gc.fill('none')
|
61
|
+
|
62
|
+
# baseline
|
63
|
+
gc.line(Origin_x-10, Origin_y, Origin_x+metrics.width+20, Origin_y)
|
64
|
+
|
65
|
+
# a vertical line through the origin
|
66
|
+
gc.line(Origin_x, 30, Origin_x, 270)
|
67
|
+
|
68
|
+
# descent
|
69
|
+
gc.line(Origin_x-10, Origin_y-metrics.descent, Origin_x+metrics.width+20, Origin_y-metrics.descent)
|
70
|
+
|
71
|
+
# ascent
|
72
|
+
gc.line(Origin_x-10, Origin_y-metrics.ascent, Origin_x+metrics.width+20, Origin_y-metrics.ascent)
|
73
|
+
|
74
|
+
# height
|
75
|
+
gc.line(Origin_x-10, Origin_y-metrics.height, Origin_x+metrics.width+10, Origin_y-metrics.height)
|
76
|
+
|
77
|
+
# width
|
78
|
+
gc.line(Origin_x+metrics.width, 30, Origin_x+metrics.width, 270)
|
79
|
+
|
80
|
+
# max_advance
|
81
|
+
gc.line(Origin_x+metrics.max_advance, Origin_y-metrics.descent-10,
|
82
|
+
Origin_x+metrics.max_advance, 270)
|
83
|
+
|
84
|
+
gc.draw(canvas)
|
85
|
+
|
86
|
+
# Draw the braces and labels. Position the braces by transforming the
|
87
|
+
# user coordinate system with translate and rotate methods.
|
88
|
+
gc = Draw.new
|
89
|
+
gc.font_family('Times')
|
90
|
+
gc.pointsize(13)
|
91
|
+
gc.fill('none')
|
92
|
+
gc.stroke('black')
|
93
|
+
gc.stroke_width(1)
|
94
|
+
|
95
|
+
# between origin and descent
|
96
|
+
gc.push
|
97
|
+
gc.translate(Origin_x+metrics.width+23, Origin_y)
|
98
|
+
gc.brace(10, metrics.descent)
|
99
|
+
gc.pop
|
100
|
+
|
101
|
+
# between origin and ascent
|
102
|
+
gc.push
|
103
|
+
gc.translate(Origin_x+metrics.width+23, Origin_y)
|
104
|
+
gc.brace(10, metrics.ascent)
|
105
|
+
gc.pop
|
106
|
+
|
107
|
+
# between origin and height
|
108
|
+
gc.push
|
109
|
+
gc.translate(Origin_x-13, Origin_y-metrics.height)
|
110
|
+
gc.rotate(180)
|
111
|
+
gc.brace(10, metrics.height)
|
112
|
+
gc.pop
|
113
|
+
|
114
|
+
# between origin and width
|
115
|
+
gc.push
|
116
|
+
gc.translate(Origin_x+metrics.width, 27.0)
|
117
|
+
gc.rotate(-90)
|
118
|
+
gc.brace(10, metrics.width)
|
119
|
+
gc.pop
|
120
|
+
|
121
|
+
# between origin and max_advance
|
122
|
+
gc.push
|
123
|
+
gc.translate(Origin_x, Origin_y-metrics.descent+14)
|
124
|
+
gc.rotate(90)
|
125
|
+
gc.brace(10, metrics.max_advance)
|
126
|
+
gc.pop
|
127
|
+
|
128
|
+
# Add labels
|
129
|
+
gc.stroke('none')
|
130
|
+
gc.fill('black')
|
131
|
+
gc.text(Origin_x+metrics.width+40, Origin_y-(metrics.ascent/2)+4, 'ascent')
|
132
|
+
gc.text(Origin_x+metrics.width+40, Origin_y-(metrics.descent/2)+4, 'descent')
|
133
|
+
gc.text(Origin_x-60, Origin_y-metrics.height/2+4, 'height')
|
134
|
+
gc.text(Origin_x+(metrics.width/2)-15, 15, 'width')
|
135
|
+
gc.text(Origin_x+(metrics.max_advance)/2-38, 290, "max_advance")
|
136
|
+
|
137
|
+
gc.draw(canvas)
|
138
|
+
canvas.border!(1,1,'blue')
|
139
|
+
canvas.write('get_type_metrics.gif')
|
140
|
+
|