hphp/runtime/ext/imagick/imagickdraw.cpp (865 lines of code) (raw):
/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
| Copyright (c) 1997-2010 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.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. |
+----------------------------------------------------------------------+
*/
#include "hphp/runtime/ext/imagick/ext_imagick.h"
#include <sstream>
namespace HPHP {
#define IMAGICKDRAW_THROW imagickThrow<ImagickDrawException>
using CUCString = const unsigned char*;
//////////////////////////////////////////////////////////////////////////////
// class ImagickDraw
ALWAYS_INLINE
static void getAffineMatrixElement(
const Array& array, const String& key, double& ret) {
auto const value = array.lookup(key);
if (isNullType(value.type())) {
IMAGICKDRAW_THROW(
"AffineMatrix must contain keys: sx, rx, ry, sy, tx and ty");
} else {
ret = tvCastToDouble(value);
}
}
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;
}
static bool HHVM_METHOD(ImagickDraw, annotation,
double x, double y, const String& text) {
auto wand = getDrawingWandResource(Object{this_});
DrawAnnotation(wand->getWand(), x, y, (CUCString)text.c_str());
return true;
}
static bool HHVM_METHOD(ImagickDraw, arc, double sx, double sy,
double ex, double ey,
double sd, double ed) {
auto wand = getDrawingWandResource(Object{this_});
DrawArc(wand->getWand(), sx, sy, ex, ey, sd, ed);
return true;
}
static bool HHVM_METHOD(ImagickDraw, bezier,
const Array& coordinates) {
auto wand = getDrawingWandResource(Object{this_});
auto points = toPointInfoArray(coordinates);
if (points.empty()) {
IMAGICKDRAW_THROW("Unable to read coordinate array");
}
DrawBezier(wand->getWand(), points.size(), points.data());
return true;
}
static bool HHVM_METHOD(ImagickDraw, circle,
double ox, double oy, double px, double py) {
auto wand = getDrawingWandResource(Object{this_});
DrawCircle(wand->getWand(), ox, oy, px, py);
return true;
}
static bool HHVM_METHOD(ImagickDraw, clear) {
auto wand = getDrawingWandResource(Object{this_});
ClearDrawingWand(wand->getWand());
return true;
}
static void HHVM_METHOD(ImagickDraw, __clone) {
auto wand = getDrawingWandResource(Object{this_});
auto newWand = CloneDrawingWand(wand->getWand());
if (newWand == nullptr) {
IMAGICKDRAW_THROW("Failed to allocate DrawingWand structure");
} else {
setWandResource(s_ImagickDraw, Object{this_}, newWand);
}
}
static bool HHVM_METHOD(ImagickDraw, color,
double x, double y, int64_t paintMethod) {
auto wand = getDrawingWandResource(Object{this_});
DrawColor(wand->getWand(), x, y, (PaintMethod)paintMethod);
return true;
}
static bool HHVM_METHOD(ImagickDraw, comment,
const String& comment) {
auto wand = getDrawingWandResource(Object{this_});
DrawComment(wand->getWand(), comment.c_str());
return true;
}
static bool HHVM_METHOD(ImagickDraw, composite,
int64_t compose,
double x, double y, double width, double height,
const Object& compositeWand) {
auto wand = getDrawingWandResource(Object{this_});
Object compositeWandObj(compositeWand);
auto magick = getMagickWandResource(compositeWandObj);
auto status = DrawComposite(wand->getWand(), (CompositeOperator)compose,
x, y, width, height, magick->getWand());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Compositing image failed");
}
return true;
}
static void HHVM_METHOD(ImagickDraw, __construct) {
auto wand = NewDrawingWand();
if (wand == nullptr) {
IMAGICKDRAW_THROW("Failed to create ImagickDraw object");
} else {
setWandResource(s_ImagickDraw, Object{this_}, wand);
}
}
static bool HHVM_METHOD(ImagickDraw, destroy) {
return HHVM_MN(ImagickDraw, clear)(this_);
}
static bool HHVM_METHOD(ImagickDraw, ellipse,
double ox, double oy, double rx, double ry,
double start, double end) {
auto wand = getDrawingWandResource(Object{this_});
DrawEllipse(wand->getWand(), ox, oy, rx, ry, start, end);
return true;
}
static String HHVM_METHOD(ImagickDraw, getClipPath) {
auto wand = getDrawingWandResource(Object{this_});
return convertMagickString(DrawGetClipPath(wand->getWand()));
}
static int64_t HHVM_METHOD(ImagickDraw, getClipRule) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetClipRule(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getClipUnits) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetClipUnits(wand->getWand());
}
static Object HHVM_METHOD(ImagickDraw, getFillColor) {
auto wand = getDrawingWandResource(Object{this_});
auto pixel = NewPixelWand();
DrawGetFillColor(wand->getWand(), pixel);
return createImagickPixel(pixel);
}
static double HHVM_METHOD(ImagickDraw, getFillOpacity) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetFillOpacity(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getFillRule) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetFillRule(wand->getWand());
}
static String HHVM_METHOD(ImagickDraw, getFont) {
auto wand = getDrawingWandResource(Object{this_});
return convertMagickString(DrawGetFont(wand->getWand()));
}
static String HHVM_METHOD(ImagickDraw, getFontFamily) {
auto wand = getDrawingWandResource(Object{this_});
return convertMagickString(DrawGetFontFamily(wand->getWand()));
}
static double HHVM_METHOD(ImagickDraw, getFontSize) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetFontSize(wand->getWand());
}
static int HHVM_METHOD(ImagickDraw, getFontStretch) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetFontStretch(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getFontStyle) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetFontStyle(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getFontWeight) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetFontWeight(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getGravity) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetGravity(wand->getWand());
}
static bool HHVM_METHOD(ImagickDraw, getStrokeAntialias) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeAntialias(wand->getWand()) != MagickFalse;
}
static Object HHVM_METHOD(ImagickDraw, getStrokeColor) {
auto wand = getDrawingWandResource(Object{this_});
auto pixel = NewPixelWand();
DrawGetStrokeColor(wand->getWand(), pixel);
return createImagickPixel(pixel);
}
static Array HHVM_METHOD(ImagickDraw, getStrokeDashArray) {
auto wand = getDrawingWandResource(Object{this_});
size_t num;
double* arr = DrawGetStrokeDashArray(wand->getWand(), &num);
return convertMagickArray(num, arr);
}
static double HHVM_METHOD(ImagickDraw, getStrokeDashOffset) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeDashOffset(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getStrokeLineCap) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeLineCap(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getStrokeLineJoin) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeLineJoin(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getStrokeMiterLimit) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeMiterLimit(wand->getWand());
}
static double HHVM_METHOD(ImagickDraw, getStrokeOpacity) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeOpacity(wand->getWand());
}
static double HHVM_METHOD(ImagickDraw, getStrokeWidth) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetStrokeWidth(wand->getWand());
}
static int64_t HHVM_METHOD(ImagickDraw, getTextAlignment) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetTextAlignment(wand->getWand());
}
static bool HHVM_METHOD(ImagickDraw, getTextAntialias) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetTextAntialias(wand->getWand()) != MagickFalse;
}
static int64_t HHVM_METHOD(ImagickDraw, getTextDecoration) {
auto wand = getDrawingWandResource(Object{this_});
return DrawGetTextDecoration(wand->getWand());
}
static String HHVM_METHOD(ImagickDraw, getTextEncoding) {
auto wand = getDrawingWandResource(Object{this_});
return convertMagickString(DrawGetTextEncoding(wand->getWand()));
}
static Object HHVM_METHOD(ImagickDraw, getTextUnderColor) {
auto wand = getDrawingWandResource(Object{this_});
auto pixel = NewPixelWand();
DrawGetTextUnderColor(wand->getWand(), pixel);
return createImagickPixel(pixel);
}
static String HHVM_METHOD(ImagickDraw, getVectorGraphics) {
auto wand = getDrawingWandResource(Object{this_});
return convertMagickString(DrawGetVectorGraphics(wand->getWand()));
}
static bool HHVM_METHOD(ImagickDraw, line,
double sx, double sy, double ex, double ey) {
auto wand = getDrawingWandResource(Object{this_});
DrawLine(wand->getWand(), sx, sy, ex, ey);
return true;
}
static bool HHVM_METHOD(ImagickDraw, matte,
double x, double y, int64_t paintMethod) {
auto wand = getDrawingWandResource(Object{this_});
DrawMatte(wand->getWand(), x, y, (PaintMethod)paintMethod);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathClose) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathClose(wand->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToAbsolute,
double x1, double y1, double x2, double y2,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToAbsolute(wand->getWand(), x1, y1, x2, y2, x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToQuadraticBezierAbsolute,
double x1, double y1, double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToQuadraticBezierAbsolute(wand->getWand(), x1, y1, x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToQuadraticBezierRelative,
double x1, double y1, double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToQuadraticBezierRelative(wand->getWand(), x1, y1, x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToQuadraticBezierSmoothAbsolute,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToQuadraticBezierSmoothAbsolute(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToQuadraticBezierSmoothRelative,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToQuadraticBezierSmoothRelative(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToRelative,
double x1, double y1, double x2, double y2,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToRelative(wand->getWand(), x1, y1, x2, y2, x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToSmoothAbsolute,
double x2, double y2, double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToSmoothAbsolute(wand->getWand(), x2, y2, x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathCurveToSmoothRelative,
double x2, double y2, double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathCurveToSmoothRelative(wand->getWand(), x2, y2, x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathEllipticArcAbsolute,
double rx, double ry, double x_axis_rotation,
bool large_arc_flag, bool sweep_flag,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathEllipticArcAbsolute(wand->getWand(), rx, ry, x_axis_rotation,
toMagickBool(large_arc_flag), toMagickBool(sweep_flag), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathEllipticArcRelative,
double rx, double ry, double x_axis_rotation,
bool large_arc_flag, bool sweep_flag,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathEllipticArcRelative(wand->getWand(), rx, ry, x_axis_rotation,
toMagickBool(large_arc_flag), toMagickBool(sweep_flag), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathFinish) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathFinish(wand->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathLineToAbsolute,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathLineToAbsolute(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathLineToHorizontalAbsolute, double x) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathLineToHorizontalAbsolute(wand->getWand(), x);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathLineToHorizontalRelative, double x) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathLineToHorizontalRelative(wand->getWand(), x);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathLineToRelative,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathLineToRelative(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathLineToVerticalAbsolute, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathLineToVerticalAbsolute(wand->getWand(), y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathLineToVerticalRelative, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathLineToVerticalRelative(wand->getWand(), y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathMoveToAbsolute,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathMoveToAbsolute(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathMoveToRelative,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathMoveToRelative(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, pathStart) {
auto wand = getDrawingWandResource(Object{this_});
DrawPathStart(wand->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, point,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawPoint(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, polygon,
const Array& coordinates) {
auto wand = getDrawingWandResource(Object{this_});
auto points = toPointInfoArray(coordinates);
if (points.empty()) {
IMAGICKDRAW_THROW("Unable to read coordinate array");
}
DrawPolygon(wand->getWand(), points.size(), points.data());
return true;
}
static bool HHVM_METHOD(ImagickDraw, polyline,
const Array& coordinates) {
auto wand = getDrawingWandResource(Object{this_});
auto points = toPointInfoArray(coordinates);
if (points.empty()) {
IMAGICKDRAW_THROW("Unable to read coordinate array");
}
DrawPolyline(wand->getWand(), points.size(), points.data());
return true;
}
static bool HHVM_METHOD(ImagickDraw, pop) {
auto wand = getDrawingWandResource(Object{this_});
auto status = PopDrawingWand(wand->getWand());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to pop the current ImagickDraw object");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, popClipPath) {
auto wand = getDrawingWandResource(Object{this_});
DrawPopClipPath(wand->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, popDefs) {
auto wand = getDrawingWandResource(Object{this_});
DrawPopDefs(wand->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, popPattern) {
auto wand = getDrawingWandResource(Object{this_});
auto status = DrawPopPattern(wand->getWand());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to terminate the pattern definition");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, push) {
auto wand = getDrawingWandResource(Object{this_});
auto status = PushDrawingWand(wand->getWand());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to push the current ImagickDraw object");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, pushClipPath,
const String& clip_mask_id) {
auto wand = getDrawingWandResource(Object{this_});
DrawPushClipPath(wand->getWand(), clip_mask_id.c_str());
return true;
}
static bool HHVM_METHOD(ImagickDraw, pushDefs) {
auto wand = getDrawingWandResource(Object{this_});
DrawPushDefs(wand->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, pushPattern,
const String& pattern_id, double x, double y, double width, double height) {
auto wand = getDrawingWandResource(Object{this_});
DrawPushPattern(wand->getWand(), pattern_id.c_str(), x, y, width, height);
return true;
}
static bool HHVM_METHOD(ImagickDraw, rectangle,
double x1, double y1, double x2, double y2) {
auto wand = getDrawingWandResource(Object{this_});
DrawRectangle(wand->getWand(), x1, y1, x2, y2);
return true;
}
static bool HHVM_METHOD(ImagickDraw, render) {
auto wand = getDrawingWandResource(Object{this_});
auto status = withMagickLocaleFix([&wand]{
return DrawRender(wand->getWand());
});
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to render the drawing commands");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, rotate, double degrees) {
auto wand = getDrawingWandResource(Object{this_});
DrawRotate(wand->getWand(), degrees);
return true;
}
static bool HHVM_METHOD(ImagickDraw, roundRectangle,
double x1, double y1, double x2, double y2,
double rx, double ry) {
auto wand = getDrawingWandResource(Object{this_});
DrawRoundRectangle(wand->getWand(), x1, y1, x2, y2, rx, ry);
return true;
}
static bool HHVM_METHOD(ImagickDraw, scale,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawScale(wand->getWand(), x, y);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setClipPath,
const String& clip_mask) {
auto wand = getDrawingWandResource(Object{this_});
auto status = DrawSetClipPath(wand->getWand(), clip_mask.c_str());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to set clipping path");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, setClipRule,
int64_t fill_rule) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetClipRule(wand->getWand(), (FillRule)fill_rule);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setClipUnits,
int64_t clip_units) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetClipUnits(wand->getWand(), (ClipPathUnits)clip_units);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFillAlpha, double opacity) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetFillOpacity(wand->getWand(), opacity);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFillColor,
const Variant& fill_pixel) {
auto wand = getDrawingWandResource(Object{this_});
auto pixel(buildColorWand(fill_pixel));
DrawSetFillColor(wand->getWand(), pixel->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFillOpacity,
double fillOpacity) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetFillOpacity(wand->getWand(), fillOpacity);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFillPatternURL,
const String& fill_url) {
auto wand = getDrawingWandResource(Object{this_});
auto status = DrawSetFillPatternURL(wand->getWand(), fill_url.c_str());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to set fill pattern URL");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFillRule,
int64_t fill_rule) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetFillRule(wand->getWand(), (FillRule)fill_rule);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFont,
const String& font_name) {
auto wand = getDrawingWandResource(Object{this_});
if (font_name.empty()) {
IMAGICKDRAW_THROW("Can not set empty font");
}
auto font = magickResolveFont(font_name);
if (font.isNull()) {
IMAGICKDRAW_THROW("Unable to set font, file path expansion failed");
}
auto status = DrawSetFont(wand->getWand(), font.c_str());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to set font");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFontFamily,
const String& font_family) {
auto wand = getDrawingWandResource(Object{this_});
if (font_family.empty()) {
IMAGICKDRAW_THROW("Can not set empty font family");
}
auto status = DrawSetFontFamily(wand->getWand(), font_family.c_str());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to set font family");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFontSize, double pointsize) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetFontSize(wand->getWand(), pointsize);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFontStretch,
int64_t fontStretch) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetFontStretch(wand->getWand(), (StretchType)fontStretch);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFontStyle, int64_t style) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetFontStyle(wand->getWand(), (StyleType)style);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setFontWeight,
int64_t font_weight) {
auto wand = getDrawingWandResource(Object{this_});
if (100 <= font_weight && font_weight <= 900) {
DrawSetFontWeight(wand->getWand(), font_weight);
return true;
} else {
IMAGICKDRAW_THROW("Font weight valid range is 100-900");
}
}
static bool HHVM_METHOD(ImagickDraw, setGravity, int64_t gravity) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetGravity(wand->getWand(), (GravityType)gravity);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setResolution,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
std::ostringstream density;
density << x << "x" << y;
auto drawInfo = PeekDrawingWand(wand->getWand());
drawInfo->density = AcquireString(density.str().c_str());
auto drawWand = DrawAllocateWand(drawInfo, nullptr);
if (drawWand == nullptr) {
IMAGICKDRAW_THROW("Failed to allocate new DrawingWand structure");
}
setWandResource(s_ImagickDraw, Object{this_}, drawWand);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeAlpha, double opacity) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeOpacity(wand->getWand(), opacity);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeAntialias,
bool stroke_antialias) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeAntialias(wand->getWand(), toMagickBool(stroke_antialias));
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeColor,
const Variant& stroke_pixel) {
auto wand = getDrawingWandResource(Object{this_});
auto pixel(buildColorWand(stroke_pixel));
DrawSetStrokeColor(wand->getWand(), pixel->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeDashArray,
const Array& dashArray) {
auto wand = getDrawingWandResource(Object{this_});
auto dashes = toDoubleArray(dashArray);
if (dashes.empty()) {
IMAGICKDRAW_THROW("Cannot read stroke dash array parameter");
}
DrawSetStrokeDashArray(wand->getWand(), dashes.size(), dashes.data());
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeDashOffset,
double dash_offset) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeDashOffset(wand->getWand(), dash_offset);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeLineCap, int64_t linecap) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeLineCap(wand->getWand(), (LineCap)linecap);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeLineJoin, int64_t linejoin) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeLineJoin(wand->getWand(), (LineJoin)linejoin);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeMiterLimit,
int64_t miterlimit) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeMiterLimit(wand->getWand(), miterlimit);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeOpacity,
double stroke_opacity) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeOpacity(wand->getWand(), stroke_opacity);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokePatternURL,
const String& stroke_url) {
auto wand = getDrawingWandResource(Object{this_});
auto status = DrawSetStrokePatternURL(wand->getWand(), stroke_url.c_str());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to set stroke pattern URL");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, setStrokeWidth,
double stroke_width) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetStrokeWidth(wand->getWand(), stroke_width);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setTextAlignment,
int64_t alignment) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetTextAlignment(wand->getWand(), (AlignType)alignment);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setTextAntialias, bool antiAlias) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetTextAntialias(wand->getWand(), toMagickBool(antiAlias));
return true;
}
static bool HHVM_METHOD(ImagickDraw, setTextDecoration,
int64_t decoration) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetTextDecoration(wand->getWand(), (DecorationType)decoration);
return true;
}
static bool HHVM_METHOD(ImagickDraw, setTextEncoding,
const String& encoding) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetTextEncoding(wand->getWand(), encoding.c_str());
return true;
}
static bool HHVM_METHOD(ImagickDraw, setTextUnderColor,
const Variant& under_color) {
auto wand = getDrawingWandResource(Object{this_});
auto pixel(buildColorWand(under_color));
DrawSetTextUnderColor(wand->getWand(), pixel->getWand());
return true;
}
static bool HHVM_METHOD(ImagickDraw, setVectorGraphics,
const String& xml) {
auto wand = getDrawingWandResource(Object{this_});
auto status = DrawSetVectorGraphics(wand->getWand(), xml.c_str());
if (status == MagickFalse) {
IMAGICKDRAW_THROW("Unable to set the vector graphics");
}
return true;
}
static bool HHVM_METHOD(ImagickDraw, setViewbox,
int64_t x1, int64_t y1, int64_t x2, int64_t y2) {
auto wand = getDrawingWandResource(Object{this_});
DrawSetViewbox(wand->getWand(), x1, y1, x2, y2);
return true;
}
static bool HHVM_METHOD(ImagickDraw, skewX, double degrees) {
auto wand = getDrawingWandResource(Object{this_});
DrawSkewX(wand->getWand(), degrees);
return true;
}
static bool HHVM_METHOD(ImagickDraw, skewY, double degrees) {
auto wand = getDrawingWandResource(Object{this_});
DrawSkewY(wand->getWand(), degrees);
return true;
}
static bool HHVM_METHOD(ImagickDraw, translate,
double x, double y) {
auto wand = getDrawingWandResource(Object{this_});
DrawTranslate(wand->getWand(), x, y);
return true;
}
#undef IMAGICKDRAW_THROW
void ImagickExtension::loadImagickDrawClass() {
HHVM_ME(ImagickDraw, affine);
HHVM_ME(ImagickDraw, annotation);
HHVM_ME(ImagickDraw, arc);
HHVM_ME(ImagickDraw, bezier);
HHVM_ME(ImagickDraw, circle);
HHVM_ME(ImagickDraw, clear);
HHVM_ME(ImagickDraw, __clone);
HHVM_ME(ImagickDraw, color);
HHVM_ME(ImagickDraw, comment);
HHVM_ME(ImagickDraw, composite);
HHVM_ME(ImagickDraw, __construct);
HHVM_ME(ImagickDraw, destroy);
HHVM_ME(ImagickDraw, ellipse);
HHVM_ME(ImagickDraw, getClipPath);
HHVM_ME(ImagickDraw, getClipRule);
HHVM_ME(ImagickDraw, getClipUnits);
HHVM_ME(ImagickDraw, getFillColor);
HHVM_ME(ImagickDraw, getFillOpacity);
HHVM_ME(ImagickDraw, getFillRule);
HHVM_ME(ImagickDraw, getFont);
HHVM_ME(ImagickDraw, getFontFamily);
HHVM_ME(ImagickDraw, getFontSize);
HHVM_ME(ImagickDraw, getFontStretch);
HHVM_ME(ImagickDraw, getFontStyle);
HHVM_ME(ImagickDraw, getFontWeight);
HHVM_ME(ImagickDraw, getGravity);
HHVM_ME(ImagickDraw, getStrokeAntialias);
HHVM_ME(ImagickDraw, getStrokeColor);
HHVM_ME(ImagickDraw, getStrokeDashArray);
HHVM_ME(ImagickDraw, getStrokeDashOffset);
HHVM_ME(ImagickDraw, getStrokeLineCap);
HHVM_ME(ImagickDraw, getStrokeLineJoin);
HHVM_ME(ImagickDraw, getStrokeMiterLimit);
HHVM_ME(ImagickDraw, getStrokeOpacity);
HHVM_ME(ImagickDraw, getStrokeWidth);
HHVM_ME(ImagickDraw, getTextAlignment);
HHVM_ME(ImagickDraw, getTextAntialias);
HHVM_ME(ImagickDraw, getTextDecoration);
HHVM_ME(ImagickDraw, getTextEncoding);
HHVM_ME(ImagickDraw, getTextUnderColor);
HHVM_ME(ImagickDraw, getVectorGraphics);
HHVM_ME(ImagickDraw, line);
HHVM_ME(ImagickDraw, matte);
HHVM_ME(ImagickDraw, pathClose);
HHVM_ME(ImagickDraw, pathCurveToAbsolute);
HHVM_ME(ImagickDraw, pathCurveToQuadraticBezierAbsolute);
HHVM_ME(ImagickDraw, pathCurveToQuadraticBezierRelative);
HHVM_ME(ImagickDraw, pathCurveToQuadraticBezierSmoothAbsolute);
HHVM_ME(ImagickDraw, pathCurveToQuadraticBezierSmoothRelative);
HHVM_ME(ImagickDraw, pathCurveToRelative);
HHVM_ME(ImagickDraw, pathCurveToSmoothAbsolute);
HHVM_ME(ImagickDraw, pathCurveToSmoothRelative);
HHVM_ME(ImagickDraw, pathEllipticArcAbsolute);
HHVM_ME(ImagickDraw, pathEllipticArcRelative);
HHVM_ME(ImagickDraw, pathFinish);
HHVM_ME(ImagickDraw, pathLineToAbsolute);
HHVM_ME(ImagickDraw, pathLineToHorizontalAbsolute);
HHVM_ME(ImagickDraw, pathLineToHorizontalRelative);
HHVM_ME(ImagickDraw, pathLineToRelative);
HHVM_ME(ImagickDraw, pathLineToVerticalAbsolute);
HHVM_ME(ImagickDraw, pathLineToVerticalRelative);
HHVM_ME(ImagickDraw, pathMoveToAbsolute);
HHVM_ME(ImagickDraw, pathMoveToRelative);
HHVM_ME(ImagickDraw, pathStart);
HHVM_ME(ImagickDraw, point);
HHVM_ME(ImagickDraw, polygon);
HHVM_ME(ImagickDraw, polyline);
HHVM_ME(ImagickDraw, pop);
HHVM_ME(ImagickDraw, popClipPath);
HHVM_ME(ImagickDraw, popDefs);
HHVM_ME(ImagickDraw, popPattern);
HHVM_ME(ImagickDraw, push);
HHVM_ME(ImagickDraw, pushClipPath);
HHVM_ME(ImagickDraw, pushDefs);
HHVM_ME(ImagickDraw, pushPattern);
HHVM_ME(ImagickDraw, rectangle);
HHVM_ME(ImagickDraw, render);
HHVM_ME(ImagickDraw, rotate);
HHVM_ME(ImagickDraw, roundRectangle);
HHVM_ME(ImagickDraw, scale);
HHVM_ME(ImagickDraw, setClipPath);
HHVM_ME(ImagickDraw, setClipRule);
HHVM_ME(ImagickDraw, setClipUnits);
HHVM_ME(ImagickDraw, setFillAlpha);
HHVM_ME(ImagickDraw, setFillColor);
HHVM_ME(ImagickDraw, setFillOpacity);
HHVM_ME(ImagickDraw, setFillPatternURL);
HHVM_ME(ImagickDraw, setFillRule);
HHVM_ME(ImagickDraw, setFont);
HHVM_ME(ImagickDraw, setFontFamily);
HHVM_ME(ImagickDraw, setFontSize);
HHVM_ME(ImagickDraw, setFontStretch);
HHVM_ME(ImagickDraw, setFontStyle);
HHVM_ME(ImagickDraw, setFontWeight);
HHVM_ME(ImagickDraw, setGravity);
HHVM_ME(ImagickDraw, setResolution);
HHVM_ME(ImagickDraw, setStrokeAlpha);
HHVM_ME(ImagickDraw, setStrokeAntialias);
HHVM_ME(ImagickDraw, setStrokeColor);
HHVM_ME(ImagickDraw, setStrokeDashArray);
HHVM_ME(ImagickDraw, setStrokeDashOffset);
HHVM_ME(ImagickDraw, setStrokeLineCap);
HHVM_ME(ImagickDraw, setStrokeLineJoin);
HHVM_ME(ImagickDraw, setStrokeMiterLimit);
HHVM_ME(ImagickDraw, setStrokeOpacity);
HHVM_ME(ImagickDraw, setStrokePatternURL);
HHVM_ME(ImagickDraw, setStrokeWidth);
HHVM_ME(ImagickDraw, setTextAlignment);
HHVM_ME(ImagickDraw, setTextAntialias);
HHVM_ME(ImagickDraw, setTextDecoration);
HHVM_ME(ImagickDraw, setTextEncoding);
HHVM_ME(ImagickDraw, setTextUnderColor);
HHVM_ME(ImagickDraw, setVectorGraphics);
HHVM_ME(ImagickDraw, setViewbox);
HHVM_ME(ImagickDraw, skewX);
HHVM_ME(ImagickDraw, skewY);
HHVM_ME(ImagickDraw, translate);
}
//////////////////////////////////////////////////////////////////////////////
} // namespace HPHP