GD.pm
上传用户:qdrechuli
上传日期:2022-08-01
资源大小:917k
文件大小:32k
源码类别:

视频捕捉/采集

开发平台:

Visual C++

  1. package GD;
  2. # Copyright 1995 Lincoln D. Stein.  See accompanying README file for
  3. # usage information
  4. require 5.003;
  5. require FileHandle;
  6. require Exporter;
  7. require DynaLoader;
  8. require AutoLoader;
  9. use strict;
  10. use vars qw($VERSION @ISA @EXPORT $AUTOLOAD);
  11. $VERSION = "1.16";
  12. @ISA = qw(Exporter DynaLoader);
  13. # Items to export into callers namespace by default. Note: do not export
  14. # names by default without a very good reason. Use EXPORT_OK instead.
  15. # Do not simply export all your public functions/methods/constants.
  16. @EXPORT = qw(
  17. gdBrushed
  18. gdDashSize
  19. gdMaxColors
  20. gdStyled
  21. gdStyledBrushed
  22. gdTiled
  23. gdTransparent
  24. gdSmallFont
  25. gdLargeFont
  26. gdMediumBoldFont
  27. gdTinyFont
  28. );
  29. sub AUTOLOAD {
  30.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  31.     # XS function.  If a constant is not found then control is passed
  32.     # to the AUTOLOAD in AutoLoader.
  33.     my($constname);
  34.     ($constname = $AUTOLOAD) =~ s/.*:://;
  35.     my $val = constant($constname, @_ ? $_[0] : 0);
  36.     if ($! != 0) {
  37. if ($! =~ /Invalid/) {
  38.     $AutoLoader::AUTOLOAD = $AUTOLOAD;
  39.     goto &AutoLoader::AUTOLOAD;
  40. }
  41. else {
  42.     my($pack,$file,$line) = caller;
  43.     die "Your vendor has not defined GD macro $pack::$constname, used at $file line $line.n";
  44. }
  45.     }
  46.     eval "sub $AUTOLOAD { $val }";
  47.     goto &$AUTOLOAD;
  48. }
  49. bootstrap GD;
  50. # Preloaded methods go here.
  51. sub GD::gdSmallFont {
  52.     return &GD::Font::Small;
  53. }
  54. sub GD::gdLargeFont {
  55.     return &GD::Font::Large;
  56. }
  57. sub GD::gdMediumBoldFont {
  58.     return &GD::Font::MediumBold;
  59. }
  60. sub GD::gdTinyFont {
  61.     return &GD::Font::Tiny;
  62. }
  63. # This is a C callback
  64. sub GD::Image::newFromGif {
  65.     croak("Usage: newFromGif(class,filehandle)") unless @_==2;
  66.     my($class,$fh) = @_;
  67.     unless (ref $fh) {
  68. my($package) = caller;
  69. no strict;
  70. $fh = "$package::$fh";
  71.     }
  72.     $class->_newFromGif($fh);
  73. }
  74. sub GD::Image::newFromXbm {
  75.     croak("Usage: newFromXbm(class,filehandle)") unless @_==2;
  76.     my($class,$fh) = @_;
  77.     unless (ref $fh) {
  78. my($package) = caller;
  79. no strict;
  80. $fh = "$package::$fh";
  81.     }
  82.     $class->_newFromXbm($fh);
  83. }
  84. sub GD::Image::newFromGd {
  85.     croak("Usage: newFromGd(class,filehandle)") unless @_==2;
  86.     my($class,$fh) = @_;
  87.     unless (ref $fh) {
  88. my($package) = caller;
  89. no strict;
  90. $fh = "$package::$fh";
  91.     }
  92.     $class->_newFromGd($fh);
  93. }
  94. ### The polygon object ###
  95. # create a new polygon
  96. sub GD::Polygon::new {
  97.     my $class = shift;
  98.     return bless { 'length'=>0,'points'=>[] },$class;
  99. }
  100. # automatic destruction of the polygon
  101. sub GD::Polygon::DESTROY {
  102.     my $self = shift;
  103.     undef $self->{'points'};
  104. }
  105. # add an x,y vertex to the polygon
  106. sub GD::Polygon::addPt {
  107.     my($self,$x,$y) = @_;
  108.     push(@{$self->{'points'}},[$x,$y]);
  109.     $self->{'length'}++;
  110. }
  111. # get a vertex
  112. sub GD::Polygon::getPt {
  113.     my($self,$index) = @_;
  114.     return () unless ($index>=0) && ($index<$self->{'length'});
  115.     return @{$self->{'points'}->[$index]};
  116. }
  117. # change the value of a vertex
  118. sub GD::Polygon::setPt {
  119.     my($self,$index,$x,$y) = @_;
  120.     unless (($index>=0) && ($index<$self->{'length'})) {
  121. warn "Attempt to set an undefined polygon vertex";
  122. return undef;
  123.     }
  124.     @{$self->{'points'}->[$index]} = ($x,$y);
  125.     1;
  126. }
  127. # return the total number of vertices
  128. sub GD::Polygon::length {
  129.     my $self = shift;
  130.     return $self->{'length'};
  131. }
  132. # return the array of vertices.
  133. # each vertex is an two-member (x,y) array
  134. sub GD::Polygon::vertices {
  135.     my $self = shift;
  136.     return @{$self->{'points'}};
  137. }
  138. # return the bounding box of the polygon
  139. # (smallest rectangle that contains it)
  140. sub GD::Polygon::bounds {
  141.     my $self = shift;
  142.     my($top,$bottom,$left,$right) = @_;
  143.     $top =    99999999;
  144.     $bottom =-99999999;
  145.     $left =   99999999;
  146.     $right = -99999999;
  147.     my $v;
  148.     foreach $v ($self->vertices) {
  149. $left = $v->[0] if $left > $v->[0];
  150. $right = $v->[0] if $right < $v->[0];
  151. $top = $v->[1] if $top > $v->[1];
  152. $bottom = $v->[1] if $bottom < $v->[1];
  153.     }
  154.     return ($left,$top,$right,$bottom);
  155. }
  156. # delete a vertex, returning it, just for fun
  157. sub GD::Polygon::delete {
  158.     my($self,$index) = @_;
  159.     my($vertex) = splice(@{$self->{'points'}},$index,1);
  160.     return @$vertex;
  161. }
  162. # translate the polygon in space by deltaX and deltaY
  163. sub GD::Polygon::offset {
  164.     my($self,$dh,$dv) = @_;
  165.     my $size = $self->length;
  166.     my($i);
  167.     for ($i=0;$i<$size;$i++) {
  168. my($x,$y)=$self->getPt($i);
  169. $self->setPt($i,$x+$dh,$y+$dv);
  170.     }
  171. }
  172. # map the polygon from sourceRect to destRect,
  173. # translating and resizing it if necessary
  174. sub GD::Polygon::map {
  175.     my($self,$srcL,$srcT,$srcR,$srcB,$destL,$destT,$destR,$destB) = @_;
  176.     my($factorV) = ($destB-$destT)/($srcB-$srcT);
  177.     my($factorH) = ($destR-$destL)/($srcR-$srcL);
  178.     my($vertices) = $self->length;
  179.     my($i);
  180.     for ($i=0;$i<$vertices;$i++) {
  181. my($x,$y) = $self->getPt($i);
  182. $x = int($destL + ($x - $srcL) * $factorH);
  183. $y = int($destT + ($y - $srcT) * $factorV);
  184. $self->setPt($i,$x,$y);
  185.     }
  186. }
  187. # draws closed polygon with the specified color
  188. sub GD::Image::polygon {
  189.     my $self = shift;
  190.     my($p,$c) = @_;
  191.     $self->openPolygon($p, $c);
  192.     $self->line( @{$p->{'points'}->[0]},
  193.     @{$p->{'points'}->[$p->{'length'}-1]}, $c);
  194. }
  195. # These routines added by Winfriend Koenig.
  196. sub GD::Polygon::toPt {
  197.     my($self, $dx, $dy) = @_;
  198.     unless ($self->length > 0) {
  199. $self->addPt($dx,$dy);
  200. return;
  201.     }
  202.     my ($x, $y) = $self->getPt($self->length-1);
  203.     $self->addPt($x+$dx,$y+$dy);
  204. }
  205. sub GD::Polygon::transform($$$$$$$) {
  206.     # see PostScript Ref. page 154
  207.     my($self, $a, $b, $c, $d, $tx, $ty) = @_;
  208.     my $size = $self->length;
  209.     for (my $i=0;$i<$size;$i++) {
  210. my($x,$y)=$self->getPt($i);
  211. $self->setPt($i, $a*$x+$c*$y+$tx, $b*$x+$d*$y+$ty);
  212.     }
  213.     
  214. }
  215. sub GD::Polygon::scale {
  216.     my($self, $sx, $sy) = @_;
  217.     $self->transform($sx,0,0,$sy,0,0);
  218. }
  219. # Autoload methods go after __END__, and are processed by the autosplit program.
  220. 1;
  221. __END__
  222. =head1 NAME
  223. GD.pm - Interface to Gd Graphics Library
  224. =head1 SYNOPSIS
  225.     use GD;
  226.         
  227.     # create a new image
  228.     $im = new GD::Image(100,100);
  229.     # allocate some colors
  230.     $white = $im->colorAllocate(255,255,255);
  231.     $black = $im->colorAllocate(0,0,0);       
  232.     $red = $im->colorAllocate(255,0,0);      
  233.     $blue = $im->colorAllocate(0,0,255);
  234.     # make the background transparent and interlaced
  235.     $im->transparent($white);
  236.     $im->interlaced('true');
  237.     # Put a black frame around the picture
  238.     $im->rectangle(0,0,99,99,$black);
  239.     # Draw a blue oval
  240.     $im->arc(50,50,95,75,0,360,$blue);
  241.     # And fill it with red
  242.     $im->fill(50,50,$red);
  243.     # Convert the image to GIF and print it on standard output
  244.     print $im->gif;
  245. =head1 DESCRIPTION
  246. B<GD.pm> is a port of Thomas Boutell's gd graphics library (see
  247. below).  GD allows you to create color drawings using a large number of
  248. graphics primitives, and emit the drawings as GIF files.
  249. GD defines the following three classes:
  250. =over 5
  251. =item C<GD::Image>
  252. An image class, which holds the image data and accepts graphic
  253. primitive method calls.
  254. =item C<GD::Font>
  255. A font class, which holds static font information and used for text
  256. rendering.
  257. =item C<GD::Polygon>
  258. A simple polygon object, used for storing lists of vertices prior to
  259. rendering a polygon into an image.
  260. =back
  261. A Simple Example:
  262. #!/usr/local/bin/perl
  263. use GD;
  264. # create a new image
  265. $im = new GD::Image(100,100);
  266. # allocate some colors
  267. $white = $im->colorAllocate(255,255,255);
  268. $black = $im->colorAllocate(0,0,0);       
  269. $red = $im->colorAllocate(255,0,0);      
  270. $blue = $im->colorAllocate(0,0,255);
  271. # make the background transparent and interlaced
  272. $im->transparent($white);
  273. $im->interlaced('true');
  274. # Put a black frame around the picture
  275. $im->rectangle(0,0,99,99,$black);
  276. # Draw a blue oval
  277. $im->arc(50,50,95,75,0,360,$blue);
  278. # And fill it with red
  279. $im->fill(50,50,$red);
  280. # Convert the image to GIF and print it on standard output
  281. print $im->gif;
  282. Notes:
  283. =over 5
  284. =item 1.
  285. To create a new, empty image, send a new() message to GD::Image, passing
  286. it the width and height of the image you want to create.  An image
  287. object will be returned.  Other class methods allow you to initialize
  288. an image from a preexisting GIF, GD or XBM file.
  289. =item 2.
  290. Next you will ordinarily add colors to the image's color table.
  291. colors are added using a colorAllocate() method call.  The three
  292. parameters in each call are the red, green and blue (rgb) triples for
  293. the desired color.  The method returns the index of that color in the
  294. image's color table.  You should store these indexes for later use.
  295. =item 3.
  296. Now you can do some drawing!  The various graphics primitives are
  297. described below.  In this example, we do some text drawing, create an
  298. oval, and create and draw a polygon.
  299. =item 4.
  300. Polygons are created with a new() message to GD::Polygon.  You can add
  301. points to the returned polygon one at a time using the addPt() method.
  302. The polygon can then be passed to an image for rendering.
  303. =item 5.
  304. When you're done drawing, you can convert the image into GIF format by
  305. sending it a gif() message.  It will return a (potentially large)
  306. scalar value containing the binary data for the image.  Ordinarily you
  307. will print it out at this point or write it to a file.
  308. =back
  309. =head1 Method Calls
  310. =head2 Creating and Saving Images
  311. =over 5
  312. =item C<new>
  313. C<GD::Image::new(width,height)> I<class method>
  314. To create a new, blank image, send a new() message to the GD::Image
  315. class.  For example:
  316. $myImage = new GD::Image(100,100) || die;
  317. This will create an image that is 100 x 100 pixels wide.  If you don't
  318. specify the dimensions, a default of 64 x 64 will be chosen. If
  319. something goes wrong (e.g. insufficient memory), this call will
  320. return undef.
  321. =item C<newFromGif>
  322. C<GD::Image::newFromGif(FILEHANDLE)> I<class method>
  323. This will create an image from a GIF file read in through the provided
  324. filehandle.  The filehandle must previously have been opened on a
  325. valid GIF file or pipe.  If successful, this call will return an
  326. initialized image which you can then manipulate as you please.  If it
  327. fails, which usually happens if the thing at the other end of the
  328. filehandle is not a valid GIF file, the call returns undef.  Notice
  329. that the call doesn't automatically close the filehandle for you.
  330. To get information about the size and color usage of the information,
  331. you can call the image query methods described below.
  332. Example usage:
  333. open (GIF,"barnswallow.gif") || die;
  334. $myImage = newFromGif GD::Image(GIF) || die;
  335. close GIF;
  336. =item C<newFromXbm>
  337. C<GD::Image::newFromXbm(FILEHANDLE)> I<class method>
  338. This works in exactly the same way as C<newFromGif>, but reads the
  339. contents of an X Bitmap file:
  340. open (XBM,"coredump.xbm") || die;
  341. $myImage = newFromXbm GD::Image(XBM) || die;
  342. close XBM;
  343. =item C<newFromGd>
  344. C<GD::Image::newFromGd(FILEHANDLE)> I<class method>
  345. This works in exactly the same way as C<newFromGif>, but reads the
  346. contents of a GD file.  GD is Tom Boutell's disk-based storage format,
  347. intended for the rare case when you need to read and write the image
  348. to disk quickly.  It's not intended for regular use, because, unlike
  349. GIF or JPEG, no image compression is performed and these files can
  350. become B<BIG>.
  351. open (GDF,"godzilla.gd") || die;
  352. $myImage = newFromGd GD::Image(GDF) || die;
  353. close GDF;
  354. =item C<gif>
  355. C<GD::Image::gif> I<object method>
  356. This returns the image data in GIF format.  You can then print it,
  357. pipe it to a display program, or write it to a file.  Example:
  358. $gif_data = $myImage->gif;
  359. open (DISPLAY,"| display -") || die;
  360. print DISPLAY $gif_data;
  361. close DISPLAY;
  362. =item C<gd>
  363. C<GD::Image::gd> I<object method>
  364. This returns the image data in GD format.  You can then print it,
  365. pipe it to a display program, or write it to a file.  Example:
  366. print MYOUTFILE $myImage->gd;
  367. =back
  368. =head2 Color Control
  369. =over 5
  370. =item C<colorAllocate>
  371. C<GD::Image::colorAllocate(red,green,blue)> I<object method>
  372. This allocates a color with the specified red, green and blue
  373. components and returns its index in the color table, if specified.
  374. The first color allocated in this way becomes the image's background
  375. color.  (255,255,255) is white (all pixels on).  (0,0,0) is black (all
  376. pixels off).  (255,0,0) is fully saturated red.  (127,127,127) is 50%
  377. gray.  You can find plenty of examples in /usr/X11/lib/X11/rgb.txt.
  378. If no colors are allocated, then this function returns -1.
  379. Example:
  380. $white = $myImage->colorAllocate(0,0,0); #background color
  381. $black = $myImage->colorAllocate(255,255,255);
  382. $peachpuff = $myImage->colorAllocate(255,218,185);
  383. =item C<colorDeallocate>
  384. C<GD::Image::colorDeallocate(colorIndex)> I<object method> 
  385. This marks the color at the specified index as being ripe for
  386. reallocation.  The next time colorAllocate is used, this entry will be
  387. replaced.  You can call this method several times to deallocate
  388. multiple colors.  There's no function result from this call.
  389. Example:
  390. $myImage->colorDeallocate($peachpuff);
  391. $peachy = $myImage->colorAllocate(255,210,185);
  392. =item C<colorClosest>
  393. C<GD::Image::colorClosest(red,green,blue)> I<object method>
  394. This returns the index of the color closest in the color table to the
  395. red green and blue components specified.  If no colors have yet been
  396. allocated, then this call returns -1.
  397. Example:
  398. $apricot = $myImage->colorClosest(255,200,180);
  399. =item C<colorExact>
  400. C<GD::Image::colorExact(red,green,blue)> I<object method>
  401. This returns the index of a color that exactly matches the specified
  402. red green and blue components.  If such a color is not in the color
  403. table, this call returns -1.
  404. $rosey = $myImage->colorExact(255,100,80);
  405. warn "Everything's coming up roses.n" if $rosey >= 0;
  406. =item C<colorsTotal>
  407. C<GD::Image::colorsTotal)> I<object method>
  408. This returns the total number of colors allocated in the object.
  409. $maxColors = $myImage->colorsTotal;
  410. =item C<getPixel>
  411. C<GD::Image::getPixel(x,y)> I<object method>
  412. This returns the color table index underneath the specified
  413. point.  It can be combined with rgb()
  414. to obtain the rgb color underneath the pixel.
  415. Example:
  416.         $index = $myImage->getPixel(20,100);
  417.         ($r,$g,$b) = $myImage->rgb($index);
  418. =item C<rgb>
  419. C<GD::Image::rgb(colorIndex)> I<object method>
  420. This returns a list containing the red, green and blue components of
  421. the specified color index.
  422. Example:
  423. @RGB = $myImage->rgb($peachy);
  424. =item C<transparent>
  425. C<GD::Image::transparent(colorIndex)> I<object method>
  426. This marks the color at the specified index as being transparent.
  427. Portions of the image drawn in this color will be invisible.  This is
  428. useful for creating paintbrushes of odd shapes, as well as for
  429. making GIF backgrounds transparent for displaying on the Web.  Only
  430. one color can be transparent at any time. To disable transparency, 
  431. specify -1 for the index.  
  432. If you call this method without any parameters, it will return the
  433. current index of the transparent color, or -1 if none.
  434. Example:
  435. open(GIF,"test.gif");
  436. $im = newFromGif GD::Image(GIF);
  437. $white = $im->colorClosest(255,255,255); # find white
  438. $im->transparent($white);
  439. print $im->gif;
  440. =back
  441. =head2 Special Colors
  442. GD implements a number of special colors that can be used to achieve
  443. special effects.  They are constants defined in the GD::
  444. namespace, but automatically exported into your namespace when the GD
  445. module is loaded.
  446. =over 5
  447. =item C<setBrush>
  448. =item C<gdBrushed>
  449. C<GD::Image::setBrush( )> and C<GD::gdBrushed>
  450. You can draw lines and shapes using a brush pattern.  Brushes are 
  451. just images that you can create and manipulate in the usual way. When
  452. you draw with them, their contents are used for the color and shape of
  453. the lines.
  454. To make a brushed line, you must create or load the brush first, then
  455. assign it to the image using C<setBrush>.  You can then draw in that
  456. with that brush using the C<gdBrushed> special color.  It's often 
  457. useful to set the background of the brush to transparent so that 
  458. the non-colored parts don't overwrite other parts of your image.
  459. Example:
  460. # Create a brush at an angle
  461. $diagonal_brush = new GD::Image(5,5);
  462. $white = $diagonal_brush->allocateColor(255,255,255);
  463. $black = $diagonal_brush->allocateColor(0,0,0);
  464. $diagonal_brush->transparent($white);
  465. $diagonal_brush->line(0,4,4,0,$black); # NE diagonal
  466. # Set the brush
  467. $myImage->setBrush($diagonal_brush);
  468. # Draw a circle using the brush
  469. $myImage->arc(50,50,25,25,0,360,gdBrushed);
  470. =item C<setStyle>
  471. =item C<gdStyled>
  472. C<GD::Image::setStyle(@colors)> and C<GD::gdStyled>
  473. Styled lines consist of an arbitrary series of repeated colors and are
  474. useful for generating dotted and dashed lines.  To create a styled
  475. line, use C<setStyle> to specify a repeating series of colors.  It
  476. accepts an array consisting of one or more color indexes.  Then
  477. draw using the C<gdStyled> special color.  Another special color,
  478. C<gdTransparent> can be used to introduce holes in the line, as the
  479. example shows.
  480. Example:
  481. # Set a style consisting of 4 pixels of yellow,
  482. # 4 pixels of blue, and a 2 pixel gap
  483. $myImage->setStyle($yellow,$yellow,$yellow,$yellow,
  484.    $blue,$blue,$blue,$blue,
  485.    gdTransparent,gdTransparent);
  486. $myImage->arc(50,50,25,25,0,360,gdStyled);
  487. To combine the C<gdStyled> and C<gdBrushed> behaviors, you can specify
  488. C<gdStyledBrushed>.  In this case, a pixel from the current brush
  489. pattern is rendered wherever the color specified in setStyle() is
  490. neither gdTransparent nor 0.
  491. =item C<gdTiled>
  492. Draw filled shapes and flood fills using a pattern.  The pattern is
  493. just another image.  The image will be tiled multiple times in order
  494. to fill the required space, creating wallpaper effects.  You must call
  495. C<setTile> in order to define the particular tile pattern you'll use
  496. for drawing when you specify the gdTiled color.
  497. details.
  498. =item C<gdStyled>
  499. The gdStyled color is used for creating dashed and dotted lines.  A
  500. styled line can contain any series of colors and is created using the
  501. C<setStyled> command.
  502. =back
  503. =head2 Drawing Commands
  504. =over 5
  505. =item C<setPixel>
  506. C<GD::Image::setPixel(x,y,color)> I<object method> 
  507. 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.
  512. Example:
  513. # This assumes $peach already allocated
  514. $myImage->setPixel(50,50,$peach);
  515. =item C<line>
  516. C<GD::Image::line(x1,y1,x2,y2,color)> I<object method>
  517. This draws a line from (x1,y1) to (x2,y2) of the specified color.  You
  518. can use a real color, or one of the special colors gdBrushed, 
  519. gdStyled and gdStyledBrushed.
  520. Example:
  521. # Draw a diagonal line using the currently defind
  522. # paintbrush pattern.
  523. $myImage->line(0,0,150,150,gdBrushed);
  524. =item C<dashedLine>
  525. C<GD::Image::dashedLine(x1,y1,x2,y2,color)> I<object method>
  526. This draws a dashed line from (x1,y1) to (x2,y2) in the specified
  527. color.  A more powerful way to generate arbitrary dashed and dotted
  528. lines is to use the setStyle() method described below and to draw with
  529. the special color gdStyled.
  530. Example:
  531. $myImage->dashedLine(0,0,150,150,$blue);
  532. =item C<rectangle>
  533. C<GD::Image::rectangle(x1,y1,x2,y2,color)> I<object method>
  534. This draws a rectangle with the specified color.  (x1,y1) and (x2,y2)
  535. are the upper left and lower right corners respectively.  Both real 
  536. color indexes and the special colors gdBrushed, gdStyled and 
  537. gdStyledBrushed are accepted.
  538. Example:
  539. $myImage->rectangle(10,10,100,100,$rose);
  540. =item C<filledRectangle>
  541. C<GD::Image::filledRectangle(x1,y1,x2,y2,color)> I<object method>
  542. This draws a rectangle filed with the specified color.  You can use a
  543. real color, or the special fill color gdTiled to fill the polygon
  544. with a pattern.
  545. Example:
  546. # read in a fill pattern and set it
  547. open(GIF,"happyface.gif") || die;
  548. $tile = newFromGif GD::Image(GIF);
  549. $myImage->setTile($tile); 
  550. # draw the rectangle, filling it with the pattern
  551. $myImage->filledRectangle(10,10,150,200,gdTiled);
  552. =item C<polygon>
  553. C<GD::Image::polygon(polygon,color)> I<object method> 
  554. This draws a polygon with the specified color.  The polygon must be
  555. created first (see below).  The polygon must have at least three
  556. vertices.  If the last vertex doesn't close the polygon, the method
  557. will close it for you.  Both real color indexes and the special 
  558. colors gdBrushed, gdStyled and gdStyledBrushed can be specified.
  559. Example:
  560. $poly = new GD::Polygon;
  561. $poly->addPt(50,0);
  562. $poly->addPt(99,99);
  563. $poly->addPt(0,99);
  564. $myImage->polygon($poly,$blue);
  565. =item C<filledPolygon>
  566. C<GD::Image::filledPolygon(poly,color)> I<object method>
  567. This draws a polygon filled with the specified color.  You can use a
  568. real color, or the special fill color gdTiled to fill the polygon
  569. with a pattern.
  570. Example:
  571. # make a polygon
  572. $poly = new GD::Polygon;
  573. $poly->addPt(50,0);
  574. $poly->addPt(99,99);
  575. $poly->addPt(0,99);
  576. # draw the polygon, filling it with a color
  577. $myImage->filledPolygon($poly,$peachpuff);
  578. =item C<arc>
  579. C<GD::Image::arc(cx,cy,width,height,start,end,color)> I<object method>
  580. This draws arcs and ellipses.  (cx,cy) are the center of the arc, and
  581. (width,height) specify the width and height, respectively.  The
  582. portion of the ellipse covered by the arc are controlled by start and
  583. end, both of which are given in degrees from 0 to 360.  Zero is at the
  584. top of the ellipse, and angles increase clockwise.  To specify a
  585. complete ellipse, use 0 and 360 as the starting and ending angles.  To
  586. draw a circle, use the same value for width and height.
  587. You can specify a normal color or one of the special colors gdBrushed,
  588. gdStyled, or gdStyledBrushed.
  589. Example:
  590. # draw a semicircle centered at 100,100
  591. $myImage->arc(100,100,50,50,0,180,$blue);
  592. =item C<fill>
  593. C<GD::Image::fill(x,y,color)> I<object method>
  594. This method flood-fills regions with the specified color.  The color
  595. will spread through the image, starting at point (x,y), until it is
  596. stopped by a pixel of a different color from the starting pixel (this
  597. is similar to the "paintbucket" in many popular drawing toys).  You
  598. can specify a normal color, or the special color gdTiled, to flood-fill
  599. with patterns.
  600. Example:
  601. # Draw a rectangle, and then make its interior blue
  602. $myImage->rectangle(10,10,100,100,$black);
  603. $myImage->fill(50,50,$blue);
  604. =item C<GD::Image::fillToBorder(x,y,bordercolor,color)> I<object method>
  605. Like C<fill>, this method flood-fills regions with the specified color,
  606. starting at position (x,y).
  607. However, instead of stopping when it hits a pixel of a different color
  608. than the starting pixel, flooding will only stop when it hits the
  609. color specified by bordercolor.  You must specify a normal indexed
  610. color for the bordercolor.  However, you are free to use the gdTiled
  611. color for the fill.
  612. Example:
  613. # This has the same effect as the previous example
  614. $myImage->rectangle(10,10,100,100,$black);
  615. $myImage->fillToBorder(50,50,$black,$blue);
  616. =back
  617. =head2 Image Copying Commands
  618. Two methods are provided for copying a rectangular region from one
  619. image to another.  One method copies a region without resizing it.
  620. The other allows you to stretch the region during the copy operation.
  621. With either of these methods it is important to know that the routines
  622. will attempt to flesh out the destination image's color table to match
  623. the colors that are being copied from the source.  If the
  624. destination's color table is already full, then the routines will
  625. attempt to find the best match, with varying results.
  626. =over 5
  627. =item C<copy>
  628. C<GD::Image::copy(sourceImage,dstX,dstY,srcX,srcY,width,height)> I<object method>
  629. This is the simpler of the two copy operations, copying the specified
  630. region from the source image to the destination image (the one
  631. performing the method call).  (srcX,srcY) specify the upper left
  632. corner of a rectangle in the source image, and (width,height) give the
  633. width and height of the region to copy.  (dstX,dstY) control where in
  634. the destination image to stamp the copy.  You can use the same image
  635. for both the source and the destination, but the source and
  636. destination regions must not overlap or strange things will happen.
  637. Example:
  638. $myImage = new GD::Image(100,100);
  639. ... various drawing stuff ...
  640. $srcImage = new GD::Image(50,50);
  641. ... more drawing stuff ...
  642. # copy a 25x25 pixel region from $srcImage to
  643. # the rectangle starting at (10,10) in $myImage
  644. $myImage->copy($srcImage,10,10,0,0,25,25);
  645. =item C<copyResized>
  646. C<GD::Image::copyResized(sourceImage,dstX,dstY,srcX,srcY,destW,destH,srcW,srcH)> I<object method>
  647. This method is similar to copy() but allows you to choose different
  648. sizes for the source and destination rectangles.  The source and
  649. destination rectangle's are specified independently by (srcW,srcH) and
  650. (destW,destH) respectively.  copyResized() will stretch or shrink the
  651. image to accomodate the size requirements.
  652. Example:
  653. $myImage = new GD::Image(100,100);
  654. ... various drawing stuff ...
  655. $srcImage = new GD::Image(50,50);
  656. ... more drawing stuff ...
  657. # copy a 25x25 pixel region from $srcImage to
  658. # a larger rectangle starting at (10,10) in $myImage
  659. $myImage->copyResized($srcImage,10,10,0,0,50,50,25,25);
  660. =back
  661. =head2 Character and String Drawing
  662. Gd allows you to draw characters and strings, either in normal
  663. horizontal orientation or rotated 90 degrees.  These routines use a
  664. GD::Font object, described in more detail below.  There are four
  665. built-in fonts, available in global variables gdLargeFont,
  666. gdMediumBoldFont, gdSmallFont and gdTinyFont.  Currently there is no
  667. way of dynamically creating your own fonts.
  668. =over 5
  669. =item C<string>
  670. C<GD::Image::string(font,x,y,string,color)> I<Object Method>
  671. This method draws a string startin at position (x,y) in the specified
  672. font and color.  Your choices of fonts are gdSmallFont, gdMediumBoldFont,
  673. gdTinyFont and gdLargeFont.
  674. Example:
  675. $myImage->string(gdSmallFont,2,10,"Peachy Keen",$peach);
  676. =item C<stringUp>
  677. C<GD::Image::stringUp(font,x,y,string,color)> I<Object Method>
  678. Just like the previous call, but draws the text rotated
  679. counterclockwise 90 degrees.
  680. =item C<char>
  681. =item C<charUp>
  682. C<GD::Image::char(font,x,y,char,color)> I<Object Method>
  683. C<GD::Image::charUp(font,x,y,char,color)> I<Object Method>
  684. These methods draw single characters at position (x,y) in the
  685. specified font and color.  They're carry-overs from the C interface,
  686. where there is a distinction between characters and strings.  Perl is
  687. insensible to such subtle distinctions.
  688. =back
  689. =head2 Miscellaneous Image Methods
  690. =over 5
  691. =item C<interlaced>
  692. C<GD::Image::interlaced( )> C<GD::Image::interlaced(1)> I<Object method>
  693. This method sets or queries the image's interlaced setting.  Interlace
  694. produces a cool venetian blinds effect on certain viewers.  Provide a
  695. true parameter to set the interlace attribute.  Provide undef to
  696. disable it.  Call the method without parameters to find out the
  697. current setting.
  698. =item c<getBounds>
  699. C<GD::Image::getBounds( )> I<Object method>
  700. This method will return a two-member list containing the width and
  701. height of the image.  You query but not not change the size of the
  702. image once it's created.
  703. =back
  704. =head2 Polygon Methods
  705. A few primitive polygon creation and manipulation methods are
  706. provided.  They aren't part of the Gd library, but I thought they
  707. might be handy to have around (they're borrowed from my qd.pl
  708. Quickdraw library).
  709. =over 5
  710. =item c<new>
  711. C<GD::Polygon::new> I<class method>
  712. Create an empty polygon with no vertices.
  713. $poly = new GD::Polygon;
  714. =item C<addPt>
  715. C<GD::Polygon::addPt(x,y)> I<object method>
  716. Add point (x,y) to the polygon.
  717. $poly->addPt(0,0);
  718. $poly->addPt(0,50);
  719. $poly->addPt(25,25);
  720. $myImage->fillPoly($poly,$blue);
  721. =item C<getPt>
  722. C<GD::Polygon::getPt(index)> I<object method>
  723. Retrieve the point at the specified vertex.
  724. ($x,$y) = $poly->getPt(2);
  725. =item C<setPt>
  726. C<GD::Polygon::setPt(index,x,y)> I<object method>
  727. Change the value of an already existing vertex.  It is an error to set
  728. a vertex that isn't already defined.
  729. $poly->setPt(2,100,100);
  730. =item C<deletePt>
  731. C<GD::Polygon:deletePt(index)> I<object method>
  732. Delete the specified vertex, returning its value.
  733. ($x,$y) = $poly->deletePt(1); 
  734. =item C<toPt>
  735. C<GD::Polygon::toPt(dx,dy)> I<object method>
  736. Draw from current vertex to a new vertex, using relative 
  737. (dx,dy) coordinates.  If this is the first point, act like
  738. addPt().
  739. $poly->addPt(0,0);
  740. $poly->toPt(0,50);
  741. $poly->toPt(25,-25);
  742. $myImage->fillPoly($poly,$blue);
  743. =item C<length>
  744. C<GD::Polygon::length> I<object method>
  745. Return the number of vertices in the polygon.
  746. $points = $poly->length;
  747. =item C<vertices>
  748. C<GD::Polygon::vertices> I<object method>
  749. Return a list of all the verticies in the polygon object.  Each
  750. membver of the list is a reference to an (x,y) array.
  751. @vertices = $poly->vertices;
  752. foreach $v (@vertices)
  753.    print join(",",@$v),"n";
  754. }
  755. =item C<bounds>
  756. C<GD::Polygon::bounds> I<object method>
  757. Return the smallest rectangle that completely encloses the polygon.
  758. The return value is an array containing the (left,top,right,bottom) of
  759. the rectangle.
  760. ($left,$top,$right,$bottom) = $poly->bounds;
  761. =item C<offset>
  762. C<GD::Polygon::offset(dx,dy)> I<object method>
  763. Offset all the vertices of the polygon by the specified horizontal
  764. (dh) and vertical (dy) amounts.  Positive numbers move the polygon
  765. down and to the right.
  766. $poly->offset(10,30);
  767. =item C<map>
  768. C<GD::Polygon::map(srcL,srcT,srcR,srcB,destL,dstT,dstR,dstB)> I<object method>
  769. Map the polygon from a source rectangle to an equivalent position in a
  770. destination rectangle, moving it and resizing it as necessary.  See
  771. polys.pl for an example of how this works.  Both the source and
  772. destination rectangles are given in (left,top,right,bottom)
  773. coordinates.  For convenience, you can use the polygon's own bounding
  774. box as the source rectangle.
  775. # Make the polygon really tall
  776. $poly->map($poly->bounds,0,0,50,200);
  777. =item C<scale>
  778. C<GD::Polygon::scale(sx,sy)> I<object method>
  779. Scale each vertex of the polygon by the X and Y factors indicated by
  780. sx and sy.  For example scale(2,2) will make the polygon twice as
  781. large.  For best results, move the center of the polygon to position
  782. (0,0) before you scale, then move it back to its previous position.
  783. =item C<transform>
  784. C<GD::Polygon::transform(sx,rx,sy,ry,tx,ty)> I<object method>
  785. Run each vertex of the polygon through a transformation matrix, where
  786. sx and sy are the X and Y scaling factors, rx and ry are the X and Y
  787. rotation factors, and tx and ty are X and Y offsets.  See the Adobe
  788. PostScript Reference, page 154 for a full explanation, or experiment.
  789. =back
  790. =head2 Font Utilities
  791. Gd's support for fonts is minimal.  Basically you have access to
  792. gdSmallFont and gdLargeFont for drawing, and not much else.  However,
  793. for future compatibility, I've made the fonts into perl objects of
  794. type GD::Font that you can query and, perhaps someday manipulate.
  795. =over 5
  796. =item C<gdSmallFont>
  797. C<GD::Font::gdSmallFont> I<constant>
  798. This is the basic small font, "borrowed" from a well known public
  799. domain 6x12 font.
  800. =item C<gdLargeFont>
  801. C<GD::Font::gdLargeFont> I<constant>
  802. This is the basic large font, "borrowed" from a well known public
  803. domain 8x16 font.
  804. =item C<gdMediumBoldFont>
  805. C<GD::Font::gdMediumBoldFont> I<constant>
  806. This is a bold font intermediate in size between the small and large
  807. fonts, borrowed from a public domain 7x13 font;
  808. =item C<gdTinyFont>
  809. C<GD::Font::gdTinyFont> I<constant>
  810. This is a tiny, almost unreadable font, 5x8 pixels wide.
  811. =item C<nchars>
  812. C<GD::Font::nchars> I<object method>
  813. This returns the number of characters in the font.
  814. print "The large font contains ",gdLargeFont->nchars," charactersn";
  815. =item C<offset>
  816. C<GD::Font::offset>  I<object method>
  817. This returns the ASCII value of the first character in the font
  818. =item C<width>
  819. =item C<height>
  820. C<GD::Font::width> C<GD::Font::height> I<object methods>
  821. These return the width and height of the font.
  822. ($w,$h) = (gdLargeFont->width,gdLargeFont->height);
  823. =back
  824. =head1 Obtaining the C-language version of gd
  825. libgd, the C-language version of gd, can be obtained at URL
  826. http://www.boutell.com/gd/gd.html.  Directions for installing and
  827. using it can be found at that site.  Please do not contact me for help
  828. with libgd.
  829. =head1 Copyright Information
  830. The GD.pm interface is copyright 1995, Lincoln D. Stein.  You are free
  831. to use it for any purpose, commercial or noncommercial, provided that
  832. if you redistribute the source code this statement of copyright
  833. remains attached. The gd library is covered separately under a 1994
  834. copyright by Quest Protein Database Center, Cold Spring Harbor Labs
  835. and Thomas Boutell.  For usage information see the gd documentation at
  836. URL
  837. http://www.boutell.com/gd/gd.html
  838. The latest versions of GD.pm are available at
  839.   http://www.genome.wi.mit.edu/ftp/pub/software/WWW/GD.html
  840.   ftp://ftp-genome.wi.mit.edu/pub/software/WWW/GD.pm.tar.gz