php-src/ext/pdf/pdf.c
Rainer Schaaf 28ed45fa72 When using pdf_get_buffer() and doing a correct cleanup by calling pdf_delete()
this always resulted in a coredump (after everything was finished, so only
visible in the logfile).
So it seems to be neccesary to copy the contents of the result of get_buffer,
to avoid this coredump.
2001-02-21 23:30:21 +00:00

2557 lines
64 KiB
C

/*
+----------------------------------------------------------------------+
| PHP version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Uwe Steinmann <Uwe.Steinmann@fernuni-hagen.de> |
| Rainer Schaaf <rjs@pdflib.com> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
/* pdflib 2.02 ... 3.0x is subject to the ALADDIN FREE PUBLIC LICENSE.
Copyright (C) 1997-1999 Thomas Merz. 2000-2001 PDFlib GmbH */
/* Note that there is no code from the pdflib package in this file */
#include "php.h"
#include "php_ini.h"
#include "php_globals.h"
#include "ext/standard/head.h"
#include "ext/standard/info.h"
#include "ext/standard/file.h"
#if HAVE_LIBGD13
#include "ext/gd/php_gd.h"
#include "gd.h"
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef PHP_WIN32
# include <io.h>
# include <fcntl.h>
#endif
#if HAVE_PDFLIB
#include "php_pdf.h"
static int le_pdf;
/*
* to adopt the php way of error handling to PDFlib
* The image related functions in PDFlib return -1 on error
* but they may return 0 (FALSE) in normal cases
* so this offset will repair this
*/
#define PDFLIB_IMAGE_OFFSET 1
#define PDFLIB_FONT_OFFSET 1
function_entry pdf_functions[] = {
/* sorry for sorting this stuff like the pdflib manual,
but this helps me to see what is done :) RJS
I'll try to avoid rearanging the sources below that => new functions to the end */
PHP_FE(pdf_new, NULL) /* new function */
PHP_FE(pdf_delete, NULL) /* new function */
PHP_FE(pdf_open_file, NULL) /* new function */
PHP_FE(pdf_get_buffer, NULL) /* new function */
PHP_FE(pdf_close, NULL)
PHP_FE(pdf_begin_page, NULL)
PHP_FE(pdf_end_page, NULL)
PHP_FE(pdf_get_value, NULL)
PHP_FE(pdf_set_value, NULL)
PHP_FE(pdf_get_parameter, NULL)
PHP_FE(pdf_set_parameter, NULL)
PHP_FE(pdf_findfont, NULL) /* new function */
PHP_FE(pdf_setfont, NULL) /* new function */
PHP_FE(pdf_show, NULL)
PHP_FE(pdf_show_xy, NULL)
PHP_FE(pdf_continue_text, NULL)
PHP_FE(pdf_show_boxed, NULL)
PHP_FE(pdf_stringwidth, NULL) /* new parameters: [int font, float size] */
PHP_FE(pdf_set_text_pos, NULL)
PHP_FE(pdf_setdash, NULL)
PHP_FE(pdf_setpolydash, NULL) /* new function: not yet finished */
PHP_FE(pdf_setflat, NULL)
PHP_FE(pdf_setlinejoin, NULL)
PHP_FE(pdf_setlinecap, NULL)
PHP_FE(pdf_setmiterlimit, NULL)
PHP_FE(pdf_setlinewidth, NULL)
PHP_FE(pdf_save, NULL)
PHP_FE(pdf_restore, NULL)
PHP_FE(pdf_translate, NULL)
PHP_FE(pdf_scale, NULL)
PHP_FE(pdf_rotate, NULL)
PHP_FE(pdf_skew, NULL)
PHP_FE(pdf_concat, NULL) /* new function */
PHP_FE(pdf_moveto, NULL)
PHP_FE(pdf_lineto, NULL)
PHP_FE(pdf_curveto, NULL)
PHP_FE(pdf_circle, NULL)
PHP_FE(pdf_arc, NULL)
PHP_FE(pdf_rect, NULL)
PHP_FE(pdf_closepath, NULL)
PHP_FE(pdf_stroke, NULL)
PHP_FE(pdf_closepath_stroke, NULL)
PHP_FE(pdf_fill, NULL)
PHP_FE(pdf_fill_stroke, NULL)
PHP_FE(pdf_closepath_fill_stroke, NULL)
PHP_FE(pdf_clip, NULL)
PHP_FE(pdf_endpath, NULL)
PHP_FE(pdf_setgray_fill, NULL)
PHP_FE(pdf_setgray_stroke, NULL)
PHP_FE(pdf_setgray, NULL)
PHP_FE(pdf_setrgbcolor_fill, NULL)
PHP_FE(pdf_setrgbcolor_stroke, NULL)
PHP_FE(pdf_setrgbcolor, NULL)
PHP_FE(pdf_open_image_file, NULL) /* new parameters: [char *stringpram, int intparam] */
PHP_FE(pdf_open_ccitt, NULL) /* new function */
PHP_FE(pdf_open_image, NULL) /* new function */
PHP_FE(pdf_close_image, NULL)
PHP_FE(pdf_place_image, NULL)
PHP_FE(pdf_add_bookmark, NULL)
PHP_FE(pdf_set_info, NULL)
PHP_FE(pdf_attach_file, NULL) /* new function */
PHP_FE(pdf_add_note, NULL) /* new function */
PHP_FE(pdf_add_pdflink, NULL)
PHP_FE(pdf_add_locallink, NULL) /* new function */
PHP_FE(pdf_add_launchlink, NULL)/* new function */
PHP_FE(pdf_add_weblink, NULL)
PHP_FE(pdf_set_border_style, NULL)
PHP_FE(pdf_set_border_color, NULL)
PHP_FE(pdf_set_border_dash, NULL)
/* End of the official PDFLIB V3.x API */
/* aliases for compatibility reasons */
PHP_FALIAS(pdf_add_outline, pdf_add_bookmark, NULL)
/* old font handling */
PHP_FE(pdf_set_font, NULL) /* deprecated */
PHP_FE(pdf_get_font, NULL) /* deprecated */
PHP_FE(pdf_get_fontname, NULL) /* deprecated */
PHP_FE(pdf_get_fontsize, NULL) /* deprecated */
/* old way of starting a PDF document */
PHP_FE(pdf_open, NULL) /* deprecated */
/* old stuff for setting infos */
PHP_FE(pdf_set_info_creator, NULL) /* deprecated */
PHP_FE(pdf_set_info_title, NULL) /* deprecated */
PHP_FE(pdf_set_info_subject, NULL) /* deprecated */
PHP_FE(pdf_set_info_author, NULL) /* deprecated */
PHP_FE(pdf_set_info_keywords, NULL) /* deprecated */
PHP_FE(pdf_set_leading, NULL) /* deprecated */
PHP_FE(pdf_set_text_rendering, NULL) /* deprecated */
PHP_FE(pdf_set_horiz_scaling, NULL) /* deprecated */
PHP_FE(pdf_set_text_rise, NULL) /* deprecated */
PHP_FE(pdf_set_char_spacing, NULL) /* deprecated */
PHP_FE(pdf_set_word_spacing, NULL) /* deprecated */
PHP_FE(pdf_set_transition, NULL) /* deprecated */
PHP_FE(pdf_set_duration, NULL) /* deprecated */
PHP_FE(pdf_get_image_height, NULL) /* deprecated */
PHP_FE(pdf_get_image_width, NULL) /* deprecated */
/* old stuff for opening images */
PHP_FE(pdf_open_jpeg, NULL) /* deprecated */
PHP_FE(pdf_open_tiff, NULL) /* deprecated */
PHP_FE(pdf_open_png, NULL) /* deprecated */
PHP_FE(pdf_open_gif, NULL) /* deprecated */
/* some more stuff for compatibility */
PHP_FE(pdf_add_annotation, NULL)
#if HAVE_LIBGD13
PHP_FE(pdf_open_memory_image, NULL)
#endif
{NULL, NULL, NULL}
};
zend_module_entry pdf_module_entry = {
"pdf",
pdf_functions,
PHP_MINIT(pdf),
PHP_MSHUTDOWN(pdf),
NULL,
NULL,
PHP_MINFO(pdf),
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_PDF
ZEND_GET_MODULE(pdf)
#endif
static void _free_pdf_doc(zend_rsrc_list_entry *rsrc)
{
/* RJS: TODO:
PDF *pdf = (PDF *)rsrc->ptr;
check whether pdf-Pointer is still valid, before pdf_delete()
+ remove php-resource */
/* PDF_delete(pdf);
*/
}
static void custom_errorhandler(PDF *p, int type, const char *shortmsg)
{
switch (type){
case PDF_NonfatalError:
/*
* PDFlib warings should be visible to the user
* If he decides to live with PDFlib warnings
* he may user the PDFlib function
* pdf_set_parameter($p, "warning" 0) to switch off
* the warnings inside PDFlib
*/
php_error(E_WARNING,"Internal PDFlib warning: %s", shortmsg);
return;
case PDF_MemoryError: /* give up in all other cases */
case PDF_IOError:
case PDF_RuntimeError:
case PDF_IndexError:
case PDF_TypeError:
case PDF_DivisionByZero:
case PDF_OverflowError:
case PDF_SyntaxError:
case PDF_ValueError:
case PDF_SystemError:
case PDF_UnknownError:
default:
if (p !=NULL) PDF_delete(p); /* clean up PDFlib */
php_error(E_ERROR,"PDFlib error: %s", shortmsg);
}
}
static void *pdf_emalloc(PDF *p, size_t size, const char *caller)
{
return(emalloc(size));
}
static void *pdf_realloc(PDF *p, void *mem, size_t size, const char *caller)
{
return(erealloc(mem, size));
}
static void pdf_efree(PDF *p, void *mem)
{
efree(mem);
}
static size_t pdf_flushwrite(PDF *p, void *data, size_t size)
{
return(php_write(data, size));
return 0;
}
PHP_MINFO_FUNCTION(pdf)
{
char tmp[32];
snprintf(tmp, 31, "%d.%02d", PDF_get_majorversion(), PDF_get_minorversion() );
tmp[31]=0;
php_info_print_table_start();
php_info_print_table_row(2, "PDF Support", "enabled" );
php_info_print_table_row(2, "PDFlib GmbH Version", tmp );
php_info_print_table_row(2, "Revision", "$Revision$" );
php_info_print_table_end();
}
PHP_MINIT_FUNCTION(pdf)
{
le_pdf = zend_register_list_destructors_ex(_free_pdf_doc, NULL, "pdf object", module_number);
/* this does something like setlocale("C", ...) in PDFlib 3.x */
PDF_boot();
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(pdf)
{
PDF_shutdown();
return SUCCESS;
}
static void _php_pdf_set_info(INTERNAL_FUNCTION_PARAMETERS, char *field)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
PDF_set_info(pdf, field, Z_STRVAL_PP(arg2));
RETURN_TRUE;
}
/* {{{ proto bool pdf_set_info(int pdfdoc, string fieldname, string value)
Fills an info field of the document */
PHP_FUNCTION(pdf_set_info)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_string_ex(arg3);
PDF_set_info(pdf, Z_STRVAL_PP(arg2), Z_STRVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto bool pdf_set_info_creator(int pdfdoc, string creator)
Fills the creator field of the document */
PHP_FUNCTION(pdf_set_info_creator)
{
_php_pdf_set_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Creator");
}
/* }}} */
/* {{{ proto bool pdf_set_info_title(int pdfdoc, string title)
Fills the title field of the document */
PHP_FUNCTION(pdf_set_info_title)
{
_php_pdf_set_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Title");
}
/* }}} */
/* {{{ proto bool pdf_set_info_subject(int pdfdoc, string subject)
Fills the subject field of the document */
PHP_FUNCTION(pdf_set_info_subject)
{
_php_pdf_set_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Subject");
}
/* }}} */
/* {{{ proto bool pdf_set_info_author(int pdfdoc, string author)
Fills the author field of the document */
PHP_FUNCTION(pdf_set_info_author)
{
_php_pdf_set_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Author");
}
/* }}} */
/* {{{ proto bool pdf_set_info_keywords(int pdfdoc, string keywords)
Fills the keywords field of the document */
PHP_FUNCTION(pdf_set_info_keywords) {
_php_pdf_set_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Keywords");
}
/* }}} */
/* {{{ proto int pdf_open([int filedesc])
Opens a new pdf document. If filedesc is NULL, document is created in memory. This is the old interface, only for compatibility use pdf_new + pdf_open_file instead */
PHP_FUNCTION(pdf_open)
{
zval **file;
FILE *fp;
PDF *pdf;
int argc = ZEND_NUM_ARGS();
if(argc > 1)
WRONG_PARAM_COUNT;
if (argc != 1 || zend_get_parameters_ex(1, &file) == FAILURE) {
fp = NULL;
} else {
ZEND_FETCH_RESOURCE(fp, FILE *, file, -1, "File-Handle", php_file_le_fopen());
/* XXX should do a zend_list_addref for <fp> here! */
}
pdf = PDF_new2(custom_errorhandler, pdf_emalloc, pdf_realloc, pdf_efree, NULL);
if(fp) {
if (PDF_open_fp(pdf, fp) < 0) RETURN_FALSE;
} else {
PDF_open_mem(pdf, pdf_flushwrite);
}
PDF_set_parameter(pdf, "imagewarning", "true");
PDF_set_parameter(pdf, "binding", "PHP");
ZEND_REGISTER_RESOURCE(return_value, pdf, le_pdf);
}
/* }}} */
/* {{{ proto void pdf_close(int pdfdoc)
Closes the pdf document */
PHP_FUNCTION(pdf_close)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_close(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_begin_page(int pdfdoc, double width, double height)
Starts page */
PHP_FUNCTION(pdf_begin_page)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_begin_page(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_end_page(int pdfdoc)
Ends page */
PHP_FUNCTION(pdf_end_page)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_end_page(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_show(int pdfdoc, string text)
Output text at current position */
PHP_FUNCTION(pdf_show)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
PDF_show(pdf, Z_STRVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_show_xy(int pdfdoc, string text, double x-koor, double y-koor)
Output text at position */
PHP_FUNCTION(pdf_show_xy)
{
zval **arg1, **arg2, **arg3, **arg4;
PDF *pdf;
if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
PDF_show_xy(pdf, Z_STRVAL_PP(arg2), (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int pdf_show_boxed(int pdfdoc, string text, double x-koor, double y-koor, double width, double height, string mode [, string feature])
Output text formated in a boxed */
PHP_FUNCTION(pdf_show_boxed)
{
zval **argv[8];
int argc = ZEND_NUM_ARGS();
int nr;
char *feature;
PDF *pdf;
if (((argc < 7) || (argc > 8)) || zend_get_parameters_array_ex(argc, argv) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, argv[0], -1, "pdf object", le_pdf);
convert_to_string_ex(argv[1]);
convert_to_double_ex(argv[2]);
convert_to_double_ex(argv[3]);
convert_to_double_ex(argv[4]);
convert_to_double_ex(argv[5]);
convert_to_string_ex(argv[6]);
if(argc == 8) {
convert_to_string_ex(argv[7]);
feature = Z_STRVAL_PP(argv[7]);
} else {
feature = NULL;
}
nr = PDF_show_boxed(pdf, Z_STRVAL_PP(argv[1]),
(float) Z_DVAL_PP(argv[2]),
(float) Z_DVAL_PP(argv[3]),
(float) Z_DVAL_PP(argv[4]),
(float) Z_DVAL_PP(argv[5]),
Z_STRVAL_PP(argv[6]),
feature);
RETURN_LONG(nr);
}
/* }}} */
/* {{{ proto void pdf_set_font(int pdfdoc, string font, double size, string encoding [, int embed])
Select the current font face, size and encoding */
PHP_FUNCTION(pdf_set_font)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5;
int font, embed;
PDF *pdf;
switch (ZEND_NUM_ARGS()) {
case 4:
if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
embed = 0;
break;
case 5:
if (zend_get_parameters_ex(5, &arg1, &arg2, &arg3, &arg4, &arg5) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long_ex(arg5);
embed = Z_LVAL_PP(arg5);
break;
default:
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_double_ex(arg3);
convert_to_string_ex(arg4);
font = PDF_findfont(pdf, Z_STRVAL_PP(arg2), Z_STRVAL_PP(arg4), embed);
if (font == -1) {
php_error(E_WARNING,"Font %s not found", Z_STRVAL_PP(arg2));
RETURN_FALSE;
}
PDF_setfont(pdf, font, (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
static void _php_pdf_set_value(INTERNAL_FUNCTION_PARAMETERS, char *field)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_set_value(pdf, field, (float)Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* {{{ proto void pdf_set_value(int pdfdoc, string key, double value)
Sets arbitrary value */
PHP_FUNCTION(pdf_set_value)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_double_ex(arg3);
PDF_set_value(pdf, Z_STRVAL_PP(arg2), (float)Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto double pdf_get_value(int pdfdoc, string key, double modifier)
Gets arbitrary value */
PHP_FUNCTION(pdf_get_value)
{
zval **argv[3];
int argc = ZEND_NUM_ARGS();
PDF *pdf;
double value;
if(((argc < 2) || (argc > 3)) || zend_get_parameters_array_ex(argc, argv) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, argv[0], -1, "pdf object", le_pdf);
convert_to_string_ex(argv[1]);
if(argc == 3)
convert_to_double_ex(argv[2]);
if(0 == (strcmp(Z_STRVAL_PP(argv[1]), "imagewidth"))) {
if(argc < 3) WRONG_PARAM_COUNT;
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), (float)Z_DVAL_PP(argv[2])-PDFLIB_IMAGE_OFFSET);
} else if(0 == (strcmp(Z_STRVAL_PP(argv[1]), "imageheight"))) {
if(argc < 3) WRONG_PARAM_COUNT;
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), (float)Z_DVAL_PP(argv[2])-PDFLIB_IMAGE_OFFSET);
} else if(0 == (strcmp(Z_STRVAL_PP(argv[1]), "resx"))) {
if(argc < 3) WRONG_PARAM_COUNT;
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), (float)Z_DVAL_PP(argv[2])-PDFLIB_IMAGE_OFFSET);
} else if(0 == (strcmp(Z_STRVAL_PP(argv[1]), "resy"))) {
if(argc < 3) WRONG_PARAM_COUNT;
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), (float)Z_DVAL_PP(argv[2])-PDFLIB_IMAGE_OFFSET);
} else if(0 == (strcmp(Z_STRVAL_PP(argv[1]), "font"))) {
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), 0.0)+PDFLIB_IMAGE_OFFSET;
} else {
if(argc < 3) {
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), 0.0);
} else {
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), (float)Z_DVAL_PP(argv[2]));
}
}
RETURN_DOUBLE(value);
}
/* }}} */
/* {{{ proto int pdf_get_font(int pdfdoc)
Gets the current font */
PHP_FUNCTION(pdf_get_font)
{
zval **arg1;
int font;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
font = (int) PDF_get_value(pdf, "font", 0);
RETURN_LONG(font+PDFLIB_FONT_OFFSET);
}
/* }}} */
/* {{{ proto string pdf_get_fontname(int pdfdoc)
Gets the current font name */
PHP_FUNCTION(pdf_get_fontname)
{
zval **arg1;
char *fontname;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
fontname = (char *) PDF_get_parameter(pdf, "fontname", 0);
RETURN_STRING(fontname, 1);
}
/* }}} */
/* {{{ proto double pdf_get_fontsize(int pdfdoc)
Gets the current font size */
PHP_FUNCTION(pdf_get_fontsize)
{
zval **arg1;
float fontsize;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
fontsize = PDF_get_value(pdf, "fontsize", 0);
RETURN_DOUBLE(fontsize);
}
/* }}} */
/* {{{ proto void pdf_set_leading(int pdfdoc, double distance)
Sets distance between text lines */
PHP_FUNCTION(pdf_set_leading)
{
_php_pdf_set_value(INTERNAL_FUNCTION_PARAM_PASSTHRU, "leading");
}
/* }}} */
/* {{{ proto void pdf_set_text_rendering(int pdfdoc, int mode)
Determines how text is rendered */
PHP_FUNCTION(pdf_set_text_rendering)
{
_php_pdf_set_value(INTERNAL_FUNCTION_PARAM_PASSTHRU, "textrendering");
}
/* }}} */
/* {{{ proto void pdf_set_horiz_scaling(int pdfdoc, double scale)
Sets horizontal scaling of text */
PHP_FUNCTION(pdf_set_horiz_scaling)
{
_php_pdf_set_value(INTERNAL_FUNCTION_PARAM_PASSTHRU, "horizscaling");
}
/* }}} */
/* {{{ proto void pdf_set_text_rise(int pdfdoc, double value)
Sets the text rise */
PHP_FUNCTION(pdf_set_text_rise)
{
_php_pdf_set_value(INTERNAL_FUNCTION_PARAM_PASSTHRU, "textrise");
}
/* }}} */
/* {{{ proto void pdf_set_char_spacing(int pdfdoc, double space)
Sets character spacing */
PHP_FUNCTION(pdf_set_char_spacing)
{
_php_pdf_set_value(INTERNAL_FUNCTION_PARAM_PASSTHRU, "charspacing");
}
/* }}} */
/* {{{ proto void pdf_set_word_spacing(int pdfdoc, double space)
Sets spacing between words */
PHP_FUNCTION(pdf_set_word_spacing)
{
_php_pdf_set_value(INTERNAL_FUNCTION_PARAM_PASSTHRU, "wordspacing");
}
/* }}} */
/* {{{ proto void pdf_set_text_pos(int pdfdoc, double x, double y)
Sets the position of text for the next pdf_show call */
PHP_FUNCTION(pdf_set_text_pos)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_set_text_pos(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_continue_text(int pdfdoc, string text)
Output text in next line */
PHP_FUNCTION(pdf_continue_text)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
PDF_continue_text(pdf, Z_STRVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto double pdf_stringwidth(int pdfdoc, string text [, int font, double size])
Returns width of text in current font */
PHP_FUNCTION(pdf_stringwidth)
{
zval **arg1, **arg2, **arg3, **arg4;
int font;
double width, size;
PDF *pdf;
switch (ZEND_NUM_ARGS()) {
case 2:
if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)
WRONG_PARAM_COUNT;
break;
case 4:
if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE)
WRONG_PARAM_COUNT;
convert_to_long_ex(arg3);
break;
default:
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
if (ZEND_NUM_ARGS() == 2) {
font = (int)PDF_get_value(pdf, "font", 0)+PDFLIB_FONT_OFFSET;
size = PDF_get_value(pdf, "fontsize", 0);
} else {
convert_to_long_ex(arg3);
font = Z_LVAL_PP(arg3);
convert_to_double_ex(arg4);
size = Z_DVAL_PP(arg4);
}
width = (double) PDF_stringwidth(pdf, Z_STRVAL_PP(arg2), font-PDFLIB_FONT_OFFSET, size);
RETURN_DOUBLE((double) width);
}
/* }}} */
/* {{{ proto void pdf_save(int pdfdoc)
Saves current enviroment */
PHP_FUNCTION(pdf_save)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_save(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_restore(int pdfdoc)
Restores formerly saved enviroment */
PHP_FUNCTION(pdf_restore)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_restore(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_translate(int pdfdoc, double x, double y)
Sets origin of coordinate system */
PHP_FUNCTION(pdf_translate)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_translate(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_scale(int pdfdoc, double x-scale, double y-scale)
Sets scaling */
PHP_FUNCTION(pdf_scale)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_scale(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_rotate(int pdfdoc, double angle)
Sets rotation */
PHP_FUNCTION(pdf_rotate)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_rotate(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_skew(int pdfdoc, double xangle, double yangle)
Skew the coordinate system */
PHP_FUNCTION(pdf_skew)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_skew(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setflat(int pdfdoc, double value)
Sets flatness */
PHP_FUNCTION(pdf_setflat)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
/* pdflib will do this for you, will throw some exception
if((Z_LVAL_PP(arg2) > 100) && (Z_LVAL_PP(arg2) < 0)) {
php_error(E_WARNING,"Parameter of pdf_setflat() has to between 0 and 100");
RETURN_FALSE;
}
*/
PDF_setflat(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setlinejoin(int pdfdoc, int value)
Sets linejoin parameter */
PHP_FUNCTION(pdf_setlinejoin)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
/* pdflib will do this for you, will throw some exception
if((Z_LVAL_PP(arg2) > 2) && (Z_LVAL_PP(arg2) < 0)) {
php_error(E_WARNING,"Parameter of pdf_setlinejoin() must be between 0 and 2");
RETURN_FALSE;
}
*/
PDF_setlinejoin(pdf, Z_LVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setlinecap(int pdfdoc, int value)
Sets linecap parameter */
PHP_FUNCTION(pdf_setlinecap)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
/* pdflib will do this for you, will throw some exception
if((Z_LVAL_PP(arg2) > 2) && (Z_LVAL_PP(arg2) < 0)) {
php_error(E_WARNING,"Parameter of pdf_setlinecap() must be > 0 and <= 2");
RETURN_FALSE;
}
*/
PDF_setlinecap(pdf, Z_LVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setmiterlimit(int pdfdoc, double value)
Sets miter limit */
PHP_FUNCTION(pdf_setmiterlimit)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
/* pdflib will do this for you, will throw some exception
if(Z_DVAL_PP(arg2) < 1) {
php_error(E_WARNING,"Parameter of pdf_setmiterlimit() must be >= 1");
RETURN_FALSE;
}
*/
PDF_setmiterlimit(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setlinewidth(int pdfdoc, double width)
Sets line width */
PHP_FUNCTION(pdf_setlinewidth)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_setlinewidth(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setdash(int pdfdoc, double white, double black)
Sets dash pattern */
PHP_FUNCTION(pdf_setdash)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_setdash(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_moveto(int pdfdoc, double x, double y)
Sets current point */
PHP_FUNCTION(pdf_moveto)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_moveto(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_curveto(int pdfdoc, double x1, double y1, double x2, double y2, double x3, double y3)
Draws a curve */
PHP_FUNCTION(pdf_curveto)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7;
PDF *pdf;
if (ZEND_NUM_ARGS() != 7 || zend_get_parameters_ex(7, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_double_ex(arg6);
convert_to_double_ex(arg7);
PDF_curveto(pdf, (float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
(float) Z_DVAL_PP(arg6),
(float) Z_DVAL_PP(arg7));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_lineto(int pdfdoc, double x, double y)
Draws a line */
PHP_FUNCTION(pdf_lineto)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_lineto(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_circle(int pdfdoc, double x, double y, double radius)
Draws a circle */
PHP_FUNCTION(pdf_circle)
{
zval **arg1, **arg2, **arg3, **arg4;
PDF *pdf;
if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
PDF_circle(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_arc(int pdfdoc, double x, double y, double radius, double start, double end)
Draws an arc */
PHP_FUNCTION(pdf_arc)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6;
PDF *pdf;
if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_ex(6, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_double_ex(arg6);
PDF_arc(pdf, (float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
(float) Z_DVAL_PP(arg6));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_rect(int pdfdoc, double x, double y, double width, double height)
Draws a rectangle */
PHP_FUNCTION(pdf_rect)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5;
PDF *pdf;
if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &arg1, &arg2, &arg3, &arg4, &arg5) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
PDF_rect(pdf, (float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_closepath(int pdfdoc)
Close path */
PHP_FUNCTION(pdf_closepath)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_closepath(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_closepath_stroke(int pdfdoc)
Close path and draw line along path */
PHP_FUNCTION(pdf_closepath_stroke)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_closepath_stroke(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_stroke(int pdfdoc)
Draw line along path path */
PHP_FUNCTION(pdf_stroke)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_stroke(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_fill(int pdfdoc)
Fill current path */
PHP_FUNCTION(pdf_fill)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_fill(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_fill_stroke(int pdfdoc)
Fill and stroke current path */
PHP_FUNCTION(pdf_fill_stroke)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_fill_stroke(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_closepath_fill_stroke(int pdfdoc)
Close, fill and stroke current path */
PHP_FUNCTION(pdf_closepath_fill_stroke)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_closepath_fill_stroke(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_endpath(int pdfdoc)
Ends current path */
PHP_FUNCTION(pdf_endpath)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_endpath(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_clip(int pdfdoc)
Clips to current path */
PHP_FUNCTION(pdf_clip)
{
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_clip(pdf);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_set_parameter(int pdfdoc, string key, string value)
Sets arbitrary parameters */
PHP_FUNCTION(pdf_set_parameter)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_string_ex(arg3);
PDF_set_parameter(pdf, Z_STRVAL_PP(arg2), Z_STRVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto string pdf_get_parameter(int pdfdoc, string key, mixed modifier)
Gets arbitrary parameters */
PHP_FUNCTION(pdf_get_parameter)
{
zval **argv[3];
int argc = ZEND_NUM_ARGS();
PDF *pdf;
char *value;
if(((argc < 2) || (argc > 3)) || zend_get_parameters_array_ex(argc, argv) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, argv[0], -1, "pdf object", le_pdf);
convert_to_string_ex(argv[1]);
if(argc == 3) {
convert_to_double_ex(argv[2]);
value = (char *) PDF_get_parameter(pdf, Z_STRVAL_PP(argv[1]), (float) Z_DVAL_PP(argv[2]));
} else {
value = (char *) PDF_get_parameter(pdf, Z_STRVAL_PP(argv[1]), 0.0);
}
RETURN_STRING(value, 1);
}
/* }}} */
/* {{{ proto void pdf_setgray_fill(int pdfdoc, double value)
Sets filling color to gray value */
PHP_FUNCTION(pdf_setgray_fill)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_setgray_fill(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setgray_stroke(int pdfdoc, double value)
Sets drawing color to gray value */
PHP_FUNCTION(pdf_setgray_stroke)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_setgray_stroke(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setgray(int pdfdoc, double value)
Sets drawing and filling color to gray value */
PHP_FUNCTION(pdf_setgray)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_setgray(pdf, (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setrgbcolor_fill(int pdfdoc, double red, double green, double blue)
Sets filling color to RGB color value */
PHP_FUNCTION(pdf_setrgbcolor_fill)
{
zval **arg1, **arg2, **arg3, **arg4;
PDF *pdf;
if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
PDF_setrgbcolor_fill(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setrgbcolor_stroke(int pdfdoc, double red, double green, double blue)
Sets drawing color to RGB color value */
PHP_FUNCTION(pdf_setrgbcolor_stroke)
{
zval **arg1, **arg2, **arg3, **arg4;
PDF *pdf;
if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
PDF_setrgbcolor_stroke(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setrgbcolor(int pdfdoc, double red, double green, double blue)
Sets drawing and filling color to RGB color value */
PHP_FUNCTION(pdf_setrgbcolor)
{
zval **arg1, **arg2, **arg3, **arg4;
PDF *pdf;
if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
PDF_setrgbcolor(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int pdf_add_bookmark(int pdfdoc, string text [, int parent, int open])
Adds bookmark for current page */
PHP_FUNCTION(pdf_add_bookmark)
{
zval **arg1, **arg2, **arg3, **arg4;
int parentid, open, id;
PDF *pdf;
switch (ZEND_NUM_ARGS()) {
case 2:
if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
break;
case 3:
if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
break;
case 4:
if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
break;
default:
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
if (ZEND_NUM_ARGS() > 2) {
convert_to_long_ex(arg3);
parentid = Z_LVAL_PP(arg3);
if (ZEND_NUM_ARGS() > 3) {
convert_to_long_ex(arg4);
open = Z_LVAL_PP(arg4);
} else {
open = 0;
}
} else {
parentid = 0;
open = 0;
}
/* will never return 0 */
id = PDF_add_bookmark(pdf, Z_STRVAL_PP(arg2), parentid, open);
RETURN_LONG(id);
}
/* }}} */
/* {{{ proto void pdf_set_transition(int pdfdoc, int transition)
Sets transition between pages */
PHP_FUNCTION(pdf_set_transition)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
switch(Z_LVAL_PP(arg2)) {
case 0:
PDF_set_parameter(pdf, "transition", "none");
break;
case 1:
PDF_set_parameter(pdf, "transition", "split");
break;
case 2:
PDF_set_parameter(pdf, "transition", "blinds");
break;
case 3:
PDF_set_parameter(pdf, "transition", "box");
break;
case 4:
PDF_set_parameter(pdf, "transition", "wipe");
break;
case 5:
PDF_set_parameter(pdf, "transition", "dissolve");
break;
case 6:
PDF_set_parameter(pdf, "transition", "glitter");
break;
case 7:
PDF_set_parameter(pdf, "transition", "replace");
break;
default:
PDF_set_parameter(pdf, "transition", "none");
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_set_duration(int pdfdoc, double duration)
Sets duration between pages */
PHP_FUNCTION(pdf_set_duration)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
PDF_set_value(pdf, "duration", (float) Z_DVAL_PP(arg2));
RETURN_TRUE;
}
/* }}} */
static void _php_pdf_open_image(INTERNAL_FUNCTION_PARAMETERS, char *type)
{
zval **arg1, **arg2;
PDF *pdf;
int pdf_image;
char *image;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
#ifdef VIRTUAL_DIR
virtual_filepath(Z_STRVAL_PP(arg2), &image);
#else
image = Z_STRVAL_PP(arg2);
#endif
pdf_image = PDF_open_image_file(pdf, type, image, "", 0);
RETURN_LONG(pdf_image+PDFLIB_IMAGE_OFFSET);
}
/* {{{ proto int pdf_open_gif(int pdf, string giffile)
Opens a GIF file and returns an image for placement in a pdf object */
PHP_FUNCTION(pdf_open_gif)
{
_php_pdf_open_image(INTERNAL_FUNCTION_PARAM_PASSTHRU,"gif");
}
/* }}} */
/* {{{ proto int pdf_open_jpeg(int pdf, string jpegfile)
Opens a JPEG file and returns an image for placement in a PDF document */
PHP_FUNCTION(pdf_open_jpeg)
{
_php_pdf_open_image(INTERNAL_FUNCTION_PARAM_PASSTHRU,"jpeg");
}
/* }}} */
/* {{{ proto int pdf_open_png(int pdf, string pngfile)
Opens a PNG file and returns an image for placement in a PDF document */
PHP_FUNCTION(pdf_open_png)
{
_php_pdf_open_image(INTERNAL_FUNCTION_PARAM_PASSTHRU,"png");
}
/* }}} */
/* {{{ proto int pdf_open_tiff(int pdf, string tifffile)
Opens a TIFF file and returns an image for placement in a PDF document */
PHP_FUNCTION(pdf_open_tiff)
{
_php_pdf_open_image(INTERNAL_FUNCTION_PARAM_PASSTHRU,"tiff");
}
/* }}} */
/* {{{ proto int pdf_open_image_file(int pdf, string type, string file, string stringparam, int intparam)
Opens an image file of the given type and returns an image for placement in a PDF document */
PHP_FUNCTION(pdf_open_image_file)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5;
PDF *pdf;
int pdf_image, argc;
char *image;
switch ((argc = ZEND_NUM_ARGS())) {
case 3:
if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)
WRONG_PARAM_COUNT;
break;
case 5:
if (zend_get_parameters_ex(5, &arg1, &arg2, &arg3, &arg4, &arg5) == FAILURE)
WRONG_PARAM_COUNT;
break;
default:
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_string_ex(arg3);
#ifdef VIRTUAL_DIR
virtual_filepath(Z_STRVAL_PP(arg3), &image);
#else
image = Z_STRVAL_PP(arg3);
#endif
if (argc == 3) {
pdf_image = PDF_open_image_file(pdf, Z_STRVAL_PP(arg2), image, "", 0);
} else {
convert_to_string_ex(arg4);
convert_to_long_ex(arg5);
pdf_image = PDF_open_image_file(pdf, Z_STRVAL_PP(arg2), image, Z_STRVAL_PP(arg4), Z_LVAL_PP(arg5));
}
if (pdf_image == -1) {
/* pdflib will do this for you, will throw some exception
php_error(E_WARNING, "Could not open image: %s", image);
*/
RETURN_FALSE;
}
RETURN_LONG(pdf_image+PDFLIB_IMAGE_OFFSET);
}
/* }}} */
#if HAVE_LIBGD13
/* {{{ proto int pdf_open_memory_image(int pdf, int image)
Takes an GD image and returns an image for placement in a PDF document */
PHP_FUNCTION(pdf_open_memory_image)
{
zval **arg1, **arg2;
int i, j, color, count;
int pdf_image, *img;
gdImagePtr im;
unsigned char *buffer, *ptr;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
ZEND_FETCH_RESOURCE(im, gdImagePtr, arg2, -1, "Image", phpi_get_le_gd());
count = 3 * im->sx * im->sy;
if(NULL == (buffer = (unsigned char *) emalloc(count))) {
RETURN_FALSE;
}
ptr = buffer;
for(i=0; i<im->sy; i++) {
for(j=0; j<im->sx; j++) {
color = im->pixels[i][j];
*ptr++ = im->red[color];
*ptr++ = im->green[color];
*ptr++ = im->blue[color];
}
}
pdf_image = PDF_open_image(pdf, "raw", "memory", buffer, im->sx*im->sy*3, im->sx, im->sy, 3, 8, NULL);
efree(buffer);
if(pdf_image == -1) {
/* pdflib will do this for you, will throw some exception
php_error(E_WARNING, "Could not open image");
*/
efree(buffer);
RETURN_FALSE;
}
RETURN_LONG(pdf_image+PDFLIB_IMAGE_OFFSET);
}
/* }}} */
#endif /* HAVE_LIBGD13 */
/* {{{ proto void pdf_close_image(int pdf, int pdfimage)
Closes the PDF image */
PHP_FUNCTION(pdf_close_image)
{
zval **arg1, **arg2;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
PDF_close_image(pdf, Z_LVAL_PP(arg2)-PDFLIB_IMAGE_OFFSET);
}
/* }}} */
/* {{{ proto void pdf_place_image(int pdf, int pdfimage, double x, double y, double scale)
Places image in the PDF document */
PHP_FUNCTION(pdf_place_image)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5;
PDF *pdf;
if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &arg1, &arg2, &arg3, &arg4, &arg5) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
PDF_place_image(pdf, Z_LVAL_PP(arg2)-PDFLIB_IMAGE_OFFSET, (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4), (float) Z_DVAL_PP(arg5));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int pdf_get_image_width(int pdf, int pdfimage)
Returns the width of an image */
PHP_FUNCTION(pdf_get_image_width)
{
zval **arg1, **arg2;
PDF *pdf;
int width;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
width = (int) PDF_get_value(pdf, "imagewidth", Z_LVAL_PP(arg2)-PDFLIB_IMAGE_OFFSET);
RETURN_LONG(width);
}
/* }}} */
/* {{{ proto int pdf_get_image_height(int pdf, int pdfimage)
Returns the height of an image */
PHP_FUNCTION(pdf_get_image_height)
{
zval **arg1, **arg2;
PDF *pdf;
int height;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
height = (int) PDF_get_value(pdf, "imageheight", Z_LVAL_PP(arg2)-PDFLIB_IMAGE_OFFSET);
RETURN_LONG(height);
}
/* }}} */
/* {{{ proto void pdf_add_weblink(int pdfdoc, double llx, double lly, double urx, double ury, string url)
Adds link to web resource */
PHP_FUNCTION(pdf_add_weblink)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6;
PDF *pdf;
if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_ex(6, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_string_ex(arg6);
PDF_add_weblink(pdf, (float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
Z_STRVAL_PP(arg6));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_add_pdflink(int pdfdoc, double llx, double lly, double urx, double ury, string filename, int page, string dest)
Adds link to PDF document */
PHP_FUNCTION(pdf_add_pdflink)
{
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8;
PDF *pdf;
if (ZEND_NUM_ARGS() != 8 || zend_get_parameters_ex(8, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_string_ex(arg6);
convert_to_long_ex(arg7);
convert_to_string_ex(arg8);
PDF_add_pdflink(pdf, (float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
Z_STRVAL_PP(arg6),
Z_LVAL_PP(arg7),
Z_STRVAL_PP(arg8));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_set_border_style(int pdfdoc, string style, double width)
Sets style of box surounding all kinds of annotations and link */
PHP_FUNCTION(pdf_set_border_style)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_double_ex(arg3);
PDF_set_border_style(pdf, Z_STRVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_set_border_color(int pdfdoc, double red, double green, double blue)
Sets color of box surounded all kinds of annotations and links */
PHP_FUNCTION(pdf_set_border_color)
{
zval **arg1, **arg2, **arg3, **arg4;
PDF *pdf;
if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
PDF_set_border_color(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_set_border_dash(int pdfdoc, double black, double white)
Sets the border dash style of all kinds of annotations and links */
PHP_FUNCTION(pdf_set_border_dash)
{
zval **arg1, **arg2, **arg3;
PDF *pdf;
if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
PDF_set_border_dash(pdf, (float) Z_DVAL_PP(arg2), (float) Z_DVAL_PP(arg3));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_add_annotation(int pdfdoc, double xll, double yll, double xur, double xur, string title, string text)
Sets annotation (depreciated use pdf_add_note instead) */
PHP_FUNCTION(pdf_add_annotation)
{
zval **argv[7];
PDF *pdf;
if(ZEND_NUM_ARGS() != 7 || zend_get_parameters_array_ex(7, argv) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, argv[0], -1, "pdf object", le_pdf);
convert_to_double_ex(argv[1]);
convert_to_double_ex(argv[2]);
convert_to_double_ex(argv[3]);
convert_to_double_ex(argv[4]);
convert_to_string_ex(argv[5]);
convert_to_string_ex(argv[6]);
PDF_add_note(pdf, (float) Z_DVAL_PP(argv[1]),
(float) Z_DVAL_PP(argv[2]),
(float) Z_DVAL_PP(argv[3]),
(float) Z_DVAL_PP(argv[4]),
Z_STRVAL_PP(argv[6]),
Z_STRVAL_PP(argv[5]),
"note", 1);
RETURN_TRUE;
}
/* }}} */
/* RJS: START OF NEW CODE */
/* {{{ proto int pdf_new()
Creates a new PDF object */
PHP_FUNCTION(pdf_new) {
PDF *pdf;
pdf = PDF_new2(custom_errorhandler, pdf_emalloc, pdf_realloc, pdf_efree, NULL);
PDF_set_parameter(pdf, "imagewarning", "true");
PDF_set_parameter(pdf, "binding", "PHP");
ZEND_REGISTER_RESOURCE(return_value, pdf, le_pdf);
}
/* }}} */
/* {{{ proto void pdf_delete(int pdfdoc)
Deletes the PDF object */
PHP_FUNCTION(pdf_delete) {
zval **arg1;
PDF *pdf;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
PDF_delete(pdf);
zend_list_delete(Z_LVAL_PP(arg1));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int pdf_open_file(int pdfdoc [, char filename])
Opens a new PDF document. If filename is NULL, document is created in memory. This is not yet fully supported */
PHP_FUNCTION(pdf_open_file) {
zval **arg1, **arg2;
int pdf_file;
char *filename;
int argc;
PDF *pdf;
if((argc = ZEND_NUM_ARGS()) > 2)
WRONG_PARAM_COUNT;
if (argc == 1) {
if (zend_get_parameters_ex(1, &arg1) == FAILURE)
WRONG_PARAM_COUNT;
} else {
if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
if (argc == 2) {
convert_to_string_ex(arg2);
#ifdef VIRTUAL_DIR
virtual_filepath(Z_STRVAL_PP(arg2), &filename);
#else
filename = Z_STRVAL_PP(arg2);
#endif
pdf_file = PDF_open_file(pdf, filename);
} else {
/* open in memory */
pdf_file = PDF_open_file(pdf, "");
}
if (pdf_file == -1)
RETURN_FALSE;
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int pdf_get_buffer(int pdfdoc)
Fetches the full buffer containig the generated PDF data */
PHP_FUNCTION(pdf_get_buffer) {
zval **arg1;
long size;
PDF *pdf;
const char *buffer;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
buffer = PDF_get_buffer(pdf, &size);
RETURN_STRINGL((char *)buffer, size, 1);
}
/* }}} */
/* {{{ proto int pdf_findfont(int pdfdoc, string fontname, string encoding [, int embed])
Prepares the font fontname for later use with pdf_setfont() */
PHP_FUNCTION(pdf_findfont) {
zval **arg1, **arg2, **arg3, **arg4;
int embed, font;
const char *fontname, *encoding;
PDF *pdf;
switch (ZEND_NUM_ARGS()) {
case 3:
if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}
embed = 0;
break;
case 4:
if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long_ex(arg4);
embed = Z_LVAL_PP(arg4);
break;
default:
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
fontname = Z_STRVAL_PP(arg2);
convert_to_string_ex(arg3);
encoding = Z_STRVAL_PP(arg3);
font = PDF_findfont(pdf, fontname, encoding, embed);
if (font == -1) {
/* pdflib will do this for you, will throw some exception
php_error(E_WARNING,"Font %s not found", fontname);
*/
RETURN_FALSE;
}
RETURN_LONG(font+PDFLIB_FONT_OFFSET);
}
/* }}} */
/* {{{ proto void pdf_setfont(int pdfdoc, int font, float fontsize)
Sets the current font in the fiven fontsize */
PHP_FUNCTION(pdf_setfont) {
zval **arg1, **arg2, **arg3;
int font;
float fontsize;
PDF *pdf;
if(ZEND_NUM_ARGS() != 3)
WRONG_PARAM_COUNT;
if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)
WRONG_PARAM_COUNT;
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
font = Z_LVAL_PP(arg2);
convert_to_double_ex(arg3);
fontsize = (float)Z_DVAL_PP(arg3);
PDF_setfont(pdf, font-PDFLIB_FONT_OFFSET, fontsize);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_setpolydash(int pdfdoc, double darray)
Sets more complicated dash pattern */
PHP_FUNCTION(pdf_setpolydash) {
zval **arg1, **arg2;
HashTable *array;
int len, i;
float *darray;
PDF *pdf;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_array_ex(arg2);
array = Z_ARRVAL_PP(arg2);
len = zend_hash_num_elements(array);
if (NULL == (darray = emalloc(len * sizeof(double)))) {
RETURN_FALSE;
}
zend_hash_internal_pointer_reset(array);
for (i=0; i<len; i++) {
zval *keydata, **keydataptr;
zend_hash_get_current_data(array, (void **) &keydataptr);
keydata = *keydataptr;
if (keydata->type == IS_DOUBLE) {
darray[i] = (float) keydata->value.dval;
} else if (keydata->type == IS_LONG) {
darray[i] = (float) keydata->value.lval;
} else {
php_error(E_WARNING,"PDFlib set_polydash: illegal darray value");
}
zend_hash_move_forward(array);
}
PDF_setpolydash(pdf, darray, len);
efree(darray);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_concat(int pdf, double a, double b, double c, double d, double e, double f)
Concatenates a matrix to the current transformation matrix for text and graphics */
PHP_FUNCTION(pdf_concat) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7;
PDF *pdf;
if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_ex(6, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_double_ex(arg6);
PDF_concat(pdf,
(float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
(float) Z_DVAL_PP(arg6),
(float) Z_DVAL_PP(arg7));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int pdf_open_ccitt(int pdf, string filename, int width, int height, int bitreverse, int k, int blackls1)
Opens an image file with raw CCITT G3 or G4 compresed bitmap data */
PHP_FUNCTION(pdf_open_ccitt) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7;
PDF *pdf;
int pdf_image;
char *image;
if (ZEND_NUM_ARGS() != 7 || zend_get_parameters_ex(7, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
#ifdef VIRTUAL_DIR
virtual_filepath(Z_STRVAL_PP(arg2), &image);
#else
image = Z_STRVAL_PP(arg2);
#endif
convert_to_long_ex(arg3);
convert_to_long_ex(arg4);
convert_to_long_ex(arg5);
convert_to_long_ex(arg6);
convert_to_long_ex(arg7);
pdf_image = PDF_open_CCITT(pdf,
image,
Z_LVAL_PP(arg3),
Z_LVAL_PP(arg4),
Z_LVAL_PP(arg5),
Z_LVAL_PP(arg6),
Z_LVAL_PP(arg7));
RETURN_LONG(pdf_image+PDFLIB_IMAGE_OFFSET);
}
/* }}} */
/* {{{ proto int pdf_open_image(int pdf, string type, string source, string data, long length, int width, int height, int components, int bpc, string params)
Opens an image of the given type and returns an image for placement in a PDF document */
PHP_FUNCTION(pdf_open_image) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8, **arg9, **arg10;
PDF *pdf;
int pdf_image;
char *image;
if (ZEND_NUM_ARGS() != 10 || zend_get_parameters_ex(10, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, &arg10) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_string_ex(arg2);
convert_to_string_ex(arg3);
convert_to_string_ex(arg4);
convert_to_long_ex(arg5);
convert_to_long_ex(arg6);
convert_to_long_ex(arg7);
convert_to_long_ex(arg8);
convert_to_long_ex(arg9);
convert_to_string_ex(arg10);
#ifdef VIRTUAL_DIR
virtual_filepath(Z_STRVAL_PP(arg4), &image);
#else
image = Z_STRVAL_PP(arg4);
#endif
pdf_image = PDF_open_image(pdf,
Z_STRVAL_PP(arg2),
Z_STRVAL_PP(arg3),
image,
Z_LVAL_PP(arg5),
Z_LVAL_PP(arg6),
Z_LVAL_PP(arg7),
Z_LVAL_PP(arg8),
Z_LVAL_PP(arg9),
Z_STRVAL_PP(arg10));
RETURN_LONG(pdf_image+PDFLIB_IMAGE_OFFSET);
}
/* }}} */
/* {{{ proto void pdf_attach_file(int pdf, double lly, double lly, double urx, double ury, string filename, string description, string author, string mimetype, string icon)
Adds a file attachment annotation at the rectangle specified by his lower left and upper right corners */
PHP_FUNCTION(pdf_attach_file) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8, **arg9, **arg10;
PDF *pdf;
if (ZEND_NUM_ARGS() != 10 || zend_get_parameters_ex(10, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, &arg10) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_long_ex(arg2);
convert_to_long_ex(arg3);
convert_to_long_ex(arg4);
convert_to_long_ex(arg5);
convert_to_string_ex(arg6);
convert_to_string_ex(arg7);
convert_to_string_ex(arg8);
convert_to_string_ex(arg9);
convert_to_string_ex(arg10);
PDF_attach_file(pdf,
(float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
Z_STRVAL_PP(arg6),
Z_STRVAL_PP(arg7),
Z_STRVAL_PP(arg8),
Z_STRVAL_PP(arg9),
Z_STRVAL_PP(arg10));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_add_note(int pdfdoc, double llx, double lly, double urx, double ury, string contents, string title, string icon, int open)
Sets annotation */
PHP_FUNCTION(pdf_add_note) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8, **arg9;
PDF *pdf;
if (ZEND_NUM_ARGS() != 9 || zend_get_parameters_ex(9, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_string_ex(arg6);
convert_to_string_ex(arg7);
convert_to_string_ex(arg8);
convert_to_long_ex(arg9);
PDF_add_note(pdf,
(float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
Z_STRVAL_PP(arg6),
Z_STRVAL_PP(arg7),
Z_STRVAL_PP(arg8),
Z_LVAL_PP(arg9));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_add_locallink(int pdfdoc, double llx, double lly, double urx, double ury, int page, string dest)
Adds link to web resource */
PHP_FUNCTION(pdf_add_locallink) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7;
PDF *pdf;
if (ZEND_NUM_ARGS() != 7 || zend_get_parameters_ex(7, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_long_ex(arg6);
convert_to_string_ex(arg7);
PDF_add_locallink(pdf,
(float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
Z_LVAL_PP(arg6),
Z_STRVAL_PP(arg7));
RETURN_TRUE;
}
/* }}} */
/* {{{ proto void pdf_add_launchlink(int pdfdoc, double llx, double lly, double urx, double ury, string filename)
Adds link to web resource */
PHP_FUNCTION(pdf_add_launchlink) {
zval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6;
PDF *pdf;
if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_ex(6, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(pdf, PDF *, arg1, -1, "pdf object", le_pdf);
convert_to_double_ex(arg2);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
convert_to_string_ex(arg6);
PDF_add_launchlink(pdf,
(float) Z_DVAL_PP(arg2),
(float) Z_DVAL_PP(arg3),
(float) Z_DVAL_PP(arg4),
(float) Z_DVAL_PP(arg5),
Z_STRVAL_PP(arg6));
RETURN_TRUE;
}
/* }}} */
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/