diff --git a/gsk/gskslprinter.c b/gsk/gskslprinter.c index 901367dbf5..2831fc9083 100644 --- a/gsk/gskslprinter.c +++ b/gsk/gskslprinter.c @@ -127,16 +127,47 @@ gsk_sl_printer_append_uint (GskSlPrinter *printer, } void -gsk_sl_printer_append_double (GskSlPrinter *printer, - double d, - gboolean with_dot) +gsk_sl_printer_append_float (GskSlPrinter *printer, + float f) { char buf[G_ASCII_DTOSTR_BUF_SIZE]; - g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, d); - g_string_append (printer->string, buf); - if (with_dot && strchr (buf, '.') == NULL) - g_string_append (printer->string, ".0"); + if (isnanf (f)) + g_string_append (printer->string, "(0.0 / 0.0)"); + else if (isinff (f) > 0) + g_string_append (printer->string, "(1.0 / 0.0)"); + else if (isinff (f) < 0) + g_string_append (printer->string, "(-1.0 / 0.0)"); + else + { + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, f); + g_string_append (printer->string, buf); + if (strchr (buf, '.') == NULL) + g_string_append (printer->string, ".0"); + } +} + +void +gsk_sl_printer_append_double (GskSlPrinter *printer, + double d) +{ + char buf[G_ASCII_DTOSTR_BUF_SIZE]; + + if (isnan (d)) + g_string_append (printer->string, "(0.0lf / 0.0lf)"); + else if (isinf (d) > 0) + g_string_append (printer->string, "(1.0lf / 0.0lf)"); + else if (isinf (d) < 0) + g_string_append (printer->string, "(-1.0lf / 0.0lf)"); + else + { + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, d); + g_string_append (printer->string, buf); + if (strchr (buf, '.') == NULL) + g_string_append (printer->string, ".0lf"); + else + g_string_append (printer->string, "lf"); + } } void diff --git a/gsk/gskslprinterprivate.h b/gsk/gskslprinterprivate.h index 83be55d138..5d1e37bd2d 100644 --- a/gsk/gskslprinterprivate.h +++ b/gsk/gskslprinterprivate.h @@ -43,9 +43,10 @@ void gsk_sl_printer_append_int (GskSlPrinter int i); void gsk_sl_printer_append_uint (GskSlPrinter *printer, guint u); +void gsk_sl_printer_append_float (GskSlPrinter *printer, + float f); void gsk_sl_printer_append_double (GskSlPrinter *printer, - double d, - gboolean with_dot); + double d); void gsk_sl_printer_newline (GskSlPrinter *printer); G_END_DECLS diff --git a/gsk/gsksltype.c b/gsk/gsksltype.c index f0324bcfe1..2b65db7288 100644 --- a/gsk/gsksltype.c +++ b/gsk/gsksltype.c @@ -95,7 +95,7 @@ print_float (GskSlPrinter *printer, { const gfloat *f = value; - gsk_sl_printer_append_double (printer, *f, TRUE); + gsk_sl_printer_append_float (printer, *f); } static guint32 @@ -122,8 +122,7 @@ print_double (GskSlPrinter *printer, { const gdouble *d = value; - gsk_sl_printer_append_double (printer, *d, TRUE); - gsk_sl_printer_append (printer, "lf"); + gsk_sl_printer_append_double (printer, *d); } static guint32