/****************************************************************************
- * RRDtool 1.2.4 Copyright by Tobi Oetiker, 1997-2005
+ * RRDtool 1.2.8 Copyright by Tobi Oetiker, 1997-2005
****************************************************************************
* rrd_gfx.c graphics wrapper for rrdtool
**************************************************************************/
#include "rrd_gfx.h"
#include "rrd_afm.h"
+#include "unused.h"
/* lines are better drawn on the pixle than between pixles */
#define LINEOFFSET 0.5
}
double gfx_get_text_width_libart (
- gfx_canvas_t *canvas, double start, char* font, double size,
+ gfx_canvas_t *canvas, double UNUSED(start), char* font, double size,
double tabwidth, char* text, int rotation ){
int error;
*/
static int svg_indent = 0;
static int svg_single_line = 0;
-static const char *svg_default_font = "Helvetica";
+static const char *svg_default_font = "-dummy-";
typedef struct svg_dash
{
int dash_enable;
static void svg_text(FILE *fp, gfx_node_t *node)
{
pdf_coords g;
+ const char *fontname;
/* as svg has 0,0 in top-left corner (like most screens) instead of
bottom-left corner like pdf and eps, we have to fake the coords
using offset and inverse sin(r) value */
svg_write_number(fp, page_height - g.tmy);
fputs("\"", fp);
}
-
-/* if (strcmp(node->filename, svg_default_font))
- fprintf(fp, " font-family=\"%s\"", node->filename);
- */
- fputs(" font-family=\"Helvetica", fp);
- fputs("\" font-size=\"", fp);
+ fontname = afm_get_font_name(node->filename);
+ if (strcmp(fontname, svg_default_font))
+ fprintf(fp, " font-family=\"%s\"", fontname);
+ fputs(" font-size=\"", fp);
svg_write_number(fp, node->size);
fputs("\"", fp);
if (!svg_color_is_black(node->color))
art_u32 width, art_u32 height,
gfx_color_t background, FILE *fp){
gfx_node_t *node = canvas->firstnode;
+ /* Find the first font used, and assume it is the mostly used
+ one. It reduces the number of font-familty attributes. */
+ while (node) {
+ if (node->type == GFX_TEXT && node->filename) {
+ svg_default_font = afm_get_font_name(node->filename);
+ break;
+ }
+ node = node->next;
+ }
fputs(
"<?xml version=\"1.0\" standalone=\"no\"?>\n"
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\"\n"
" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"
"<!--\n"
" SVG file created by\n"
-" RRDtool 1.2.4 Tobias Oetiker, http://tobi.oetiker.ch\n"
+" RRDtool 1.2.8 Tobias Oetiker, http://tobi.oetiker.ch\n"
"\n"
" The width/height attributes in the outhermost svg node\n"
" are just default sizes for the browser which is used\n"
fprintf(fp, " x=\"0\" y=\"0\" width=\"%d\" height=\"%d\"", width, height);
svg_write_color(fp, background, "fill");
svg_close_tag_empty_node(fp);
+ node = canvas->firstnode;
while (node) {
switch (node->type) {
case GFX_LINE:
gfx_node_t *node;
fputs(
"%!PS-Adobe-3.0 EPSF-3.0\n"
- "%%Creator: RRDtool 1.2.4 Tobias Oetiker, http://tobi.oetiker.ch\n"
+ "%%Creator: RRDtool 1.2.8 Tobias Oetiker, http://tobi.oetiker.ch\n"
/* can't like weird chars here */
"%%Title: (RRDtool output)\n"
"%%DocumentData: Clean7Bit\n"
static void eps_write_text(eps_state *state, gfx_node_t *node)
{
FILE *fp = state->fp;
- const unsigned char *p;
+ const char *p;
const char *ps_font = afm_get_font_postscript_name(node->filename);
int lineLen = 0;
pdf_coords g;
fputs("T1 ", fp);
fputs("(", fp);
lineLen = 20;
- for (p = (const unsigned char*)node->text; *p; p++) {
- if (lineLen > 70) {
+ p = node->text;
+ while (1) {
+ unsigned char ch = *(unsigned char*)p;
+ if (!ch)
+ break;
+ if (++lineLen > 70) {
fputs("\\\n", fp); /* backslash and \n */
lineLen = 0;
}
- switch (*p) {
+ switch (ch) {
+ case '%':
case '(':
case ')':
case '\\':
+ fputc('\\', fp);
+ fputc(ch, fp);
+ break;
case '\n':
+ fputs("\\n", fp);
+ break;
case '\r':
+ fputs("\\r", fp);
+ break;
case '\t':
- fputc('\\', fp);
- lineLen++;
- /* fall-through */
+ fputs("\\t", fp);
+ break;
default:
- if (*p >= 126)
- fprintf(fp, "\\%03o", *p);
- else
- fputc(*p, fp);
- lineLen++;
- }
+ if (ch >= 126 || ch < 32) {
+ fprintf(fp, "\\%03o", ch);
+ lineLen += 3;
+ } else {
+ fputc(ch, fp);
+ }
+ }
+ p++;
}
if (node->angle) {
/* can't use svg_write_number as 2 decimals is far from enough to avoid
{
const char *p = text;
while (1) {
- char ch = *p;
+ unsigned char ch = *(unsigned char*)p;
switch (ch) {
case 0: return;
case '(':
case ')':
case '\\':
+ pdf_puts(buf, "\\");
+ pdf_put(buf, p, 1);
+ break;
case '\n':
+ pdf_puts(buf, "\\n");
+ break;
case '\r':
+ pdf_puts(buf, "\\r");
+ break;
case '\t':
- pdf_puts(buf, "\\");
- pdf_put(buf, (char)ch, 1);
+ pdf_puts(buf, "\\t");
break;
default:
if (ch >= 126 || ch < 32) {
static void pdf_setup_document(pdf_state *state)
{
- const char *creator = "RRDtool 1.2.4 Tobias Oetiker, http://tobi.oetiker.ch";
+ const char *creator = "RRDtool 1.2.8 Tobias Oetiker, http://tobi.oetiker.ch";
/* all objects created by now, so init code can reference them */
/* HEADER */
pdf_puts(&state->pdf_header, "%PDF-1.3\n");
int gfx_render_pdf (gfx_canvas_t *canvas,
art_u32 width, art_u32 height,
- gfx_color_t background, FILE *fp){
+ gfx_color_t UNUSED(background), FILE *fp){
struct pdf_state state;
memset(&state, 0, sizeof(pdf_state));
state.fp = fp;