Browse Source

Partial TextMetrics support.

v1.x
c-spencer 13 years ago
parent
commit
e06ed99dec
  1. 44
      src/CanvasRenderingContext2d.cc

44
src/CanvasRenderingContext2d.cc

@ -1667,6 +1667,9 @@ Context2d::SetFont(const Arguments &args) {
/*
* Return the given text extents.
* TODO: Support for:
* hangingBaseline, ideographicBaseline,
* fontBoundingBoxAscent, fontBoundingBoxDescent
*/
Handle<Value>
@ -1680,9 +1683,50 @@ Context2d::MeasureText(const Arguments &args) {
Local<Object> obj = Object::New();
cairo_text_extents_t te;
cairo_font_extents_t fe;
cairo_text_extents(ctx, *str, &te);
cairo_font_extents(ctx, &fe);
obj->Set(String::New("width"), Number::New(te.x_advance));
double x_offset;
switch (context->state->textAlignment) {
case 0: // center
x_offset = te.width / 2;
break;
case 1: // right
x_offset = te.width;
break;
default: // left
x_offset = 0.0;
}
obj->Set(String::New("actualBoundingBoxLeft"), Number::New(x_offset - te.x_bearing));
obj->Set(String::New("actualBoundingBoxRight"), Number::New((te.x_bearing + te.width) - x_offset));
double y_offset;
switch (context->state->textBaseline) {
case TEXT_BASELINE_TOP:
case TEXT_BASELINE_HANGING:
y_offset = fe.ascent;
break;
case TEXT_BASELINE_MIDDLE:
y_offset = fe.ascent/2;
break;
case TEXT_BASELINE_BOTTOM:
y_offset = -fe.descent;
break;
default:
y_offset = 0.0;
}
obj->Set(String::New("actualBoundingBoxAscent"), Number::New(-(te.y_bearing + y_offset)));
obj->Set(String::New("actualBoundingBoxDescent"), Number::New(te.height + te.y_bearing + y_offset));
obj->Set(String::New("emHeightAscent"), Number::New(fe.ascent - y_offset));
obj->Set(String::New("emHeightDescent"), Number::New(fe.descent + y_offset));
obj->Set(String::New("alphabeticBaseline"), Number::New(-y_offset));
return scope.Close(obj);
}

Loading…
Cancel
Save