Set outline color per spiral segment

This commit is contained in:
Paul Dicker
2025-04-09 20:16:12 +02:00
committed by Stéphane Lesimple
parent 73218aebd2
commit ed8d9cfd66
7 changed files with 28 additions and 25 deletions

View File

@@ -1529,7 +1529,7 @@ typedef struct _Spiral
int segmentCount;
double *segmentPos;
GdkColor **segmentColor;
GdkColor *outline;
GdkColor **segmentOutline;
int diameter;
int segmentClipping;
int cursorPos;
@@ -1543,7 +1543,7 @@ void GuiFreeSpiral(Spiral*);
void GuiFillSpiral(Spiral*, GdkColor*);
void GuiDrawSpiral(Spiral*);
void GuiDrawSpiralSegment(Spiral*, GdkColor*, int);
void GuiDrawSpiralSegment(Spiral*, GdkColor*, GdkColor*, int);
void GuiDrawSpiralLabel(Spiral*, PangoLayout*, char*, GdkColor*, int, int);
void GuiChangeSpiralCursor(Spiral*, int);
void GuiMoveSpiralCursor(Spiral*, int);

View File

@@ -182,7 +182,7 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat
}
/*
* Clip the spiral. Simply remove the clipping elements to avoid flicker.
* Clip the spiral.
*/
static gboolean clip_idle_func(gpointer data)
@@ -190,22 +190,19 @@ static gboolean clip_idle_func(gpointer data)
int i;
if(spiral->segmentClipping < spiral->segmentCount)
{ GdkColor *outline = spiral->outline;
int clipping = spiral->segmentClipping;
{ int clipping = spiral->segmentClipping;
spiral->outline = Closure->background;
spiral->segmentClipping = spiral->segmentCount;
for(i=clipping; i < spiral->segmentCount; i++)
GuiDrawSpiralSegment(spiral, Closure->background, i);
GuiDrawSpiralSegment(spiral, Closure->background, Closure->background, i);
spiral->outline = outline;
spiral->segmentClipping = clipping;
/* Now redraw the last turn */
for(i=ADAPTIVE_READ_SPIRAL_SIZE-300; i<=clipping; i++)
GuiDrawSpiralSegment(spiral, Closure->background, i);
GuiDrawSpiralSegment(spiral, Closure->background, 0, i);
}
return FALSE;
@@ -233,6 +230,7 @@ static gboolean segment_idle_func(gpointer data)
segment-=100;
GuiDrawSpiralSegment(Closure->readAdaptiveSpiral,
Closure->readAdaptiveSpiral->segmentColor[segment],
0,
segment);
return FALSE;
@@ -255,8 +253,8 @@ static gboolean remove_fill_idle_func(gpointer data)
int i;
for(i=0; i<spiral->segmentCount; i++)
if(spiral->segmentColor[i] == Closure->whiteSector)
GuiDrawSpiralSegment(spiral, Closure->background, i);
if(spiral->segmentColor[i] == Closure->whiteSector)
GuiDrawSpiralSegment(spiral, Closure->background, 0, i);
return FALSE;
}

View File

@@ -116,11 +116,11 @@ static gboolean curve_idle_func(gpointer data)
for(i=rc->lastSegment; i<ci->percent; i++)
switch(Closure->readLinearCurve->ivalue[i])
{ case 0: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->blueSector, i); break;
case 1: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->greenSector, i); break;
case 2: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->redSector, i); break;
case 3: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->darkSector, i); break;
case 4: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->yellowSector, i); break;
{ case 0: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->blueSector, 0, i); break;
case 1: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->greenSector, 0, i); break;
case 2: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->redSector, 0, i); break;
case 3: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->darkSector, 0, i); break;
case 4: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->yellowSector, 0, i); break;
}
rc->lastSegment = ci->percent;

View File

@@ -78,7 +78,7 @@ static gboolean spiral_idle_func(gpointer data)
int i;
for(i=sii->from; i<=sii->to; i++)
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, i-1);
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, 0, i-1);
g_free(sii);
return FALSE;

View File

@@ -81,7 +81,7 @@ static gboolean spiral_idle_func(gpointer data)
int i;
for(i=sii->from; i<=sii->to; i++)
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, i-1);
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, 0, i-1);
g_free(sii);
return FALSE;

View File

@@ -91,7 +91,7 @@ static gboolean spiral_idle_func(gpointer data)
int i;
for(i=sii->from; i<=sii->to; i++)
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, i-1);
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, 0, i-1);
g_free(sii);
return FALSE;

View File

@@ -51,13 +51,14 @@ Spiral* GuiCreateSpiral(GdkColor *outline, GdkColor *fill,
spiral->segmentCount = spiral->segmentClipping = n_segments;
spiral->segmentPos = g_malloc(n_segments * sizeof(double));
spiral->segmentColor = g_malloc(n_segments * sizeof(GdkColor*));
spiral->outline = outline;
spiral->segmentOutline = g_malloc(n_segments * sizeof(GdkColor*));
spiral->cursorPos = -1;
for(i=0; i<n_segments; i++)
{
spiral->segmentPos[i] = a;
spiral->segmentColor[i] = fill;
spiral->segmentOutline[i] = outline;
ring_expand = ((double)segment_size * a) / (2.0*M_PI);
a += atan((double)segment_size / scale_o);
@@ -85,6 +86,7 @@ void GuiFreeSpiral(Spiral *spiral)
g_free(spiral->segmentPos);
g_free(spiral->segmentColor);
g_free(spiral->segmentOutline);
g_free(spiral);
}
@@ -139,9 +141,11 @@ void GuiDrawSpiral(Spiral *spiral)
points[2].x = xo1; points[2].y = yo1;
points[3].x = xi1; points[3].y = yi1;
GdkColor *outline = spiral->segmentOutline[i] ? spiral->segmentOutline[i] : Closure->grid;
gdk_gc_set_rgb_fg_color(Closure->drawGC, spiral->segmentColor[i]);
gdk_draw_polygon(d, Closure->drawGC, TRUE, points, 4);
gdk_gc_set_rgb_fg_color(Closure->drawGC, spiral->outline);
gdk_gc_set_rgb_fg_color(Closure->drawGC, outline);
gdk_draw_polygon(d, Closure->drawGC, FALSE, points, 4);
xi0 = xi1; yi0 = yi1;
@@ -153,7 +157,7 @@ void GuiDrawSpiral(Spiral *spiral)
* Draw just one segment of the spiral
*/
void GuiDrawSpiralSegment(Spiral *spiral, GdkColor *color, int segment)
void GuiDrawSpiralSegment(Spiral *spiral, GdkColor *color, GdkColor *outline, int segment)
{ GdkDrawable *d = gtk_widget_get_window(spiral->widget);
double a;
double scale_i,scale_o,ring_expand;
@@ -185,9 +189,10 @@ void GuiDrawSpiralSegment(Spiral *spiral, GdkColor *color, int segment)
points[2].y = spiral->my + scale_o*sin(a);
spiral->segmentColor[segment] = color;
spiral->segmentOutline[segment] = outline;
gdk_gc_set_rgb_fg_color(Closure->drawGC, color);
gdk_draw_polygon(d, Closure->drawGC, TRUE, points, 4);
gdk_gc_set_rgb_fg_color(Closure->drawGC, spiral->outline);
gdk_gc_set_rgb_fg_color(Closure->drawGC, outline);
gdk_draw_polygon(d, Closure->drawGC, FALSE, points, 4);
}
@@ -230,7 +235,7 @@ void GuiMoveSpiralCursor(Spiral *spiral, int to_segment)
/* Erase old cursor */
if(spiral->cursorPos >= 0)
GuiDrawSpiralSegment(spiral, spiral->colorUnderCursor, spiral->cursorPos);
GuiDrawSpiralSegment(spiral, spiral->colorUnderCursor, 0, spiral->cursorPos);
/* Moving to -1 means cursor off */
@@ -247,7 +252,7 @@ void GuiMoveSpiralCursor(Spiral *spiral, int to_segment)
/* Draw cursor at new place */
spiral->colorUnderCursor = spiral->segmentColor[to_segment];
GuiDrawSpiralSegment(spiral, Closure->blueSector, to_segment);
GuiDrawSpiralSegment(spiral, Closure->blueSector, 0, to_segment);
}
/*