void cdfCanvasBox(cdCanvas* canvas, double xmin, double xmax, double ymin, double ymax) { assert(canvas); if (!_cdCheckCanvas(canvas)) return; if (canvas->interior_style == CD_HOLLOW) { cdfCanvasRect(canvas, xmin, xmax, ymin, ymax); return; } if (!cdfCheckBoxSize(&xmin, &xmax, &ymin, &ymax)) return; if (canvas->use_origin) { xmin += canvas->forigin.x; xmax += canvas->forigin.x; ymin += canvas->forigin.y; ymax += canvas->forigin.y; } if (canvas->invert_yaxis) { ymin = _cdInvertYAxis(canvas, ymin); ymax = _cdInvertYAxis(canvas, ymax); _cdSwapDouble(ymin, ymax); } if (canvas->cxFBox) canvas->cxFBox(canvas->ctxcanvas, xmin, xmax, ymin, ymax); else canvas->cxBox(canvas->ctxcanvas, _cdRound(xmin), _cdRound(xmax), _cdRound(ymin), _cdRound(ymax)); }
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); }