diff --git a/lib/canvas.js b/lib/canvas.js index 5c6385f..99cf0b7 100644 --- a/lib/canvas.js +++ b/lib/canvas.js @@ -500,4 +500,40 @@ Context2d.prototype.__defineSetter__('font', function(val){ Context2d.prototype.__defineGetter__('font', function(){ return this.lastFontString || '10px sans-serif'; +}); + +/** + * Set text alignment. + * + * @api public + */ + +Context2d.prototype.__defineSetter__('textAlign', function(val){ + switch (val) { + case 'center': + this.setTextAlignment(0); + this.lastTextAlignment = val; + break; + case 'left': + case 'start': + this.setTextAlignment(-1); + this.lastTextAlignment = val; + break; + case 'right': + case 'end': + this.setTextAlignment(1); + this.lastTextAlignment = val; + break; + } +}); + +/** + * Get the current font. + * + * @see exports.parseFont() + * @api public + */ + +Context2d.prototype.__defineGetter__('textAlign', function(){ + return this.lastTextAlignment || 'start'; }); \ No newline at end of file diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index bfc51de..9dca222 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -88,6 +88,7 @@ Context2d::Initialize(Handle<Object> target) { NODE_SET_PROTOTYPE_METHOD(t, "strokeRect", StrokeRect); NODE_SET_PROTOTYPE_METHOD(t, "clearRect", ClearRect); NODE_SET_PROTOTYPE_METHOD(t, "rect", Rect); + NODE_SET_PROTOTYPE_METHOD(t, "setTextAlignment", SetTextAlignment); NODE_SET_PROTOTYPE_METHOD(t, "setTextPath", SetTextPath); NODE_SET_PROTOTYPE_METHOD(t, "measureText", MeasureText); NODE_SET_PROTOTYPE_METHOD(t, "moveTo", MoveTo); @@ -139,6 +140,7 @@ Context2d::Context2d(Canvas *canvas): ObjectWrap() { shadowBlur = shadowOffsetX = shadowOffsetY = 0; state = states[stateno = 0] = (canvas_state_t *) malloc(sizeof(canvas_state_t)); state->globalAlpha = 1; + state->textAlignment -1; state->fillPattern = state->strokePattern = NULL; RGBA(state->fill,0,0,0,1); RGBA(state->stroke,0,0,0,1); @@ -866,6 +868,22 @@ Context2d::MeasureText(const Arguments &args) { return scope.Close(obj); } +/* + * Set text alignment. -1 0 1 + */ + +Handle<Value> +Context2d::SetTextAlignment(const Arguments &args) { + HandleScope scope; + + if (!args[0]->IsInt32()) return Undefined(); + Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This()); + context->state->textAlignment = args[0]->Int32Value(); + + return Undefined(); +} + + /* * Set text path at x, y. */ diff --git a/src/CanvasRenderingContext2d.h b/src/CanvasRenderingContext2d.h index 077bf7c..8e16de3 100644 --- a/src/CanvasRenderingContext2d.h +++ b/src/CanvasRenderingContext2d.h @@ -32,6 +32,7 @@ typedef struct { cairo_pattern_t *fillPattern; cairo_pattern_t *strokePattern; float globalAlpha; + short textAlignment; } canvas_state_t; class Context2d: public node::ObjectWrap { @@ -64,6 +65,7 @@ class Context2d: public node::ObjectWrap { static Handle<Value> SetShadowRGBA(const Arguments &args); static Handle<Value> SetFillPattern(const Arguments &args); static Handle<Value> SetStrokePattern(const Arguments &args); + static Handle<Value> SetTextAlignment(const Arguments &args); static Handle<Value> SetTextPath(const Arguments &args); static Handle<Value> MeasureText(const Arguments &args); static Handle<Value> BezierCurveTo(const Arguments &args);