php-src/ext/pdf/pdf.c
2001-01-03 16:53:00 +00:00

2023 lines
50 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> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
/* pdflib 2.02 is subject to the ALADDIN FREE PUBLIC LICENSE.
Copyright (C) 1997 Thomas Merz. */
/* 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"
#include "ext/gd/php_gd.h"
#if HAVE_LIBGD13
#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_image, le_outline, le_pdf;
function_entry pdf_functions[] = {
PHP_FE(pdf_set_info, NULL)
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_open, NULL)
PHP_FE(pdf_close, NULL)
PHP_FE(pdf_begin_page, NULL)
PHP_FE(pdf_end_page, NULL)
PHP_FE(pdf_show, NULL)
PHP_FE(pdf_show_xy, NULL)
PHP_FE(pdf_show_boxed, NULL)
PHP_FE(pdf_skew, NULL)
PHP_FE(pdf_set_font, NULL)
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_text_pos, NULL)
PHP_FE(pdf_set_char_spacing, NULL) /* deprecated */
PHP_FE(pdf_set_word_spacing, NULL) /* deprecated */
PHP_FE(pdf_get_font, NULL)
PHP_FE(pdf_get_fontname, NULL)
PHP_FE(pdf_get_fontsize, NULL)
PHP_FE(pdf_continue_text, NULL)
PHP_FE(pdf_stringwidth, 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_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_setdash, NULL)
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_endpath, NULL)
PHP_FE(pdf_clip, NULL)
PHP_FE(pdf_set_parameter, NULL)
PHP_FE(pdf_get_parameter, NULL)
PHP_FE(pdf_set_value, NULL)
PHP_FE(pdf_get_value, 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_add_outline, NULL)
PHP_FALIAS(pdf_add_bookmark, pdf_add_outline, NULL)
PHP_FE(pdf_set_transition, NULL) /* deprecated */
PHP_FE(pdf_set_duration, NULL) /* deprecated */
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 */
PHP_FE(pdf_open_image_file, NULL)
#if HAVE_LIBGD13
PHP_FE(pdf_open_memory_image, NULL)
#endif
PHP_FE(pdf_close_image, NULL)
PHP_FE(pdf_place_image, NULL)
PHP_FE(pdf_add_weblink, NULL)
PHP_FE(pdf_add_pdflink, NULL)
PHP_FE(pdf_add_annotation, NULL)
PHP_FE(pdf_set_border_style, NULL)
PHP_FE(pdf_set_border_color, NULL)
PHP_FE(pdf_set_border_dash, NULL)
PHP_FE(pdf_get_image_height, NULL)
PHP_FE(pdf_get_image_width, NULL)
{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_image(zend_rsrc_list_entry *rsrc)
{
int *pdf_image = (int *)rsrc->ptr;
if(pdf_image) efree(pdf_image);
}
static void _free_pdf_doc(zend_rsrc_list_entry *rsrc)
{
PDF *pdf = (PDF *)rsrc->ptr;
PDF_close(pdf);
PDF_delete(pdf);
}
static void _free_outline(zend_rsrc_list_entry *rsrc)
{
int *outline = (int *)rsrc->ptr;
if(outline) efree(outline);
}
static void custom_errorhandler(PDF *p, int type, const char *shortmsg)
{
switch (type){
case PDF_NonfatalError:
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,"Internal 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)
{
if(php_header()) 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 Version", tmp );
php_info_print_table_row(2, "CJK Font Support", "yes" );
#ifdef PDF_OPEN_MEM_SUPPORTED
php_info_print_table_row(2, "In-memory PDF Creation Support", "yes" );
#else
php_info_print_table_row(2, "In-memory PDF Creation Support", "no" );
#endif
php_info_print_table_end();
}
PHP_MINIT_FUNCTION(pdf)
{
le_pdf_image = zend_register_list_destructors_ex(_free_pdf_image, NULL, "pdf image", module_number);
le_outline = zend_register_list_destructors_ex(_free_outline, NULL, "pdf outline", module_number);
le_pdf = zend_register_list_destructors_ex(_free_pdf_doc, NULL, "pdf document", module_number);
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(pdf)
{
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 document", 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 document", 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 not yet fully supported.*/
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) {
#if defined PDF_OPEN_MEM_SUPPORTED
fp = NULL;
#else
php_error(E_WARNING, "Your version of pdflib does not support in memory creation of PDF documents. You have to pass a file handle to pdf_open()");
WRONG_PARAM_COUNT;
#endif
} 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);
}
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 document", le_pdf);
zend_list_delete((*arg1)->value.lval);
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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 < 0) {
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 document", le_pdf);
convert_to_double_ex(arg2);
PDF_set_value(pdf, field, 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 document", le_pdf);
convert_to_string_ex(arg2);
convert_to_double_ex(arg3);
PDF_set_value(pdf, Z_STRVAL_PP(arg2), 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 document", le_pdf);
convert_to_string_ex(argv[1]);
if(0 == (strncmp(Z_STRVAL_PP(argv[1]), "image", 5))) {
int *pdf_image;
if(argc < 3) WRONG_PARAM_COUNT;
ZEND_FETCH_RESOURCE(pdf_image, int *, argv[2], -1, "pdf image", le_pdf_image);
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), *pdf_image);
} else {
if(argc < 3) {
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), 0.0);
} else {
convert_to_double_ex(argv[2]);
value = PDF_get_value(pdf, Z_STRVAL_PP(argv[1]), 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 document", le_pdf);
font = (int) PDF_get_value(pdf, "font", 0);
RETURN_LONG(font);
}
/* }}} */
/* {{{ 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 document", 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 document", 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)
Set 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 document", 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 document", 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)
Returns width of text in current font*/
PHP_FUNCTION(pdf_stringwidth)
{
zval **arg1, **arg2;
double width;
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 document", le_pdf);
convert_to_string_ex(arg2);
width = (double) PDF_stringwidth(pdf, Z_STRVAL_PP(arg2), PDF_get_value(pdf, "font", 0), PDF_get_value(pdf, "fontsize", 0));
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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", le_pdf);
convert_to_double_ex(arg2);
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 document", le_pdf);
convert_to_long_ex(arg2);
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 document", le_pdf);
convert_to_long_ex(arg2);
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 document", le_pdf);
convert_to_double_ex(arg2);
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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", le_pdf);
convert_to_string_ex(arg2);
convert_to_string_ex(arg3);
if (Z_STRVAL_PP(arg2) == "compatibility") {
php_error(E_ERROR,"Compatibility modes not supported at this time");
RETURN_FALSE;
}
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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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 document", 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_outline(int pdfdoc, string text [, int parent, int open]);
Add bookmark for current page */
PHP_FUNCTION(pdf_add_outline)
{
zval **arg1, **arg2, **arg3, **arg4;
int *outline, *parent, 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 document", le_pdf);
convert_to_string_ex(arg2);
if (ZEND_NUM_ARGS() > 2) {
ZEND_FETCH_RESOURCE(parent, int *, arg3, -1, "pdf outline", le_outline);
if (parent) {
parentid = *parent;
} else {
parentid = 0;
}
if (ZEND_NUM_ARGS() > 3) {
convert_to_long_ex(arg4);
open = Z_LVAL_PP(arg4);
} else {
open = 0;
}
} else {
parentid = 0;
open = 0;
}
id = PDF_add_bookmark(pdf, Z_STRVAL_PP(arg2), parentid, open);
outline = (int *) emalloc(sizeof(int));
*outline = id;
ZEND_REGISTER_RESOURCE(return_value, outline, le_outline);
}
/* }}} */
/* {{{ 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 document", 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 document", 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, *img;
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 document", 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);
if(pdf_image < 0) {
php_error(E_WARNING, "Could not open image");
RETURN_FALSE;
}
img = (int *) emalloc(sizeof(int));
*img = pdf_image;
ZEND_REGISTER_RESOURCE(return_value, img, le_pdf_image);
}
/* {{{ proto int pdf_open_gif(int pdf, string giffile)
Opens a gif file and returns an image for placement in a pdf document */
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)
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;
PDF *pdf;
int pdf_image, *img;
char *image;
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 document", 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
pdf_image = PDF_open_image_file(pdf, Z_STRVAL_PP(arg2), image, "", 0);
if(pdf_image < 0) {
php_error(E_WARNING, "Could not open image: %s", image);
RETURN_FALSE;
}
img = (int *) emalloc(sizeof(int));
*img = pdf_image;
ZEND_REGISTER_RESOURCE(return_value, img, le_pdf_image);
}
/* }}} */
#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 document", 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) {
php_error(E_WARNING, "Could not open image");
efree(buffer);
RETURN_FALSE;
}
img = (int *) emalloc(sizeof(int));
*img = pdf_image;
ZEND_REGISTER_RESOURCE(return_value, img, le_pdf_image);
}
/* }}} */
#endif /* HAVE_LIBGD13 */
/* {{{ proto void pdf_close_image(int pdfimage)
Closes the pdf image */
PHP_FUNCTION(pdf_close_image)
{
zval **arg1, **arg2;
PDF *pdf;
int *pdf_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 document", le_pdf);
ZEND_FETCH_RESOURCE(pdf_image, int *, arg2, -1, "pdf image", le_pdf_image);
PDF_close_image(pdf, *pdf_image);
RETURN_TRUE;
}
/* }}} */
/* {{{ 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;
int *pdf_image;
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 document", le_pdf);
ZEND_FETCH_RESOURCE(pdf_image, int *, arg2, -1, "pdf image", le_pdf_image);
convert_to_double_ex(arg3);
convert_to_double_ex(arg4);
convert_to_double_ex(arg5);
PDF_place_image(pdf, *pdf_image, (float) Z_DVAL_PP(arg3), (float) Z_DVAL_PP(arg4), 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 *pdf_image, 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 document", le_pdf);
ZEND_FETCH_RESOURCE(pdf_image, int *, arg2, -1, "pdf image", le_pdf_image);
width = PDF_get_value(pdf, "imagewidth", *pdf_image);
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 *pdf_image, 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 document", le_pdf);
ZEND_FETCH_RESOURCE(pdf_image, int *, arg2, -1, "pdf image", le_pdf_image);
height = PDF_get_value(pdf, "imageheight", *pdf_image);
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 document", 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 document", 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)
Set 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 document", 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)
Set 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 document", 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)
Set 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 document", 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 */
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 document", 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;
}
/* }}} */
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/