| 763 | } |
| 764 | |
| 765 | GJS_JSAPI_RETURN_CONVENTION |
| 766 | static bool textExtents_func(JSContext* cx, unsigned argc, JS::Value* vp) { |
| 767 | GJS_CAIRO_CONTEXT_GET_PRIV_CR_CHECKED(cx, argc, vp, args, this_obj); |
| 768 | |
| 769 | JS::UniqueChars utf8; |
| 770 | if (!gjs_parse_call_args(cx, "textExtents", args, "s", "utf8", &utf8)) |
| 771 | return false; |
| 772 | |
| 773 | cairo_text_extents_t extents; |
| 774 | cairo_text_extents(cr, utf8.get(), &extents); |
| 775 | if (!gjs_cairo_check_status(cx, cairo_status(cr), "context")) |
| 776 | return false; |
| 777 | |
| 778 | JS::RootedObject extents_obj(cx, JS_NewPlainObject(cx)); |
| 779 | if (!extents_obj) |
| 780 | return false; |
| 781 | |
| 782 | JSPropertySpec properties[] = { |
| 783 | JS_DOUBLE_PS("xBearing", extents.x_bearing, JSPROP_ENUMERATE), |
| 784 | JS_DOUBLE_PS("yBearing", extents.y_bearing, JSPROP_ENUMERATE), |
| 785 | JS_DOUBLE_PS("width", extents.width, JSPROP_ENUMERATE), |
| 786 | JS_DOUBLE_PS("height", extents.height, JSPROP_ENUMERATE), |
| 787 | JS_DOUBLE_PS("xAdvance", extents.x_advance, JSPROP_ENUMERATE), |
| 788 | JS_DOUBLE_PS("yAdvance", extents.y_advance, JSPROP_ENUMERATE), |
| 789 | JS_PS_END}; |
| 790 | |
| 791 | if (!JS_DefineProperties(cx, extents_obj, properties)) |
| 792 | return false; |
| 793 | |
| 794 | args.rval().setObject(*extents_obj); |
| 795 | return true; |
| 796 | } |
| 797 | |
| 798 | GJS_JSAPI_RETURN_CONVENTION |
| 799 | static bool fontExtents_func(JSContext* cx, unsigned argc, JS::Value* vp) { |
nothing calls this directly
no test coverage detected