From d866e81e681fc7cbe05769d929dab0a407305bbd Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 2 Feb 2020 14:46:35 +0800 Subject: [PATCH] Merge bubble_init_left and bubble_init_right --- ChangeLog | 7 +- src/bubblegen.c | 221 ++++++++++-------------------------------------- 2 files changed, 53 insertions(+), 175 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5be586a..48a69f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2020-02-02 Nick Gasson + + * src/bubblegen.c (bubble_init): Merge `bubble_init_left' and + `bubble_init_right'. + 2017-04-10 Nick Gasson * src/xcowsay.c (main): patch from Tony Finch to make cow @@ -37,7 +42,7 @@ 2010-11-06 Nick Gasson * src/bubblegen.c (bubble_init_left): Fix rendering of - left-handed though bubbles. + left-handed thought bubbles. * src/bubblegen.c (bubble_content_left): Align left-handed text content correctly. * src/xcowsay.c (main): Add -l option as short form of --left. diff --git a/src/bubblegen.c b/src/bubblegen.c index 1390654..d0192e9 100644 --- a/src/bubblegen.c +++ b/src/bubblegen.c @@ -1,5 +1,5 @@ /* bubblegen.c -- Generate various sorts of bubbles. - * Copyright (C) 2008-2019 Nick Gasson + * Copyright (C) 2008-2020 Nick Gasson * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -110,7 +110,7 @@ static void bubble_corner_arcs(bubble_t *b, bubble_style_t style, } } -static void bubble_init_left(bubble_t *b, bubble_style_t style) +static void bubble_init_shared(bubble_t *b, bubble_style_t style, bool right) { GdkColor black, white, bright_green; GdkPoint tip_points[5]; @@ -146,12 +146,13 @@ static void bubble_init_left(bubble_t *b, bubble_style_t style) // Fill in the middle of the bubble gdk_draw_rectangle(b->pixmap, b->gc, TRUE, - CORNER_RADIUS + BUBBLE_BORDER, + CORNER_RADIUS + (right ? middle : 0) + BUBBLE_BORDER, BUBBLE_BORDER, b->width - middle - BUBBLE_BORDER - CORNER_DIAM, b->height - BUBBLE_BORDER); gdk_draw_rectangle(b->pixmap, b->gc, TRUE, - BUBBLE_BORDER, BUBBLE_BORDER + CORNER_RADIUS, + (right ? middle : 0) + BUBBLE_BORDER, + BUBBLE_BORDER + CORNER_RADIUS, b->width - middle - BUBBLE_BORDER*2, b->height - BUBBLE_BORDER - CORNER_DIAM); @@ -166,161 +167,31 @@ static void bubble_init_left(bubble_t *b, bubble_style_t style) tip_offset[2] = new_offset; } - tip_points[0].x = b->width - middle - BUBBLE_BORDER; - tip_points[0].y = BUBBLE_BORDER + CORNER_RADIUS; - tip_points[1].x = b->width - middle - BUBBLE_BORDER; - tip_points[1].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0]; - tip_points[2].x = b->width - BUBBLE_BORDER; - tip_points[2].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]/2; - tip_points[3].x = b->width - middle - BUBBLE_BORDER; - tip_points[3].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]; - tip_points[4].x = b->width - middle - BUBBLE_BORDER; - tip_points[4].y = b->height - CORNER_RADIUS; - - gdk_draw_polygon(b->pixmap, b->gc, TRUE, tip_points, 5); - } - else { - // Incrementally move the top kircle down so it's within the - // bubble's border - int big_y = BIG_KIRCLE_Y; - int small_y = SMALL_KIRCLE_Y; - - while (big_y + KIRCLE_TOP_MIN > b->height/2) { - big_y /= 2; - small_y /= 2; + if (right) { + tip_points[0].x = middle + BUBBLE_BORDER; + tip_points[0].y = BUBBLE_BORDER + CORNER_RADIUS; + tip_points[1].x = middle + BUBBLE_BORDER; + tip_points[1].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0]; + tip_points[2].x = BUBBLE_BORDER; + tip_points[2].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]/2; + tip_points[3].x = middle + BUBBLE_BORDER; + tip_points[3].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]; + tip_points[4].x = middle + BUBBLE_BORDER; + tip_points[4].y = b->height - CORNER_RADIUS; } - - // Draw two think kircles - gdk_draw_arc(b->pixmap, b->gc, TRUE, - b->width - BIG_KIRCLE_X - BIG_KIRCLE_DIAM, - b->height/2 - big_y, BIG_KIRCLE_DIAM, - BIG_KIRCLE_DIAM, 0, 360*64); - - gdk_draw_arc(b->pixmap, b->gc, TRUE, - b->width - SMALL_KIRCLE_X - SMALL_KIRCLE_DIAM, - b->height/2 - small_y, SMALL_KIRCLE_DIAM, - SMALL_KIRCLE_DIAM, 0, 360*64); - - gdk_gc_set_line_attributes(b->gc, 4, GDK_LINE_SOLID, - GDK_CAP_ROUND, GDK_JOIN_ROUND); - gdk_gc_set_foreground(b->gc, &black); - gdk_draw_arc(b->pixmap, b->gc, FALSE, - b->width - BIG_KIRCLE_X - BIG_KIRCLE_DIAM, - b->height/2 - big_y, BIG_KIRCLE_DIAM, - BIG_KIRCLE_DIAM, 0, 360*64); - - gdk_draw_arc(b->pixmap, b->gc, FALSE, - b->width - SMALL_KIRCLE_X - SMALL_KIRCLE_DIAM, - b->height/2 - small_y, SMALL_KIRCLE_DIAM, - SMALL_KIRCLE_DIAM, 0, 360*64); - } - - // Draw the black rounded corners - gdk_gc_set_line_attributes(b->gc, 4, GDK_LINE_SOLID, - GDK_CAP_ROUND, GDK_JOIN_ROUND); - gdk_gc_set_foreground(b->gc, &black); - gdk_draw_arc(b->pixmap, b->gc, FALSE, BUBBLE_BORDER, - BUBBLE_BORDER, CORNER_DIAM, CORNER_DIAM, 90*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, FALSE, BUBBLE_BORDER, - b->height - CORNER_DIAM, CORNER_DIAM, - CORNER_DIAM, 180*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, FALSE, - b->width - middle - CORNER_DIAM - BUBBLE_BORDER, - b->height - CORNER_DIAM, CORNER_DIAM, - CORNER_DIAM, 270*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, FALSE, - b->width - middle - CORNER_DIAM - BUBBLE_BORDER, - BUBBLE_BORDER, CORNER_DIAM, CORNER_DIAM, 0*64, 90*64); - - // Draw the top, bottom, and left sides (easy as they're straight!) - gdk_draw_line(b->pixmap, b->gc, - BUBBLE_BORDER, - CORNER_RADIUS + BUBBLE_BORDER, - BUBBLE_BORDER, b->height - CORNER_RADIUS); - gdk_draw_line(b->pixmap, b->gc, - BUBBLE_BORDER + CORNER_RADIUS, BUBBLE_BORDER, - b->width - CORNER_RADIUS - middle, BUBBLE_BORDER); - gdk_draw_line(b->pixmap, b->gc, - BUBBLE_BORDER + CORNER_RADIUS, b->height, - b->width - CORNER_RADIUS - middle, b->height); - - if (style == NORMAL) - gdk_draw_lines(b->pixmap, b->gc, tip_points, 5); - else - gdk_draw_line(b->pixmap, b->gc, - b->width - THINK_WIDTH - BUBBLE_BORDER, - CORNER_RADIUS + BUBBLE_BORDER, - b->width - THINK_WIDTH - BUBBLE_BORDER, - b->height - CORNER_RADIUS); -} - -static void bubble_init_right(bubble_t *b, bubble_style_t style) -{ - GdkColor black, white, bright_green; - GdkPoint tip_points[5]; - - get_colour(0, 0, 0, &black); - get_colour(0xffff, 0xffff, 0xffff, &white); - get_colour(0, 0xffff, 0, &bright_green); - - gdk_gc_set_background(b->gc, &black); - gdk_gc_set_rgb_fg_color(b->gc, &bright_green); - - gdk_draw_rectangle(b->pixmap, b->gc, TRUE, 0, 0, b->width, b->height); - - b->width -= BUBBLE_BORDER; - b->height -= BUBBLE_BORDER; - - // Space between cow and bubble - int middle = style == NORMAL ? TIP_WIDTH : THINK_WIDTH; - - // Draw the white corners - int corners[4][2]; - bubble_corner_arcs(b, style, corners); - - gdk_gc_set_foreground(b->gc, &white); - gdk_draw_arc(b->pixmap, b->gc, TRUE, corners[0][0], corners[0][1], - CORNER_DIAM, CORNER_DIAM, 90*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, TRUE, corners[1][0], corners[1][1], - CORNER_DIAM, CORNER_DIAM, 180*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, TRUE, corners[2][0], corners[2][1], - CORNER_DIAM, CORNER_DIAM, 270*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, TRUE, corners[3][0], corners[3][1], - CORNER_DIAM, CORNER_DIAM, 0*64, 90*64); - - // Fill in the middle of the bubble - gdk_draw_rectangle(b->pixmap, b->gc, TRUE, - CORNER_RADIUS + middle + BUBBLE_BORDER, - BUBBLE_BORDER, - b->width - middle - BUBBLE_BORDER - CORNER_DIAM, - b->height - BUBBLE_BORDER); - gdk_draw_rectangle(b->pixmap, b->gc, TRUE, - middle + BUBBLE_BORDER, BUBBLE_BORDER + CORNER_RADIUS, - b->width - middle - BUBBLE_BORDER*2, - b->height - BUBBLE_BORDER - CORNER_DIAM); - - if (style == NORMAL) { - // The points on the tip part - int tip_compute_offset = (b->height - BUBBLE_BORDER - CORNER_DIAM)/3; - int tip_offset[3] = { tip_compute_offset, tip_compute_offset, tip_compute_offset }; - if (tip_compute_offset < MIN_TIP_HEIGHT) { - int new_offset = (b->height - BUBBLE_BORDER - CORNER_DIAM - MIN_TIP_HEIGHT)/2; - tip_offset[0] = new_offset; - tip_offset[1] = MIN_TIP_HEIGHT; - tip_offset[2] = new_offset; + else { + tip_points[0].x = b->width - middle - BUBBLE_BORDER; + tip_points[0].y = BUBBLE_BORDER + CORNER_RADIUS; + tip_points[1].x = b->width - middle - BUBBLE_BORDER; + tip_points[1].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0]; + tip_points[2].x = b->width - BUBBLE_BORDER; + tip_points[2].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]/2; + tip_points[3].x = b->width - middle - BUBBLE_BORDER; + tip_points[3].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]; + tip_points[4].x = b->width - middle - BUBBLE_BORDER; + tip_points[4].y = b->height - CORNER_RADIUS; } - tip_points[0].x = middle + BUBBLE_BORDER; - tip_points[0].y = BUBBLE_BORDER + CORNER_RADIUS; - tip_points[1].x = middle + BUBBLE_BORDER; - tip_points[1].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0]; - tip_points[2].x = BUBBLE_BORDER; - tip_points[2].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]/2; - tip_points[3].x = middle + BUBBLE_BORDER; - tip_points[3].y = BUBBLE_BORDER + CORNER_RADIUS + tip_offset[0] + tip_offset[1]; - tip_points[4].x = middle + BUBBLE_BORDER; - tip_points[4].y = b->height - CORNER_RADIUS; - gdk_draw_polygon(b->pixmap, b->gc, TRUE, tip_points, 5); } else { @@ -336,12 +207,12 @@ static void bubble_init_right(bubble_t *b, bubble_style_t style) // Draw two think kircles gdk_draw_arc(b->pixmap, b->gc, TRUE, - BIG_KIRCLE_X, + right ? BIG_KIRCLE_X : b->width - BIG_KIRCLE_X - BIG_KIRCLE_DIAM, b->height/2 - big_y, BIG_KIRCLE_DIAM, BIG_KIRCLE_DIAM, 0, 360*64); gdk_draw_arc(b->pixmap, b->gc, TRUE, - SMALL_KIRCLE_X, + right ? SMALL_KIRCLE_X : b->width - SMALL_KIRCLE_X - SMALL_KIRCLE_DIAM, b->height/2 - small_y, SMALL_KIRCLE_DIAM, SMALL_KIRCLE_DIAM, 0, 360*64); @@ -349,12 +220,12 @@ static void bubble_init_right(bubble_t *b, bubble_style_t style) GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground(b->gc, &black); gdk_draw_arc(b->pixmap, b->gc, FALSE, - BIG_KIRCLE_X, + right ? BIG_KIRCLE_X : b->width - BIG_KIRCLE_X - BIG_KIRCLE_DIAM, b->height/2 - big_y, BIG_KIRCLE_DIAM, BIG_KIRCLE_DIAM, 0, 360*64); gdk_draw_arc(b->pixmap, b->gc, FALSE, - SMALL_KIRCLE_X, + right ? SMALL_KIRCLE_X : b->width - SMALL_KIRCLE_X - SMALL_KIRCLE_DIAM, b->height/2 - small_y, SMALL_KIRCLE_DIAM, SMALL_KIRCLE_DIAM, 0, 360*64); } @@ -363,30 +234,35 @@ static void bubble_init_right(bubble_t *b, bubble_style_t style) gdk_gc_set_line_attributes(b->gc, 4, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground(b->gc, &black); - gdk_draw_arc(b->pixmap, b->gc, FALSE, middle + BUBBLE_BORDER, + gdk_draw_arc(b->pixmap, b->gc, FALSE, (right ? middle : 0) + BUBBLE_BORDER, BUBBLE_BORDER, CORNER_DIAM, CORNER_DIAM, 90*64, 90*64); - gdk_draw_arc(b->pixmap, b->gc, FALSE, middle + BUBBLE_BORDER, + gdk_draw_arc(b->pixmap, b->gc, FALSE, (right ? middle : 0) + BUBBLE_BORDER, b->height - CORNER_DIAM, CORNER_DIAM, CORNER_DIAM, 180*64, 90*64); gdk_draw_arc(b->pixmap, b->gc, FALSE, - b->width - CORNER_DIAM - BUBBLE_BORDER, + b->width - (!right ? middle : 0) - CORNER_DIAM - BUBBLE_BORDER, b->height - CORNER_DIAM, CORNER_DIAM, CORNER_DIAM, 270*64, 90*64); gdk_draw_arc(b->pixmap, b->gc, FALSE, - b->width - CORNER_DIAM - BUBBLE_BORDER, + b->width - (!right ? middle : 0) - CORNER_DIAM - BUBBLE_BORDER, BUBBLE_BORDER, CORNER_DIAM, CORNER_DIAM, 0*64, 90*64); // Draw the top, bottom, and right sides (easy as they're straight!) gdk_draw_line(b->pixmap, b->gc, - b->width - BUBBLE_BORDER, + right ? b->width - BUBBLE_BORDER : BUBBLE_BORDER, CORNER_RADIUS + BUBBLE_BORDER, - b->width - BUBBLE_BORDER, b->height - CORNER_RADIUS); + right ? b->width - BUBBLE_BORDER : BUBBLE_BORDER, + b->height - CORNER_RADIUS); gdk_draw_line(b->pixmap, b->gc, - BUBBLE_BORDER + middle + CORNER_RADIUS, BUBBLE_BORDER, - b->width - CORNER_RADIUS, BUBBLE_BORDER); + BUBBLE_BORDER + (right ? middle : 0) + CORNER_RADIUS , + BUBBLE_BORDER, + b->width - CORNER_RADIUS - (!right ? middle : 0), + BUBBLE_BORDER); gdk_draw_line(b->pixmap, b->gc, - BUBBLE_BORDER + middle + CORNER_RADIUS, b->height, - b->width - CORNER_RADIUS, b->height); + BUBBLE_BORDER + (right ? middle : 0) + CORNER_RADIUS, + b->height, + b->width - CORNER_RADIUS - (!right ? middle : 0), + b->height); if (style == NORMAL) gdk_draw_lines(b->pixmap, b->gc, tip_points, 5); @@ -408,10 +284,7 @@ static void bubble_init(bubble_t *b, bubble_style_t style) g_assert(b->pixmap); b->gc = gdk_gc_new(b->pixmap); - if (get_bool_option("left")) - bubble_init_left(b, style); - else - bubble_init_right(b, style); + bubble_init_shared(b, style, !get_bool_option("left")); } static void bubble_size_from_content(bubble_t *b, bubble_style_t style, -- 2.39.2