summaryrefslogtreecommitdiff
path: root/snd-draw.c
diff options
context:
space:
mode:
authorAlessio Treglia <alessio@debian.org>2011-03-24 09:13:51 +0100
committerAlessio Treglia <alessio@debian.org>2011-03-24 09:13:51 +0100
commite5328e59987b90c4e98959510b810510e384650d (patch)
tree0f140b79d942c4654701d8fb4cfe2f1dd904f9f0 /snd-draw.c
parent36cf8384e5699cda3f1ca607753fe4d4a8515b01 (diff)
Imported Upstream version 12.0
Diffstat (limited to 'snd-draw.c')
-rw-r--r--snd-draw.c650
1 files changed, 402 insertions, 248 deletions
diff --git a/snd-draw.c b/snd-draw.c
index 5d2e107..1b7d75f 100644
--- a/snd-draw.c
+++ b/snd-draw.c
@@ -4,12 +4,14 @@
#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
+ #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))
+#endif
+
+#if USE_GTK
#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))) && \
@@ -161,15 +163,11 @@ void draw_cursor(chan_info *cp)
if (!ax)
{
fprintf(stderr,"axis->ax is null...");
- ap->ax = cp->cgx->ax;
+ ap->ax = cp->ax;
ax = ap->ax;
}
old_color = get_foreground_color(ax);
- set_foreground_color(ax, ss->sgx->cursor_color);
-
- if (ax->cr) cairo_destroy(ax->cr);
- ax->cr = gdk_cairo_create(ax->wn); /* this is needed to force the cursor to be displayed! */
- free_cursor_pix(cp);
+ set_foreground_color(ax, ss->cursor_color);
if (cp->cx > cp->cursor_size) cx0 = cp->cx - cp->cursor_size;
if (cp->cy > cp->cursor_size) cy0 = cp->cy - cp->cursor_size;
@@ -178,16 +176,13 @@ void draw_cursor(chan_info *cp)
ax = cursor_context(cp);
#endif
- if ((cp->tracking) && (with_tracking_cursor(ss) != DONT_TRACK))
+ if (ss->tracking)
cur = cp->tracking_cursor_style;
else cur = cp->cursor_style;
switch (cur)
{
case CURSOR_CROSS:
-#if USE_GTK
- save_cursor_pix(cp, ax, csize, csize, cx0, cy0);
-#endif
draw_line(ax, cp->cx, cp->cy - cp->cursor_size, cp->cx, cp->cy + cp->cursor_size);
draw_line(ax, cp->cx - cp->cursor_size, cp->cy, cp->cx + cp->cursor_size, cp->cy);
break;
@@ -196,56 +191,107 @@ void draw_cursor(chan_info *cp)
if ((with_inset_graph(ss)) &&
(cp->inset_graph))
draw_inset_line_cursor(cp, ax);
- else
- {
-#if USE_GTK
- save_cursor_pix(cp, ax, 2, ap->y_axis_y0 - ap->y_axis_y1, cp->cx, ap->y_axis_y1);
-#endif
- draw_line(ax, cp->cx, ap->y_axis_y0 - 1, cp->cx, ap->y_axis_y1);
- }
+ else draw_line(ax, cp->cx, ap->y_axis_y0 - 1, cp->cx, ap->y_axis_y1);
break;
case CURSOR_PROC:
#if USE_GTK
- /* in the cairo case, we need some info about the cursor shape, but I'll assume cursor_size is meaningful */
- save_cursor_pix(cp, ax, csize, csize, cx0, cy0);
+ FREE_CAIRO(ss->cr);
+ ss->cr = NULL;
#endif
XEN_CALL_3((XEN_PROCEDURE_P(cp->cursor_proc)) ? (cp->cursor_proc) : (ss->cursor_proc),
C_INT_TO_XEN_SOUND(cp->sound->index),
C_TO_XEN_INT(cp->chan),
/* this was time-graph, which was useless. It's now #t if we're in tracking-cursor mode */
- /* this will be called only it with_tracking_cursor is #f -> we want to draw it ourselves */
- C_TO_XEN_BOOLEAN(cp->tracking),
+ C_TO_XEN_BOOLEAN(ss->tracking),
S_cursor_style " procedure");
+#if USE_GTK
+ ss->cr = MAKE_CAIRO(ap->ax->wn);
+#endif
break;
}
+ /* now draw the play triangle below the x axis */
+ fill_polygon(ax, 4,
+ cp->cx, ap->y_axis_y0,
+ cp->cx + play_arrow_size(ss), ap->y_axis_y0 + play_arrow_size(ss),
+ cp->cx, ap->y_axis_y0 + 2 * play_arrow_size(ss),
+ cp->cx, ap->y_axis_y0);
+
#if USE_GTK
set_foreground_color(ax, old_color);
#endif
}
-void erase_cursor(chan_info *cp)
-{
-#if USE_GTK
- if (cp->cgx->cursor_pix)
- restore_cursor_pix(cp, cp->axis->ax); /* returns true if old cursor was erased */
-#else
- draw_cursor(cp);
-#endif
-}
-
/* -------------------------------------------------------------------------------- */
#define AXIS_CONTEXT_ID_OK(Id) ((Id >= CHAN_GC) && (Id <= CHAN_TMPGC))
-#define NO_SUCH_WIDGET XEN_ERROR_TYPE("no-such-widget")
+#define NO_SUCH_WIDGET XEN_ERROR_TYPE("no-such-widget")
-static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller)
+#if USE_MOTIF
+static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller, XEN ignored)
{
if ((cp) && (AXIS_CONTEXT_ID_OK(ax_id)))
return(set_context(cp, (chan_gc_t)ax_id));
+
+ XEN_ERROR(XEN_ERROR_TYPE("no-such-graphics-context"),
+ XEN_LIST_6(C_TO_XEN_STRING("~A: no such graphics context: ~A, sound index: ~A (~A), chan: ~A"),
+ C_TO_XEN_STRING(caller),
+ C_TO_XEN_INT(ax_id),
+ C_INT_TO_XEN_SOUND(cp->sound->index),
+ C_TO_XEN_STRING(cp->sound->short_filename),
+ C_TO_XEN_INT(cp->chan)));
+ return(NULL);
+}
+
+
+static graphics_context *get_ax_no_cr(chan_info *cp, int ax_id, const char *caller)
+{
+ return(get_ax(cp,ax_id, caller, XEN_FALSE));
+}
+#endif
+
+#if USE_GTK
+static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller, XEN xcr)
+{
+ if ((cp) && (AXIS_CONTEXT_ID_OK(ax_id)))
+ {
+ graphics_context *ax;
+ ax = set_context(cp, (chan_gc_t)ax_id);
+ /* (gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (car (channel-widgets 0 0)))))) -> '(cairo_t_ #<c_pointer 0x12bbca0>)
+ * (eq? (car hi) 'cairo_t_) -> #t
+ */
+ if ((XEN_LIST_P(xcr)) &&
+ (XEN_LIST_LENGTH(xcr) == 2) &&
+ (XEN_SYMBOL_P(XEN_CAR(xcr))) &&
+ (strcmp("cairo_t_", XEN_SYMBOL_TO_C_STRING(XEN_CAR(xcr))) == 0))
+ ss->cr = (cairo_t *)XEN_UNWRAP_C_POINTER(XEN_CADR(xcr));
+ else
+ XEN_ERROR(XEN_ERROR_TYPE("not-a-graphics-context"),
+ XEN_LIST_2(C_TO_XEN_STRING("~A: cairo_t argument is not a cairo_t pointer"),
+ C_TO_XEN_STRING(caller)));
+ return(ax);
+ }
+ XEN_ERROR(XEN_ERROR_TYPE("no-such-graphics-context"),
+ XEN_LIST_6(C_TO_XEN_STRING("~A: no such graphics context: ~A, sound index: ~A (~A), chan: ~A"),
+ C_TO_XEN_STRING(caller),
+ C_TO_XEN_INT(ax_id),
+ C_INT_TO_XEN_SOUND(cp->sound->index),
+ C_TO_XEN_STRING(cp->sound->short_filename),
+ C_TO_XEN_INT(cp->chan)));
+ return(NULL);
+}
+
+static graphics_context *get_ax_no_cr(chan_info *cp, int ax_id, const char *caller)
+{
+ if ((cp) && (AXIS_CONTEXT_ID_OK(ax_id)))
+ {
+ graphics_context *ax;
+ ax = set_context(cp, (chan_gc_t)ax_id);
+ return(ax);
+ }
XEN_ERROR(XEN_ERROR_TYPE("no-such-graphics-context"),
XEN_LIST_6(C_TO_XEN_STRING("~A: no such graphics context: ~A, sound index: ~A (~A), chan: ~A"),
C_TO_XEN_STRING(caller),
@@ -255,16 +301,16 @@ static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller)
C_TO_XEN_INT(cp->chan)));
return(NULL);
}
+#endif
+
+#define TO_C_AXIS_CONTEXT(Snd, Chn, Ax, Caller, Cr) get_ax(get_cp(Snd, Chn, Caller), XEN_TO_C_INT_OR_ELSE(Ax, (int)CHAN_GC), Caller, Cr)
+#define TO_C_AXIS_CONTEXT_NO_CR(Snd, Chn, Ax, Caller) get_ax_no_cr(get_cp(Snd, Chn, Caller), XEN_TO_C_INT_OR_ELSE(Ax, (int)CHAN_GC), Caller)
-#define TO_C_AXIS_CONTEXT(Snd, Chn, Ax, Caller) \
- get_ax(get_cp(Snd, Chn, Caller), \
- XEN_TO_C_INT_OR_ELSE(Ax, (int)CHAN_GC), \
- Caller)
-static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax)
+static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax, XEN xcr)
{
- #define H_draw_line "(" S_draw_line " x0 y0 x1 y1 :optional snd chn (ax " S_time_graph ")): draw a line"
+ #define H_draw_line "(" S_draw_line " x0 y0 x1 y1 :optional snd chn (ax " S_time_graph ") cr): draw a line"
ASSERT_CHANNEL(S_draw_line, snd, chn, 5);
XEN_ASSERT_TYPE(XEN_NUMBER_P(x0), x0, XEN_ARG_1, S_draw_line, "a number");
@@ -273,24 +319,7 @@ static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax)
XEN_ASSERT_TYPE(XEN_NUMBER_P(y1), y1, XEN_ARG_4, S_draw_line, "a number");
XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_7, S_draw_line, "an integer such as " S_time_graph);
-#if USE_GTK
- {
- graphics_context *axc;
- axc = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_line);
- if (!(axc->cr))
- {
- if (axc->wn)
- axc->cr = gdk_cairo_create(axc->wn);
- else
- {
- fprintf(stderr,"ax->cr is null in (draw-line %s %s %s %s %s %s %s)\n",
- XEN_AS_STRING(x0), XEN_AS_STRING(y0), XEN_AS_STRING(x1), XEN_AS_STRING(y1), XEN_AS_STRING(snd), XEN_AS_STRING(chn), XEN_AS_STRING(ax));
- abort();
- }
- }
- }
-#endif
- draw_line(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_line),
+ draw_line(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_line, xcr),
XEN_TO_C_INT(x0),
XEN_TO_C_INT(y0),
XEN_TO_C_INT(x1),
@@ -299,9 +328,9 @@ static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax)
}
-static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax)
+static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax, XEN xcr)
{
- #define H_draw_dot "(" S_draw_dot " x0 y0 size :optional snd chn (ax " S_time_graph ")): draw a dot"
+ #define H_draw_dot "(" S_draw_dot " x0 y0 size :optional snd chn (ax " S_time_graph ") cr): draw a dot"
ASSERT_CHANNEL(S_draw_dot, snd, chn, 4);
XEN_ASSERT_TYPE(XEN_NUMBER_P(x0), x0, XEN_ARG_1, S_draw_dot, "a number");
@@ -309,7 +338,7 @@ static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax)
XEN_ASSERT_TYPE(XEN_NUMBER_P(size), size, XEN_ARG_3, S_draw_dot, "a number");
XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_6, S_draw_dot, "an integer such as " S_time_graph);
- draw_dot(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dot),
+ draw_dot(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dot, xcr),
XEN_TO_C_INT(x0),
XEN_TO_C_INT(y0),
XEN_TO_C_INT_OR_ELSE(size, 1));
@@ -317,9 +346,9 @@ static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax)
}
-static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN chn, XEN ax, XEN erase)
+static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN chn, XEN ax, XEN erase, XEN xcr)
{
- #define H_fill_rectangle "(" S_fill_rectangle " x0 y0 width height :optional snd chn (ax " S_time_graph ") erase): draw a filled rectangle"
+ #define H_fill_rectangle "(" S_fill_rectangle " x0 y0 width height :optional snd chn (ax " S_time_graph ") erase cr): draw a filled rectangle"
ASSERT_CHANNEL(S_fill_rectangle, snd, chn, 5);
XEN_ASSERT_TYPE(XEN_NUMBER_P(x0), x0, XEN_ARG_1, S_fill_rectangle, "a number");
@@ -332,12 +361,12 @@ static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN
if ((XEN_BOOLEAN_P(erase)) &&
(XEN_TRUE_P(erase)))
erase_rectangle(get_cp(snd, chn, S_fill_rectangle),
- TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle),
+ TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle, xcr),
XEN_TO_C_INT(x0),
XEN_TO_C_INT(y0),
XEN_TO_C_INT(width),
XEN_TO_C_INT(height));
- else fill_rectangle(TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle),
+ else fill_rectangle(TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle, xcr),
XEN_TO_C_INT(x0),
XEN_TO_C_INT(y0),
XEN_TO_C_INT(width),
@@ -346,9 +375,9 @@ static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN
}
-static XEN g_draw_string(XEN text, XEN x0, XEN y0, XEN snd, XEN chn, XEN ax)
+static XEN g_draw_string(XEN text, XEN x0, XEN y0, XEN snd, XEN chn, XEN ax, XEN xcr)
{
- #define H_draw_string "(" S_draw_string " text x0 y0 :optional snd chn (ax " S_time_graph ")): draw a string"
+ #define H_draw_string "(" S_draw_string " text x0 y0 :optional snd chn (ax " S_time_graph ") cr): draw a string"
const char *tmp = NULL;
ASSERT_CHANNEL(S_draw_string, snd, chn, 4);
@@ -361,9 +390,9 @@ static XEN g_draw_string(XEN text, XEN x0, XEN y0, XEN snd, XEN chn, XEN ax)
#if USE_MOTIF
/* snd-xdraw to make motif draw-string act in the same way (coordinate-wise) as gtk */
/* despite the name, this is not a gtk function */
- gtk_style_draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string),
+ gtk_style_draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string, xcr),
#else
- draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string),
+ draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string, xcr),
#endif
XEN_TO_C_INT(x0),
XEN_TO_C_INT(y0),
@@ -402,10 +431,10 @@ static point_t *vector_to_points(XEN pts, const char *caller, int *vector_len)
}
-static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax)
+ static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax, XEN xcr)
{
/* pts should be a vector of integers as (x y) pairs */
- #define H_draw_lines "(" S_draw_lines " lines :optional snd chn (ax " S_time_graph ")): draw a vector of lines"
+ #define H_draw_lines "(" S_draw_lines " lines :optional snd chn (ax " S_time_graph ") cr): draw a vector of lines"
point_t *pack_pts;
graphics_context *ax1;
@@ -415,7 +444,8 @@ static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax)
XEN_ASSERT_TYPE(XEN_VECTOR_P(pts), pts, XEN_ARG_1, S_draw_lines, "a vector");
XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_4, S_draw_lines, "an integer such as " S_time_graph);
- ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_lines);
+ ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_lines, xcr);
+
pack_pts = vector_to_points(pts, S_draw_lines, &vlen);
draw_lines(ax1, pack_pts, vlen);
@@ -424,10 +454,10 @@ 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)
+ static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax, XEN xcr)
{
/* pts should be a vector of integers as (x y) pairs */
- #define H_draw_dots "(" S_draw_dots " positions :optional dot-size 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 ") cr): draw a vector of dots"
point_t *pack_pts;
graphics_context *ax1;
@@ -438,7 +468,8 @@ static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax)
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);
+ ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dots, xcr);
+
pack_pts = vector_to_points(pts, S_draw_dots, &vlen);
draw_points(ax1,
pack_pts,
@@ -450,9 +481,9 @@ static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax)
}
-static XEN g_fill_polygon(XEN pts, XEN snd, XEN chn, XEN ax_id)
+ static XEN g_fill_polygon(XEN pts, XEN snd, XEN chn, XEN ax_id, XEN xcr)
{
- #define H_fill_polygon "(" S_fill_polygon " points :optional snd chn (ax " S_time_graph ")): draw a filled polygon"
+ #define H_fill_polygon "(" S_fill_polygon " points :optional snd chn (ax " S_time_graph ") cr): draw a filled polygon"
point_t *pack_pts;
graphics_context *ax;
@@ -462,7 +493,8 @@ static XEN g_fill_polygon(XEN pts, XEN snd, XEN chn, XEN ax_id)
XEN_ASSERT_TYPE(XEN_VECTOR_P(pts), pts, XEN_ARG_1, S_fill_polygon, "a vector");
XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax_id), ax_id, XEN_ARG_4, S_fill_polygon, "an integer such as " S_time_graph);
- ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_fill_polygon);
+ ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_fill_polygon, xcr);
+
pack_pts = vector_to_points(pts, S_fill_polygon, &vlen);
#if USE_MOTIF
XFillPolygon(ax->dp, ax->wn, ax->gc, pack_pts, vlen, Complex, CoordModeOrigin);
@@ -522,7 +554,7 @@ defined by the 4 controlling points x0..y3; 'n' is how many points to return"
}
-static XEN g_foreground_color(XEN snd, XEN chn, XEN xax)
+ static XEN g_foreground_color(XEN snd, XEN chn, XEN xax)
{
#define H_foreground_color "(" S_foreground_color " :optional snd chn (ax " S_time_graph ")): current drawing color"
chan_info *cp;
@@ -534,12 +566,12 @@ static XEN g_foreground_color(XEN snd, XEN chn, XEN xax)
cp = get_cp(snd, chn, S_foreground_color);
if (!cp) return(XEN_FALSE);
- ax = get_ax(cp, XEN_TO_C_INT_OR_ELSE(xax, (int)CHAN_GC), S_foreground_color);
+ ax = get_ax_no_cr(cp, XEN_TO_C_INT_OR_ELSE(xax, (int)CHAN_GC), S_foreground_color);
return(XEN_WRAP_PIXEL(get_foreground_color(ax)));
}
-static XEN g_set_foreground_color(XEN color, XEN snd, XEN chn, XEN ax)
+ static XEN g_set_foreground_color(XEN color, XEN snd, XEN chn, XEN ax)
{
chan_info *cp;
@@ -550,9 +582,7 @@ static XEN g_set_foreground_color(XEN color, XEN snd, XEN chn, XEN ax)
cp = get_cp(snd, chn, S_setB S_foreground_color);
if (!cp) return(XEN_FALSE);
- set_foreground_color(get_ax(cp,
- XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC),
- S_setB S_foreground_color),
+ set_foreground_color(get_ax_no_cr(cp, XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), S_setB S_foreground_color),
XEN_UNWRAP_PIXEL(color));
return(color);
}
@@ -573,7 +603,7 @@ static XEN g_set_current_font(XEN id, XEN snd, XEN chn, XEN ax_id)
(XEN_SYMBOL_P(XEN_CAR(id))) &&
(strcmp("Font", XEN_SYMBOL_TO_C_STRING(XEN_CAR(id))) == 0), id, XEN_ARG_1, S_setB S_current_font, "a Font");
- ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_current_font);
+ ax = TO_C_AXIS_CONTEXT_NO_CR(snd, chn, ax_id, S_current_font);
ax->current_font = (Font)XEN_TO_C_ULONG(XEN_CADR(id));
XSetFont(ax->dp, ax->gc, ax->current_font);
return(id);
@@ -591,9 +621,7 @@ static XEN g_current_font(XEN snd, XEN chn, XEN ax_id)
cp = get_cp(snd, chn, S_current_font);
if (!cp) return(XEN_FALSE);
- ax = get_ax(cp,
- XEN_TO_C_INT_OR_ELSE(ax_id, (int)CHAN_GC),
- S_current_font);
+ ax = get_ax_no_cr(cp, XEN_TO_C_INT_OR_ELSE(ax_id, (int)CHAN_GC), S_current_font);
if (ax->current_font == 0)
{
if ((cp->axis) && (cp->axis->ax))
@@ -614,7 +642,8 @@ static XEN g_set_current_font(XEN id, XEN snd, XEN chn, XEN ax_id)
ASSERT_CHANNEL(S_setB S_current_font, snd, chn, 2);
XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax_id), ax_id, XEN_ARG_4, S_setB S_current_font, "an integer such as time-graph");
- ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_setB S_current_font);
+
+ ax = TO_C_AXIS_CONTEXT_NO_CR(snd, chn, ax_id, S_setB S_current_font);
XEN_ASSERT_TYPE((XEN_WRAPPED_C_POINTER_P(id)) ||
(XEN_LIST_P(id) &&
(XEN_LIST_LENGTH(id) >= 2) &&
@@ -634,7 +663,7 @@ static XEN g_current_font(XEN snd, XEN chn, XEN ax_id)
graphics_context *ax;
ASSERT_CHANNEL(S_current_font, snd, chn, 1);
XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax_id), ax_id, XEN_ARG_3, S_current_font, "an integer such as time-graph");
- ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_current_font);
+ ax = TO_C_AXIS_CONTEXT_NO_CR(snd, chn, ax_id, S_current_font);
return(XEN_WRAP_C_POINTER(ax->current_font));
}
@@ -651,11 +680,14 @@ return either a vct (if the graph has one trace), or a list of two vcts (the two
'high' defaults to the current rightmost sample. (" S_graph_data " (" S_make_graph_data ")) reimplements the time domain graph."
chan_info *cp;
+
ASSERT_CHANNEL(S_make_graph_data, snd, chn, 1);
cp = get_cp(snd, chn, S_make_graph_data);
if (!cp) return(XEN_FALSE);
+
XEN_ASSERT_TYPE(XEN_NUMBER_IF_BOUND_P(lo), lo, XEN_ARG_4, S_make_graph_data, "a number");
XEN_ASSERT_TYPE(XEN_NUMBER_IF_BOUND_P(hi), hi, XEN_ARG_5, S_make_graph_data, "a number");
+
return(make_graph_data(cp,
to_c_edit_position(cp, edpos, S_make_graph_data, 3),
XEN_TO_C_INT64_T_OR_ELSE(lo, -1),
@@ -663,17 +695,20 @@ return either a vct (if the graph has one trace), or a list of two vcts (the two
}
-static XEN g_graph_data(XEN data, XEN snd, XEN chn, XEN ax, XEN lo, XEN hi, XEN style)
+ static XEN g_graph_data(XEN data, XEN snd, XEN chn, XEN ax, XEN lo, XEN hi, XEN style, XEN xcr)
{
- #define H_graph_data "(" S_graph_data " data :optional snd chn (context " S_copy_context ") low high graph-style): \
+ #define H_graph_data "(" S_graph_data " data :optional snd chn (context " S_copy_context ") low high graph-style cr): \
display 'data' in the time domain graph of snd's channel chn using the graphics context context (normally " S_copy_context "), placing the \
data in the recipient's graph between points low and high in the drawing mode graphic-style."
chan_info *cp;
vct *v0, *v1 = NULL;
+
ASSERT_CHANNEL(S_graph_data, snd, chn, 2);
+
cp = get_cp(snd, chn, S_graph_data);
if (!cp) return(XEN_FALSE);
+
if (XEN_FALSE_P(data)) return(XEN_FALSE);
XEN_ASSERT_TYPE((XEN_LIST_P(data) &&
(XEN_LIST_LENGTH(data) == 2) &&
@@ -685,19 +720,21 @@ data in the recipient's graph between points low and high in the drawing mode gr
XEN_ASSERT_TYPE(XEN_INT64_T_P(lo) || XEN_FALSE_P(lo) || XEN_NOT_BOUND_P(lo), lo, XEN_ARG_5, S_graph_data, "a sample number");
XEN_ASSERT_TYPE(XEN_INT64_T_P(hi) || XEN_FALSE_P(hi) || XEN_NOT_BOUND_P(hi), hi, XEN_ARG_6, S_graph_data, "a sample number");
XEN_ASSERT_TYPE(XEN_INTEGER_OR_BOOLEAN_IF_BOUND_P(style), style, XEN_ARG_7, S_graph_data, "an integer");
+
if (XEN_LIST_P(data))
{
v0 = xen_to_vct(XEN_CAR(data));
v1 = xen_to_vct(XEN_CADR(data));
}
else v0 = xen_to_vct(data);
+
draw_graph_data(cp,
XEN_TO_C_INT64_T_OR_ELSE(lo, -1),
XEN_TO_C_INT64_T_OR_ELSE(hi, -1),
v0->length,
v0->data,
(v1) ? (v1->data) : NULL,
- get_ax(cp, XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), S_graph_data),
+ get_ax(cp, XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), S_graph_data, xcr),
(graph_style_t)XEN_TO_C_INT_OR_ELSE(style, (int)(cp->time_graph_style)));
return(data);
}
@@ -721,7 +758,7 @@ widgets (list (0)main-app (1)main-shell (2)main-pane (3)sound-pane (4)listener-p
XEN_CONS(XEN_WRAP_WIDGET(MAIN_SHELL(ss)),
XEN_CONS(XEN_WRAP_WIDGET(MAIN_PANE(ss)),
XEN_CONS(XEN_WRAP_WIDGET(SOUND_PANE(ss)),
- XEN_CONS(XEN_WRAP_WIDGET(ss->sgx->listener_pane),
+ XEN_CONS(XEN_WRAP_WIDGET(ss->listener_pane),
XEN_CONS(XEN_WRAP_WIDGET(SOUND_PANE_BOX(ss)),
XEN_EMPTY_LIST))))));
snd_unprotect_at(loc);
@@ -767,27 +804,29 @@ static XEN g_dialog_widgets(void)
void set_dialog_widget(snd_dialog_t which, widget_t wid)
{
- state_context *sx;
- sx = ss->sgx;
- if (sx->dialogs == NULL)
+ if (ss->dialogs == NULL)
{
- sx->dialogs_size = 8;
- sx->num_dialogs = 0;
- sx->dialogs = (widget_t *)calloc(sx->dialogs_size, sizeof(widget_t));
+ ss->dialogs_size = 8;
+ ss->num_dialogs = 0;
+ ss->dialogs = (widget_t *)calloc(ss->dialogs_size, sizeof(widget_t));
}
else
{
- if (sx->num_dialogs == sx->dialogs_size)
+ if (ss->num_dialogs == ss->dialogs_size)
{
int i;
- sx->dialogs_size += 8;
- sx->dialogs = (widget_t *)realloc(sx->dialogs, sx->dialogs_size * sizeof(widget_t));
- for (i = sx->num_dialogs; i < sx->dialogs_size; i++) sx->dialogs[i] = NULL;
+ ss->dialogs_size += 8;
+ ss->dialogs = (widget_t *)realloc(ss->dialogs, ss->dialogs_size * sizeof(widget_t));
+ for (i = ss->num_dialogs; i < ss->dialogs_size; i++) ss->dialogs[i] = NULL;
}
}
- sx->dialogs[sx->num_dialogs++] = wid;
+ ss->dialogs[ss->num_dialogs++] = wid;
check_dialog_widget_table();
+#if USE_GTK && HAVE_GTK_3
+ gtk_widget_override_background_color(wid, GTK_STATE_NORMAL, (GdkRGBA *)(ss->basic_color));
+#endif
+
if (XEN_FALSE_P(XEN_VECTOR_REF(dialog_widgets, (int)which)))
XEN_VECTOR_SET(dialog_widgets, (int)which,
XEN_WRAP_WIDGET(wid));
@@ -1037,25 +1076,25 @@ fltenv_basic) (13 fltenv_data))."
#endif
#endif
- state_context *sx;
- sx = ss->sgx;
- if (sx)
- return(XEN_CONS(XEN_WRAP_SND_GC(sx->basic_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->selected_basic_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->combined_basic_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->cursor_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->selected_cursor_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->selection_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->selected_selection_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->erase_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->selected_erase_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->mark_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->selected_mark_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->mix_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->fltenv_basic_gc),
- XEN_CONS(XEN_WRAP_SND_GC(sx->fltenv_data_gc),
+#if (!USE_NO_GUI)
+ return(XEN_CONS(XEN_WRAP_SND_GC(ss->basic_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->selected_basic_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->combined_basic_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->cursor_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->selected_cursor_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->selection_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->selected_selection_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->erase_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->selected_erase_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->mark_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->selected_mark_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->mix_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->fltenv_basic_gc),
+ XEN_CONS(XEN_WRAP_SND_GC(ss->fltenv_data_gc),
XEN_EMPTY_LIST)))))))))))))));
+#else
return(XEN_EMPTY_LIST);
+#endif
}
@@ -1067,43 +1106,43 @@ static XEN g_snd_color(XEN choice)
switch (XEN_TO_C_INT(choice))
{
- case 0: col = ss->sgx->white; break;
- case 1: col = ss->sgx->black; break;
- case 2: col = ss->sgx->red; break;
- case 3: col = ss->sgx->yellow; break;
- case 4: col = ss->sgx->green; break;
- case 5: col = ss->sgx->light_blue; break;
- case 6: col = ss->sgx->lighter_blue; break;
-
- case 7: col = ss->sgx->data_color; break;
- case 8: col = ss->sgx->selected_data_color; break;
- case 9: col = ss->sgx->mark_color; break;
- case 10: col = ss->sgx->graph_color; break;
- case 11: col = ss->sgx->selected_graph_color; break;
- case 12: col = ss->sgx->listener_color; break;
- case 13: col = ss->sgx->listener_text_color; break;
-
- case 14: col = ss->sgx->basic_color; break;
- case 15: col = ss->sgx->selection_color; break;
- case 16: col = ss->sgx->zoom_color; break;
- case 17: col = ss->sgx->position_color; break;
- case 18: col = ss->sgx->highlight_color; break;
- case 19: col = ss->sgx->enved_waveform_color; break;
- case 20: col = ss->sgx->cursor_color; break;
-
- case 21: col = ss->sgx->text_focus_color; break;
- case 22: col = ss->sgx->filter_control_waveform_color; break;
- case 23: col = ss->sgx->mix_color; break;
- case 25: col = ss->sgx->sash_color; break;
-
- case 31: col = ss->sgx->grid_color; break;
- case 32: col = ss->sgx->selected_grid_color; break;
+ case 0: col = ss->white; break;
+ case 1: col = ss->black; break;
+ case 2: col = ss->red; break;
+ case 3: col = ss->yellow; break;
+ case 4: col = ss->green; break;
+ case 5: col = ss->light_blue; break;
+ case 6: col = ss->lighter_blue; break;
+
+ case 7: col = ss->data_color; break;
+ case 8: col = ss->selected_data_color; break;
+ case 9: col = ss->mark_color; break;
+ case 10: col = ss->graph_color; break;
+ case 11: col = ss->selected_graph_color; break;
+ case 12: col = ss->listener_color; break;
+ case 13: col = ss->listener_text_color; break;
+
+ case 14: col = ss->basic_color; break;
+ case 15: col = ss->selection_color; break;
+ case 16: col = ss->zoom_color; break;
+ case 17: col = ss->position_color; break;
+ case 18: col = ss->highlight_color; break;
+ case 19: col = ss->enved_waveform_color; break;
+ case 20: col = ss->cursor_color; break;
+
+ case 21: col = ss->text_focus_color; break;
+ case 22: col = ss->filter_control_waveform_color; break;
+ case 23: col = ss->mix_color; break;
+ case 25: col = ss->sash_color; break;
+
+ case 31: col = ss->grid_color; break;
+ case 32: col = ss->selected_grid_color; break;
case 33:
- if (ss->sgx->axis_color_set)
- col = ss->sgx->axis_color;
- else col = ss->sgx->black;
+ if (ss->axis_color_set)
+ col = ss->axis_color;
+ else col = ss->black;
break;
- default: col = ss->sgx->black; break;
+ default: col = ss->black; break;
}
return(XEN_WRAP_PIXEL(col));
}
@@ -1123,20 +1162,20 @@ static XEN g_snd_font(XEN choice)
switch (XEN_TO_C_INT(choice))
{
#if USE_MOTIF
- case 0: return(WRAP_FONT(ss->sgx->peaks_fontstruct->fid)); break;
- case 1: return(WRAP_FONT(ss->sgx->bold_peaks_fontstruct->fid)); break;
- case 2: return(WRAP_FONT(ss->sgx->tiny_fontstruct->fid)); break;
- case 3: return(WRAP_FONT(ss->sgx->axis_label_fontstruct->fid)); break;
- case 4: return(WRAP_FONT(ss->sgx->axis_numbers_fontstruct->fid)); break;
- case 5: return(WRAP_FONT(ss->sgx->listener_fontstruct->fid)); break;
+ case 0: return(WRAP_FONT(ss->peaks_fontstruct->fid)); break;
+ case 1: return(WRAP_FONT(ss->bold_peaks_fontstruct->fid)); break;
+ case 2: return(WRAP_FONT(ss->tiny_fontstruct->fid)); break;
+ case 3: return(WRAP_FONT(ss->axis_label_fontstruct->fid)); break;
+ case 4: return(WRAP_FONT(ss->axis_numbers_fontstruct->fid)); break;
+ case 5: return(WRAP_FONT(ss->listener_fontstruct->fid)); break;
#endif
#if USE_GTK
- case 0: return(WRAP_FONT(ss->sgx->peaks_fnt)); break;
- case 1: return(WRAP_FONT(ss->sgx->bold_peaks_fnt)); break;
- case 2: return(WRAP_FONT(ss->sgx->tiny_fnt)); break;
- case 3: return(WRAP_FONT(ss->sgx->axis_label_fnt)); break;
- case 4: return(WRAP_FONT(ss->sgx->axis_numbers_fnt)); break;
- case 5: return(WRAP_FONT(ss->sgx->listener_fnt)); break;
+ case 0: return(WRAP_FONT(ss->peaks_fnt)); break;
+ case 1: return(WRAP_FONT(ss->bold_peaks_fnt)); break;
+ case 2: return(WRAP_FONT(ss->tiny_fnt)); break;
+ case 3: return(WRAP_FONT(ss->axis_label_fnt)); break;
+ case 4: return(WRAP_FONT(ss->axis_numbers_fnt)); break;
+ case 5: return(WRAP_FONT(ss->listener_fnt)); break;
#endif
default: return(XEN_FALSE); break;
}
@@ -1144,6 +1183,47 @@ static XEN g_snd_font(XEN choice)
}
+static XEN g_make_cairo(XEN drawer)
+{
+ #define H_make_cairo "(" S_make_cairo " widget) in gtk, this returns a new cairo_t to draw on the widget."
+
+#if USE_GTK
+ #define C_TO_XEN_cairo_t(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("cairo_t_"), XEN_WRAP_C_POINTER(Value))
+ cairo_t *cr;
+
+ XEN_ASSERT_TYPE(XEN_WIDGET_P(drawer), drawer, XEN_ONLY_ARG, S_make_cairo, "a widget");
+
+#if (!HAVE_GTK_3)
+ cr = MAKE_CAIRO(GDK_DRAWABLE(gtk_widget_get_window(XEN_UNWRAP_WIDGET(drawer))));
+#else
+ cr = MAKE_CAIRO(GDK_WINDOW(gtk_widget_get_window(XEN_UNWRAP_WIDGET(drawer))));
+#endif
+
+ return(C_TO_XEN_cairo_t(cr));
+#endif
+
+ return(XEN_FALSE);
+}
+
+
+static XEN g_free_cairo(XEN xcr)
+{
+ #define H_free_cairo "(" S_free_cairo " cr) in gtk, this frees (destroys) the cairo_t 'cr'."
+
+#if USE_GTK
+ if ((XEN_LIST_P(xcr)) &&
+ (XEN_LIST_LENGTH(xcr) == 2) &&
+ (XEN_SYMBOL_P(XEN_CAR(xcr))) &&
+ (strcmp("cairo_t_", XEN_SYMBOL_TO_C_STRING(XEN_CAR(xcr))) == 0))
+ FREE_CAIRO((cairo_t *)XEN_UNWRAP_C_POINTER(XEN_CADR(xcr)));
+ else
+ XEN_ERROR(XEN_ERROR_TYPE("not-a-graphics-context"),
+ XEN_LIST_2(C_TO_XEN_STRING(S_free_cairo ": cairo_t argument is not a cairo_t pointer: ~A"), xcr));
+#endif
+ return(XEN_FALSE);
+}
+
+
#if HAVE_GL
static mus_float_t gl_currents[6] = {DEFAULT_SPECTRO_X_ANGLE, DEFAULT_SPECTRO_Y_ANGLE, DEFAULT_SPECTRO_Z_ANGLE,
DEFAULT_SPECTRO_X_SCALE, DEFAULT_SPECTRO_Y_SCALE, DEFAULT_SPECTRO_Z_SCALE};
@@ -1215,7 +1295,7 @@ static XEN g_set_cursor_color(XEN color)
static XEN g_cursor_color(void)
{
#define H_cursor_color "(" S_cursor_color "): cursor color"
- return(XEN_WRAP_PIXEL(ss->sgx->cursor_color));
+ return(XEN_WRAP_PIXEL(ss->cursor_color));
}
@@ -1227,7 +1307,7 @@ static void highlight_recolor_everything(widget_t w, color_t color)
{
XtVaGetValues(w, XmNbackground, &curcol, NULL);
if (curcol == color)
- XmChangeColor(w, ss->sgx->highlight_color);
+ XmChangeColor(w, ss->highlight_color);
}
/* to handle the gtk side correctly here, we'd need a list of widgets to modify --
* currently basic-color hits every background, so the whole thing is messed up.
@@ -1239,8 +1319,8 @@ static void highlight_recolor_everything(widget_t w, color_t color)
void set_highlight_color(color_t color)
{
color_t old_color;
- old_color = ss->sgx->highlight_color;
- ss->sgx->highlight_color = color;
+ old_color = ss->highlight_color;
+ ss->highlight_color = color;
#if USE_MOTIF
map_over_children_with_color(MAIN_SHELL(ss), highlight_recolor_everything, old_color);
#endif
@@ -1258,7 +1338,7 @@ static XEN g_set_highlight_color(XEN color)
static XEN g_highlight_color(void)
{
#define H_highlight_color "(" S_highlight_color "): color of highlighted text or buttons"
- return(XEN_WRAP_PIXEL(ss->sgx->highlight_color));
+ return(XEN_WRAP_PIXEL(ss->highlight_color));
}
@@ -1274,14 +1354,14 @@ static XEN g_set_mark_color(XEN color)
static XEN g_mark_color(void)
{
#define H_mark_color "(" S_mark_color "): mark color"
- return(XEN_WRAP_PIXEL(ss->sgx->mark_color));
+ return(XEN_WRAP_PIXEL(ss->mark_color));
}
void set_zoom_color(color_t color)
{
- ss->sgx->zoom_color = color;
- color_chan_components(ss->sgx->zoom_color, COLOR_ZOOM);
+ ss->zoom_color = color;
+ color_chan_components(ss->zoom_color, COLOR_ZOOM);
}
@@ -1296,14 +1376,14 @@ static XEN g_set_zoom_color(XEN color)
static XEN g_zoom_color(void)
{
#define H_zoom_color "(" S_zoom_color "): color of zoom sliders"
- return(XEN_WRAP_PIXEL(ss->sgx->zoom_color));
+ return(XEN_WRAP_PIXEL(ss->zoom_color));
}
void set_position_color(color_t color)
{
- ss->sgx->position_color = color;
- color_chan_components(ss->sgx->position_color, COLOR_POSITION);
+ ss->position_color = color;
+ color_chan_components(ss->position_color, COLOR_POSITION);
}
@@ -1318,7 +1398,7 @@ static XEN g_set_position_color(XEN color)
static XEN g_position_color(void)
{
#define H_position_color "(" S_position_color "): color of position sliders"
- return(XEN_WRAP_PIXEL(ss->sgx->position_color));
+ return(XEN_WRAP_PIXEL(ss->position_color));
}
@@ -1333,7 +1413,7 @@ static XEN g_set_listener_color(XEN color)
static XEN g_listener_color(void)
{
#define H_listener_color "(" S_listener_color "): background color of the lisp listener"
- return(XEN_WRAP_PIXEL(ss->sgx->listener_color));
+ return(XEN_WRAP_PIXEL(ss->listener_color));
}
@@ -1348,7 +1428,7 @@ static XEN g_set_listener_text_color(XEN color)
static XEN g_listener_text_color(void)
{
#define H_listener_text_color "(" S_listener_text_color "): text color in the lisp listener"
- return(XEN_WRAP_PIXEL(ss->sgx->listener_text_color));
+ return(XEN_WRAP_PIXEL(ss->listener_text_color));
}
@@ -1363,7 +1443,7 @@ static XEN g_set_enved_waveform_color(XEN color)
static XEN g_enved_waveform_color(void)
{
#define H_enved_waveform_color "(" S_enved_waveform_color "): color of the envelope editor wave display"
- return(XEN_WRAP_PIXEL(ss->sgx->enved_waveform_color));
+ return(XEN_WRAP_PIXEL(ss->enved_waveform_color));
}
@@ -1378,7 +1458,7 @@ static XEN g_set_filter_control_waveform_color(XEN color)
static XEN g_filter_control_waveform_color(void)
{
#define H_filter_control_waveform_color "(" S_filter_control_waveform_color "): color of the filter waveform"
- return(XEN_WRAP_PIXEL(ss->sgx->filter_control_waveform_color));
+ return(XEN_WRAP_PIXEL(ss->filter_control_waveform_color));
}
@@ -1394,14 +1474,14 @@ static XEN g_set_selection_color(XEN color)
static XEN g_selection_color(void)
{
#define H_selection_color "(" S_selection_color "): selection color"
- return(XEN_WRAP_PIXEL(ss->sgx->selection_color));
+ return(XEN_WRAP_PIXEL(ss->selection_color));
}
static XEN g_set_text_focus_color(XEN color)
{
XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ONLY_ARG, S_setB S_text_focus_color, "a color");
- ss->sgx->text_focus_color = XEN_UNWRAP_PIXEL(color);
+ ss->text_focus_color = XEN_UNWRAP_PIXEL(color);
return(color);
}
@@ -1409,14 +1489,14 @@ static XEN g_set_text_focus_color(XEN color)
static XEN g_text_focus_color(void)
{
#define H_text_focus_color "(" S_text_focus_color "): color used to show a text field has focus"
- return(XEN_WRAP_PIXEL(ss->sgx->text_focus_color));
+ return(XEN_WRAP_PIXEL(ss->text_focus_color));
}
static XEN g_set_sash_color(XEN color)
{
XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ONLY_ARG, S_setB S_sash_color, "a color");
- ss->sgx->sash_color = XEN_UNWRAP_PIXEL(color);
+ ss->sash_color = XEN_UNWRAP_PIXEL(color);
return(color);
}
@@ -1424,21 +1504,21 @@ static XEN g_set_sash_color(XEN color)
static XEN g_sash_color(void)
{
#define H_sash_color "(" S_sash_color "): color used to draw paned window sashes"
- return(XEN_WRAP_PIXEL(ss->sgx->sash_color));
+ return(XEN_WRAP_PIXEL(ss->sash_color));
}
static XEN g_data_color(void)
{
#define H_data_color "(" S_data_color "): color used to draw unselected data"
- return(XEN_WRAP_PIXEL(ss->sgx->data_color));
+ return(XEN_WRAP_PIXEL(ss->data_color));
}
void set_data_color(color_t color)
{
color_data(color);
- ss->sgx->grid_color = get_in_between_color(ss->sgx->data_color, ss->sgx->graph_color);
+ ss->grid_color = get_in_between_color(ss->data_color, ss->graph_color);
for_each_chan(update_graph);
}
@@ -1455,7 +1535,7 @@ void set_selected_data_color(color_t color)
{
chan_info *cp;
color_selected_data(color);
- ss->sgx->selected_grid_color = get_in_between_color(ss->sgx->selected_data_color, ss->sgx->selected_graph_color);
+ ss->selected_grid_color = get_in_between_color(ss->selected_data_color, ss->selected_graph_color);
cp = selected_channel();
if (cp) update_graph(cp);
}
@@ -1472,7 +1552,7 @@ static XEN g_set_selected_data_color(XEN color)
static XEN g_selected_data_color(void)
{
#define H_selected_data_color "(" S_selected_data_color "): color used for selected data"
- return(XEN_WRAP_PIXEL(ss->sgx->selected_data_color));
+ return(XEN_WRAP_PIXEL(ss->selected_data_color));
}
@@ -1480,7 +1560,7 @@ void set_graph_color(color_t color)
{
color_graph(color);
color_unselected_graphs(color);
- ss->sgx->grid_color = get_in_between_color(ss->sgx->data_color, ss->sgx->graph_color);
+ ss->grid_color = get_in_between_color(ss->data_color, ss->graph_color);
}
@@ -1495,7 +1575,7 @@ static XEN g_set_graph_color(XEN color)
static XEN g_graph_color(void)
{
#define H_graph_color "(" S_graph_color "): background color used for unselected data"
- return(XEN_WRAP_PIXEL(ss->sgx->graph_color));
+ return(XEN_WRAP_PIXEL(ss->graph_color));
}
@@ -1503,14 +1583,14 @@ void set_selected_graph_color(color_t color)
{
chan_info *cp;
color_selected_graph(color);
- ss->sgx->selected_grid_color = get_in_between_color(ss->sgx->selected_data_color, ss->sgx->selected_graph_color);
+ ss->selected_grid_color = get_in_between_color(ss->selected_data_color, ss->selected_graph_color);
cp = selected_channel();
if (cp)
{
#if USE_MOTIF
- XtVaSetValues(channel_graph(cp), XmNbackground, ss->sgx->selected_graph_color, NULL);
+ XtVaSetValues(channel_graph(cp), XmNbackground, ss->selected_graph_color, NULL);
#else
- widget_modify_bg(channel_graph(cp), GTK_STATE_NORMAL, ss->sgx->selected_graph_color);
+ widget_modify_bg(channel_graph(cp), GTK_STATE_NORMAL, ss->selected_graph_color);
#endif
}
}
@@ -1527,15 +1607,15 @@ static XEN g_set_selected_graph_color(XEN color)
static XEN g_selected_graph_color(void)
{
#define H_selected_graph_color "(" S_selected_graph_color "): background color of selected data"
- return(XEN_WRAP_PIXEL(ss->sgx->selected_graph_color));
+ return(XEN_WRAP_PIXEL(ss->selected_graph_color));
}
static XEN g_set_axis_color(XEN color)
{
XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ONLY_ARG, S_setB S_axis_color, "a color");
- ss->sgx->axis_color = XEN_UNWRAP_PIXEL(color);
- ss->sgx->axis_color_set = true;
+ ss->axis_color = XEN_UNWRAP_PIXEL(color);
+ ss->axis_color_set = true;
for_each_chan(update_graph);
return(color);
}
@@ -1544,33 +1624,60 @@ static XEN g_set_axis_color(XEN color)
static XEN g_axis_color(void)
{
#define H_axis_color "(" S_axis_color "): color of axis (defaults to current data color)"
- return(XEN_WRAP_PIXEL(ss->sgx->axis_color));
+ return(XEN_WRAP_PIXEL(ss->axis_color));
}
static XEN g_basic_color(void)
{
#define H_basic_color "(" S_basic_color "): Snd's basic color"
- return(XEN_WRAP_PIXEL(ss->sgx->basic_color));
+ return(XEN_WRAP_PIXEL(ss->basic_color));
}
#if USE_GTK
+
+#if HAVE_GTK_3
+static bool is_dark(color_info *color)
+{
+ return(color->red + color->green + color->blue < 0.75);
+}
+#endif
+
static void recolor_everything_1(widget_t w, gpointer color)
{
- if (GTK_IS_WIDGET(w))
+ if ((GTK_IS_WIDGET(w)) &&
+ (w != ss->listener_pane))
{
+#if (!HAVE_GTK_3)
gtk_widget_modify_bg(w, GTK_STATE_NORMAL, (GdkColor *)color);
if (GTK_IS_CONTAINER(w))
gtk_container_foreach(GTK_CONTAINER(w), recolor_everything_1, color);
+#else
+ gtk_widget_override_background_color(w, GTK_STATE_NORMAL, (GdkRGBA *)color);
+ if (GTK_IS_LABEL(w))
+ {
+ if (is_dark(color))
+ gtk_widget_override_color(w, GTK_STATE_NORMAL, (GdkRGBA *)(ss->white));
+ else gtk_widget_override_color(w, GTK_STATE_NORMAL, (GdkRGBA *)(ss->black));
+ }
+
+ if (GTK_IS_CONTAINER(w))
+ gtk_container_foreach(GTK_CONTAINER(w), recolor_everything_1, color);
+#endif
}
}
-static void recolor_everything(widget_t w, gpointer color)
+void recolor_everything(widget_t w, gpointer color)
{
+#if (!HAVE_GTK_3)
GdkColor *nc;
nc = rgb_to_gdk_color((color_t)color);
+#else
+ GdkRGBA *nc;
+ nc = (GdkRGBA *)color;
+#endif
recolor_everything_1(w, (gpointer)nc);
}
@@ -1581,15 +1688,16 @@ static XEN g_color_to_list(XEN obj)
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)),
+ return(XEN_LIST_4(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))));
+ C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->blue)),
+ C_TO_XEN_DOUBLE(v->alpha)));
}
-static XEN g_make_color(XEN r, XEN g, XEN b)
+static XEN g_make_color(XEN r, XEN g, XEN b, XEN alpha)
{
- #define H_make_color "(" S_make_color " r g b): return a color object with the indicated rgb values"
+ #define H_make_color "(" S_make_color " r g b alpha): return a color object with the indicated rgb values"
color_info *ccolor;
mus_float_t rf, gf, bf;
@@ -1601,10 +1709,15 @@ static XEN g_make_color(XEN r, XEN g, XEN b)
rf = check_color_range(S_make_color, r);
gf = check_color_range(S_make_color, g);
bf = check_color_range(S_make_color, b);
- ccolor = (color_info *)calloc(1, sizeof(color_info)); /* memleak here -- need color smob + free to deal with this */
+ ccolor = (color_info *)calloc(1, sizeof(color_info)); /* memleak here */
ccolor->red = rf;
ccolor->green = gf;
ccolor->blue = bf;
+
+ if (XEN_NUMBER_P(alpha))
+ ccolor->alpha = check_color_range(S_make_color, alpha);
+ else ccolor->alpha = 1.0;
+
return(XEN_WRAP_PIXEL(ccolor));
}
#endif
@@ -1619,7 +1732,7 @@ static void recolor_everything(widget_t w, color_t color)
{
XtVaGetValues(w, XmNbackground, &curcol, NULL);
if (curcol == color)
- XmChangeColor(w, ss->sgx->basic_color);
+ XmChangeColor(w, ss->basic_color);
}
}
@@ -1643,8 +1756,9 @@ static XEN g_color_to_list(XEN obj)
}
-static XEN g_make_color(XEN r, XEN g, XEN b)
+static XEN g_make_color(XEN r, XEN g, XEN b, XEN alpha)
{
+ /* alpha is ignored in Motif */
#define H_make_color "(" S_make_color " r g b): return a color object with the indicated rgb values"
Colormap cmap;
XColor tmp_color;
@@ -1679,8 +1793,8 @@ static XEN g_make_color(XEN r, XEN g, XEN b)
void set_basic_color(color_t color)
{
color_t old_color;
- old_color = ss->sgx->basic_color;
- ss->sgx->basic_color = color;
+ old_color = ss->basic_color;
+ ss->basic_color = color;
#if USE_MOTIF
map_over_children_with_color(MAIN_SHELL(ss), recolor_everything, old_color);
#endif
@@ -1688,9 +1802,9 @@ void set_basic_color(color_t color)
recolor_everything(MAIN_SHELL(ss), color);
#endif
-#if HAVE_XPM && USE_MOTIF
- make_sound_icons_transparent_again(old_color, ss->sgx->basic_color);
- make_mixer_icons_transparent_again(old_color, ss->sgx->basic_color);
+#if USE_MOTIF
+ make_sound_icons_transparent_again(old_color, ss->basic_color);
+ make_mixer_icons_transparent_again(old_color, ss->basic_color);
#endif
}
@@ -1708,7 +1822,7 @@ 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));
+ return(XEN_WRAP_PIXEL(ss->mix_color));
}
@@ -1736,14 +1850,45 @@ bool foreground_color_ok(XEN color, graphics_context *ax)
}
+
+static XEN g_combined_data_color(XEN snd, XEN chn)
+{
+ #define H_combined_data_color "(" S_combined_data_color " snd chn): color of this channel's data if graphed with channels-combined"
+ chan_info *cp;
+
+ ASSERT_CHANNEL(S_combined_data_color, snd, chn, 1);
+ cp = get_cp(snd, chn, S_combined_data_color);
+ if (!cp) return(XEN_FALSE);
+
+ return(XEN_WRAP_PIXEL(cp->combined_data_color));
+}
+
+
+static XEN g_set_combined_data_color(XEN color, XEN snd, XEN chn)
+{
+ chan_info *cp;
+
+ XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ARG_1, S_setB S_combined_data_color, "a color");
+ ASSERT_CHANNEL(S_combined_data_color, snd, chn, 1);
+ cp = get_cp(snd, chn, S_combined_data_color);
+ if (!cp) return(XEN_FALSE);
+
+ cp->combined_data_color = XEN_UNWRAP_PIXEL(color);
+ return(color);
+}
+
+WITH_THREE_SETTER_ARGS(g_set_combined_data_color_reversed, g_set_combined_data_color)
+
+
+
#ifdef XEN_ARGIFY_1
-XEN_ARGIFY_7(g_draw_line_w, g_draw_line)
-XEN_ARGIFY_6(g_draw_dot_w, g_draw_dot)
-XEN_ARGIFY_4(g_draw_lines_w, g_draw_lines)
-XEN_ARGIFY_5(g_draw_dots_w, g_draw_dots)
-XEN_ARGIFY_6(g_draw_string_w, g_draw_string)
-XEN_ARGIFY_8(g_fill_rectangle_w, g_fill_rectangle)
-XEN_ARGIFY_4(g_fill_polygon_w, g_fill_polygon)
+XEN_ARGIFY_8(g_draw_line_w, g_draw_line)
+XEN_ARGIFY_7(g_draw_dot_w, g_draw_dot)
+XEN_ARGIFY_5(g_draw_lines_w, g_draw_lines)
+XEN_ARGIFY_6(g_draw_dots_w, g_draw_dots)
+XEN_ARGIFY_7(g_draw_string_w, g_draw_string)
+XEN_ARGIFY_9(g_fill_rectangle_w, g_fill_rectangle)
+XEN_ARGIFY_5(g_fill_polygon_w, g_fill_polygon)
XEN_ARGIFY_3(g_foreground_color_w, g_foreground_color)
XEN_ARGIFY_4(g_set_foreground_color_w, g_set_foreground_color)
XEN_ARGIFY_3(g_current_font_w, g_current_font)
@@ -1760,11 +1905,13 @@ XEN_NARGIFY_1(g_hide_widget_w, g_hide_widget)
XEN_NARGIFY_1(g_show_widget_w, g_show_widget)
XEN_NARGIFY_1(g_focus_widget_w, g_focus_widget)
XEN_ARGIFY_5(g_make_graph_data_w, g_make_graph_data)
-XEN_ARGIFY_7(g_graph_data_w, g_graph_data)
+XEN_ARGIFY_8(g_graph_data_w, g_graph_data)
XEN_VARGIFY(g_make_bezier_w, g_make_bezier)
XEN_NARGIFY_0(g_snd_gcs_w, g_snd_gcs)
XEN_NARGIFY_1(g_snd_color_w, g_snd_color)
XEN_NARGIFY_1(g_snd_font_w, g_snd_font)
+XEN_NARGIFY_1(g_make_cairo_w, g_make_cairo)
+XEN_NARGIFY_1(g_free_cairo_w, g_free_cairo)
XEN_NARGIFY_0(g_selection_color_w, g_selection_color)
XEN_NARGIFY_1(g_set_selection_color_w, g_set_selection_color)
@@ -1803,10 +1950,12 @@ XEN_NARGIFY_1(g_set_axis_color_w, g_set_axis_color)
XEN_NARGIFY_0(g_basic_color_w, g_basic_color)
XEN_NARGIFY_1(g_set_basic_color_w, g_set_basic_color)
XEN_NARGIFY_1(g_color_p_w, g_color_p)
-XEN_NARGIFY_3(g_make_color_w, g_make_color)
+XEN_ARGIFY_4(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)
+XEN_NARGIFY_2(g_combined_data_color_w, g_combined_data_color)
+XEN_NARGIFY_3(g_set_combined_data_color_w, g_set_combined_data_color)
#else
@@ -1838,6 +1987,8 @@ XEN_ARGIFY_2(g_set_mix_color_w, g_set_mix_color)
#define g_snd_gcs_w g_snd_gcs
#define g_snd_color_w g_snd_color
#define g_snd_font_w g_snd_font
+#define g_make_cairo_w g_make_cairo
+#define g_free_cairo_w g_free_cairo
#define g_selection_color_w g_selection_color
#define g_set_selection_color_w g_set_selection_color
@@ -1880,6 +2031,8 @@ XEN_ARGIFY_2(g_set_mix_color_w, g_set_mix_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
+#define g_combined_data_color_w g_combined_data_color
+#define g_set_combined_data_color_w g_set_combined_data_color
#endif
@@ -1892,13 +2045,13 @@ void g_init_draw(void)
XEN_DEFINE_CONSTANT(S_selection_context, CHAN_SELGC, "graphics context to draw in the selection color");
XEN_DEFINE_CONSTANT(S_mark_context, CHAN_MGC, "graphics context for a mark");
- XEN_DEFINE_PROCEDURE(S_draw_line, g_draw_line_w, 4, 3, 0, H_draw_line);
- XEN_DEFINE_PROCEDURE(S_draw_dot, g_draw_dot_w, 2, 4, 0, H_draw_dot);
- XEN_DEFINE_PROCEDURE(S_draw_lines, g_draw_lines_w, 1, 3, 0, H_draw_lines);
- XEN_DEFINE_PROCEDURE(S_draw_dots, g_draw_dots_w, 1, 4, 0, H_draw_dots);
- XEN_DEFINE_PROCEDURE(S_draw_string, g_draw_string_w, 3, 3, 0, H_draw_string);
- XEN_DEFINE_PROCEDURE(S_fill_rectangle, g_fill_rectangle_w, 4, 4, 0, H_fill_rectangle);
- XEN_DEFINE_PROCEDURE(S_fill_polygon, g_fill_polygon_w, 1, 3, 0, H_fill_polygon);
+ XEN_DEFINE_PROCEDURE(S_draw_line, g_draw_line_w, 4, 4, 0, H_draw_line);
+ XEN_DEFINE_PROCEDURE(S_draw_dot, g_draw_dot_w, 2, 5, 0, H_draw_dot);
+ XEN_DEFINE_PROCEDURE(S_draw_lines, g_draw_lines_w, 1, 4, 0, H_draw_lines);
+ XEN_DEFINE_PROCEDURE(S_draw_dots, g_draw_dots_w, 1, 5, 0, H_draw_dots);
+ XEN_DEFINE_PROCEDURE(S_draw_string, g_draw_string_w, 3, 4, 0, H_draw_string);
+ XEN_DEFINE_PROCEDURE(S_fill_rectangle, g_fill_rectangle_w, 4, 5, 0, H_fill_rectangle);
+ XEN_DEFINE_PROCEDURE(S_fill_polygon, g_fill_polygon_w, 1, 4, 0, H_fill_polygon);
XEN_DEFINE_PROCEDURE(S_main_widgets, g_main_widgets_w, 0, 0, 0, H_main_widgets);
XEN_DEFINE_PROCEDURE(S_dialog_widgets, g_dialog_widgets_w, 0, 0, 0, H_dialog_widgets);
XEN_DEFINE_PROCEDURE(S_hide_widget, g_hide_widget_w, 1, 0, 0, H_hide_widget);
@@ -1906,7 +2059,7 @@ void g_init_draw(void)
XEN_DEFINE_PROCEDURE(S_focus_widget, g_focus_widget_w, 1, 0, 0, H_focus_widget);
XEN_DEFINE_PROCEDURE(S_make_graph_data, g_make_graph_data_w, 0, 5, 0, H_make_graph_data);
- XEN_DEFINE_PROCEDURE(S_graph_data, g_graph_data_w, 1, 6, 0, H_graph_data);
+ XEN_DEFINE_PROCEDURE(S_graph_data, g_graph_data_w, 1, 7, 0, H_graph_data);
XEN_DEFINE_PROCEDURE_WITH_REVERSED_SETTER(S_foreground_color, g_foreground_color_w, H_foreground_color,
S_setB S_foreground_color, g_set_foreground_color_w, g_set_foreground_color_reversed, 0, 3, 1, 3);
@@ -1981,18 +2134,21 @@ void g_init_draw(void)
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_WITH_REVERSED_SETTER(S_combined_data_color, g_combined_data_color_w, H_combined_data_color,
+ S_setB S_combined_data_color, g_set_combined_data_color_w, g_set_combined_data_color_reversed, 2, 0, 3, 0);
+
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_make_color, g_make_color_w, 3, 1, 0, H_make_color);
XEN_DEFINE_PROCEDURE(S_color_to_list, g_color_to_list_w, 1, 0, 0, H_color_to_list);
-
- /* ---------------- unstable ---------------- */
-
XEN_DEFINE_PROCEDURE(S_make_bezier, g_make_bezier_w, 0, 0, 1, H_make_bezier);
XEN_DEFINE_PROCEDURE(S_snd_gcs, g_snd_gcs_w, 0, 0, 0, H_snd_gcs);
XEN_DEFINE_PROCEDURE(S_snd_color, g_snd_color_w, 1, 0, 0, H_snd_color);
XEN_DEFINE_PROCEDURE(S_snd_font, g_snd_font_w, 1, 0, 0, H_snd_font);
+ XEN_DEFINE_PROCEDURE(S_make_cairo, g_make_cairo_w, 1, 0, 0, H_make_cairo);
+ XEN_DEFINE_PROCEDURE(S_free_cairo, g_free_cairo_w, 1, 0, 0, H_free_cairo);
+
#define H_new_widget_hook S_new_widget_hook " (widget): called each time a dialog or \
a new set of channel or sound widgets is created."
@@ -2000,15 +2156,13 @@ a new set of channel or sound widgets is created."
}
#else
-/* no gui */
+/* no gui -- extension lang tie-ins are in snd-nogui.c */
void set_grf_points(int xi, int j, int ymin, int ymax) {}
void set_grf_point(int xi, int j, int yi) {}
void draw_grf_points(int dot_size, graphics_context *ax, int j, axis_info *ap, mus_float_t y0, graph_style_t graph_style) {}
void draw_both_grf_points(int dot_size, graphics_context *ax, int j, graph_style_t graph_style) {}
void draw_cursor(chan_info *cp) {}
-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, graphics_context *ax) {return(true);}
#endif
-