static void cdcreatecanvas(cdCanvas* canvas, void* data) { cdCtxCanvas* ctxcanvas; char* strdata = (char*)data; int w = 0, h = 0; double res = 0, xres, yres; FILE* fh; char filename[10240] = ""; /* Inicializa parametros */ if (strdata == NULL) return; strdata += cdGetFileName(strdata, filename); if (filename[0] == 0) return; sscanf(strdata,"%dx%d %lg", &w, &h, &res); if (w == 0 || h == 0) return; if (res) { xres = res; yres = res; } else { HDC ScreenDC = GetDC(NULL); xres = ((double)GetDeviceCaps(ScreenDC, LOGPIXELSX)) / 25.4; yres = ((double)GetDeviceCaps(ScreenDC, LOGPIXELSY)) / 25.4; ReleaseDC(NULL, ScreenDC); } /* Verifica se o arquivo pode ser aberto para escrita */ fh = fopen(filename, "w"); if (fh == 0) return; fclose(fh); /* Inicializa driver WIN32 */ ctxcanvas = cdwCreateCanvas(canvas, NULL, CreateMetaFile(NULL), CDW_WMF); canvas->w = w; canvas->h = h; canvas->xres = xres; canvas->yres = yres; canvas->w_mm = ((double)w) / res; canvas->h_mm = ((double)h) / res; canvas->bpp = 24; ctxcanvas->clip_pnt[2].x = ctxcanvas->clip_pnt[1].x = canvas->w - 1; ctxcanvas->clip_pnt[3].y = ctxcanvas->clip_pnt[2].y = canvas->h - 1; /* Inicializacao de variaveis particulares para o WMF */ ctxcanvas->filename = cdStrDup(filename); }
/* %F cdCreateCanvas para EMF. O DC é um EMF em memoria. */ static void cdcreatecanvas(cdCanvas* canvas, void* data) { cdCtxCanvas* ctxcanvas; char* strdata = (char*)data; int w = 0, h = 0; double xres, yres; FILE* file; char filename[10240] = ""; HDC ScreenDC, hDC; RECT rect; /* Inicializa parametros */ if (strdata == NULL) return; strdata += cdGetFileName(strdata, filename); if (filename[0] == 0) return; sscanf(strdata,"%dx%d", &w, &h); if (w == 0 || h == 0) return; /* Verifica se o arquivo pode ser aberto para escrita */ file = fopen(filename, "wb"); if (file == NULL) return; fclose(file); ScreenDC = GetDC(NULL); /* LOGPIXELS can not be used for EMF */ xres = (double)GetDeviceCaps(ScreenDC, HORZRES) / (double)GetDeviceCaps(ScreenDC, HORZSIZE); yres = (double)GetDeviceCaps(ScreenDC, VERTRES) / (double)GetDeviceCaps(ScreenDC, VERTSIZE); rect.left = 0; rect.top = 0; rect.right = (int)(100. * w / xres); rect.bottom = (int)(100. * h / yres); hDC = CreateEnhMetaFile(ScreenDC,filename,&rect,NULL); ReleaseDC(NULL, ScreenDC); if(!hDC) return; /* Inicializa driver WIN32 */ ctxcanvas = cdwCreateCanvas(canvas, NULL, hDC, CDW_EMF); canvas->w = w; canvas->h = h; canvas->xres = xres; canvas->yres = yres; canvas->w_mm = ((double)w) / xres; canvas->h_mm = ((double)h) / yres; canvas->bpp = 24; ctxcanvas->clip_pnt[2].x = ctxcanvas->clip_pnt[1].x = canvas->w - 1; ctxcanvas->clip_pnt[3].y = ctxcanvas->clip_pnt[2].y = canvas->h - 1; }
/* %F cdCreateCanvas para EMF. O DC é um EMF em memoria. */ static void cdcreatecanvas(cdCanvas* canvas, void* data) { char* strdata = (char*)data; char filename[10240] = ""; Metafile* metafile; /* Inicializa parametros */ if (strdata == NULL) return; strdata += cdGetFileName(strdata, filename); if (filename[0] == 0) return; int w = 0, h = 0; sscanf(strdata,"%dx%d", &w, &h); if (w == 0 || h == 0) return; { /* Verifica se o arquivo pode ser aberto para escrita */ FILE* file = fopen(filename, "wb"); if (file == NULL) return; fclose(file); } { HDC ScreenDC = GetDC(NULL); /* LOGPIXELS can not be used for EMF */ canvas->xres = (double)GetDeviceCaps(ScreenDC, HORZRES) / (double)GetDeviceCaps(ScreenDC, HORZSIZE); canvas->yres = (double)GetDeviceCaps(ScreenDC, VERTRES) / (double)GetDeviceCaps(ScreenDC, VERTSIZE); Rect frameRect(0, 0, (int)(100 * w / canvas->xres), (int)(100 * h / canvas->yres)); metafile = new Metafile(cdwpString2Unicode(filename, strlen(filename)), ScreenDC, frameRect, MetafileFrameUnitGdi, EmfTypeEmfPlusDual, NULL); ReleaseDC(NULL, ScreenDC); } canvas->w = w; canvas->h = h; canvas->bpp = 24; Graphics* graphics = new Graphics(metafile); /* Inicializa driver WIN32 */ cdCtxCanvas* ctxcanvas = cdwpCreateCanvas(canvas, graphics, CDW_EMF); /* Inicializacao de variaveis particulares para o EMF */ ctxcanvas->metafile = metafile; }
void cdcreatecanvasMF(cdCanvas *canvas, void *data) { char filename[10240] = ""; char* strdata = (char*)data; double w_mm = INT_MAX*3.78, h_mm = INT_MAX*3.78, res = 3.78; cdCtxCanvas* ctxcanvas; int size; strdata += cdGetFileName(strdata, filename); if (filename[0] == 0) return; sscanf(strdata, "%lgx%lg %lg", &w_mm, &h_mm, &res); ctxcanvas = (cdCtxCanvas *)malloc(sizeof(cdCtxCanvas)); memset(ctxcanvas, 0, sizeof(cdCtxCanvas)); ctxcanvas->file = fopen(filename, "w"); if (!ctxcanvas->file) { free(ctxcanvas); return; } size = strlen(filename); ctxcanvas->filename = malloc(size+1); memcpy(ctxcanvas->filename, filename, size+1); ctxcanvas->canvas = canvas; /* update canvas context */ canvas->w = (int)(w_mm * res); canvas->h = (int)(h_mm * res); canvas->w_mm = w_mm; canvas->h_mm = h_mm; canvas->bpp = 24; canvas->xres = res; canvas->yres = res; canvas->ctxcanvas = ctxcanvas; ctxcanvas->last_line_style = -1; ctxcanvas->last_fill_mode = -1; fprintf(ctxcanvas->file, "CDMF %d %d\n", canvas->w, canvas->h); }
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); }
/* %F Cria um canvas CGM. Parametros passados em data: [nome] nome do arquivo de saida <= 255 caracteres [size] tamanho do papel -t codificacao clear text se nao binaria */ static void cdcreatecanvas(cdCanvas* canvas, void *data) { cdCtxCanvas *ctxcanvas; char *line = (char *)data; char c; char words[4][256]; char filename[10240] = ""; double w=0, h=0, r=0; int p=0; int i, n; line += cdGetFileName(line, filename); if (filename[0] == 0) return; n = sscanf(line, "%s %s %s %s", words[0], words[1], words[2], words[3]); ctxcanvas = (cdCtxCanvas *)malloc(sizeof(cdCtxCanvas)); canvas->ctxcanvas = ctxcanvas; ctxcanvas->canvas = canvas; strcpy(ctxcanvas->filename, filename); canvas->w_mm = (double)INT_MAX*3.78; canvas->h_mm = (double)INT_MAX*3.78; canvas->xres = 3.78; canvas->yres = 3.78; canvas->bpp = 24; ctxcanvas->vdc_int_prec = 16; ctxcanvas->codificacao = CD_BIN; ctxcanvas->first = 1; ctxcanvas->clip.first = 1; ctxcanvas->patindex = 1; ctxcanvas->hassize = 0; /* Indica se foi passado um tamanho para o canvas */ for (i = 0; i < n; i++) { if (sscanf ( words[i], "%lgx%lg", &w, &h )== 2) { canvas->w_mm = w; canvas->h_mm = h; ctxcanvas->hassize = 1; } else if (sscanf ( words[i], "%lg", &r ) == 1) canvas->yres = canvas->xres = r; else if (sscanf ( words[i], "-%c%d", &c, &p )>0) { if ( c=='t' ) ctxcanvas->codificacao = CD_CLEAR_TEXT; else if ( c=='p' ) ctxcanvas->vdc_int_prec = p; } } if ( ctxcanvas->vdc_int_prec != 16 && w == 0.0 && h == 0.0 ) { canvas->w_mm = (double) (pow(2,p)/2)-1; canvas->h_mm = (double) (pow(2,p)/2)-1; } /* update canvas context */ canvas->w = (int)(canvas->w_mm * canvas->xres); canvas->h = (int)(canvas->h_mm * canvas->yres); ctxcanvas->cgm = cgm_begin_metafile ( ctxcanvas->filename, ctxcanvas->codificacao, "CD - CanvasDraw, Tecgraf/PUC-RIO" ); metafile_descriptor(ctxcanvas); cgm_begin_picture ( ctxcanvas->cgm, "Picture x" ); picture_descriptor (ctxcanvas); cgm_clip_rectangle ( ctxcanvas->cgm, 0, 0, (double)canvas->w, (double)canvas->h); cgm_clip_indicator (ctxcanvas->cgm, 0); cgm_begin_picture_body ( ctxcanvas->cgm ); control_elements (ctxcanvas); cgm_marker_type( ctxcanvas->cgm, MARKER_DOT); cgm_marker_size( ctxcanvas->cgm, 1.0); }