1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/** \file
* \brief Cairo PDF Driver
*
* See Copyright Notice in cd.h
*/
#include <stdlib.h>
#include <stdio.h>
#include "cd.h"
#include "cdcairo.h"
#include "cdcairoctx.h"
#include <cairo-pdf.h>
static void cdkillcanvas (cdCtxCanvas *ctxcanvas)
{
cdcairoKillCanvas(ctxcanvas);
}
static void cdcreatecanvas(cdCanvas* canvas, void* data)
{
cdCtxCanvas* ctxcanvas;
char* strdata = (char*)data;
char filename[10240] = "";
cairo_surface_t *surface;
int res = 300;
double w_pt; /* Largura do papel (points) */
double h_pt; /* Altura do papel (points) */
double scale; /* Fator de conversao de coordenadas (pixel2points) */
int landscape = 0; /* page orientation */
/* Starting parameters */
if (strdata == NULL)
return;
strdata += cdGetFileName(strdata, filename);
if (filename[0] == 0)
return;
cdSetPaperSize(CD_A4, &w_pt, &h_pt);
while (*strdata != '\0')
{
while (*strdata != '\0' && *strdata != '-')
strdata++;
if (*strdata != '\0')
{
float num;
strdata++;
switch (*strdata++)
{
case 'p':
{
int paper;
sscanf(strdata, "%d", &paper);
cdSetPaperSize(paper, &w_pt, &h_pt);
break;
}
case 'w':
sscanf(strdata, "%g", &num);
w_pt = CD_MM2PT*num;
break;
case 'h':
sscanf(strdata, "%g", &num);
h_pt = CD_MM2PT*num;
break;
case 'o':
landscape = 1;
break;
case 's':
sscanf(strdata, "%d", &res);
break;
}
}
while (*strdata != '\0' && *strdata != ' ')
strdata++;
}
if (landscape)
_cdSwapDouble(w_pt, h_pt);
scale = 72.0/res;
canvas->w = (int)(w_pt/scale + 0.5); /* Converte p/ unidades do usuario */
canvas->h = (int)(h_pt/scale + 0.5); /* Converte p/ unidades do usuario */
canvas->w_mm = w_pt/CD_MM2PT; /* Converte p/ milimetros */
canvas->h_mm = h_pt/CD_MM2PT; /* Converte p/ milimetros */
canvas->bpp = 24;
canvas->xres = canvas->w / canvas->w_mm;
canvas->yres = canvas->h / canvas->h_mm;
surface = cairo_pdf_surface_create(filename, w_pt, h_pt);
/* Starting Cairo driver */
ctxcanvas = cdcairoCreateCanvas(canvas, cairo_create(surface));
cairo_surface_destroy(surface);
}
static void cdinittable(cdCanvas* canvas)
{
cdcairoInitTable(canvas);
canvas->cxKillCanvas = cdkillcanvas;
}
static cdContext cdCairoPDFContext =
{
CD_CAP_ALL & ~(CD_CAP_PLAY | CD_CAP_YAXIS | CD_CAP_REGION | CD_CAP_WRITEMODE | CD_CAP_PALETTE),
CD_CTX_FILE, /* not a plus driver */
cdcreatecanvas,
cdinittable,
NULL,
NULL
};
cdContext* cdContextCairoPDF(void)
{
return &cdCairoPDFContext;
}
|