[perl-Cairo] Add another PNG example
- From: Torsten Schönfeld <tsch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [perl-Cairo] Add another PNG example
- Date: Mon, 17 May 2010 19:01:01 +0000 (UTC)
commit 9a3c6e5ffcffccd895c5fc1d0d6a6e6e9985d706
Author: Torsten Schönfeld <kaffeetisch gmx de>
Date: Mon May 17 20:59:39 2010 +0200
Add another PNG example
examples/png/README | 3 -
examples/png/star_and_ring.pl | 164 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 164 insertions(+), 3 deletions(-)
---
diff --git a/examples/png/README b/examples/png/README
index 4b12f7f..f5dad51 100644
--- a/examples/png/README
+++ b/examples/png/README
@@ -1,6 +1,3 @@
These files are ports of the cairo-demo/png examples as of 2006-05-28. This
stuff isn't done in perlish ways so you've been warned. You'll need png backend
support.
-
-TODO:
- star_and_ring
diff --git a/examples/png/star_and_ring.pl b/examples/png/star_and_ring.pl
new file mode 100644
index 0000000..250d717
--- /dev/null
+++ b/examples/png/star_and_ring.pl
@@ -0,0 +1,164 @@
+#!/usr/bin/env perl
+
+# This a Perl port of the C example cairo-demo/png/star_and_ring.c. Original
+# copyright:
+
+# Copyright © 2005 Red Hat, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software
+# and its documentation for any purpose is hereby granted without
+# fee, provided that the above copyright notice appear in all copies
+# and that both that copyright notice and this permission notice
+# appear in supporting documentation, and that the name of
+# Red Hat, Inc. not be used in advertising or publicity pertaining to
+# distribution of the software without specific, written prior
+# permission. Red Hat, Inc. makes no representations about the
+# suitability of this software for any purpose. It is provided "as
+# is" without express or implied warranty.
+#
+# RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
+# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+# Author: Carl D. Worth <cworth cworth org>
+
+use strict;
+use warnings;
+use Cairo;
+
+use constant {
+ WIDTH => 600,
+ HEIGHT => 600,
+};
+
+sub ring_path {
+ my ($cr) = @_;
+
+ $cr->move_to (200.86568, 667.80795);
+ $cr->curve_to (110.32266, 562.62134,
+ 122.22863, 403.77940,
+ 227.41524, 313.23637);
+ $cr->curve_to (332.60185, 222.69334,
+ 491.42341, 234.57563,
+ 581.96644, 339.76224);
+ $cr->curve_to (672.50948, 444.94884,
+ 660.64756, 603.79410,
+ 555.46095, 694.33712);
+ $cr->curve_to (450.27436, 784.88016,
+ 291.40871, 772.99456,
+ 200.86568, 667.80795);
+ $cr->close_path;
+
+ $cr->move_to (272.14411, 365.19927);
+ $cr->curve_to (195.64476, 431.04875,
+ 186.97911, 546.57972,
+ 252.82859, 623.07908);
+ $cr->curve_to (318.67807, 699.57844,
+ 434.23272, 708.22370,
+ 510.73208, 642.37422);
+ $cr->curve_to (587.23144, 576.52474,
+ 595.85301, 460.99047,
+ 530.00354, 384.49112);
+ $cr->curve_to (464.15406, 307.99176,
+ 348.64347, 299.34979,
+ 272.14411, 365.19927);
+ $cr->close_path;
+}
+
+sub star_path {
+ my ($cr) = @_;
+
+ my $matrix = Cairo::Matrix->init (0.647919, -0.761710,
+ 0.761710, 0.647919,
+ -208.7977, 462.0608);
+ $cr->transform ($matrix);
+
+ $cr->move_to (505.80857, 746.23606);
+ $cr->line_to (335.06870, 555.86488);
+ $cr->line_to (91.840384, 635.31360);
+ $cr->line_to (282.21157, 464.57374);
+ $cr->line_to (202.76285, 221.34542);
+ $cr->line_to (373.50271, 411.71660);
+ $cr->line_to (616.73103, 332.26788);
+ $cr->line_to (426.35984, 503.00775);
+ $cr->line_to (505.80857, 746.23606);
+ $cr->close_path;
+}
+
+sub fill_ring {
+ my ($cr) = @_;
+
+ $cr->save;
+ $cr->translate (-90, -205);
+ ring_path ($cr);
+ $cr->set_source_rgba (1.0, 0.0, 0.0, 0.75);
+ $cr->fill;
+ $cr->restore;
+}
+
+sub fill_star {
+ my ($cr) = @_;
+
+ $cr->save;
+ $cr->translate (-90, -205);
+ star_path ($cr);
+ $cr->set_source_rgba (0.0, 0.0, 0xae / 0xff, 0.55135137);
+ $cr->fill;
+ $cr->restore;
+}
+
+sub clip_to_top_and_bottom {
+ my ($cr, $width, $height) = @_;
+ $cr->move_to (0, 0);
+ $cr->line_to ($width, 0);
+ $cr->line_to (0, $height);
+ $cr->line_to ($width, $height);
+ $cr->close_path;
+ $cr->clip;
+ $cr->new_path;
+}
+
+sub clip_to_left_and_right {
+ my ($cr, $width, $height) = @_;
+ $cr->move_to (0, 0);
+ $cr->line_to (0, $height);
+ $cr->line_to ($width, 0);
+ $cr->line_to ($width, $height);
+ $cr->close_path;
+ $cr->clip;
+ $cr->new_path;
+}
+
+{
+ my $result = Cairo::ImageSurface->create ('argb32', WIDTH, HEIGHT);
+ my $ring_over_star = Cairo::ImageSurface->create ('argb32', WIDTH, HEIGHT);
+ my $star_over_ring = Cairo::ImageSurface->create ('argb32', WIDTH, HEIGHT);
+
+ my $cr = Cairo::Context->create ($result);
+
+ {
+ my $cr_ros = Cairo::Context->create ($ring_over_star);
+ clip_to_top_and_bottom ($cr_ros, WIDTH, HEIGHT);
+ fill_star ($cr_ros);
+ fill_ring ($cr_ros);
+ }
+
+ {
+ my $cr_sor = Cairo::Context->create ($star_over_ring);
+ clip_to_left_and_right ($cr_sor, WIDTH, HEIGHT);
+ fill_ring ($cr_sor);
+ fill_star ($cr_sor);
+ }
+
+ $cr->set_operator ('add');
+ $cr->set_source_surface ($ring_over_star, 0, 0);
+ $cr->paint;
+ $cr->set_source_surface ($star_over_ring, 0, 0);
+ $cr->paint;
+
+ $result->write_to_png ("star_and_ring.png");
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]