static duk_ret_t js_Font_drawZoomedText(duk_context* ctx) { int x = duk_require_int(ctx, 0); int y = duk_require_int(ctx, 1); float scale = duk_require_number(ctx, 2); const char* text = duk_to_string(ctx, 3); ALLEGRO_BITMAP* bitmap; font_t* font; color_t mask; int text_w, text_h; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); font = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_get_prop_string(ctx, -1, "\xFF" "color_mask"); mask = duk_require_sphere_color(ctx, -1); duk_pop(ctx); duk_pop(ctx); if (!is_skipped_frame()) { text_w = get_text_width(font, text); text_h = get_font_line_height(font); bitmap = al_create_bitmap(text_w, text_h); al_set_target_bitmap(bitmap); draw_text(font, mask, 0, 0, TEXT_ALIGN_LEFT, text); al_set_target_backbuffer(g_display); al_draw_scaled_bitmap(bitmap, 0, 0, text_w, text_h, x, y, text_w * scale, text_h * scale, 0x0); al_destroy_bitmap(bitmap); } return 0; }
static duk_ret_t js_Point(duk_context* ctx) { float x = duk_require_int(ctx, 0) + 0.5; float y = duk_require_int(ctx, 1) + 0.5; color_t color = duk_require_sphere_color(ctx, 2); if (!is_skipped_frame()) al_draw_pixel(x, y, nativecolor(color)); return 0; }
static duk_ret_t js_ApplyColorMask(duk_context* ctx) { color_t color = duk_require_sphere_color(ctx, 0); float rect_w, rect_h; rect_w = al_get_display_width(g_display); rect_h = al_get_display_height(g_display); if (!is_skipped_frame()) al_draw_filled_rectangle(0, 0, rect_w, rect_h, nativecolor(color)); return 0; }
static duk_ret_t js_Rectangle(duk_context* ctx) { int x = duk_require_int(ctx, 0); int y = duk_require_int(ctx, 1); int w = duk_require_int(ctx, 2); int h = duk_require_int(ctx, 3); color_t color = duk_require_sphere_color(ctx, 4); if (!is_skipped_frame()) al_draw_filled_rectangle(x, y, x + w, y + h, nativecolor(color)); return 0; }
static duk_ret_t js_Line(duk_context* ctx) { int x1 = duk_require_int(ctx, 0); int y1 = duk_require_int(ctx, 1); int x2 = duk_require_int(ctx, 2); int y2 = duk_require_int(ctx, 3); color_t color = duk_require_sphere_color(ctx, 4); if (!is_skipped_frame()) al_draw_line(x1, y1, x2, y2, nativecolor(color), 1); return 0; }
static duk_ret_t js_Triangle(duk_context* ctx) { int x1 = duk_require_int(ctx, 0); int y1 = duk_require_int(ctx, 1); int x2 = duk_require_int(ctx, 2); int y2 = duk_require_int(ctx, 3); int x3 = duk_require_int(ctx, 4); int y3 = duk_require_int(ctx, 5); color_t color = duk_require_sphere_color(ctx, 6); if (!is_skipped_frame()) al_draw_filled_triangle(x1, y1, x2, y2, x3, y3, nativecolor(color)); return 0; }
static duk_ret_t js_OutlinedRoundRectangle(duk_context* ctx) { int n_args = duk_get_top(ctx); float x = duk_require_int(ctx, 0) + 0.5; float y = duk_require_int(ctx, 1) + 0.5; int w = duk_require_int(ctx, 2); int h = duk_require_int(ctx, 3); float radius = duk_require_number(ctx, 4); color_t color = duk_require_sphere_color(ctx, 5); int thickness = n_args >= 7 ? duk_require_int(ctx, 6) : 1; if (!is_skipped_frame()) al_draw_rounded_rectangle(x, y, x + w - 1, y + h - 1, radius, radius, nativecolor(color), thickness); return 0; }
static duk_ret_t js_OutlinedCircle(duk_context* ctx) { bool antialiased = false; color_t color; int n_args; int x, y, radius; n_args = duk_get_top(ctx); x = duk_to_int(ctx, 0); y = duk_to_int(ctx, 1); radius = duk_to_int(ctx, 2); color = duk_require_sphere_color(ctx, 3); if (n_args >= 5) antialiased = duk_require_boolean(ctx, 4); if (!is_skipped_frame()) al_draw_circle(x, y, radius, nativecolor(color), 1); return 0; }
static duk_ret_t js_Font_drawText(duk_context* ctx) { int x = duk_require_int(ctx, 0); int y = duk_require_int(ctx, 1); const char* text = duk_to_string(ctx, 2); font_t* font; color_t mask; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); font = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_get_prop_string(ctx, -1, "\xFF" "color_mask"); mask = duk_require_sphere_color(ctx, -1); duk_pop(ctx); duk_pop(ctx); if (!is_skipped_frame()) draw_text(font, mask, x, y, TEXT_ALIGN_LEFT, text); return 0; }
static duk_ret_t js_GradientCircle(duk_context* ctx) { color_t inner_color; color_t outer_color; float radius; float x, y; x = (float)duk_require_number(ctx, 0); y = (float)duk_require_number(ctx, 1); radius = (float)duk_require_number(ctx, 2); inner_color = duk_require_sphere_color(ctx, 3); outer_color = duk_require_sphere_color(ctx, 4); // TODO: actually draw a gradient circle instead of a solid one if (!is_skipped_frame()) al_draw_filled_circle(x, y, radius, nativecolor(inner_color)); return 0; }
static duk_ret_t js_OutlinedRectangle(duk_context* ctx) { color_t color; int n_args; float x1, y1, x2, y2; n_args = duk_get_top(ctx); x1 = duk_to_int(ctx, 0) + 0.5; y1 = duk_to_int(ctx, 1) + 0.5; x2 = x1 + duk_to_int(ctx, 2) - 1; y2 = y1 + duk_to_int(ctx, 3) - 1; color = duk_require_sphere_color(ctx, 4); int thickness = n_args >= 6 ? duk_to_int(ctx, 5) : 1; if (!is_skipped_frame()) al_draw_rectangle(x1, y1, x2, y2, nativecolor(color), thickness); return 0; }
static duk_ret_t js_Font_drawTextBox(duk_context* ctx) { int x = duk_require_int(ctx, 0); int y = duk_require_int(ctx, 1); int w = duk_require_int(ctx, 2); int h = duk_require_int(ctx, 3); int offset = duk_require_int(ctx, 4); const char* text = duk_to_string(ctx, 5); font_t* font; int line_height; const char* line_text; color_t mask; int num_lines; int i; duk_push_this(ctx); duk_get_prop_string(ctx, -1, "\xFF" "ptr"); font = duk_get_pointer(ctx, -1); duk_pop(ctx); duk_get_prop_string(ctx, -1, "\xFF" "color_mask"); mask = duk_require_sphere_color(ctx, -1); duk_pop(ctx); duk_pop(ctx); if (!is_skipped_frame()) { duk_push_c_function(ctx, js_Font_wordWrapString, DUK_VARARGS); duk_push_this(ctx); duk_push_string(ctx, text); duk_push_int(ctx, w); duk_call_method(ctx, 2); duk_get_prop_string(ctx, -1, "length"); num_lines = duk_get_int(ctx, -1); duk_pop(ctx); line_height = get_font_line_height(font); for (i = 0; i < num_lines; ++i) { duk_get_prop_index(ctx, -1, i); line_text = duk_get_string(ctx, -1); duk_pop(ctx); draw_text(font, mask, x + offset, y, TEXT_ALIGN_LEFT, line_text); y += line_height; } duk_pop(ctx); } return 0; }
static duk_ret_t js_GradientRectangle(duk_context* ctx) { int x1 = duk_require_int(ctx, 0); int y1 = duk_require_int(ctx, 1); int x2 = x1 + duk_require_int(ctx, 2); int y2 = y1 + duk_require_int(ctx, 3); color_t color_ul = duk_require_sphere_color(ctx, 4); color_t color_ur = duk_require_sphere_color(ctx, 5); color_t color_lr = duk_require_sphere_color(ctx, 6); color_t color_ll = duk_require_sphere_color(ctx, 7); if (!is_skipped_frame()) { ALLEGRO_VERTEX verts[] = { { x1, y1, 0, 0, 0, nativecolor(color_ul) }, { x2, y1, 0, 0, 0, nativecolor(color_ur) }, { x1, y2, 0, 0, 0, nativecolor(color_ll) }, { x2, y2, 0, 0, 0, nativecolor(color_lr) } }; al_draw_prim(verts, NULL, NULL, 0, 4, ALLEGRO_PRIM_TRIANGLE_STRIP); } return 0; }