2 /* {{{ Class CairoPattern */
4 static zend_class_entry
* CairoPattern_ce_ptr
= NULL
;
9 /* {{{ proto void contruct()
11 PHP_METHOD(CairoPattern
, __construct
)
17 if (ZEND_NUM_ARGS()>0) {
22 php_error(E_ERROR
, "Pattern Cannot be initialized"); RETURN_FALSE
;
29 /* {{{ proto object getMatrix()
31 PHP_METHOD(CairoPattern
, getMatrix
)
34 zval
* _this_zval
= NULL
;
35 cairo_matrix_t matrix
;
37 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoPattern_ce_ptr
) == FAILURE
) {
41 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
43 cairo_pattern_get_matrix(curr
->pattern
, &matrix
);
44 object_init_ex(return_value
, CairoMatrix_ce_ptr
);
45 matrix_object
*mobj
= (matrix_object
*)zend_objects_get_address(return_value TSRMLS_CC
);
46 mobj
->matrix
= matrix
;
52 /* {{{ proto void setMatrix(object m)
54 PHP_METHOD(CairoPattern
, setMatrix
)
57 zval
* _this_zval
= NULL
;
62 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "Oo", &_this_zval
, CairoPattern_ce_ptr
, &m
) == FAILURE
) {
66 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
67 matrix_object
*mobj
= (matrix_object
*)zend_objects_get_address(m TSRMLS_CC
);
68 cairo_pattern_set_matrix(curr
->pattern
, &mobj
->matrix
);
73 /* {{{ proto void setExtend(int extend)
75 PHP_METHOD(CairoPattern
, setExtend
)
79 zval
* _this_zval
= NULL
;
80 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "Ol", &_this_zval
, CairoPattern_ce_ptr
, &extend
) == FAILURE
) {
83 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
84 cairo_pattern_set_extend(curr
->pattern
, extend
);
85 PHP_CAIRO_PATTERN_ERROR(curr
->pattern
);
92 /* {{{ proto void getExtend()
94 PHP_METHOD(CairoPattern
, getExtend
)
98 zval
* _this_zval
= NULL
;
99 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoPattern_ce_ptr
) == FAILURE
) {
102 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
103 extend
= cairo_pattern_get_extend(curr
->pattern
);
109 static zend_function_entry CairoPattern_methods
[] = {
110 PHP_ME(CairoPattern
, __construct
, NULL
, /**/ZEND_ACC_PUBLIC
| ZEND_ACC_CTOR
)
111 PHP_ME(CairoPattern
, getMatrix
, NULL
, /**/ZEND_ACC_PUBLIC
)
112 PHP_ME(CairoPattern
, setMatrix
, CairoPattern__set_matrix_args
, /**/ZEND_ACC_PUBLIC
)
113 PHP_ME(CairoPattern
, getExtend
, NULL
, /**/ZEND_ACC_PUBLIC
)
114 PHP_ME(CairoPattern
, setExtend
, CairoPattern__set_extend_args
, /**/ZEND_ACC_PUBLIC
)
120 static zend_object_handlers CairoPattern_handlers
;
122 static void CairoPattern_object_dtor(void *object
)
124 pattern_object
*pattern
= (pattern_object
*)object
;
125 zend_hash_destroy(pattern
->std
.properties
);
126 FREE_HASHTABLE(pattern
->std
.properties
);
127 if(pattern
->pattern
){
128 cairo_pattern_destroy(pattern
->pattern
);
133 static zend_object_value
CairoPattern_object_new(zend_class_entry
*ce
)
135 zend_object_value retval
;
136 pattern_object
*pattern
;
138 pattern
=emalloc(sizeof(pattern_object
));
139 memset(pattern
,0,sizeof(pattern_object
));
140 pattern
->std
.ce
= ce
;
141 ALLOC_HASHTABLE(pattern
->std
.properties
);
142 zend_hash_init(pattern
->std
.properties
, 0, NULL
, ZVAL_PTR_DTOR
,0);
143 zend_hash_copy(pattern
->std
.properties
, &ce
->default_properties
, (copy_ctor_func_t
) zval_add_ref
, (void *) &temp
, sizeof(zval
*));
144 retval
.handle
= zend_objects_store_put(pattern
, NULL
, (zend_objects_free_object_storage_t
)CairoPattern_object_dtor
, NULL TSRMLS_CC
);
145 retval
.handlers
= &CairoPattern_handlers
;
150 static void class_init_CairoPattern(void)
154 INIT_CLASS_ENTRY(ce
, "CairoPattern", CairoPattern_methods
);
155 CairoPattern_ce_ptr
= zend_register_internal_class(&ce
);
156 CairoPattern_ce_ptr
->create_object
= CairoPattern_object_new
;
157 memcpy(&CairoPattern_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
158 CairoPattern_handlers
.clone_obj
= NULL
;
161 /* }}} Class CairoPattern */
163 /* {{{ Class CairoGradient */
165 static zend_class_entry
* CairoGradient_ce_ptr
= NULL
;
170 /* {{{ proto void construct()
172 PHP_METHOD(CairoGradient
, __construct
)
175 zval
* _this_zval
= NULL
;
179 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoGradient_ce_ptr
) == FAILURE
) {
185 php_error(E_ERROR
, "Gradient cannot be initialized"); RETURN_FALSE
;
188 /* }}} __construct */
192 /* {{{ proto void addColorStopRgb(float offset, float red, float green, float blue)
194 PHP_METHOD(CairoGradient
, addColorStopRgb
)
197 zval
* _this_zval
= NULL
;
205 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "Odddd", &_this_zval
, CairoGradient_ce_ptr
, &offset
, &red
, &green
, &blue
) == FAILURE
) {
209 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
210 cairo_pattern_add_color_stop_rgb(curr
->pattern
, offset
, red
, green
, blue
);
211 PHP_CAIRO_PATTERN_ERROR(curr
->pattern
);
213 /* }}} addColorStopRgb */
217 /* {{{ proto void addColorStopRgba(float offset, float red, float green, float blue, float alpha)
219 PHP_METHOD(CairoGradient
, addColorStopRgba
)
222 zval
* _this_zval
= NULL
;
231 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "Oddddd", &_this_zval
, CairoGradient_ce_ptr
, &offset
, &red
, &green
, &blue
, &alpha
) == FAILURE
) {
235 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
236 cairo_pattern_add_color_stop_rgba(curr
->pattern
, offset
, red
, green
, blue
, alpha
);
237 PHP_CAIRO_PATTERN_ERROR(curr
->pattern
);
239 /* }}} addColorStopRgba */
243 static zend_function_entry CairoGradient_methods
[] = {
244 PHP_ME(CairoGradient
, __construct
, NULL
, /**/ZEND_ACC_PUBLIC
| ZEND_ACC_CTOR
)
245 PHP_ME(CairoGradient
, addColorStopRgb
, CairoGradient__add_color_stop_rgb_args
, /**/ZEND_ACC_PUBLIC
)
246 PHP_ME(CairoGradient
, addColorStopRgba
, CairoGradient__add_color_stop_rgba_args
, /**/ZEND_ACC_PUBLIC
)
252 static zend_object_handlers CairoGradient_handlers
;
254 static zend_object_value
CairoGradient_object_new(zend_class_entry
*ce TSRMLS_CC
)
256 zend_object_value retval
;
257 retval
= CairoPattern_object_new(ce TSRMLS_CC
);
258 retval
.handlers
= &CairoGradient_handlers
;
262 static void class_init_CairoGradient(void)
265 INIT_CLASS_ENTRY(ce
, "CairoGradient", CairoGradient_methods
);
266 CairoGradient_ce_ptr
= zend_register_internal_class_ex(&ce
, CairoPattern_ce_ptr
, "CairoPattern" TSRMLS_CC
);
267 CairoGradient_ce_ptr
->create_object
= CairoGradient_object_new
;
268 memcpy(&CairoGradient_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
272 /* }}} Class CairoGradient */
274 /* {{{ Class CairoLinearGradient */
276 static zend_class_entry
* CairoLinearGradient_ce_ptr
= NULL
;
281 /* {{{ proto void construct(float x0, float y0, float x1, float y1)
283 PHP_METHOD(CairoLinearGradient
, __construct
)
294 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "dddd", &x0
, &y0
, &x1
, &y1
) == FAILURE
) {
298 _this_zval
= getThis();
299 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
300 curr
->pattern
= cairo_pattern_create_linear(x0
, y0
, x1
, y1
);
303 /* }}} __construct */
307 /* {{{ proto array getLinearPoints()
309 PHP_METHOD(CairoLinearGradient
, getLinearPoints
)
312 zval
* _this_zval
= NULL
;
313 double x0
, y0
, x1
, y1
;
316 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoLinearGradient_ce_ptr
) == FAILURE
) {
320 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
321 cairo_pattern_get_linear_points(curr
->pattern
, &x0
, &y0
, &x1
, &y1
);
323 array_init(return_value
);
324 add_assoc_double(return_value
, "x0", x0
);
325 add_assoc_double(return_value
, "y0", y0
);
326 add_assoc_double(return_value
, "x1", x1
);
327 add_assoc_double(return_value
, "y1", y1
);
330 /* }}} getLinearPoints */
333 static zend_function_entry CairoLinearGradient_methods
[] = {
334 PHP_ME(CairoLinearGradient
, __construct
, CairoLinearGradient____construct_args
, /**/ZEND_ACC_PUBLIC
| ZEND_ACC_CTOR
)
335 PHP_ME(CairoLinearGradient
, getLinearPoints
, NULL
, /**/ZEND_ACC_PUBLIC
)
341 static zend_object_handlers CairoLinearGradient_handlers
;
343 static zend_object_value
CairoLinearGradient_object_new(zend_class_entry
*ce TSRMLS_CC
)
345 zend_object_value retval
;
346 retval
= CairoGradient_object_new(ce TSRMLS_CC
);
347 retval
.handlers
= &CairoLinearGradient_handlers
;
351 static void class_init_CairoLinearGradient(void)
354 INIT_CLASS_ENTRY(ce
, "CairoLinearGradient", CairoLinearGradient_methods
);
355 CairoLinearGradient_ce_ptr
= zend_register_internal_class_ex(&ce
, CairoGradient_ce_ptr
, "CairoGradient" TSRMLS_CC
);
356 CairoLinearGradient_ce_ptr
->create_object
= CairoLinearGradient_object_new
;
357 memcpy(&CairoLinearGradient_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
361 /* }}} Class CairoLinearGradient */
363 /* {{{ Class CairoRadialGradient */
365 static zend_class_entry
* CairoRadialGradient_ce_ptr
= NULL
;
370 /* {{{ proto void construct(float cx0, float cy0, float radius0, float cx1, float cy1, float radius1)
372 PHP_METHOD(CairoRadialGradient
, __construct
)
375 zval
* _this_zval
= NULL
;
378 double radius0
= 0.0;
381 double radius1
= 0.0;
385 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "Odddddd", &_this_zval
, CairoRadialGradient_ce_ptr
, &cx0
, &cy0
, &radius0
, &cx1
, &cy1
, &radius1
) == FAILURE
) {
389 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
390 curr
->pattern
= cairo_pattern_create_radial(cx0
, cy0
, radius0
, cx1
, cy1
, radius1
);
393 /* }}} __construct */
397 /* {{{ proto array getRadialCircles()
399 PHP_METHOD(CairoRadialGradient
, getRadialCircles
)
402 zval
* _this_zval
= NULL
;
403 double x0
, y0
, r0
, x1
, y1
, r1
;
406 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoRadialGradient_ce_ptr
) == FAILURE
) {
410 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
411 cairo_pattern_get_radial_circles(curr
->pattern
, &x0
, &y0
, &r0
, &x1
, &y1
, &r1
);
413 array_init(return_value
);
414 add_assoc_double(return_value
, "x0", x0
);
415 add_assoc_double(return_value
, "y0", y0
);
416 add_assoc_double(return_value
, "r0", r0
);
417 add_assoc_double(return_value
, "x1", x1
);
418 add_assoc_double(return_value
, "y1", y1
);
419 add_assoc_double(return_value
, "r1", r1
);
422 /* }}} getRadialCircles */
425 static zend_function_entry CairoRadialGradient_methods
[] = {
426 PHP_ME(CairoRadialGradient
, __construct
, CairoRadialGradient____constuct_args
, /**/ZEND_ACC_PUBLIC
| ZEND_ACC_CTOR
)
427 PHP_ME(CairoRadialGradient
, getRadialCircles
, NULL
, /**/ZEND_ACC_PUBLIC
)
433 static zend_object_handlers CairoRadialGradient_handlers
;
435 static zend_object_value
CairoRadialGradient_object_new(zend_class_entry
*ce TSRMLS_CC
)
437 zend_object_value retval
;
438 retval
= CairoGradient_object_new(ce TSRMLS_CC
);
439 retval
.handlers
= &CairoRadialGradient_handlers
;
443 static void class_init_CairoRadialGradient(void)
446 INIT_CLASS_ENTRY(ce
, "CairoRadialGradient", CairoRadialGradient_methods
);
447 CairoRadialGradient_ce_ptr
= zend_register_internal_class_ex(&ce
, CairoGradient_ce_ptr
, "CairoGradient" TSRMLS_CC
);
448 CairoRadialGradient_ce_ptr
->create_object
= CairoRadialGradient_object_new
;
449 memcpy(&CairoRadialGradient_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
452 /* }}} Class CairoRadialGradient */
454 /* {{{ Class CairoSolidPattern */
456 static zend_class_entry
* CairoSolidPattern_ce_ptr
= NULL
;
461 /* {{{ proto void construct(float r, float g, float b [, float a])
463 PHP_METHOD(CairoSolidPattern
, __construct
)
474 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ddd|d", &r
, &g
, &b
, &a
) == FAILURE
) {
478 _this_zval
= getThis();
479 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
480 curr
->pattern
= cairo_pattern_create_rgba(r
, g
, b
, a
);
483 /* }}} __construct */
487 /* {{{ proto array getRgba()
489 PHP_METHOD(CairoSolidPattern
, getRgba
)
492 zval
* _this_zval
= NULL
;
496 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoSolidPattern_ce_ptr
) == FAILURE
) {
500 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
501 cairo_pattern_get_rgba(curr
->pattern
, &r
, &g
, &b
, &a
);
503 array_init(return_value
);
504 add_assoc_double(return_value
, "red", r
);
505 add_assoc_double(return_value
, "green", g
);
506 add_assoc_double(return_value
, "blue", b
);
507 add_assoc_double(return_value
, "alpha", a
);
513 static zend_function_entry CairoSolidPattern_methods
[] = {
514 PHP_ME(CairoSolidPattern
, __construct
, CairoSolidPattern____construct_args
, /**/ZEND_ACC_PUBLIC
| ZEND_ACC_CTOR
)
515 PHP_ME(CairoSolidPattern
, getRgba
, NULL
, /**/ZEND_ACC_PUBLIC
)
521 static zend_object_handlers CairoSolidPattern_handlers
;
523 static zend_object_value
CairoSolidPattern_object_new(zend_class_entry
*ce TSRMLS_CC
)
525 zend_object_value retval
;
526 retval
= CairoPattern_object_new(ce TSRMLS_CC
);
527 retval
.handlers
= &CairoSolidPattern_handlers
;
532 static void class_init_CairoSolidPattern(void)
536 INIT_CLASS_ENTRY(ce
, "CairoSolidPattern", CairoSolidPattern_methods
);
537 CairoSolidPattern_ce_ptr
= zend_register_internal_class_ex(&ce
, CairoPattern_ce_ptr
, "CairoPattern" TSRMLS_CC
);
538 CairoSolidPattern_ce_ptr
->create_object
= CairoSolidPattern_object_new
;
539 memcpy(&CairoSolidPattern_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
542 /* }}} Class CairoSolidPattern */
544 /* {{{ Class CairoSurfacePattern */
546 static zend_class_entry
* CairoSurfacePattern_ce_ptr
= NULL
;
551 /* {{{ proto void construct(object s)
553 PHP_METHOD(CairoSurfacePattern
, __construct
)
561 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "o", &s
) == FAILURE
) {
565 _this_zval
= getThis();
566 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
567 surface_object
*sobj
= (surface_object
*)zend_objects_get_address(s TSRMLS_CC
);
568 curr
->pattern
= cairo_pattern_create_for_surface(sobj
->surface
);
571 /* }}} __construct */
574 /* {{{ proto int getFilter()
576 PHP_METHOD(CairoSurfacePattern
, getFilter
)
579 zval
* _this_zval
= NULL
;
583 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoSurfacePattern_ce_ptr
) == FAILURE
) {
587 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
588 filter
= cairo_pattern_get_filter(curr
->pattern
);
595 /* {{{ proto object getSurface()
597 PHP_METHOD(CairoSurfacePattern
, getSurface
)
599 zend_class_entry
*surface_ce
;
600 cairo_surface_t
*surface
;
601 zval
* _this_zval
= NULL
;
605 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "O", &_this_zval
, CairoSurfacePattern_ce_ptr
) == FAILURE
) {
609 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
610 cairo_pattern_get_surface(curr
->pattern
, &surface
);
611 surface_ce
= get_CairoSurface_ce_ptr(surface
);
613 object_init_ex(return_value
,surface_ce
);
614 surface_object
*sobj
= (surface_object
*)zend_objects_get_address(return_value TSRMLS_CC
);
615 sobj
->surface
= cairo_surface_reference(surface
);
622 /* {{{ proto void setFilter(int filter)
624 PHP_METHOD(CairoSurfacePattern
, setFilter
)
627 zval
* _this_zval
= NULL
;
632 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, getThis(), "Ol", &_this_zval
, CairoSurfacePattern_ce_ptr
, &filter
) == FAILURE
) {
636 pattern_object
*curr
= (pattern_object
*)zend_objects_get_address(_this_zval TSRMLS_CC
);
638 cairo_pattern_set_filter(curr
->pattern
, filter
);
643 static zend_function_entry CairoSurfacePattern_methods
[] = {
644 PHP_ME(CairoSurfacePattern
, __construct
, NULL
, /**/ZEND_ACC_PUBLIC
| ZEND_ACC_CTOR
)
645 PHP_ME(CairoSurfacePattern
, getFilter
, NULL
, /**/ZEND_ACC_PUBLIC
)
646 PHP_ME(CairoSurfacePattern
, getSurface
, NULL
, /**/ZEND_ACC_PUBLIC
)
647 PHP_ME(CairoSurfacePattern
, setFilter
, CairoSurfacePattern__set_filter_args
, /**/ZEND_ACC_PUBLIC
)
653 static zend_object_handlers CairoSurfacePattern_handlers
;
655 static zend_object_value
CairoSurfacePattern_object_new(zend_class_entry
*ce TSRMLS_CC
)
657 zend_object_value retval
;
658 retval
= CairoPattern_object_new(ce TSRMLS_CC
);
659 retval
.handlers
= &CairoSurfacePattern_handlers
;
663 static void class_init_CairoSurfacePattern(void)
666 INIT_CLASS_ENTRY(ce
, "CairoSurfacePattern", CairoSurfacePattern_methods
);
667 CairoSurfacePattern_ce_ptr
= zend_register_internal_class_ex(&ce
, CairoPattern_ce_ptr
, "CairoPattern" TSRMLS_CC
);
668 CairoSurfacePattern_ce_ptr
->create_object
= CairoSurfacePattern_object_new
;
669 memcpy(&CairoSurfacePattern_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
673 /* }}} Class CairoSurfacePattern */
675 /* {{{ Helper functions */
678 get_CairoPattern_ce_ptr(cairo_pattern_t
*pattern
)
680 zend_class_entry
*type
;
683 switch(cairo_pattern_get_type(pattern
)) {
684 case CAIRO_PATTERN_TYPE_SOLID
:
685 type
= CairoSolidPattern_ce_ptr
;
687 case CAIRO_PATTERN_TYPE_SURFACE
:
688 type
= CairoSurfacePattern_ce_ptr
;
690 case CAIRO_PATTERN_TYPE_LINEAR
:
691 type
= CairoLinearGradient_ce_ptr
;
693 case CAIRO_PATTERN_TYPE_RADIAL
:
694 type
= CairoRadialGradient_ce_ptr
;
697 php_error(E_ERROR
,"Unsupported Pattern");
702 /* }}} Helper functions */