mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Do the pango text layout in multiple chunks
This way we can avoid the need for quoting, since we can just use text rendering instead of markup for the free-form fields. And we will want to make the pango layout width different for the date and location, since we want to fit the depth/duration to the right of them. I still haven't set the different width for the date/location, but this at least is going in the rigth direction. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
924ad0e15e
commit
b4c4a29a11
1 changed files with 22 additions and 74 deletions
96
print.c
96
print.c
|
@ -7,77 +7,24 @@
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "display-gtk.h"
|
#include "display-gtk.h"
|
||||||
|
|
||||||
/* Why doesn't pango/gtk have these quoting functions? */
|
|
||||||
static inline int add_char(char *buffer, size_t size, int len, char c)
|
|
||||||
{
|
|
||||||
if (len < size)
|
|
||||||
buffer[len++] = c;
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add an escape string "atomically" - all or nothing */
|
|
||||||
static int add_str(char *buffer, size_t size, int len, const char *s)
|
|
||||||
{
|
|
||||||
int oldlen = len;
|
|
||||||
char c;
|
|
||||||
while ((c = *s++) != 0) {
|
|
||||||
if (len >= size)
|
|
||||||
return oldlen;
|
|
||||||
buffer[len++] = c;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int add_quoted_string(char *buffer, size_t size, int len, const char *s)
|
|
||||||
{
|
|
||||||
if (!s)
|
|
||||||
return len;
|
|
||||||
|
|
||||||
/* Room for '\0' */
|
|
||||||
size--;
|
|
||||||
for (;;) {
|
|
||||||
const char *escape;
|
|
||||||
unsigned char c = *s++;
|
|
||||||
switch(c) {
|
|
||||||
default:
|
|
||||||
len = add_char(buffer, size, len, c);
|
|
||||||
continue;
|
|
||||||
case 0:
|
|
||||||
escape = "\n";
|
|
||||||
break;
|
|
||||||
case '&':
|
|
||||||
escape = "&";
|
|
||||||
break;
|
|
||||||
case '>':
|
|
||||||
escape = ">";
|
|
||||||
break;
|
|
||||||
case '<':
|
|
||||||
escape = "<";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
len = add_str(buffer, size, len, escape);
|
|
||||||
if (c)
|
|
||||||
continue;
|
|
||||||
buffer[len] = 0;
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* You know what? Maybe somebody can do a real Pango layout thing.
|
* You know what? Maybe somebody can do a real Pango layout thing.
|
||||||
* This is hacky.
|
* This is hacky.
|
||||||
*/
|
*/
|
||||||
static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, PangoFontDescription *font)
|
static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, PangoFontDescription *font)
|
||||||
{
|
{
|
||||||
int len;
|
int len, width, height, maxwidth, maxheight;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
char buffer[1024], divenr[20];
|
char buffer[1024], divenr[20];
|
||||||
|
|
||||||
|
maxwidth = w * PANGO_SCALE;
|
||||||
|
maxheight = h * PANGO_SCALE * 0.9;
|
||||||
|
|
||||||
layout = pango_cairo_create_layout(cr);
|
layout = pango_cairo_create_layout(cr);
|
||||||
pango_layout_set_font_description(layout, font);
|
pango_layout_set_font_description(layout, font);
|
||||||
pango_layout_set_width(layout, w * PANGO_SCALE);
|
pango_layout_set_width(layout, maxwidth);
|
||||||
pango_layout_set_height(layout, h * PANGO_SCALE * 0.9);
|
pango_layout_set_height(layout, maxheight);
|
||||||
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
|
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
|
||||||
|
|
||||||
*divenr = 0;
|
*divenr = 0;
|
||||||
|
@ -89,31 +36,19 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, P
|
||||||
len = snprintf(buffer, sizeof(buffer),
|
len = snprintf(buffer, sizeof(buffer),
|
||||||
"<span size=\"large\">"
|
"<span size=\"large\">"
|
||||||
"%s%s, %s %d, %d %d:%02d"
|
"%s%s, %s %d, %d %d:%02d"
|
||||||
"</span>\n",
|
"</span>",
|
||||||
divenr,
|
divenr,
|
||||||
weekday(tm->tm_wday),
|
weekday(tm->tm_wday),
|
||||||
monthname(tm->tm_mon),
|
monthname(tm->tm_mon),
|
||||||
tm->tm_mday, tm->tm_year + 1900,
|
tm->tm_mday, tm->tm_year + 1900,
|
||||||
tm->tm_hour, tm->tm_min);
|
tm->tm_hour, tm->tm_min);
|
||||||
|
|
||||||
/*
|
|
||||||
* Leave an empty line even if no location: otherwise the notes can
|
|
||||||
* overrun the depth/duration information.
|
|
||||||
*/
|
|
||||||
if (dive->location)
|
|
||||||
len = add_quoted_string(buffer, sizeof(buffer), len, dive->location);
|
|
||||||
else
|
|
||||||
len = add_char(buffer, sizeof(buffer), len, '\n');
|
|
||||||
|
|
||||||
if (dive->notes) {
|
|
||||||
len = add_char(buffer, sizeof(buffer), len, '\n');
|
|
||||||
len = add_quoted_string(buffer, sizeof(buffer), len, dive->notes);
|
|
||||||
}
|
|
||||||
|
|
||||||
pango_layout_set_justify(layout, 1);
|
pango_layout_set_justify(layout, 1);
|
||||||
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
||||||
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
||||||
|
|
||||||
pango_layout_set_markup(layout, buffer, len);
|
pango_layout_set_markup(layout, buffer, len);
|
||||||
|
pango_layout_get_size(layout, &width, &height);
|
||||||
|
|
||||||
cairo_move_to(cr, 0, 0);
|
cairo_move_to(cr, 0, 0);
|
||||||
pango_cairo_show_layout(cr, layout);
|
pango_cairo_show_layout(cr, layout);
|
||||||
|
@ -138,6 +73,19 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, P
|
||||||
cairo_move_to(cr, 0, 0);
|
cairo_move_to(cr, 0, 0);
|
||||||
pango_cairo_show_layout(cr, layout);
|
pango_cairo_show_layout(cr, layout);
|
||||||
|
|
||||||
|
len = snprintf(buffer, sizeof(buffer), "%s\n\n%s",
|
||||||
|
dive->location ? : "",
|
||||||
|
dive->notes ? : "");
|
||||||
|
|
||||||
|
maxheight -= height;
|
||||||
|
pango_layout_set_height(layout, maxheight);
|
||||||
|
pango_layout_set_attributes(layout, NULL);
|
||||||
|
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
||||||
|
pango_layout_set_text(layout, buffer, len);
|
||||||
|
|
||||||
|
cairo_move_to(cr, 0, height / (double) PANGO_SCALE);
|
||||||
|
pango_cairo_show_layout(cr, layout);
|
||||||
|
|
||||||
g_object_unref(layout);
|
g_object_unref(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue