home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _1b64d025fd7ca8a24ce96dece0ee9e9d < prev    next >
Text File  |  2000-03-23  |  50KB  |  1,057 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>GD.pm - Interface to Gd Graphics Library</TITLE>
  5. <LINK REL="stylesheet" HREF="../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> GD.pm - Interface to Gd Graphics Library</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <LI><A HREF="#method calls">Method Calls</A></LI>
  26.     <UL>
  27.  
  28.         <LI><A HREF="#creating and saving images">Creating and Saving Images</A></LI>
  29.         <LI><A HREF="#color control">Color Control</A></LI>
  30.         <LI><A HREF="#special colors">Special Colors</A></LI>
  31.         <LI><A HREF="#drawing commands">Drawing Commands</A></LI>
  32.         <LI><A HREF="#image copying commands">Image Copying Commands</A></LI>
  33.         <LI><A HREF="#character and string drawing">Character and String Drawing</A></LI>
  34.         <LI><A HREF="#miscellaneous image methods">Miscellaneous Image Methods</A></LI>
  35.         <LI><A HREF="#polygon methods">Polygon Methods</A></LI>
  36.         <LI><A HREF="#font utilities">Font Utilities</A></LI>
  37.     </UL>
  38.  
  39.     <LI><A HREF="#obtaining the clanguage version of gd">Obtaining the C-language version of gd</A></LI>
  40.     <LI><A HREF="#copyright information">Copyright Information</A></LI>
  41. </UL>
  42. <!-- INDEX END -->
  43.  
  44. <HR>
  45. <P>
  46. <H1><A NAME="name">NAME</A></H1>
  47. <P>GD.pm - Interface to Gd Graphics Library</P>
  48. <P>
  49. <HR>
  50. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  51. <UL>
  52. <LI>Linux</LI>
  53. <LI>Windows</LI>
  54. </UL>
  55. <HR>
  56. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  57. <PRE>
  58.     use GD;
  59. </PRE>
  60. <PRE>
  61.  
  62.     # create a new image
  63.     $im = new GD::Image(100,100);</PRE>
  64. <PRE>
  65.     # allocate some colors
  66.     $white = $im->colorAllocate(255,255,255);
  67.     $black = $im->colorAllocate(0,0,0);       
  68.     $red = $im->colorAllocate(255,0,0);      
  69.     $blue = $im->colorAllocate(0,0,255);</PRE>
  70. <PRE>
  71.     # make the background transparent and interlaced
  72.     $im->transparent($white);
  73.     $im->interlaced('true');</PRE>
  74. <PRE>
  75.     # Put a black frame around the picture
  76.     $im->rectangle(0,0,99,99,$black);</PRE>
  77. <PRE>
  78.     # Draw a blue oval
  79.     $im->arc(50,50,95,75,0,360,$blue);</PRE>
  80. <PRE>
  81.     # And fill it with red
  82.     $im->fill(50,50,$red);</PRE>
  83. <PRE>
  84.     # make sure we are writing to a binary stream
  85.     binmode STDOUT;</PRE>
  86. <PRE>
  87.     # Convert the image to PNG and print it on standard output
  88.     print $im->png;</PRE>
  89. <P>
  90. <HR>
  91. <H1><A NAME="description">DESCRIPTION</A></H1>
  92. <P><STRONG>GD.pm</STRONG> is a port of Thomas Boutell's gd graphics library (see
  93. below).  GD allows you to create color drawings using a large number of
  94. graphics primitives, and emit the drawings as PNG files.</P>
  95. <P>GD defines the following three classes:</P>
  96. <DL>
  97. <DT><STRONG><A NAME="item_GD%3A%3AImage"><CODE>GD::Image</CODE></A></STRONG><BR>
  98. <DD>
  99. An image class, which holds the image data and accepts graphic
  100. primitive method calls.
  101. <P></P>
  102. <DT><STRONG><A NAME="item_GD%3A%3AFont"><CODE>GD::Font</CODE></A></STRONG><BR>
  103. <DD>
  104. A font class, which holds static font information and used for text
  105. rendering.
  106. <P></P>
  107. <DT><STRONG><A NAME="item_GD%3A%3APolygon"><CODE>GD::Polygon</CODE></A></STRONG><BR>
  108. <DD>
  109. A simple polygon object, used for storing lists of vertices prior to
  110. rendering a polygon into an image.
  111. <P></P></DL>
  112. <P>A Simple Example:</P>
  113. <PRE>
  114.         #!/usr/local/bin/perl</PRE>
  115. <PRE>
  116.         use GD;
  117. </PRE>
  118. <PRE>
  119.  
  120.         # create a new image
  121.         $im = new GD::Image(100,100);</PRE>
  122. <PRE>
  123.         # allocate some colors
  124.         $white = $im->colorAllocate(255,255,255);
  125.         $black = $im->colorAllocate(0,0,0);       
  126.         $red = $im->colorAllocate(255,0,0);      
  127.         $blue = $im->colorAllocate(0,0,255);</PRE>
  128. <PRE>
  129.         # make the background transparent and interlaced
  130.         $im->transparent($white);
  131.         $im->interlaced('true');</PRE>
  132. <PRE>
  133.         # Put a black frame around the picture
  134.         $im->rectangle(0,0,99,99,$black);</PRE>
  135. <PRE>
  136.         # Draw a blue oval
  137.         $im->arc(50,50,95,75,0,360,$blue);</PRE>
  138. <PRE>
  139.         # And fill it with red
  140.         $im->fill(50,50,$red);</PRE>
  141. <PRE>
  142.         # make sure we are writing to a binary stream
  143.         binmode STDOUT;</PRE>
  144. <PRE>
  145.         # Convert the image to PNG and print it on standard output
  146.         print $im->png;</PRE>
  147. <P>Notes:</P>
  148. <OL>
  149. <LI><STRONG><A NAME="item_new">To create a new, empty image, send a <CODE>new()</CODE> message to GD::Image, passing
  150. it the width and height of the image you want to create.  An image
  151. object will be returned.  Other class methods allow you to initialize
  152. an image from a preexisting PNG, GD or XBM file.</A></STRONG><BR>
  153.  
  154. <LI><STRONG><A NAME="item_colorAllocate">Next you will ordinarily add colors to the image's color table.
  155. colors are added using a <CODE>colorAllocate()</CODE> method call.  The three
  156. parameters in each call are the red, green and blue (rgb) triples for
  157. the desired color.  The method returns the index of that color in the
  158. image's color table.  You should store these indexes for later use.</A></STRONG><BR>
  159.  
  160. <LI><STRONG><A NAME="item_Now_you_can_do_some_drawing%21_The_various_graphic">Now you can do some drawing!  The various graphics primitives are
  161. described below.  In this example, we do some text drawing, create an
  162. oval, and create and draw a polygon.</A></STRONG><BR>
  163.  
  164. <LI><STRONG>Polygons are created with a <CODE>new()</CODE> message to GD::Polygon.  You can add
  165. points to the returned polygon one at a time using the <A HREF="#item_addPt"><CODE>addPt()</CODE></A> method.
  166. The polygon can then be passed to an image for rendering.</STRONG><BR>
  167.  
  168. <LI><STRONG><A NAME="item_png">When you're done drawing, you can convert the image into PNG format by
  169. sending it a <CODE>png()</CODE> message.  It will return a (potentially large)
  170. scalar value containing the binary data for the image.  Ordinarily you
  171. will print it out at this point or write it to a file.  To ensure
  172. portability to platforms that differentiate between text and binary
  173. files, be sure to call <A HREF="../../lib/Pod/perlfunc.html#item_binmode"><CODE>binmode()</CODE></A> on the file you are writing
  174. the image to.</A></STRONG><BR>
  175.  
  176. </OL>
  177. <P>
  178. <HR>
  179. <H1><A NAME="method calls">Method Calls</A></H1>
  180. <P>
  181. <H2><A NAME="creating and saving images">Creating and Saving Images</A></H2>
  182. <DL>
  183. <DT><STRONG><CODE>new</CODE></STRONG><BR>
  184. <DD>
  185. <A HREF="#item_new"><CODE>GD::Image->new(width,height)</CODE></A> <EM>class method</EM>
  186. <P>To create a new, blank image, send a <A HREF="#item_new"><CODE>new()</CODE></A> message to the GD::Image
  187. class.  For example:</P>
  188. <PRE>
  189.         $myImage = new GD::Image(100,100) || die;</PRE>
  190. <P>This will create an image that is 100 x 100 pixels wide.  If you don't
  191. specify the dimensions, a default of 64 x 64 will be chosen. If
  192. something goes wrong (e.g. insufficient memory), this call will
  193. return undef.</P>
  194. <P></P>
  195. <DT><STRONG><A NAME="item_newFromPng"><CODE>newFromPng</CODE></A></STRONG><BR>
  196. <DD>
  197. <A HREF="#item_newFromPng"><CODE>GD::Image->newFromPng(FILEHANDLE)</CODE></A> <EM>class method</EM>
  198. <P>This will create an image from a PNG file read in through the provided
  199. filehandle.  The filehandle must previously have been opened on a
  200. valid PNG file or pipe.  If successful, this call will return an
  201. initialized image which you can then manipulate as you please.  If it
  202. fails, which usually happens if the thing at the other end of the
  203. filehandle is not a valid PNG file, the call returns undef.  Notice
  204. that the call doesn't automatically close the filehandle for you.
  205. But it does call <A HREF="../../lib/Pod/perlfunc.html#item_binmode"><CODE>binmode(FILEHANDLE)</CODE></A> for you, on platforms where
  206. this matters.</P>
  207. <P>To get information about the size and color usage of the information,
  208. you can call the image query methods described below.</P>
  209. <PRE>
  210.         Example usage:</PRE>
  211. <PRE>
  212.         open (PNG,"barnswallow.png") || die;
  213.         $myImage = newFromPng GD::Image(PNG) || die;
  214.         close PNG;</PRE>
  215. <P></P>
  216. <DT><STRONG><A NAME="item_newFromXbm"><CODE>newFromXbm</CODE></A></STRONG><BR>
  217. <DD>
  218. <A HREF="#item_newFromXbm"><CODE>GD::Image->newFromXbm(FILEHANDLE)</CODE></A> <EM>class method</EM>
  219. <P>This works in exactly the same way as <A HREF="#item_newFromPng"><CODE>newFromPng</CODE></A>, but reads the
  220. contents of an X Bitmap (black & white) file:</P>
  221. <PRE>
  222.         open (XBM,"coredump.xbm") || die;
  223.         $myImage = newFromXbm GD::Image(XBM) || die;
  224.         close XBM;</PRE>
  225. <P>Note that this function also calls <A HREF="../../lib/Pod/perlfunc.html#item_binmode"><CODE>binmode(FILEHANDLE)</CODE></A> before
  226. reading from the filehandle.</P>
  227. <P></P>
  228. <DT><STRONG><A NAME="item_newFromXpm"><CODE>newFromXpm</CODE></A></STRONG><BR>
  229. <DD>
  230. <A HREF="#item_newFromXpm"><CODE>GD::Image->newFromXpm($filename)</CODE></A> <EM>class method</EM>
  231. <P>This creates a new GD::Image object starting from a <STRONG>filename</STRONG>.  This
  232. is unlike the other <CODE>newFrom()</CODE> functions because it does not take a
  233. filehandle.  This difference comes from an inconsistency in the
  234. underlying gd library.</P>
  235. <PRE>
  236.         $myImage = newFromXpm GD::Image('earth.xpm') || die;</PRE>
  237. <P>This function is only available if libgd was compiled with XPM
  238. support.</P>
  239. <P>NOTE: As of version 1.7.3 of the libgd library, I can't get the
  240. underlying <CODE>createFromXpm()</CODE> function to return a valid image -- I just
  241. get black.</P>
  242. <P></P>
  243. <DT><STRONG><A NAME="item_newFromGd2"><CODE>newFromGd2</CODE></A></STRONG><BR>
  244. <DD>
  245. <A HREF="#item_newFromGd2"><CODE>GD::Image->newFromGd2(FILEHANDLE)</CODE></A> <EM>class method</EM>
  246. <P>This works in exactly the same way as <CODE>newFromgd()</CODE>, but uses the new
  247. compressed GD2 image format.</P>
  248. <P></P>
  249. <DT><STRONG><A NAME="item_newFromGd"><CODE>newFromGd</CODE></A></STRONG><BR>
  250. <DD>
  251. <A HREF="#item_newFromGd"><CODE>GD::Image->newFromGd(FILEHANDLE)</CODE></A> <EM>class method</EM>
  252. <P>This works in exactly the same way as <A HREF="#item_newFromPng"><CODE>newFromPng</CODE></A>, but reads the
  253. contents of a GD file.  GD is Tom Boutell's disk-based storage format,
  254. intended for the rare case when you need to read and write the image
  255. to disk quickly.  It's not intended for regular use, because, unlike
  256. PNG or JPEG, no image compression is performed and these files can
  257. become <STRONG>BIG</STRONG>.</P>
  258. <PRE>
  259.         open (GDF,"godzilla.gd") || die;
  260.         $myImage = newFromGd GD::Image(GDF) || die;
  261.         close GDF;</PRE>
  262. <P>Note that this function also calls <A HREF="../../lib/Pod/perlfunc.html#item_binmode"><CODE>binmode(FILEHANDLE)</CODE></A> before
  263. reading from the supplied filehandle.</P>
  264. <P></P>
  265. <DT><STRONG><CODE>newFromGd2</CODE></STRONG><BR>
  266. <DD>
  267. <A HREF="#item_newFromGd2"><CODE>GD::Image->newFromGd2(FILEHANDLE)</CODE></A> <EM>class method</EM>
  268. <P>This works in exactly the same way as <CODE>newFromgd()</CODE>, but uses the new
  269. compressed GD2 image format.</P>
  270. <P></P>
  271. <DT><STRONG><A NAME="item_newFromGd2Part"><CODE>newFromGd2Part</CODE></A></STRONG><BR>
  272. <DD>
  273. <A HREF="#item_newFromGd2Part"><CODE>GD::Image->newFromGd2Part(FILEHANDLE,srcX,srcY,width,height)</CODE></A> <EM>class method</EM>
  274. <P>This class method allows you to read in just a portion of a GD version
  275. 2 image file.  In additionto a filehandle, it accepts the top-left
  276. corner and dimensions (width,height) of the region of the image to
  277. read.  For example:</P>
  278. <PRE>
  279.         open (GDF,"godzilla.gd2") || die;
  280.         $myImage = GD::Image->newFromGd2Part(GDF,10,20,100,100) || die;
  281.         close GDF;</PRE>
  282. <P>This reads a 100x100 square portion of the image starting from
  283. position (10,20).</P>
  284. <P></P>
  285. <DT><STRONG><CODE>png</CODE></STRONG><BR>
  286. <DD>
  287. <A HREF="#item_png"><CODE>$image->png</CODE></A> <EM>object method</EM>
  288. <P>This returns the image data in PNG format.  You can then print it,
  289. pipe it to a display program, or write it to a file.  Example:</P>
  290. <PRE>
  291.         $png_data = $myImage->png;
  292.         open (DISPLAY,"| display -") || die;
  293.         binmode DISPLAY;
  294.         print DISPLAY $png_data;
  295.         close DISPLAY;</PRE>
  296. <P>Note the use of <A HREF="../../lib/Pod/perlfunc.html#item_binmode"><CODE>binmode()</CODE></A>.  This is crucial for portability to
  297. DOSish platforms.</P>
  298. <P></P>
  299. <DT><STRONG><A NAME="item_gd"><CODE>gd</CODE></A></STRONG><BR>
  300. <DD>
  301. <A HREF="#item_gd"><CODE>$image->gd</CODE></A> <EM>object method</EM>
  302. <P>This returns the image data in GD format.  You can then print it,
  303. pipe it to a display program, or write it to a file.  Example:</P>
  304. <PRE>
  305.         binmode MYOUTFILE;
  306.         print MYOUTFILE $myImage->gd;</PRE>
  307. <P></P>
  308. <DT><STRONG><A NAME="item_gd2"><CODE>gd2</CODE></A></STRONG><BR>
  309. <DD>
  310. <A HREF="#item_gd2"><CODE>$image->gd2</CODE></A> <EM>object method</EM>
  311. <P>Same as gd(), except that it returns the data in compressed GD2
  312. format.</P>
  313. <P></P></DL>
  314. <P>
  315. <H2><A NAME="color control">Color Control</A></H2>
  316. <DL>
  317. <DT><STRONG><CODE>colorAllocate</CODE></STRONG><BR>
  318. <DD>
  319. <A HREF="#item_colorAllocate"><CODE>$image->colorAllocate(red,green,blue)</CODE></A> <EM>object method</EM>
  320. <P>This allocates a color with the specified red, green and blue
  321. components and returns its index in the color table, if specified.
  322. The first color allocated in this way becomes the image's background
  323. color.  (255,255,255) is white (all pixels on).  (0,0,0) is black (all
  324. pixels off).  (255,0,0) is fully saturated red.  (127,127,127) is 50%
  325. gray.  You can find plenty of examples in /usr/X11/lib/X11/rgb.txt.</P>
  326. <P>If no colors are allocated, then this function returns -1.</P>
  327. <P>Example:</P>
  328. <PRE>
  329.         $white = $myImage->colorAllocate(0,0,0); #background color
  330.         $black = $myImage->colorAllocate(255,255,255);
  331.         $peachpuff = $myImage->colorAllocate(255,218,185);</PRE>
  332. <P></P>
  333. <DT><STRONG><A NAME="item_colorDeallocate"><CODE>colorDeallocate</CODE></A></STRONG><BR>
  334. <DD>
  335. <A HREF="#item_colorDeallocate"><CODE>$image->colorDeallocate(colorIndex)</CODE></A> <EM>object method</EM>
  336. <P>This marks the color at the specified index as being ripe for
  337. reallocation.  The next time colorAllocate is used, this entry will be
  338. replaced.  You can call this method several times to deallocate
  339. multiple colors.  There's no function result from this call.</P>
  340. <P>Example:</P>
  341. <PRE>
  342.         $myImage->colorDeallocate($peachpuff);
  343.         $peachy = $myImage->colorAllocate(255,210,185);</PRE>
  344. <P></P>
  345. <DT><STRONG><A NAME="item_colorClosest"><CODE>colorClosest</CODE></A></STRONG><BR>
  346. <DD>
  347. <A HREF="#item_colorClosest"><CODE>$image->colorClosest(red,green,blue)</CODE></A> <EM>object method</EM>
  348. <P>This returns the index of the color closest in the color table to the
  349. red green and blue components specified.  If no colors have yet been
  350. allocated, then this call returns -1.</P>
  351. <P>Example:</P>
  352. <PRE>
  353.         $apricot = $myImage->colorClosest(255,200,180);</PRE>
  354. <P></P>
  355. <DT><STRONG><A NAME="item_colorExact"><CODE>colorExact</CODE></A></STRONG><BR>
  356. <DD>
  357. <A HREF="#item_colorExact"><CODE>$image->colorExact(red,green,blue)</CODE></A> <EM>object method</EM>
  358. <P>This returns the index of a color that exactly matches the specified
  359. red green and blue components.  If such a color is not in the color
  360. table, this call returns -1.</P>
  361. <PRE>
  362.         $rosey = $myImage->colorExact(255,100,80);
  363.         warn "Everything's coming up roses.\n" if $rosey >= 0;</PRE>
  364. <P></P>
  365. <DT><STRONG><A NAME="item_colorResolve"><CODE>colorResolve</CODE></A></STRONG><BR>
  366. <DD>
  367. <A HREF="#item_colorResolve"><CODE>$image->colorResolve(red,green,blue)</CODE></A> <EM>object method</EM>
  368. <P>This returns the index of a color that exactly matches the specified
  369. red green and blue components.  If such a color is not in the color
  370. table and there is room, then this method allocates the color in the
  371. color table and returns its index.</P>
  372. <PRE>
  373.         $rosey = $myImage->colorResolve(255,100,80);
  374.         warn "Everything's coming up roses.\n" if $rosey >= 0;</PRE>
  375. <P></P>
  376. <DT><STRONG><A NAME="item_colorsTotal"><CODE>colorsTotal</CODE></A></STRONG><BR>
  377. <DD>
  378. <A HREF="#item_colorsTotal"><CODE>$image->colorsTotal)</CODE></A> <EM>object method</EM>
  379. <P>This returns the total number of colors allocated in the object.</P>
  380. <PRE>
  381.         $maxColors = $myImage->colorsTotal;</PRE>
  382. <P></P>
  383. <DT><STRONG><A NAME="item_getPixel"><CODE>getPixel</CODE></A></STRONG><BR>
  384. <DD>
  385. <A HREF="#item_getPixel"><CODE>$image->getPixel(x,y)</CODE></A> <EM>object method</EM>
  386. <P>This returns the color table index underneath the specified
  387. point.  It can be combined with <A HREF="#item_rgb"><CODE>rgb()</CODE></A>
  388. to obtain the rgb color underneath the pixel.</P>
  389. <P>Example:</P>
  390. <PRE>
  391.         $index = $myImage->getPixel(20,100);
  392.         ($r,$g,$b) = $myImage->rgb($index);</PRE>
  393. <P></P>
  394. <DT><STRONG><A NAME="item_rgb"><CODE>rgb</CODE></A></STRONG><BR>
  395. <DD>
  396. <A HREF="#item_rgb"><CODE>$image->rgb(colorIndex)</CODE></A> <EM>object method</EM>
  397. <P>This returns a list containing the red, green and blue components of
  398. the specified color index.</P>
  399. <P>Example:</P>
  400. <PRE>
  401.         @RGB = $myImage->rgb($peachy);</PRE>
  402. <P></P>
  403. <DT><STRONG><A NAME="item_transparent"><CODE>transparent</CODE></A></STRONG><BR>
  404. <DD>
  405. <A HREF="#item_transparent"><CODE>$image->transparent(colorIndex)</CODE></A> <EM>object method</EM>
  406. <P>This marks the color at the specified index as being transparent.
  407. Portions of the image drawn in this color will be invisible.  This is
  408. useful for creating paintbrushes of odd shapes, as well as for
  409. making PNG backgrounds transparent for displaying on the Web.  Only
  410. one color can be transparent at any time. To disable transparency, 
  411. specify -1 for the index.</P>
  412. <P>If you call this method without any parameters, it will return the
  413. current index of the transparent color, or -1 if none.</P>
  414. <P>Example:</P>
  415. <PRE>
  416.         open(PNG,"test.png");
  417.         $im = newFromPng GD::Image(PNG);
  418.         $white = $im->colorClosest(255,255,255); # find white
  419.         $im->transparent($white);
  420.         binmode STDOUT;
  421.         print $im->png;</PRE>
  422. <P></P></DL>
  423. <P>
  424. <H2><A NAME="special colors">Special Colors</A></H2>
  425. <P>GD implements a number of special colors that can be used to achieve
  426. special effects.  They are constants defined in the GD::
  427. namespace, but automatically exported into your namespace when the GD
  428. module is loaded.</P>
  429. <DL>
  430. <DT><STRONG><A NAME="item_setBrush"><CODE>setBrush</CODE></A></STRONG><BR>
  431. <DD>
  432. <DT><STRONG><A NAME="item_gdBrushed"><CODE>gdBrushed</CODE></A></STRONG><BR>
  433. <DD>
  434. <A HREF="#item_setBrush"><CODE>$image->setBrush( )</CODE></A> and <CODE>GD::gdBrushed</CODE>
  435. <P>You can draw lines and shapes using a brush pattern.  Brushes are 
  436. just images that you can create and manipulate in the usual way. When
  437. you draw with them, their contents are used for the color and shape of
  438. the lines.</P>
  439. <P>To make a brushed line, you must create or load the brush first, then
  440. assign it to the image using <A HREF="#item_setBrush"><CODE>setBrush</CODE></A>.  You can then draw in that
  441. with that brush using the <A HREF="#item_gdBrushed"><CODE>gdBrushed</CODE></A> special color.  It's often 
  442. useful to set the background of the brush to transparent so that 
  443. the non-colored parts don't overwrite other parts of your image.</P>
  444. <P>Example:</P>
  445. <PRE>
  446.         # Create a brush at an angle
  447.         $diagonal_brush = new GD::Image(5,5);
  448.         $white = $diagonal_brush->allocateColor(255,255,255);
  449.         $black = $diagonal_brush->allocateColor(0,0,0);
  450.         $diagonal_brush->transparent($white);
  451.         $diagonal_brush->line(0,4,4,0,$black); # NE diagonal</PRE>
  452. <PRE>
  453.         # Set the brush
  454.         $myImage->setBrush($diagonal_brush);
  455. </PRE>
  456. <PRE>
  457.  
  458.         # Draw a circle using the brush
  459.         $myImage->arc(50,50,25,25,0,360,gdBrushed);</PRE>
  460. <P></P>
  461. <DT><STRONG><A NAME="item_setStyle"><CODE>setStyle</CODE></A></STRONG><BR>
  462. <DD>
  463. <DT><STRONG><A NAME="item_gdStyled"><CODE>gdStyled</CODE></A></STRONG><BR>
  464. <DD>
  465. <A HREF="#item_setStyle"><CODE>$image->setStyle(@colors)</CODE></A> and <CODE>GD::gdStyled</CODE>
  466. <P>Styled lines consist of an arbitrary series of repeated colors and are
  467. useful for generating dotted and dashed lines.  To create a styled
  468. line, use <A HREF="#item_setStyle"><CODE>setStyle</CODE></A> to specify a repeating series of colors.  It
  469. accepts an array consisting of one or more color indexes.  Then
  470. draw using the <A HREF="#item_gdStyled"><CODE>gdStyled</CODE></A> special color.  Another special color,
  471. <CODE>gdTransparent</CODE> can be used to introduce holes in the line, as the
  472. example shows.</P>
  473. <P>Example:</P>
  474. <PRE>
  475.         # Set a style consisting of 4 pixels of yellow,
  476.         # 4 pixels of blue, and a 2 pixel gap
  477.         $myImage->setStyle($yellow,$yellow,$yellow,$yellow,
  478.                            $blue,$blue,$blue,$blue,
  479.                            gdTransparent,gdTransparent);
  480.         $myImage->arc(50,50,25,25,0,360,gdStyled);</PRE>
  481. <P>To combine the <A HREF="#item_gdStyled"><CODE>gdStyled</CODE></A> and <A HREF="#item_gdBrushed"><CODE>gdBrushed</CODE></A> behaviors, you can specify
  482. <CODE>gdStyledBrushed</CODE>.  In this case, a pixel from the current brush
  483. pattern is rendered wherever the color specified in <A HREF="#item_setStyle"><CODE>setStyle()</CODE></A> is
  484. neither gdTransparent nor 0.</P>
  485. <P></P>
  486. <DT><STRONG><A NAME="item_gdTiled"><CODE>gdTiled</CODE></A></STRONG><BR>
  487. <DD>
  488. Draw filled shapes and flood fills using a pattern.  The pattern is
  489. just another image.  The image will be tiled multiple times in order
  490. to fill the required space, creating wallpaper effects.  You must call
  491. <CODE>setTile</CODE> in order to define the particular tile pattern you'll use
  492. for drawing when you specify the gdTiled color.
  493. details.
  494. <P></P>
  495. <DT><STRONG><CODE>gdStyled</CODE></STRONG><BR>
  496. <DD>
  497. The gdStyled color is used for creating dashed and dotted lines.  A
  498. styled line can contain any series of colors and is created using the
  499. <CODE>setStyled</CODE> command.
  500. <P></P></DL>
  501. <P>
  502. <H2><A NAME="drawing commands">Drawing Commands</A></H2>
  503. <DL>
  504. <DT><STRONG><A NAME="item_setPixel"><CODE>setPixel</CODE></A></STRONG><BR>
  505. <DD>
  506. <A HREF="#item_setPixel"><CODE>$image->setPixel(x,y,color)</CODE></A> <EM>object method</EM>
  507. <P>This sets the pixel at (x,y) to the specified color index.  No value
  508. is returned from this method.  The coordinate system starts at the
  509. upper left at (0,0) and gets larger as you go down and to the right.
  510. You can use a real color, or one of the special colors gdBrushed, 
  511. gdStyled and gdStyledBrushed can be specified.</P>
  512. <P>Example:</P>
  513. <PRE>
  514.         # This assumes $peach already allocated
  515.         $myImage->setPixel(50,50,$peach);</PRE>
  516. <P></P>
  517. <DT><STRONG><A NAME="item_line"><CODE>line</CODE></A></STRONG><BR>
  518. <DD>
  519. <A HREF="#item_line"><CODE>$image->line(x1,y1,x2,y2,color)</CODE></A> <EM>object method</EM>
  520. <P>This draws a line from (x1,y1) to (x2,y2) of the specified color.  You
  521. can use a real color, or one of the special colors gdBrushed, 
  522. gdStyled and gdStyledBrushed.</P>
  523. <P>Example:</P>
  524. <PRE>
  525.         # Draw a diagonal line using the currently defind
  526.         # paintbrush pattern.
  527.         $myImage->line(0,0,150,150,gdBrushed);</PRE>
  528. <P></P>
  529. <DT><STRONG><A NAME="item_dashedLine"><CODE>dashedLine</CODE></A></STRONG><BR>
  530. <DD>
  531. <A HREF="#item_dashedLine"><CODE>$image->dashedLine(x1,y1,x2,y2,color)</CODE></A> <EM>object method</EM>
  532. <P>This draws a dashed line from (x1,y1) to (x2,y2) in the specified
  533. color.  A more powerful way to generate arbitrary dashed and dotted
  534. lines is to use the <A HREF="#item_setStyle"><CODE>setStyle()</CODE></A> method described below and to draw with
  535. the special color gdStyled.</P>
  536. <P>Example:</P>
  537. <PRE>
  538.         $myImage->dashedLine(0,0,150,150,$blue);</PRE>
  539. <P></P>
  540. <DT><STRONG><A NAME="item_rectangle"><CODE>rectangle</CODE></A></STRONG><BR>
  541. <DD>
  542. <A HREF="#item_rectangle"><CODE>GD::Image::rectangle(x1,y1,x2,y2,color)</CODE></A> <EM>object method</EM>
  543. <P>This draws a rectangle with the specified color.  (x1,y1) and (x2,y2)
  544. are the upper left and lower right corners respectively.  Both real 
  545. color indexes and the special colors gdBrushed, gdStyled and 
  546. gdStyledBrushed are accepted.</P>
  547. <P>Example:</P>
  548. <PRE>
  549.         $myImage->rectangle(10,10,100,100,$rose);</PRE>
  550. <P></P>
  551. <DT><STRONG><A NAME="item_filledRectangle"><CODE>filledRectangle</CODE></A></STRONG><BR>
  552. <DD>
  553. <A HREF="#item_filledRectangle"><CODE>$image->filledRectangle(x1,y1,x2,y2,color)</CODE></A> <EM>object method</EM>
  554. <P>This draws a rectangle filed with the specified color.  You can use a
  555. real color, or the special fill color gdTiled to fill the polygon
  556. with a pattern.</P>
  557. <P>Example:</P>
  558. <PRE>
  559.         # read in a fill pattern and set it
  560.         open(PNG,"happyface.png") || die;
  561.         $tile = newFromPng GD::Image(PNG);
  562.         $myImage->setTile($tile);</PRE>
  563. <PRE>
  564.         # draw the rectangle, filling it with the pattern
  565.         $myImage->filledRectangle(10,10,150,200,gdTiled);</PRE>
  566. <P></P>
  567. <DT><STRONG><A NAME="item_polygon"><CODE>polygon</CODE></A></STRONG><BR>
  568. <DD>
  569. <A HREF="#item_polygon"><CODE>$image->polygon(polygon,color)</CODE></A> <EM>object method</EM>
  570. <P>This draws a polygon with the specified color.  The polygon must be
  571. created first (see below).  The polygon must have at least three
  572. vertices.  If the last vertex doesn't close the polygon, the method
  573. will close it for you.  Both real color indexes and the special 
  574. colors gdBrushed, gdStyled and gdStyledBrushed can be specified.</P>
  575. <P>Example:</P>
  576. <PRE>
  577.         $poly = new GD::Polygon;
  578.         $poly->addPt(50,0);
  579.         $poly->addPt(99,99);
  580.         $poly->addPt(0,99);
  581.         $myImage->polygon($poly,$blue);</PRE>
  582. <P></P>
  583. <DT><STRONG><A NAME="item_filledPolygon"><CODE>filledPolygon</CODE></A></STRONG><BR>
  584. <DD>
  585. <A HREF="#item_filledPolygon"><CODE>$image->filledPolygon(poly,color)</CODE></A> <EM>object method</EM>
  586. <P>This draws a polygon filled with the specified color.  You can use a
  587. real color, or the special fill color gdTiled to fill the polygon
  588. with a pattern.</P>
  589. <P>Example:</P>
  590. <PRE>
  591.         # make a polygon
  592.         $poly = new GD::Polygon;
  593.         $poly->addPt(50,0);
  594.         $poly->addPt(99,99);
  595.         $poly->addPt(0,99);</PRE>
  596. <PRE>
  597.         # draw the polygon, filling it with a color
  598.         $myImage->filledPolygon($poly,$peachpuff);</PRE>
  599. <P></P>
  600. <DT><STRONG><A NAME="item_arc"><CODE>arc</CODE></A></STRONG><BR>
  601. <DD>
  602. <A HREF="#item_arc"><CODE>$image->arc(cx,cy,width,height,start,end,color)</CODE></A> <EM>object method</EM>
  603. <P>This draws arcs and ellipses.  (cx,cy) are the center of the arc, and
  604. (width,height) specify the width and height, respectively.  The
  605. portion of the ellipse covered by the arc are controlled by start and
  606. end, both of which are given in degrees from 0 to 360.  Zero is at the
  607. top of the ellipse, and angles increase clockwise.  To specify a
  608. complete ellipse, use 0 and 360 as the starting and ending angles.  To
  609. draw a circle, use the same value for width and height.</P>
  610. <P>You can specify a normal color or one of the special colors gdBrushed,
  611. gdStyled, or gdStyledBrushed.</P>
  612. <P>Example:</P>
  613. <PRE>
  614.         # draw a semicircle centered at 100,100
  615.         $myImage->arc(100,100,50,50,0,180,$blue);</PRE>
  616. <P></P>
  617. <DT><STRONG><A NAME="item_fill"><CODE>fill</CODE></A></STRONG><BR>
  618. <DD>
  619. <A HREF="#item_fill"><CODE>$image->fill(x,y,color)</CODE></A> <EM>object method</EM>
  620. <P>This method flood-fills regions with the specified color.  The color
  621. will spread through the image, starting at point (x,y), until it is
  622. stopped by a pixel of a different color from the starting pixel (this
  623. is similar to the ``paintbucket'' in many popular drawing toys).  You
  624. can specify a normal color, or the special color gdTiled, to flood-fill
  625. with patterns.</P>
  626. <P>Example:</P>
  627. <PRE>
  628.         # Draw a rectangle, and then make its interior blue
  629.         $myImage->rectangle(10,10,100,100,$black);
  630.         $myImage->fill(50,50,$blue);</PRE>
  631. <P></P>
  632. <DT><STRONG><A NAME="item_fillToBorder"><CODE>$image->fillToBorder(x,y,bordercolor,color)</CODE> <EM>object method</EM></A></STRONG><BR>
  633. <DD>
  634. Like <A HREF="#item_fill"><CODE>fill</CODE></A>, this method flood-fills regions with the specified color,
  635. starting at position (x,y).
  636. However, instead of stopping when it hits a pixel of a different color
  637. than the starting pixel, flooding will only stop when it hits the
  638. color specified by bordercolor.  You must specify a normal indexed
  639. color for the bordercolor.  However, you are free to use the gdTiled
  640. color for the fill.
  641. <P>Example:</P>
  642. <PRE>
  643.         # This has the same effect as the previous example
  644.         $myImage->rectangle(10,10,100,100,$black);
  645.         $myImage->fillToBorder(50,50,$black,$blue);</PRE>
  646. <P></P></DL>
  647. <P>
  648. <H2><A NAME="image copying commands">Image Copying Commands</A></H2>
  649. <P>Two methods are provided for copying a rectangular region from one
  650. image to another.  One method copies a region without resizing it.
  651. The other allows you to stretch the region during the copy operation.</P>
  652. <P>With either of these methods it is important to know that the routines
  653. will attempt to flesh out the destination image's color table to match
  654. the colors that are being copied from the source.  If the
  655. destination's color table is already full, then the routines will
  656. attempt to find the best match, with varying results.</P>
  657. <DL>
  658. <DT><STRONG><A NAME="item_copy"><CODE>copy</CODE></A></STRONG><BR>
  659. <DD>
  660. <A HREF="#item_copy"><CODE>$image->copy(sourceImage,dstX,dstY,srcX,srcY,width,height)</CODE></A> <EM>object method</EM>
  661. <P>This is the simplest of the several copy operations, copying the
  662. specified region from the source image to the destination image (the
  663. one performing the method call).  (srcX,srcY) specify the upper left
  664. corner of a rectangle in the source image, and (width,height) give the
  665. width and height of the region to copy.  (dstX,dstY) control where in
  666. the destination image to stamp the copy.  You can use the same image
  667. for both the source and the destination, but the source and
  668. destination regions must not overlap or strange things will happen.</P>
  669. <P>Example:</P>
  670. <PRE>
  671.         $myImage = new GD::Image(100,100);
  672.         ... various drawing stuff ...
  673.         $srcImage = new GD::Image(50,50);
  674.         ... more drawing stuff ...
  675.         # copy a 25x25 pixel region from $srcImage to
  676.         # the rectangle starting at (10,10) in $myImage
  677.         $myImage->copy($srcImage,10,10,0,0,25,25);</PRE>
  678. <P></P>
  679. <DT><STRONG><A NAME="item_clone"><CODE>clone</CODE></A></STRONG><BR>
  680. <DD>
  681. <A HREF="#item_clone"><CODE>$image->clone()</CODE></A> <EM>object method</EM>
  682. <P>Make a copy of the image and return it as a new object.  The new image
  683. will look identical.  However, it may differ in the size of the color
  684. palette and other nonessential details.</P>
  685. <P>Example:</P>
  686. <PRE>
  687.         $myImage = new GD::Image(100,100);
  688.         ... various drawing stuff ...
  689.         $copy = $myImage->clone;</PRE>
  690. <P><CODE>$image->copyMerge(sourceImage,dstX,dstY,srcX,srcY,width,height,percent)</CODE> <EM>object method</EM></P>
  691. <P>This copies the indicated rectangle from the source image to the
  692. destination image, merging the colors to the extent specified by
  693. percent (an integer between 0 and 100).  Specifying 100% has the same
  694. effect as <A HREF="#item_copy"><CODE>copy()</CODE></A> -- replacing the destination pixels with the source
  695. image.  This is most useful for highlighting an area by merging in a
  696. solid rectangle.</P>
  697. <P>Example:</P>
  698. <PRE>
  699.         $myImage = new GD::Image(100,100);
  700.         ... various drawing stuff ...
  701.         $redImage = new GD::Image(50,50);
  702.         ... more drawing stuff ...
  703.         # copy a 25x25 pixel region from $srcImage to
  704.         # the rectangle starting at (10,10) in $myImage, merging 50%
  705.         $myImage->copyMerge($srcImage,10,10,0,0,25,25,50);</PRE>
  706. <P><CODE>$image->copyMergeGray(sourceImage,dstX,dstY,srcX,srcY,width,height,percent)</CODE> <EM>object method</EM></P>
  707. <P>This is identical to <CODE>copyMerge()</CODE> except that it preserves the hue of
  708. the source by converting all the pixels of the destination rectangle
  709. to grayscale before merging.</P>
  710. <P></P>
  711. <DT><STRONG><A NAME="item_copyResized"><CODE>copyResized</CODE></A></STRONG><BR>
  712. <DD>
  713. <A HREF="#item_copyResized"><CODE>$image->copyResized(sourceImage,dstX,dstY,srcX,srcY,destW,destH,srcW,srcH)</CODE></A> <EM>object method</EM>
  714. <P>This method is similar to <A HREF="#item_copy"><CODE>copy()</CODE></A> but allows you to choose different
  715. sizes for the source and destination rectangles.  The source and
  716. destination rectangle's are specified independently by (srcW,srcH) and
  717. (destW,destH) respectively.  <A HREF="#item_copyResized"><CODE>copyResized()</CODE></A> will stretch or shrink the
  718. image to accomodate the size requirements.</P>
  719. <P>Example:</P>
  720. <PRE>
  721.         $myImage = new GD::Image(100,100);
  722.         ... various drawing stuff ...
  723.         $srcImage = new GD::Image(50,50);
  724.         ... more drawing stuff ...
  725.         # copy a 25x25 pixel region from $srcImage to
  726.         # a larger rectangle starting at (10,10) in $myImage
  727.         $myImage->copyResized($srcImage,10,10,0,0,50,50,25,25);</PRE>
  728. <P></P></DL>
  729. <P>
  730. <H2><A NAME="character and string drawing">Character and String Drawing</A></H2>
  731. <P>Gd allows you to draw characters and strings, either in normal
  732. horizontal orientation or rotated 90 degrees.  These routines use a
  733. GD::Font object, described in more detail below.  There are four
  734. built-in fonts, available in global variables gdGiantFont, gdLargeFont,
  735. gdMediumBoldFont, gdSmallFont and gdTinyFont.  Currently there is no
  736. way of dynamically creating your own fonts.</P>
  737. <DL>
  738. <DT><STRONG><A NAME="item_string"><CODE>string</CODE></A></STRONG><BR>
  739. <DD>
  740. <A HREF="#item_string"><CODE>$image->string(font,x,y,string,color)</CODE></A> <EM>Object Method</EM>
  741. <P>This method draws a string startin at position (x,y) in the specified
  742. font and color.  Your choices of fonts are gdSmallFont, gdMediumBoldFont,
  743. gdTinyFont, gdLargeFont and gdGiantFont.</P>
  744. <P>Example:</P>
  745. <PRE>
  746.         $myImage->string(gdSmallFont,2,10,"Peachy Keen",$peach);</PRE>
  747. <P></P>
  748. <DT><STRONG><A NAME="item_stringUp"><CODE>stringUp</CODE></A></STRONG><BR>
  749. <DD>
  750. <A HREF="#item_stringUp"><CODE>$image->stringUp(font,x,y,string,color)</CODE></A> <EM>Object Method</EM>
  751. <P>Just like the previous call, but draws the text rotated
  752. counterclockwise 90 degrees.</P>
  753. <P></P>
  754. <DT><STRONG><A NAME="item_char"><CODE>char</CODE></A></STRONG><BR>
  755. <DD>
  756. <DT><STRONG><A NAME="item_charUp"><CODE>charUp</CODE></A></STRONG><BR>
  757. <DD>
  758. <A HREF="#item_char"><CODE>$image->char(font,x,y,char,color)</CODE></A> <EM>Object Method</EM>
  759. <A HREF="#item_charUp"><CODE>$image->charUp(font,x,y,char,color)</CODE></A> <EM>Object Method</EM>
  760. <P>These methods draw single characters at position (x,y) in the
  761. specified font and color.  They're carry-overs from the C interface,
  762. where there is a distinction between characters and strings.  Perl is
  763. insensible to such subtle distinctions.</P>
  764. <P></P>
  765. <DT><STRONG><A NAME="item_stringTTF"><CODE>stringTTF</CODE></A></STRONG><BR>
  766. <DD>
  767. <A HREF="#item_stringTTF"><CODE>@bounds = $image->stringTTF(fgcolor,fontname,ptsize,angle,x,y,string)</CODE></A> <EM>Object Method</EM> 
  768. <A HREF="#item_stringTTF"><CODE>@bounds = GD::Image->stringTTF(fgcolor,fontname,ptsize,angle,x,y,string)</CODE></A> <EM>Class Method</EM>
  769. <P>This method uses TrueType to draw a scaled, antialiased string using
  770. the TrueType vector font of your choice.  It requires that libgd to
  771. have been compiled with TrueType support, and for the appropriate
  772. TrueType font to be installed on your system.</P>
  773. <P>The arguments are as follows:</P>
  774. <PRE>
  775.   fgcolor    Color index to draw the string in
  776.   fontname   An absolute or relative path to the TrueType (.ttf) font file
  777.   ptsize     The desired point size (may be fractional)
  778.   angle      The rotation angle, in radians
  779.   x,y        X and Y coordinates to start drawing the string
  780.   string     The string itself</PRE>
  781. <P>If successful, the method returns an eight-element list giving the
  782. boundaries of the rendered string:</P>
  783. <PRE>
  784.  @bounds[0,1]  Lower left corner (x,y)
  785.  @bounds[2,3]  Lower right corner (x,y)
  786.  @bounds[4,5]  Upper right corner (x,y)
  787.  @bounds[6,7]  Upper left corner (x,y)</PRE>
  788. <P>In case of an error (such as the font not being available, or TTF
  789. support not being available), the method returns an empty list and
  790. sets $@ to the error message.</P>
  791. <P>You may also call this method from the GD::Image class name, in which
  792. case it doesn't do any actual drawing, but returns the bounding box
  793. using an inexpensive operation.  You can use this to perform layout
  794. operations prior to drawing.</P>
  795. <P></P></DL>
  796. <P>
  797. <H2><A NAME="miscellaneous image methods">Miscellaneous Image Methods</A></H2>
  798. <DL>
  799. <DT><STRONG><A NAME="item_interlaced"><CODE>interlaced</CODE></A></STRONG><BR>
  800. <DD>
  801. <A HREF="#item_interlaced"><CODE>$image->interlaced( )</CODE></A> <A HREF="#item_interlaced"><CODE>$image->interlaced(1)</CODE></A> <EM>Object method</EM>
  802. <P>This method sets or queries the image's interlaced setting.  Interlace
  803. produces a cool venetian blinds effect on certain viewers.  Provide a
  804. true parameter to set the interlace attribute.  Provide undef to
  805. disable it.  Call the method without parameters to find out the
  806. current setting.</P>
  807. <P></P>
  808. <DT><STRONG><A NAME="item_getBounds"><CODE>getBounds</CODE></A></STRONG><BR>
  809. <DD>
  810. <A HREF="#item_getBounds"><CODE>$image->getBounds( )</CODE></A> <EM>Object method</EM>
  811. <P>This method will return a two-member list containing the width and
  812. height of the image.  You query but not not change the size of the
  813. image once it's created.</P>
  814. <P></P>
  815. <DT><STRONG><A NAME="item_compare"><CODE>compare</CODE></A></STRONG><BR>
  816. <DD>
  817. <A HREF="#item_compare"><CODE>$image1->compare($image2)</CODE></A>
  818. <P>Compare two images and return a bitmap describing the differenes
  819. found, if any.  The return value must be logically ANDed with one or
  820. more constants in order to determine the differences.  The following
  821. constants are available:</P>
  822. <PRE>
  823.   GD_CMP_IMAGE             The two images look different
  824.   GD_CMP_NUM_COLORS        The two images have different numbers of colors
  825.   GD_CMP_COLOR             The two images' palettes differ
  826.   GD_CMP_SIZE_X            The two images differ in the horizontal dimension
  827.   GD_CMP_SIZE_Y            The two images differ in the vertical dimension
  828.   GD_CMP_TRANSPARENT       The two images have different transparency
  829.   GD_CMP_BACKGROUND        The two images have different background colors
  830.   GD_CMP_INTERLACE         The two images differ in their interlace</PRE>
  831. <P>The most important of these is GD_CMP_IMAGE, which will tell you
  832. whether the two images will look different, ignoring differences in the
  833. order of colors in the color palette and other invisible changes.  The
  834. constants are not imported by default, but must be imported individually
  835. or by importing the :cmp tag.  Example:</P>
  836. <PRE>
  837.   use GD qw(:DEFAULT :cmp);
  838.   # get $image1 from somewhere
  839.   # get $image2 from somewhere
  840.   if ($image1->compare($image2) & GD_CMP_IMAGE) {
  841.      warn "images differ!";
  842.   }</PRE>
  843. <P></P></DL>
  844. <P>
  845. <H2><A NAME="polygon methods">Polygon Methods</A></H2>
  846. <P>A few primitive polygon creation and manipulation methods are
  847. provided.  They aren't part of the Gd library, but I thought they
  848. might be handy to have around (they're borrowed from my qd.pl
  849. Quickdraw library).</P>
  850. <DL>
  851. <DT><STRONG><CODE>new</CODE></STRONG><BR>
  852. <DD>
  853. <A HREF="#item_new"><CODE>GD::Polygon->new</CODE></A> <EM>class method</EM>
  854. <P>Create an empty polygon with no vertices.</P>
  855. <PRE>
  856.         $poly = new GD::Polygon;</PRE>
  857. <P></P>
  858. <DT><STRONG><A NAME="item_addPt"><CODE>addPt</CODE></A></STRONG><BR>
  859. <DD>
  860. <A HREF="#item_addPt"><CODE>$poly->addPt(x,y)</CODE></A> <EM>object method</EM>
  861. <P>Add point (x,y) to the polygon.</P>
  862. <PRE>
  863.         $poly->addPt(0,0);
  864.         $poly->addPt(0,50);
  865.         $poly->addPt(25,25);
  866.         $myImage->fillPoly($poly,$blue);</PRE>
  867. <P></P>
  868. <DT><STRONG><A NAME="item_getPt"><CODE>getPt</CODE></A></STRONG><BR>
  869. <DD>
  870. <A HREF="#item_getPt"><CODE>$poly->getPt(index)</CODE></A> <EM>object method</EM>
  871. <P>Retrieve the point at the specified vertex.</P>
  872. <PRE>
  873.         ($x,$y) = $poly->getPt(2);</PRE>
  874. <P></P>
  875. <DT><STRONG><A NAME="item_setPt"><CODE>setPt</CODE></A></STRONG><BR>
  876. <DD>
  877. <A HREF="#item_setPt"><CODE>$poly->setPt(index,x,y)</CODE></A> <EM>object method</EM>
  878. <P>Change the value of an already existing vertex.  It is an error to set
  879. a vertex that isn't already defined.</P>
  880. <PRE>
  881.         $poly->setPt(2,100,100);</PRE>
  882. <P></P>
  883. <DT><STRONG><A NAME="item_deletePt"><CODE>deletePt</CODE></A></STRONG><BR>
  884. <DD>
  885. <A HREF="#item_deletePt"><CODE>$poly->deletePt(index)</CODE></A> <EM>object method</EM>
  886. <P>Delete the specified vertex, returning its value.</P>
  887. <PRE>
  888.         ($x,$y) = $poly->deletePt(1);</PRE>
  889. <P></P>
  890. <DT><STRONG><A NAME="item_toPt"><CODE>toPt</CODE></A></STRONG><BR>
  891. <DD>
  892. <A HREF="#item_toPt"><CODE>$poly->toPt(dx,dy)</CODE></A> <EM>object method</EM>
  893. <P>Draw from current vertex to a new vertex, using relative 
  894. (dx,dy) coordinates.  If this is the first point, act like
  895. addPt().</P>
  896. <PRE>
  897.         $poly->addPt(0,0);
  898.         $poly->toPt(0,50);
  899.         $poly->toPt(25,-25);
  900.         $myImage->fillPoly($poly,$blue);</PRE>
  901. <P></P>
  902. <DT><STRONG><A NAME="item_length"><CODE>length</CODE></A></STRONG><BR>
  903. <DD>
  904. <A HREF="#item_length"><CODE>$poly->length</CODE></A> <EM>object method</EM>
  905. <P>Return the number of vertices in the polygon.</P>
  906. <PRE>
  907.         $points = $poly->length;</PRE>
  908. <P></P>
  909. <DT><STRONG><A NAME="item_vertices"><CODE>vertices</CODE></A></STRONG><BR>
  910. <DD>
  911. <A HREF="#item_vertices"><CODE>$poly->vertices</CODE></A> <EM>object method</EM>
  912. <P>Return a list of all the verticies in the polygon object.  Each
  913. membver of the list is a reference to an (x,y) array.</P>
  914. <PRE>
  915.         @vertices = $poly->vertices;
  916.         foreach $v (@vertices)
  917.            print join(",",@$v),"\n";
  918.         }</PRE>
  919. <P></P>
  920. <DT><STRONG><A NAME="item_bounds"><CODE>bounds</CODE></A></STRONG><BR>
  921. <DD>
  922. <A HREF="#item_bounds"><CODE>$poly->bounds</CODE></A> <EM>object method</EM>
  923. <P>Return the smallest rectangle that completely encloses the polygon.
  924. The return value is an array containing the (left,top,right,bottom) of
  925. the rectangle.</P>
  926. <PRE>
  927.         ($left,$top,$right,$bottom) = $poly->bounds;</PRE>
  928. <P></P>
  929. <DT><STRONG><A NAME="item_offset"><CODE>offset</CODE></A></STRONG><BR>
  930. <DD>
  931. <A HREF="#item_offset"><CODE>$poly->offset(dx,dy)</CODE></A> <EM>object method</EM>
  932. <P>Offset all the vertices of the polygon by the specified horizontal
  933. (dh) and vertical (dy) amounts.  Positive numbers move the polygon
  934. down and to the right.</P>
  935. <PRE>
  936.         $poly->offset(10,30);</PRE>
  937. <P></P>
  938. <DT><STRONG><A NAME="item_map"><CODE>map</CODE></A></STRONG><BR>
  939. <DD>
  940. <A HREF="#item_map"><CODE>$poly->map(srcL,srcT,srcR,srcB,destL,dstT,dstR,dstB)</CODE></A> <EM>object method</EM>
  941. <P>Map the polygon from a source rectangle to an equivalent position in a
  942. destination rectangle, moving it and resizing it as necessary.  See
  943. polys.pl for an example of how this works.  Both the source and
  944. destination rectangles are given in (left,top,right,bottom)
  945. coordinates.  For convenience, you can use the polygon's own bounding
  946. box as the source rectangle.</P>
  947. <PRE>
  948.         # Make the polygon really tall
  949.         $poly->map($poly->bounds,0,0,50,200);</PRE>
  950. <P></P>
  951. <DT><STRONG><A NAME="item_scale"><CODE>scale</CODE></A></STRONG><BR>
  952. <DD>
  953. <A HREF="#item_scale"><CODE>$poly->scale(sx,sy)</CODE></A> <EM>object method</EM>
  954. <P>Scale each vertex of the polygon by the X and Y factors indicated by
  955. sx and sy.  For example <A HREF="#item_scale"><CODE>scale(2,2)</CODE></A> will make the polygon twice as
  956. large.  For best results, move the center of the polygon to position
  957. (0,0) before you scale, then move it back to its previous position.</P>
  958. <P></P>
  959. <DT><STRONG><A NAME="item_transform"><CODE>transform</CODE></A></STRONG><BR>
  960. <DD>
  961. <A HREF="#item_transform"><CODE>$poly->transform(sx,rx,sy,ry,tx,ty)</CODE></A> <EM>object method</EM>
  962. <P>Run each vertex of the polygon through a transformation matrix, where
  963. sx and sy are the X and Y scaling factors, rx and ry are the X and Y
  964. rotation factors, and tx and ty are X and Y offsets.  See the Adobe
  965. PostScript Reference, page 154 for a full explanation, or experiment.</P>
  966. <P></P></DL>
  967. <P>
  968. <H2><A NAME="font utilities">Font Utilities</A></H2>
  969. <P>The libgd library (used by the Perl GD library) has built-in support
  970. for about half a dozen fonts, which were converted from public-domain
  971. X Windows fonts.  For more fonts, compile libgd with TrueType support
  972. and use the <A HREF="#item_stringTTF"><CODE>stringTTF()</CODE></A> call.</P>
  973. <P>If you wish to add more built-in fonts, the directory bdf_scripts
  974. contains two contributed utilities that may help you convert X-Windows
  975. BDF-format fonts into the format that libgd uses internally.  However
  976. these scripts were written for earlier versions of GD which included
  977. its own mini-gd library.  These scripts will have to be adapted for
  978. use with libgd, and the libgd library itself will have to be
  979. recompiled and linked!  Please do not contact me for help with these
  980. scripts: they are unsupported.</P>
  981. <DL>
  982. <DT><STRONG><A NAME="item_gdSmallFont"><CODE>gdSmallFont</CODE></A></STRONG><BR>
  983. <DD>
  984. <CODE>GD::Font->Small</CODE> <EM>constant</EM>
  985. <P>This is the basic small font, ``borrowed'' from a well known public
  986. domain 6x12 font.</P>
  987. <P></P>
  988. <DT><STRONG><A NAME="item_gdLargeFont"><CODE>gdLargeFont</CODE></A></STRONG><BR>
  989. <DD>
  990. <CODE>GD::Font->Large</CODE> <EM>constant</EM>
  991. <P>This is the basic large font, ``borrowed'' from a well known public
  992. domain 8x16 font.</P>
  993. <P></P>
  994. <DT><STRONG><A NAME="item_gdMediumBoldFont"><CODE>gdMediumBoldFont</CODE></A></STRONG><BR>
  995. <DD>
  996. <CODE>GD::Font->MediumBold</CODE> <EM>constant</EM>
  997. <P>This is a bold font intermediate in size between the small and large
  998. fonts, borrowed from a public domain 7x13 font;</P>
  999. <P></P>
  1000. <DT><STRONG><A NAME="item_gdTinyFont"><CODE>gdTinyFont</CODE></A></STRONG><BR>
  1001. <DD>
  1002. <CODE>GD::Font->Tiny</CODE> <EM>constant</EM>
  1003. <P>This is a tiny, almost unreadable font, 5x8 pixels wide.</P>
  1004. <P></P>
  1005. <DT><STRONG><A NAME="item_gdGiantFont"><CODE>gdGiantFont</CODE></A></STRONG><BR>
  1006. <DD>
  1007. <CODE>GD::Font->Giant</CODE> <EM>constant</EM>
  1008. <P>This is a 9x15 bold font converted by Jan Pazdziora from a sans serif
  1009. X11 font.</P>
  1010. <P></P>
  1011. <DT><STRONG><A NAME="item_nchars"><CODE>nchars</CODE></A></STRONG><BR>
  1012. <DD>
  1013. <A HREF="#item_nchars"><CODE>$font->nchars</CODE></A>    <EM>object method</EM>
  1014. <P>This returns the number of characters in the font.</P>
  1015. <PRE>
  1016.         print "The large font contains ",gdLargeFont->nchars," characters\n";</PRE>
  1017. <P></P>
  1018. <DT><STRONG><CODE>offset</CODE></STRONG><BR>
  1019. <DD>
  1020. <A HREF="#item_offset"><CODE>$font->offset</CODE></A>     <EM>object method</EM>
  1021. <P>This returns the ASCII value of the first character in the font</P>
  1022. <P></P>
  1023. <DT><STRONG><A NAME="item_width"><CODE>width</CODE></A></STRONG><BR>
  1024. <DD>
  1025. <DT><STRONG><A NAME="item_height"><CODE>height</CODE></A></STRONG><BR>
  1026. <DD>
  1027. <A HREF="#item_width"><CODE>$font->width</CODE></A> <CODE>GD::Font::height</CODE>    <EM>object methods</EM>
  1028. <P>These return the width and height of the font.</P>
  1029. <PRE>
  1030.         ($w,$h) = (gdLargeFont->width,gdLargeFont->height);</PRE>
  1031. <P></P></DL>
  1032. <P>
  1033. <HR>
  1034. <H1><A NAME="obtaining the clanguage version of gd">Obtaining the C-language version of gd</A></H1>
  1035. <P>libgd, the C-language version of gd, can be obtained at URL
  1036. <A HREF="http://www.boutell.com/gd/.">http://www.boutell.com/gd/.</A>  Directions for installing and using it
  1037. can be found at that site.  Please do not contact me for help with
  1038. libgd.</P>
  1039. <P>
  1040. <HR>
  1041. <H1><A NAME="copyright information">Copyright Information</A></H1>
  1042. <P>The GD.pm interface is copyright 1995-1999, Lincoln D. Stein.  It is
  1043. distributed under the same terms as Perl itself.  See the ``Artistic
  1044. License'' in the Perl source code distribution for licensing terms.</P>
  1045. <P>The latest versions of GD.pm are available at</P>
  1046. <PRE>
  1047.   <A HREF="http://stein.cshl.org/WWW/software/GD">http://stein.cshl.org/WWW/software/GD</A></PRE>
  1048. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  1049. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  1050. <STRONG><P CLASS=block> GD.pm - Interface to Gd Graphics Library</P></STRONG>
  1051. </TD></TR>
  1052. </TABLE>
  1053.  
  1054. </BODY>
  1055.  
  1056. </HTML>
  1057.