diff options
author | Alessio Treglia <quadrispro@ubuntu.com> | 2010-05-02 22:31:31 +0200 |
---|---|---|
committer | Alessio Treglia <quadrispro@ubuntu.com> | 2010-05-02 22:31:31 +0200 |
commit | eb1f6106a36c100ab25cab7f29045e16f6e967fb (patch) | |
tree | e66f81d41fe3107a12b36d56e6aa5b13ea2a3f1a /snd-draw.c | |
parent | 08d24d7a5682e59434c3da226fb1f2546c0ebd86 (diff) |
Imported Upstream version 11.5
Diffstat (limited to 'snd-draw.c')
-rw-r--r-- | snd-draw.c | 173 |
1 files changed, 171 insertions, 2 deletions
@@ -3,6 +3,30 @@ #if (!USE_NO_GUI) +#if USE_MOTIF +#define XEN_WRAP_PIXEL(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("Pixel"), C_TO_XEN_INT((int)Value)) + /* not ulong here! -- messes up the equal? check */ +#define XEN_UNWRAP_PIXEL(Value) (unsigned long)XEN_TO_C_INT(XEN_CADR(Value)) +#define XEN_PIXEL_P(Value) (XEN_LIST_P(Value) && (XEN_LIST_LENGTH(Value) >= 2) && (XEN_SYMBOL_P(XEN_CAR(Value))) && \ + (strcmp("Pixel", XEN_SYMBOL_TO_C_STRING(XEN_CAR(Value))) == 0)) +#else +#if USE_CAIRO + #define XEN_WRAP_PIXEL(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("color_t"), XEN_WRAP_C_POINTER((unsigned long)Value)) + #define XEN_UNWRAP_PIXEL(Value) (color_t)(XEN_UNWRAP_C_POINTER(XEN_CADR(Value))) + #define XEN_PIXEL_P(Value) (XEN_LIST_P(Value) && (XEN_LIST_LENGTH(Value) >= 2) && (XEN_SYMBOL_P(XEN_CAR(Value))) && \ + (strcmp("color_t", XEN_SYMBOL_TO_C_STRING(XEN_CAR(Value))) == 0)) +#else + #define XEN_WRAP_PIXEL(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("GdkColor_"), XEN_WRAP_C_POINTER((unsigned long)Value)) + #define XEN_UNWRAP_PIXEL(Value) (GdkColor*)(XEN_UNWRAP_C_POINTER(XEN_CADR(Value))) + #define XEN_PIXEL_P(Value) (XEN_LIST_P(Value) && (XEN_LIST_LENGTH(Value) >= 2) && (XEN_SYMBOL_P(XEN_CAR(Value))) && \ + (strcmp("GdkColor_", XEN_SYMBOL_TO_C_STRING(XEN_CAR(Value))) == 0)) +#endif +#endif + +/* unfortunately, we can't just make PIXEL into a C type here -- it is called + * XM_PIXEL in xm.c and in that context, it assumes the layout given above. + */ + /* our "current path" */ static point_t points[POINT_BUFFER_SIZE]; static point_t points1[POINT_BUFFER_SIZE]; @@ -434,7 +458,7 @@ static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax) static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax) { /* pts should be a vector of integers as (x y) pairs */ - #define H_draw_dots "(" S_draw_dots " positions dot-size :optional snd chn (ax " S_time_graph ")): draw a vector of dots" + #define H_draw_dots "(" S_draw_dots " positions :optional dot-size snd chn (ax " S_time_graph ")): draw a vector of dots" point_t *pack_pts; axis_context *ax1; @@ -442,6 +466,7 @@ static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax) ASSERT_CHANNEL(S_draw_dots, snd, chn, 3); XEN_ASSERT_TYPE(XEN_VECTOR_P(pts), pts, XEN_ARG_1, S_draw_dots, "a vector"); + XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(size), size, XEN_ARG_2, S_draw_dots, "an integer"); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_5, S_draw_dots, "an integer such as " S_time_graph); ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dots); @@ -1683,6 +1708,7 @@ static XEN g_basic_color(void) #if USE_GTK + static void recolor_everything_1(widget_t w, gpointer color) { if (GTK_IS_WIDGET(w)) @@ -1704,7 +1730,52 @@ static void recolor_everything(widget_t w, gpointer color) recolor_everything_1(w, color); #endif } + + +static XEN g_color_to_list(XEN obj) +{ + #define H_color_to_list "(" S_color_to_list " obj): 'obj' rgb values as a list of floats" + color_info *v; + XEN_ASSERT_TYPE(XEN_PIXEL_P(obj), obj, XEN_ONLY_ARG, S_color_to_list, "a color"); + v = XEN_UNWRAP_PIXEL(obj); + return(XEN_LIST_3(C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->red)), + C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->green)), + C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->blue)))); +} + + +static XEN g_make_color(XEN r, XEN g, XEN b) +{ + #define H_make_color "(" S_make_color " r g b): return a color object with the indicated rgb values" + color_info *ccolor; + mus_float_t rf, gf, bf; + + XEN_ASSERT_TYPE(XEN_NUMBER_P(r), r, XEN_ARG_1, S_make_color, "a number"); + /* someday accept a list as r */ + XEN_ASSERT_TYPE(XEN_NUMBER_P(g), g, XEN_ARG_2, S_make_color, "a number"); + XEN_ASSERT_TYPE(XEN_NUMBER_P(b), b, XEN_ARG_3, S_make_color, "a number"); + + rf = check_color_range(S_make_color, r); + gf = check_color_range(S_make_color, g); + bf = check_color_range(S_make_color, b); +#if USE_CAIRO + ccolor = (color_info *)calloc(1, sizeof(color_info)); /* memleak here -- need color smob + free to deal with this */ + ccolor->red = rf; + ccolor->green = gf; + ccolor->blue = bf; +#else + color_info gcolor; + gcolor.red = FLOAT_TO_RGB(rf); + gcolor.green = FLOAT_TO_RGB(gf); + gcolor.blue = FLOAT_TO_RGB(bf); + ccolor = gdk_color_copy(&gcolor); + gdk_rgb_find_color(gdk_colormap_get_system(), ccolor); #endif + return(XEN_WRAP_PIXEL(ccolor)); +} + +#endif + #if USE_MOTIF @@ -1718,6 +1789,57 @@ static void recolor_everything(widget_t w, color_t color) XmChangeColor(w, ss->sgx->basic_color); } } + +static XEN g_color_to_list(XEN obj) +{ + #define H_color_to_list "(" S_color_to_list " obj): 'obj' rgb values as a list of floats" + Colormap cmap; + XColor tmp_color; + Display *dpy; + + XEN_ASSERT_TYPE(XEN_PIXEL_P(obj), obj, XEN_ONLY_ARG, S_color_to_list, "a color"); + + dpy = XtDisplay(MAIN_SHELL(ss)); + cmap = DefaultColormap(dpy, DefaultScreen(dpy)); + tmp_color.flags = DoRed | DoGreen | DoBlue; + tmp_color.pixel = XEN_UNWRAP_PIXEL(obj); + XQueryColor(dpy, cmap, &tmp_color); + return(XEN_LIST_3(C_TO_XEN_DOUBLE(RGB_TO_FLOAT(tmp_color.red)), + C_TO_XEN_DOUBLE(RGB_TO_FLOAT(tmp_color.green)), + C_TO_XEN_DOUBLE(RGB_TO_FLOAT(tmp_color.blue)))); +} + + +static XEN g_make_color(XEN r, XEN g, XEN b) +{ + #define H_make_color "(" S_make_color " r g b): return a color object with the indicated rgb values" + Colormap cmap; + XColor tmp_color; + Display *dpy; + mus_float_t rf, gf, bf; + + XEN_ASSERT_TYPE(XEN_NUMBER_P(r), r, XEN_ARG_1, S_make_color, "a number"); + /* someday accept a list as r */ + XEN_ASSERT_TYPE(XEN_NUMBER_P(g), g, XEN_ARG_2, S_make_color, "a number"); + XEN_ASSERT_TYPE(XEN_NUMBER_P(b), b, XEN_ARG_3, S_make_color, "a number"); + + rf = check_color_range(S_make_color, r); + gf = check_color_range(S_make_color, g); + bf = check_color_range(S_make_color, b); + dpy = XtDisplay(MAIN_SHELL(ss)); + cmap = DefaultColormap(dpy, DefaultScreen(dpy)); + tmp_color.flags = DoRed | DoGreen | DoBlue; + tmp_color.red = FLOAT_TO_RGB(rf); + tmp_color.green = FLOAT_TO_RGB(gf); + tmp_color.blue = FLOAT_TO_RGB(bf); + + if ((XAllocColor(dpy, cmap, &tmp_color)) == 0) + XEN_ERROR(XEN_ERROR_TYPE("no-such-color"), + XEN_LIST_4(C_TO_XEN_STRING(S_make_color ": can't allocate this color! (~A ~A ~A)"), + r, g, b)); + + return(XEN_WRAP_PIXEL(tmp_color.pixel)); +} #endif @@ -1748,6 +1870,38 @@ static XEN g_set_basic_color(XEN color) } +static XEN g_mix_color(XEN mix_id) +{ + #define H_mix_color "(" S_mix_color " :optional mix-id): color of all mix tags (if mix-id is omitted), or of mix-id's tag" + if (XEN_MIX_P(mix_id)) + return(XEN_WRAP_PIXEL(mix_color_from_id(XEN_MIX_TO_C_INT(mix_id)))); + return(XEN_WRAP_PIXEL(ss->sgx->mix_color)); +} + + +static XEN g_set_mix_color(XEN color, XEN mix_id) +{ + XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ARG_1, S_setB S_mix_color, "a color"); + XEN_ASSERT_TYPE(XEN_MIX_P(mix_id) || XEN_NOT_BOUND_P(mix_id), mix_id, XEN_ARG_2, S_setB S_mix_color, "a mix"); + if (XEN_MIX_P(mix_id)) + mix_set_color_from_id(XEN_MIX_TO_C_INT(mix_id), XEN_UNWRAP_PIXEL(color)); + else color_mixes(XEN_UNWRAP_PIXEL(color)); + return(color); +} + +WITH_TWO_SETTER_ARGS(g_set_mix_color_reversed, g_set_mix_color) + + +bool foreground_color_ok(XEN color, axis_context *ax) +{ + if (XEN_PIXEL_P(color)) + { + set_foreground_color(ax, (color_t)XEN_UNWRAP_PIXEL(color)); + return(true); + } + return(false); +} + #ifdef XEN_ARGIFY_1 XEN_ARGIFY_7(g_draw_line_w, g_draw_line) @@ -1828,8 +1982,13 @@ XEN_NARGIFY_1(g_set_basic_color_w, g_set_basic_color) XEN_NARGIFY_0(g_pushed_button_color_w, g_pushed_button_color) XEN_NARGIFY_1(g_set_pushed_button_color_w, g_set_pushed_button_color) XEN_NARGIFY_1(g_color_p_w, g_color_p) +XEN_NARGIFY_3(g_make_color_w, g_make_color) +XEN_NARGIFY_1(g_color_to_list_w, g_color_to_list) +XEN_ARGIFY_1(g_mix_color_w, g_mix_color) +XEN_ARGIFY_2(g_set_mix_color_w, g_set_mix_color) #else + #define g_draw_line_w g_draw_line #define g_draw_dot_w g_draw_dot #define g_draw_lines_w g_draw_lines @@ -1908,6 +2067,10 @@ XEN_NARGIFY_1(g_color_p_w, g_color_p) #define g_pushed_button_color_w g_pushed_button_color #define g_set_pushed_button_color_w g_set_pushed_button_color #define g_color_p_w g_color_p +#define g_make_color_w g_make_color +#define g_color_to_list_w g_color_to_list +#define g_mix_color_w g_mix_color +#define g_set_mix_color_w g_set_mix_color #endif @@ -2024,7 +2187,12 @@ void g_init_draw(void) XEN_DEFINE_PROCEDURE_WITH_SETTER(S_pushed_button_color, g_pushed_button_color_w, H_pushed_button_color, S_setB S_pushed_button_color, g_set_pushed_button_color_w, 0, 0, 1, 0); - XEN_DEFINE_PROCEDURE(S_color_p, g_color_p_w, 1, 0, 0, H_color_p); + XEN_DEFINE_PROCEDURE_WITH_REVERSED_SETTER(S_mix_color, g_mix_color_w, H_mix_color, + S_setB S_mix_color, g_set_mix_color_w, g_set_mix_color_reversed, 0, 1, 1, 1); + + XEN_DEFINE_PROCEDURE(S_color_p, g_color_p_w, 1, 0, 0, H_color_p); + XEN_DEFINE_PROCEDURE(S_make_color, g_make_color_w, 3, 0, 0, H_make_color); + XEN_DEFINE_PROCEDURE(S_color_to_list, g_color_to_list_w, 1, 0, 0, H_color_to_list); /* ---------------- unstable ---------------- */ @@ -2052,5 +2220,6 @@ void show_mark_triangle(chan_info *cp, int x) {} void erase_cursor(chan_info *cp) {} point_t *get_grf_points(void) {return(NULL);} point_t *get_grf_points1(void) {return(NULL);} +bool foreground_color_ok(XEN color, axis_context *ax) {return(true);} #endif |