static bool HHVM_METHOD(ImagickDraw, affine, const Array& affine) { auto wand = getDrawingWandResource(Object{this_}); AffineMatrix affineMatrix; getAffineMatrixElement(affine, s_sx, affineMatrix.sx); getAffineMatrixElement(affine, s_rx, affineMatrix.rx); getAffineMatrixElement(affine, s_ry, affineMatrix.ry); getAffineMatrixElement(affine, s_sy, affineMatrix.sy); getAffineMatrixElement(affine, s_tx, affineMatrix.tx); getAffineMatrixElement(affine, s_ty, affineMatrix.ty); DrawAffine(wand->getWand(), &affineMatrix); return true; }
MAGICK_NET_EXPORT void DrawingWand_Affine(DrawingWand *instance, const double scaleX, const double scaleY, const double shearX, const double shearY, const double translateX, const double translateY, ExceptionInfo **exception) { AffineMatrix matrix; matrix.sx = scaleX; matrix.sy = scaleY; matrix.rx = shearX; matrix.ry = shearY; matrix.tx = translateX; matrix.ty = translateY; DrawAffine(instance, &matrix); MAGICK_NET_SET_DRAW_EXCEPTION; }
/* {{{ proto bool GmagickDraw::affine(array affine) Adjusts the current affine transformation matrix with the specified affine transformation matrix. Note that the current affine transform is adjusted rather than replaced. */ PHP_METHOD(gmagickdraw, affine) { php_gmagickdraw_object *internd; zval *affine_matrix, **ppzval; HashTable *affine; char *matrix_elements[] = { "sx", "rx", "ry", "sy", "tx", "ty" }; int i; double value; AffineMatrix *pmatrix; /* Parse parameters given to function */ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &affine_matrix) == FAILURE) { return; } /* Allocate space to build matrix */ pmatrix = emalloc(sizeof(AffineMatrix)); affine = Z_ARRVAL_P(affine_matrix); zend_hash_internal_pointer_reset_ex(affine, (HashPosition *) 0); for (i = 0; i < 6 ; i++) { if (zend_hash_find(affine, matrix_elements[i], 3, (void**)&ppzval) == FAILURE) { efree(pmatrix); GMAGICK_THROW_EXCEPTION_WITH_MESSAGE(GMAGICKDRAW_CLASS, "AffineMatrix should contain keys: sx, rx, ry, sy, tx and ty", 2); } else { zval tmp_zval, *tmp_pzval; tmp_zval = **ppzval; zval_copy_ctor(&tmp_zval); tmp_pzval = &tmp_zval; convert_to_double(tmp_pzval); value = Z_DVAL(tmp_zval); if (strcmp(matrix_elements[i], "sx") == 0) { pmatrix->sx = value; } else if (strcmp(matrix_elements[i], "rx") == 0) { pmatrix->rx = value; } else if (strcmp(matrix_elements[i], "ry") == 0) { pmatrix->ry = value; } else if (strcmp(matrix_elements[i], "sy") == 0) { pmatrix->sy = value; } else if (strcmp(matrix_elements[i], "tx") == 0) { pmatrix->tx = value; } else if (strcmp(matrix_elements[i], "ty") == 0) { pmatrix->ty = value; } } } internd = (php_gmagickdraw_object *) zend_object_store_get_object(getThis() TSRMLS_CC); DrawAffine(internd->drawing_wand, pmatrix); efree(pmatrix); RETURN_TRUE; }