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

视频捕捉/采集

开发平台:

Visual C++

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4. #include "libgd/gd.h"
  5. #ifdef FCGI
  6.  #include <fcgi_stdio.h>
  7. #else
  8.  #ifdef USE_SFIO
  9.   #include <config.h>
  10.  #else
  11.   #include <stdio.h>
  12.  #endif
  13.  #include <perlio.h>
  14. #endif
  15. /* Copyright 1995, 1996, Lincoln D. Stein.  See accompanying README file for
  16. usage restrictions */
  17. static int
  18. not_here(s)
  19. char *s;
  20. {
  21.     croak("%s not implemented on this architecture", s);
  22.     return -1;
  23. }
  24. static double
  25. constant(name, arg)
  26. char *name;
  27. int arg;
  28. {
  29.     errno = 0;
  30.     switch (*name) {
  31.     case 'A':
  32. break;
  33.     case 'B':
  34. break;
  35.     case 'C':
  36. break;
  37.     case 'D':
  38. break;
  39.     case 'E':
  40. break;
  41.     case 'F':
  42. break;
  43.     case 'G':
  44. break;
  45.     case 'H':
  46. break;
  47.     case 'I':
  48. break;
  49.     case 'J':
  50. break;
  51.     case 'K':
  52. break;
  53.     case 'L':
  54. break;
  55.     case 'M':
  56. break;
  57.     case 'N':
  58. break;
  59.     case 'O':
  60. break;
  61.     case 'P':
  62. break;
  63.     case 'Q':
  64. break;
  65.     case 'R':
  66. break;
  67.     case 'S':
  68. break;
  69.     case 'T':
  70. break;
  71.     case 'U':
  72. break;
  73.     case 'V':
  74. break;
  75.     case 'W':
  76. break;
  77.     case 'X':
  78. break;
  79.     case 'Y':
  80. break;
  81.     case 'Z':
  82. break;
  83.     case 'a':
  84. break;
  85.     case 'b':
  86. break;
  87.     case 'c':
  88. break;
  89.     case 'd':
  90. break;
  91.     case 'e':
  92. break;
  93.     case 'f':
  94. break;
  95.     case 'g':
  96. if (strEQ(name, "gdBrushed"))
  97. #ifdef gdBrushed
  98.     return gdBrushed;
  99. #else
  100.     goto not_there;
  101. #endif
  102. if (strEQ(name, "gdDashSize"))
  103. #ifdef gdDashSize
  104.     return gdDashSize;
  105. #else
  106.     goto not_there;
  107. #endif
  108. if (strEQ(name, "gdMaxColors"))
  109. #ifdef gdMaxColors
  110.     return gdMaxColors;
  111. #else
  112.     goto not_there;
  113. #endif
  114. if (strEQ(name, "gdStyled"))
  115. #ifdef gdStyled
  116.     return gdStyled;
  117. #else
  118.     goto not_there;
  119. #endif
  120. if (strEQ(name, "gdStyledBrushed"))
  121. #ifdef gdStyledBrushed
  122.     return gdStyledBrushed;
  123. #else
  124.     goto not_there;
  125. #endif
  126. if (strEQ(name, "gdTiled"))
  127. #ifdef gdTiled
  128.     return gdTiled;
  129. #else
  130.     goto not_there;
  131. #endif
  132. if (strEQ(name, "gdTransparent"))
  133. #ifdef gdTransparent
  134.     return gdTransparent;
  135. #else
  136.     goto not_there;
  137. #endif
  138. break;
  139.     case 'h':
  140. break;
  141.     case 'i':
  142. break;
  143.     case 'j':
  144. break;
  145.     case 'k':
  146. break;
  147.     case 'l':
  148. break;
  149.     case 'm':
  150. break;
  151.     case 'n':
  152. break;
  153.     case 'o':
  154. break;
  155.     case 'p':
  156. break;
  157.     case 'q':
  158. break;
  159.     case 'r':
  160. break;
  161.     case 's':
  162. break;
  163.     case 't':
  164. break;
  165.     case 'u':
  166. break;
  167.     case 'v':
  168. break;
  169.     case 'w':
  170. break;
  171.     case 'x':
  172. break;
  173.     case 'y':
  174. break;
  175.     case 'z':
  176. break;
  177.     }
  178.     errno = EINVAL;
  179.     return 0;
  180. not_there:
  181.     errno = ENOENT;
  182.     return 0;
  183. }
  184. typedef gdImagePtr GD__Image;
  185. typedef gdFontPtr GD__Font;
  186. typedef PerlIO * InputStream;
  187. extern  gdFontPtr gdFontLarge;
  188. extern gdFontPtr gdFontSmall;
  189. extern gdFontPtr gdFontMediumBold;
  190. extern gdFontPtr gdFontTiny;
  191. MODULE = GD PACKAGE = GD
  192. double
  193. constant(name,arg)
  194. char * name
  195. int arg
  196. MODULE = GD PACKAGE = GD::Image PREFIX=gd
  197. GD::Image
  198. gdnew(packname="GD::Image", x=64, y=64)
  199. char * packname
  200. int x
  201. int y
  202.         PROTOTYPE: $;$$
  203. CODE:
  204. {
  205. gdImagePtr theImage;
  206. theImage = gdImageCreate(x,y);
  207. RETVAL = theImage;
  208. }
  209. OUTPUT:
  210. RETVAL
  211. GD::Image
  212. gd_newFromGif(packname="GD::Image", filehandle)
  213. char * packname
  214. InputStream filehandle
  215. PROTOTYPE: $$
  216. CODE:
  217. RETVAL = gdImageCreateFromGif(filehandle);
  218. OUTPUT:
  219. RETVAL
  220. GD::Image
  221. gd_newFromXbm(packname="GD::Image", filehandle)
  222. char * packname
  223. InputStream filehandle
  224. PROTOTYPE: $$
  225. CODE:
  226. RETVAL = gdImageCreateFromXbm(filehandle);
  227. OUTPUT:
  228. RETVAL
  229. GD::Image
  230. gd_newFromGd(packname="GD::Image", filehandle)
  231. char * packname
  232. InputStream filehandle
  233. PROTOTYPE: $$
  234. CODE:
  235. RETVAL = gdImageCreateFromGd(filehandle);
  236. OUTPUT:
  237. RETVAL
  238. void
  239. gdDESTROY(image)
  240. GD::Image image
  241. PROTOTYPE: $
  242. CODE:
  243. {
  244. gdImageDestroy(image);
  245. }
  246. SV*
  247. gdgif(image)
  248.   GD::Image image
  249.   PROTOTYPE: $
  250.   CODE:
  251.   {
  252. void*         data;
  253. int           size;
  254. data = gdImageGifPtr(image,&size);
  255. RETVAL = newSVpv((char*) data,size);
  256. free(data);
  257.   }
  258.   OUTPUT:
  259.     RETVAL
  260. SV*
  261. gdgd(image)
  262.   GD::Image image
  263.   PROTOTYPE: $
  264.   CODE:
  265.   {
  266. void*         data;
  267. int           size;
  268. data = gdImageGdPtr(image,&size);
  269. RETVAL = newSVpv((char*) data,size);
  270. free(data);
  271.   }
  272.   OUTPUT:
  273.     RETVAL
  274. int
  275. gdtransparent(image, ...)
  276. GD::Image image
  277.         PROTOTYPE: $;$
  278. CODE:
  279. {
  280. int color;
  281. if (items > 1) {
  282. color=(int)SvIV(ST(1));
  283. gdImageColorTransparent(image,color);
  284. }
  285. RETVAL = gdImageGetTransparent(image);
  286. }
  287. OUTPUT:
  288. RETVAL
  289. void
  290. gdgetBounds(image)
  291. GD::Image image
  292. PROTOTYPE: $
  293. PPCODE:
  294. {
  295. int sx,sy;
  296. sx = gdImageSX(image);
  297. sy = gdImageSY(image);
  298. EXTEND(sp,2);
  299. PUSHs(sv_2mortal(newSViv(sx)));
  300. PUSHs(sv_2mortal(newSViv(sy)));
  301. }
  302. int
  303. gdrgb(image,color)
  304. GD::Image image
  305. int color
  306.         PROTOTYPE: $$
  307. PPCODE:
  308. {
  309. int r,g,b;
  310. r = gdImageRed(image,color);
  311. g = gdImageGreen(image,color);
  312. b = gdImageBlue(image,color);
  313. EXTEND(sp,3);
  314. PUSHs(sv_2mortal(newSViv(r)));
  315. PUSHs(sv_2mortal(newSViv(g)));
  316. PUSHs(sv_2mortal(newSViv(b)));
  317. }
  318. int
  319. gdboundsSafe(image,x,y)
  320. GD::Image image
  321. int x
  322. int y
  323.         PROTOTYPE: $$$
  324. CODE:
  325. {
  326. RETVAL=gdImageBoundsSafe(image,x,y);
  327. }
  328. OUTPUT:
  329. RETVAL
  330. int
  331. gdgetPixel(image,x,y)
  332. GD::Image image
  333. int x
  334. int y
  335. PROTOTYPE: $$$
  336. CODE:
  337. {
  338. RETVAL=gdImageGetPixel(image,x,y);
  339. }
  340. OUTPUT:
  341. RETVAL
  342. void
  343. gdsetPixel(image,x,y,color)
  344. GD::Image image
  345. int x
  346. int y
  347. int color
  348. PROTOTYPE: $$$
  349. CODE:
  350. {
  351. gdImageSetPixel(image,x,y,color);
  352. }
  353. void
  354. gdline(image,x1,y1,x2,y2,color)
  355. GD::Image image
  356. int x1
  357. int y1
  358. int x2
  359. int y2
  360. int color
  361.         PROTOTYPE: $$$$$$
  362. CODE:
  363. {
  364. gdImageLine(image,x1,y1,x2,y2,color);
  365. }
  366. void
  367. gddashedLine(image,x1,y1,x2,y2,color)
  368. GD::Image image
  369. int x1
  370. int y1
  371. int x2
  372. int y2
  373. int color
  374.         PROTOTYPE: $$$$$$
  375. CODE:
  376. {
  377. gdImageDashedLine(image,x1,y1,x2,y2,color);
  378. }
  379. void
  380. gdopenPolygon(image,poly,color)
  381. GD::Image image
  382. SV * poly
  383. int color
  384.         PROTOTYPE: $$$
  385. CODE:
  386. {
  387. dSP ;
  388. int length,count ;
  389. int x,y,i ;
  390. gdPointPtr polyptr;
  391. ENTER ;
  392. SAVETMPS ;
  393. PUSHMARK(sp) ;
  394. XPUSHs(poly) ;
  395. PUTBACK ;
  396. count = perl_call_method("length",G_SCALAR) ;
  397. SPAGAIN ;
  398. if (count != 1)
  399. croak("Didn't get a single result from GD::Poly::length() call.n");
  400. length = POPi ;
  401. PUTBACK ;
  402. FREETMPS ;
  403. LEAVE ;
  404. polyptr = (gdPointPtr)safemalloc(sizeof(gdPoint)*length);
  405. if (polyptr == NULL)
  406. croak("safemalloc() returned NULL in GD::Image::poly().n");
  407. for (i=0;i<length;i++) {
  408. ENTER ;
  409. SAVETMPS ;
  410. PUSHMARK(sp) ;
  411. XPUSHs(poly) ;
  412. XPUSHs(sv_2mortal(newSViv(i))) ;
  413. PUTBACK ;
  414. count = perl_call_method("getPt",G_ARRAY) ;
  415. SPAGAIN ;
  416. if (count != 2)
  417. croak("Didn't get a single result from GD::Poly::length() call.n");
  418. y = POPi ;
  419. x = POPi ;
  420. PUTBACK ;
  421. FREETMPS ;
  422. LEAVE ;
  423. polyptr[i].x = x;
  424. polyptr[i].y = y;
  425. }
  426. gdImageOpenPolygon(image,polyptr,length,color);
  427. safefree((char*) polyptr);
  428. }
  429. void
  430. gdfilledPolygon(image,poly,color)
  431. GD::Image image
  432. SV * poly
  433. int color
  434.         PROTOTYPE: $$$
  435. CODE:
  436. {
  437. dSP ;
  438. int length,count ;
  439. int x,y,i ;
  440. gdPointPtr polyptr;
  441. ENTER ;
  442. SAVETMPS ;
  443. PUSHMARK(sp) ;
  444. XPUSHs(poly) ;
  445. PUTBACK ;
  446. count = perl_call_method("length",G_SCALAR) ;
  447. SPAGAIN ;
  448. if (count != 1)
  449. croak("Didn't get a single result from GD::Poly::length() call.n");
  450. length = POPi ;
  451. PUTBACK ;
  452. FREETMPS ;
  453. LEAVE ;
  454. polyptr = (gdPointPtr)safemalloc(sizeof(gdPoint)*length);
  455. if (polyptr == NULL)
  456. croak("safemalloc() returned NULL in GD::Image::poly().n");
  457. for (i=0;i<length;i++) {
  458. ENTER ;
  459. SAVETMPS ;
  460. PUSHMARK(sp) ;
  461. XPUSHs(poly) ;
  462. XPUSHs(sv_2mortal(newSViv(i))) ;
  463. PUTBACK ;
  464. count = perl_call_method("getPt",G_ARRAY) ;
  465. SPAGAIN ;
  466. if (count != 2)
  467. croak("Didn't get a single result from GD::Poly::length() call.n");
  468. y = POPi ;
  469. x = POPi ;
  470. PUTBACK ;
  471. FREETMPS ;
  472. LEAVE ;
  473. polyptr[i].x = x;
  474. polyptr[i].y = y;
  475. }
  476. gdImageFilledPolygon(image,polyptr,length,color);
  477. safefree((char*) polyptr);
  478. }
  479. void
  480. gdrectangle(image,x1,y1,x2,y2,color)
  481. GD::Image image
  482. int x1
  483. int y1
  484. int x2
  485. int y2
  486. int color
  487.         PROTOTYPE: $$$$$$
  488. CODE:
  489. {
  490. gdImageRectangle(image,x1,y1,x2,y2,color);
  491. }
  492. void
  493. gdfilledRectangle(image,x1,y1,x2,y2,color)
  494. GD::Image image
  495. int x1
  496. int y1
  497. int x2
  498. int y2
  499. int color
  500.         PROTOTYPE: $$$$$$
  501. CODE:
  502. {
  503. gdImageFilledRectangle(image,x1,y1,x2,y2,color);
  504. }
  505. void
  506. gdarc(image,cx,cy,w,h,s,e,color)
  507. GD::Image image
  508. int cx
  509. int cy
  510. int w
  511. int h
  512. int s
  513. int e
  514. int color
  515.         PROTOTYPE: $$$$$$$$
  516. CODE:
  517. {
  518. gdImageArc(image,cx,cy,w,h,s,e,color);
  519. }
  520. void
  521. fillToBorder(image,x,y,border,color)
  522. GD::Image image
  523. int x
  524. int y
  525. int border
  526. int color
  527.         PROTOTYPE: $$$$$
  528. CODE:
  529. {
  530. gdImageFillToBorder(image,x,y,border,color);
  531. }
  532. void
  533. fill(image,x,y,color)
  534. GD::Image image
  535. int x
  536. int y
  537. int color
  538.         PROTOTYPE: $$$$
  539. CODE:
  540. {
  541. gdImageFill(image,x,y,color);
  542. }
  543. void
  544. setBrush(image,brush)
  545. GD::Image image
  546. GD::Image brush
  547.         PROTOTYPE: $$
  548. CODE:
  549. {
  550. gdImageSetBrush(image,brush);
  551. }
  552. void
  553. setTile(image,tile)
  554. GD::Image image
  555. GD::Image tile
  556.         PROTOTYPE: $$
  557. CODE:
  558. {
  559. gdImageSetTile(image,tile);
  560. }
  561. void
  562. setStyle(image, ...)
  563. GD::Image image
  564.         PROTOTYPE: $;$
  565. CODE:
  566. {
  567. int *style;
  568. int i;
  569. if (items < 2)
  570. return;
  571. style = (int*) safemalloc(sizeof(int)*(items-1));
  572. if (style == NULL)
  573. croak("malloc returned NULL at setStyle().n");
  574. for(i=1;i<items;i++) {
  575. style[i-1]=(int)SvIV(ST(i));
  576. }
  577. gdImageSetStyle(image,style,items-1);
  578. safefree((char*) style);
  579. }
  580. int
  581. colorAllocate(image,r,g,b)
  582. GD::Image image
  583. int r
  584. int g
  585. int b
  586.         PROTOTYPE: $$$$
  587. CODE:
  588. {
  589. RETVAL = gdImageColorAllocate(image,r,g,b);
  590. }
  591. OUTPUT:
  592. RETVAL
  593. int
  594. colorClosest(image,r,g,b)
  595. GD::Image image
  596. int r
  597. int g
  598. int b
  599.         PROTOTYPE: $$$$
  600. CODE:
  601. {
  602. RETVAL = gdImageColorClosest(image,r,g,b);
  603. }
  604. OUTPUT:
  605. RETVAL
  606. int
  607. colorExact(image,r,g,b)
  608. GD::Image image
  609. int r
  610. int g
  611. int b
  612. PROTOTYPE: $$$$
  613. CODE:
  614. {
  615. RETVAL = gdImageColorExact(image,r,g,b);
  616. }
  617. OUTPUT:
  618. RETVAL
  619. int
  620. colorsTotal(image)
  621. GD::Image image
  622. PROTOTYPE: $
  623. CODE:
  624. {
  625. RETVAL = gdImageColorsTotal(image);
  626. }
  627. OUTPUT:
  628. RETVAL
  629. int
  630. interlaced(image, ...)
  631. GD::Image image
  632. PROTOTYPE: $;$
  633. CODE:
  634. {
  635. if (items > 1) {
  636. if (SvOK(ST(1)))
  637. gdImageInterlace(image,1);
  638. else
  639. gdImageInterlace(image,0);
  640. }
  641. RETVAL = gdImageGetInterlaced(image);
  642. }
  643. OUTPUT:
  644. RETVAL
  645. void
  646. colorDeallocate(image,color)
  647. GD::Image image
  648. int color
  649. PROTOTYPE: $$
  650. CODE:
  651. {
  652. gdImageColorDeallocate(image,color);
  653. }
  654. void
  655. copy(destination,source,dstX,dstY,srcX,srcY,w,h)
  656. GD::Image destination
  657. GD::Image source
  658. int dstX
  659. int dstY
  660. int srcX
  661. int srcY
  662. int w
  663. int h
  664.         PROTOTYPE: $$$$$$$$
  665. CODE:
  666. {
  667. gdImageCopy(destination,source,dstX,dstY,srcX,srcY,w,h);
  668. }
  669. void
  670. copyResized(destination,source,dstX,dstY,srcX,srcY,destW,destH,srcW,srcH)
  671. GD::Image destination
  672. GD::Image source
  673. int dstX
  674. int dstY
  675. int srcX
  676. int srcY
  677. int destW
  678. int destH
  679. int srcW
  680. int srcH
  681.         PROTOTYPE: $$$$$$$$$$
  682. CODE:
  683. {
  684. gdImageCopyResized(destination,source,dstX,dstY,srcX,srcY,destW,destH,srcW,srcH);
  685. }
  686. void
  687. gdchar(image,font,x,y,c,color)
  688. GD::Image image
  689. GD::Font font
  690. int x
  691. int y
  692. char * c
  693. int color
  694.         PROTOTYPE: $$$$$$
  695. CODE:
  696. {
  697. gdImageChar(image,font,x,y,*c,color);
  698. }
  699. void
  700. gdcharUp(image,font,x,y,c,color)
  701. GD::Image image
  702. GD::Font font
  703. int x
  704. int y
  705. char * c
  706. int color
  707.         PROTOTYPE: $$$$$$
  708. CODE:
  709. {
  710. gdImageCharUp(image,font,x,y,*c,color);
  711. }
  712. void
  713. gdstring(image,font,x,y,s,color)
  714. GD::Image image
  715. GD::Font font
  716. int x
  717. int y
  718. char * s
  719. int color
  720.         PROTOTYPE: $$$$$$
  721. CODE:
  722. {
  723. gdImageString(image,font,x,y,s,color);
  724. }
  725. void
  726. gdstringUp(image,font,x,y,s,color)
  727. GD::Image image
  728. GD::Font font
  729. int x
  730. int y
  731. char * s
  732. int color
  733.         PROTOTYPE: $$$$$$
  734. CODE:
  735. {
  736. gdImageStringUp(image,font,x,y,s,color);
  737. }
  738. MODULE = GD PACKAGE = GD::Font PREFIX=gd
  739. GD::Font
  740. gdSmall(packname="GD::Font")
  741. char * packname
  742.         PROTOTYPE: $
  743. CODE:
  744. {
  745. RETVAL = gdFontSmall;
  746. }
  747. OUTPUT:
  748. RETVAL
  749. GD::Font
  750. gdLarge(packname="GD::Font")
  751. char * packname
  752. PROTOTYPE: $
  753. CODE:
  754. {
  755. RETVAL = gdFontLarge;
  756. }
  757. OUTPUT:
  758. RETVAL
  759. GD::Font
  760. gdMediumBold(packname="GD::Font")
  761. char * packname
  762. PROTOTYPE: $
  763. CODE:
  764. {
  765. RETVAL = gdFontMediumBold;
  766. }
  767. OUTPUT:
  768. RETVAL
  769. GD::Font
  770. gdTiny(packname="GD::Font")
  771. char * packname
  772. PROTOTYPE: $
  773. CODE:
  774. {
  775. RETVAL = gdFontTiny;
  776. }
  777. OUTPUT:
  778. RETVAL
  779. int
  780. gdnchars(font)
  781. GD::Font font
  782. PROTOTYPE: $
  783. CODE:
  784. {
  785. RETVAL = font->nchars;
  786. }
  787. OUTPUT:
  788. RETVAL
  789. int
  790. gdoffset(font)
  791. GD::Font font
  792. PROTOTYPE: $
  793. CODE:
  794. {
  795. RETVAL = font->offset;
  796. }
  797. OUTPUT:
  798. RETVAL
  799. int
  800. gdwidth(font)
  801. GD::Font font
  802. PROTOTYPE: $
  803. CODE:
  804. {
  805. RETVAL = font->w;
  806. }
  807. OUTPUT:
  808. RETVAL
  809. int
  810. gdheight(font)
  811. GD::Font font
  812. PROTOTYPE: $
  813. CODE:
  814. {
  815. RETVAL = font->h;
  816. }
  817. OUTPUT:
  818. RETVAL