From ed8d9cfd66a2dc151a94ef13ca210f65a1adafe5 Mon Sep 17 00:00:00 2001 From: Paul Dicker Date: Wed, 9 Apr 2025 20:16:12 +0200 Subject: [PATCH] Set outline color per spiral segment --- src/dvdisaster.h | 4 ++-- src/read-adaptive-window.c | 16 +++++++--------- src/read-linear-window.c | 10 +++++----- src/rs01-verify.c | 2 +- src/rs02-verify.c | 2 +- src/rs03-verify.c | 2 +- src/spiral.c | 17 +++++++++++------ 7 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/dvdisaster.h b/src/dvdisaster.h index d5ec661..68fc160 100644 --- a/src/dvdisaster.h +++ b/src/dvdisaster.h @@ -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); diff --git a/src/read-adaptive-window.c b/src/read-adaptive-window.c index 9931197..bf09551 100644 --- a/src/read-adaptive-window.c +++ b/src/read-adaptive-window.c @@ -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; isegmentCount; 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; } diff --git a/src/read-linear-window.c b/src/read-linear-window.c index f9055d4..b4d97b2 100644 --- a/src/read-linear-window.c +++ b/src/read-linear-window.c @@ -116,11 +116,11 @@ static gboolean curve_idle_func(gpointer data) for(i=rc->lastSegment; ipercent; 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; diff --git a/src/rs01-verify.c b/src/rs01-verify.c index 698a659..696c5d1 100644 --- a/src/rs01-verify.c +++ b/src/rs01-verify.c @@ -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; diff --git a/src/rs02-verify.c b/src/rs02-verify.c index 19f8db6..229a56d 100644 --- a/src/rs02-verify.c +++ b/src/rs02-verify.c @@ -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; diff --git a/src/rs03-verify.c b/src/rs03-verify.c index 1bbfcbe..812f95c 100644 --- a/src/rs03-verify.c +++ b/src/rs03-verify.c @@ -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; diff --git a/src/spiral.c b/src/spiral.c index ebdc8a6..60f8b33 100644 --- a/src/spiral.c +++ b/src/spiral.c @@ -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; isegmentPos[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); } /*