[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pecl-cvs
Subject:    [PECL-CVS] cvs: pecl /ps/examples shading.php
From:       "Uwe Steinmann" <steinm () php ! net>
Date:       2004-07-27 14:23:27
Message-ID: cvssteinm1090938207 () cvsserver
[Download RAW message or body]

steinm		Tue Jul 27 10:23:27 2004 EDT

  Added files:                 
    /pecl/ps/examples	shading.php 
  Log:
  - new example to demonstrate gradient fills
  
  
["steinm-20040727102327.txt" (text/plain)]

http://cvs.php.net/co.php/pecl/ps/examples/shading.php?r=1.1&p=1
Index: pecl/ps/examples/shading.php
+++ pecl/ps/examples/shading.php
<?php
define(LEFT_BORDER, 50);

function footer($p, $text) {
	$psfont = PS_findfont($p, "Helvetica", "", 0);
	PS_setfont($p, $psfont, 8.0);
	$buffer = sprintf("This file has been created with pslib %s", PS_get_parameter($p, \
"dottedversion", 0.0));  PS_show_xy($p, $buffer, LEFT_BORDER, 25);
}

	$ps = PS_new();

	if (0 > PS_open_file($ps, "shading.ps")) {
		printf("Cannot open PostScript file\n");
		exit(1);
	}

	PS_set_parameter($ps, "warning", "false");
	PS_set_value($ps, "parskip", 10);

	PS_set_info($ps, "Creator", __FILE__);
	PS_set_info($ps, "Author", "Uwe Steinmann");
	PS_set_info($ps, "Title", "Shading Examples");
	PS_set_info($ps, "Keywords", "shading");

	$antiqua = PS_findfont($ps, "Helvetica", "", 0);

	/* Page 2 */
	PS_begin_page($ps, 596, 842);
	footer($ps, "");

	$shading1 = PS_shading($ps, "axial", 0.0, 0.0, 90.0, 0.0, 1.0, 0.0, 0.0, 0.0, NULL);
	$shading2 = PS_shading($ps, "axial", 10.0, 10.0, 90.0, 90.0, 1.0, 0.0, 0.0, 0.0, \
NULL);  $shading3 = PS_shading($ps, "axial", 10.0, 10.0, 90.0, 90.0, 1.0, 0.0, 0.0, \
0.0, "extend0 true extend1 true");  $shading4 = PS_shading($ps, "radial", 29.0, 29.0, \
55.0, 55.0, 1.0, 0.0, 0.0, 0.0, "r0 0 r1 45");  $shading5 = PS_shading($ps, "radial", \
29.0, 29.0, 55.0, 55.0, 1.0, 0.0, 0.0, 0.0, "r0 5 r1 45");  PS_save($ps);
	PS_translate($ps, 500, 0);
	PS_shfill($ps, $shading1);
	PS_restore($ps);

	PS_setfont($ps, $antiqua, 20.0);
	PS_show_xy($ps, "Shading", LEFT_BORDER, 763);
	PS_setfont($ps, $antiqua, 10.0);
	PS_set_value($ps, "leading", 15.0);
	PS_show_boxed($ps, "pslib supports a PostScript level 3 feature called shading. A \
shading starts at a certain point on the page with a given color and ends at a second \
point with different color. The type of shading can be 'axial' or 'radial'. Shadings \
are used for many purposes like shadows, three dimensional appearance or simply to \
make a nice background for a diagramm.\n\nThe bar's gradient fill to the right of \
this page starts at (500, 0) and ends at (590, 0). It extends over the whole page in \
y direction which is normal. I you want to restrict the gradient fill to a given \
area, one will have to apply PS_clip() on a path before calling PS_shfill() (see \
Shading 1).\n\nA grandient fill can easily be drawn in an angle if the start and end \
position have different x and y coordinates like in Shading 2.\n\nAs you can see at \
the bar, the shading extends orthogonal to the drawing direction but does not extend \
in the drawing direction. This behaviour can also be altered by the two parameters \
'extend0' and 'extend1'. Both are passed as part of the option list. Setting them to \
'true' will extend the gradient fill towards the drawing direction with the color \
where it left off or starts (see Shading 3).\n\nThe second class of gradient fills \
are of type 'radial'. They start at one circle and grow/shrink towards a second \
circle. The coordinates mentioned above now specify the middle points of the circles. \
The radi of both circles are passed again within the option list, named 'r0' and 'r1' \
(see Shading 4).\n\nThe previous example starts with a circle whose radius is 0. \
Making this a value greater 0 will punch a whole into the gradient fill.", \
LEFT_BORDER, 170, 260, 580, "left", NULL);

	PS_save($ps);
	PS_translate($ps, 350, 680);
	PS_show_xy($ps, "Shading 1", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_shfill($ps, $shading1);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 550);
	PS_show_xy($ps, "Shading 2", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_shfill($ps, $shading2);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 420);
	PS_show_xy($ps, "Shading 3", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_shfill($ps, $shading3);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 290);
	PS_show_xy($ps, "Shading 4", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_shfill($ps, $shading4);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 160);
	PS_show_xy($ps, "Shading 5", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_shfill($ps, $shading5);
	PS_restore($ps);
	PS_end_page($ps);

	/* Page 2 */
	PS_begin_page($ps, 596, 842);
	PS_setcolor($ps, "fill", "rgb", 1, 1, 1, 0);
	$shading1 = PS_shading($ps, "radial", 100.0, 100.0, 550.0, 550.0, 0.5, 0.0, 0.0, \
0.0, "N 1 r0 40 r1 795 extend1 false antialias true");  PS_setcolor($ps, "fill", \
"rgb", 0, 0.7, 0, 0);  $shading2 = PS_shading($ps, "radial", 50.0, 50.0, 50.0, 50.0, \
1.0, 1.0, 1.0, 0.0, "N 1 r0 40 r1 0 extend1 false extend0 false antialias true");  \
$shading3 = PS_shading($ps, "radial", 50.0, 50.0, 50.0, 50.0, 1.0, 1.0, 1.0, 0.0, "N \
1 r0 40 r1 0 extend0 true antialias true");  PS_setcolor($ps, "fill", "rgb", 0, 0, 1, \
0);  $shading4 = PS_shading($ps, "radial", 50.0, 50.0, 50.0, 50.0, 1.0, 1.0, 0.0, \
0.0, "N 1 r0 40 r1 0 extend0 true antialias true");  $shading5 = PS_shading($ps, \
"radial", 30.0, 30.0, 53.0, 53.0, 0.0, 0.0, 0.9, 0.0, "N 1 r0 20 r1 35 extend0 false \
extend1 false");  PS_setcolor($ps, "fill", "cmyk", 0.37, 0.0, 0.34, 0.34);
	$spotcolor = PS_makespotcolor($ps, "PANTONE 5565 C", 0);
	PS_setcolor($ps, "fill", "spot", (float) $spotcolor, 0.2, 0.0, 0.0);
	$shading6 = PS_shading($ps, "radial", 50.0, 50.0, 50.0, 50.0, (float) $spotcolor, \
0.8, 0.0, 0.0, "N 1 r0 40 r1 0 extend1 false extend0 false antialias true");

	PS_shfill($ps, $shading1);

	PS_setcolor($ps, "fill", "rgb", 0, 0, 0.7, 0);
	PS_setfont($ps, $antiqua, 20.0);
	PS_show_xy($ps, "The world of color shading", LEFT_BORDER, 763);
	PS_setfont($ps, $antiqua, 10.0);
	PS_set_value($ps, "leading", 15.0);
	PS_show_boxed($ps, "I suppose it does not really supprise you that gradient fills \
can be colorful. The first example is the background of this page which is a radial \
gradient fill from white to red (RGB [0,0,0.7]). Its outer circle has a very large \
radius of 795 pixels. The inner circle's radius is just 40 pixels. If there was \
something behind the gradient fill it would shine through the inner circle, because \
the gradient fill does not extend into that direction. There is a continuation of the \
red color beyond the outer circle, but that does not make a difference in this case, \
because its outside of the page and therefore not visible.\n\nShading 1 and Shading 2 \
illustrate the difference of the extend1 parameter being set to false in Shading 1 or \
true in Shading 2. Using extend is always a bit dangerous because it easily fills up \
the whole page, unless you clip the drawing area, which was done in all the examples \
on this page.\n\nUsing white as the start or end color is quite common but not \
nessecary. Shading 3 shows that any other color can be used as well.\n\nThe tube in \
Shading 4 is a bit of a misuse of shadings. It used alsmost identical start and end \
colors for the shading without any extend parameter set. This only works if the two \
colors are not identical. If they were identical you would see just the start and \
circle overlapping, because the gradient function has no domain it can run over. \
Well, this is anyway not the way to draw tubes.\n\nYou wonder if this all works with \
CMYK colors? Yes, of course it does! And what about spot colors? No problem either, \
with one little restriction. The start and end spot color must be same one, but with \
different tint value. That means that the gradient just changes the tint value but \
not the color itself. I am not sure if this is an unbearable restriction or not. \
Shading 5 shows an example of Pantone 5565 C starting at a tint value of 0.2 (the \
outer circle) and ending with 0.8 (the middle point).", LEFT_BORDER, 170, 260, 580, \
"left", NULL);

	PS_save($ps);
	PS_translate($ps, 350, 650);
	PS_show_xy($ps, "Shading 1", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_setcolor($ps, "fill", "rgb", 1, 1, 1, 0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_shfill($ps, $shading2);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 520);
	PS_show_xy($ps, "Shading 2", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_setcolor($ps, "fill", "rgb", 1, 1, 1, 0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_shfill($ps, $shading3);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 390);
	PS_show_xy($ps, "Shading 3", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_setcolor($ps, "fill", "rgb", 1, 1, 1, 0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_shfill($ps, $shading4);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 260);
	PS_show_xy($ps, "Shading 4", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_setcolor($ps, "fill", "rgb", 1, 1, 1, 0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_shfill($ps, $shading5);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, 350, 130);
	PS_show_xy($ps, "Shading 5", 0, -12);
	PS_rect($ps, 0, 0, 100, 100);
	PS_clip($ps);
	PS_setcolor($ps, "fill", "rgb", 1, 1, 1, 0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_shfill($ps, $shading6);
	PS_restore($ps);

	PS_end_page($ps);

	/* Page 3 */
	PS_begin_page($ps, 596, 842);
	PS_setcolor($ps, "fill", "rgb", 0, 0, 1, 0);
	$shading1 = PS_shading($ps, "axial", (float) LEFT_BORDER, 0.0, 470.0, 0.0, 1.0, 1.0, \
0.0, 0.0, "N 1");  $shading2 = PS_shading($ps, "axial", 0.0, 0.0, 100.0, 0.0, 1.0, \
1.0, 0.0, 0.0, "N 1");

	PS_setfont($ps, $antiqua, 20.0);
	PS_show_xy($ps, "Shading pattern", LEFT_BORDER, 763);
	PS_setfont($ps, $antiqua, 10.0);
	PS_set_value($ps, "leading", 15.0);
	PS_show_boxed($ps, "The examples so far were using the PS_shading() and PS_shfill() \
in combination wiht PS_clip(). They are more than sufficient in most cases, but pslib \
has a second approach to create areas with a gradient fill. Beside regular patterns \
--- which are used like regular colors --- used for filling an area with a drawing, \
one can use shading pattern in the same way. The results are similar, they way of \
doing it is different. Each filled rectangle below this text uses the same shading \
pattern for filling.", LEFT_BORDER, 170, 360, 580, "left", NULL);

	$pspattern = PS_shading_pattern($ps, $shading1, NULL);
	PS_setcolor($ps, "fill", "pattern", (float) $pspattern, 0.0, 0.0, 0.0);
	PS_rect($ps, LEFT_BORDER, 550, 100, 100);
	PS_fill($ps);
	PS_rect($ps, LEFT_BORDER+130, 550, 100, 100);
	PS_fill($ps);
	PS_rect($ps, LEFT_BORDER+260, 550, 100, 100);
	PS_fill($ps);
	PS_rect($ps, LEFT_BORDER+390, 550, 100, 100);
	PS_fill($ps);

	PS_show_boxed($ps, "The line of rectangles illustrates one important aspect of \
shading. The shading is defined relativ to the current coordinate system. In this \
case it starts at x-position 50 and ends at x-position 470 in an unmodified \
coordinate system. The right most rectangle is not filled completly because of the \
shadings end. Filling areas is like punching wholes in a white coat on top of the \
page and peeking through. This is mostly not what you want. If you would like to fill \
the rectangle with the full range of the shading, you will have to create a shading \
starting at 0 and ending at the width of the rectangle. Before filling the rectangle \
you will have to translate the coordinate system to the lower left corner of the \
rectangle, create the pattern in the modified coordinate system and draw a filled \
rectangle at (0, 0). The pattern must be created after the translation, because it \
always uses the active coordinate system.", LEFT_BORDER, 170, 360, 360, "left", \
NULL);

	PS_save($ps);
	PS_translate($ps, LEFT_BORDER, 240);
	$pspattern = PS_shading_pattern($ps, $shading2, NULL);
	PS_setcolor($ps, "fill", "pattern", (float) $pspattern, 0.0, 0.0, 0.0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_restore($ps);

	PS_save($ps);
	PS_translate($ps, LEFT_BORDER+130, 240);
	$pspattern = PS_shading_pattern($ps, $shading2, NULL);
	PS_setcolor($ps, "fill", "pattern", (float) $pspattern, 0.0, 0.0, 0.0);
	PS_rect($ps, 0, 0, 100, 100);
	PS_fill($ps);
	PS_restore($ps);

	PS_end_page($ps);

	/* Page 4 */
	PS_begin_page($ps, 596, 842);
	PS_setcolor($ps, "fill", "rgb", 0, 0, 1, 0);
	$shading1 = PS_shading($ps, "axial", (float) 0, 0.0, 470.0, 0.0, 1.0, 1.0, 0.0, 0.0, \
"N 1");

	PS_setfont($ps, $antiqua, 20.0);
	PS_show_xy($ps, "Using shading patterns for drawing", LEFT_BORDER, 763);
	PS_setfont($ps, $antiqua, 10.0);
	PS_set_value($ps, "leading", 15.0);
	PS_show_boxed($ps, "A pattern is like a color and be used like one. The examples on \
the previous pages used the pattern for filling rectangles. Why not use it for \
something more fancy like filling the outline of a text or drawing with a pattern.", \
LEFT_BORDER, 170, 360, 580, "left", NULL);

	PS_save($ps);
	PS_translate($ps, LEFT_BORDER, 620);
	$pspattern = PS_shading_pattern($ps, $shading1, NULL);
	PS_setcolor($ps, "stroke", "pattern", (float) $pspattern, 0.0, 0.0, 0.0);
	PS_setfont($ps, $antiqua, 90.0);
	PS_show_xy($ps, "Some text.", 0, 10);
	PS_setlinewidth($ps, 5);
	PS_moveto($ps, 0, 0);
	PS_lineto($ps, 470, 0);
	PS_stroke($ps);
	PS_restore($ps);

	PS_end_page($ps);

	PS_close($ps);
	PS_delete($ps);

	exit(0);
?>



-- 
PECL CVS Mailing List 
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic