static void cdcreatecanvas(cdCanvas* canvas, void *data) { cdCtxCanvas* ctxcanvas; cairo_surface_t *surface; HWND hWnd = (HWND)data; HDC ScreenDC, hDC; HRGN clip_hrgn; ScreenDC = GetDC(NULL); canvas->bpp = GetDeviceCaps(ScreenDC, BITSPIXEL); canvas->xres = (float)(((double)GetDeviceCaps(ScreenDC, LOGPIXELSX)) / 25.4); canvas->yres = (float)(((double)GetDeviceCaps(ScreenDC, LOGPIXELSY)) / 25.4); ReleaseDC(NULL, ScreenDC); if (!data) { hDC = GetDC(NULL); canvas->w = GetDeviceCaps(hDC, HORZRES); canvas->h = GetDeviceCaps(hDC, VERTRES); } else { RECT rect; hWnd = (HWND)data; hDC = GetDC(hWnd); GetClientRect(hWnd, &rect); canvas->w = rect.right - rect.left; canvas->h = rect.bottom - rect.top; } /* initial clip extents controls size */ clip_hrgn = CreateRectRgn(0, 0, canvas->w, canvas->h); SelectClipRgn(hDC, clip_hrgn); DeleteObject(clip_hrgn); surface = cairo_win32_surface_create(hDC); canvas->w_mm = ((double)canvas->w) / canvas->xres; canvas->h_mm = ((double)canvas->h) / canvas->yres; ctxcanvas = cdcairoCreateCanvas(canvas, cairo_create(surface)); cairo_surface_destroy(surface); ctxcanvas->hDC = hDC; ctxcanvas->hWnd = hWnd; if (hWnd) { LONG style = GetClassLong(hWnd, GCL_STYLE); ctxcanvas->isOwnedDC = (int) ((style & CS_OWNDC) || (style & CS_CLASSDC)); } else ctxcanvas->isOwnedDC = 1; }
static void cdcreatecanvas(cdCanvas* canvas, void *data) { cdCtxImage *ctximage = ((cdImage*)data)->ctximage; cdcairoCreateCanvas(canvas, (cairo_t*)ctximage->cr); canvas->w = ctximage->w; canvas->h = ctximage->h; canvas->w_mm = ctximage->w_mm; canvas->h_mm = ctximage->h_mm; canvas->bpp = ctximage->bpp; canvas->xres = ctximage->xres; canvas->yres = ctximage->yres; }
static void cdcreatecanvas(cdCanvas* canvas, void* data) { cdCtxCanvas* ctxcanvas; cairo_surface_t *surface; int w = 0, h = 0, use_alpha = 0; double res = 3.78; unsigned char *rgb = NULL; char* str_data = (char*)data; char* res_ptr = NULL; cairo_format_t format = CAIRO_FORMAT_RGB24; /* Starting parameters */ if (str_data == NULL) return; if (strstr(str_data, "-a")) use_alpha = 1; res_ptr = strstr(str_data, "-r"); if (res_ptr) sscanf(res_ptr+2, "%lg", &res); /* size and rgb */ #ifdef SunOS_OLD sscanf(str_data, "%dx%d %d", &w, &h, &rgb); #else sscanf(str_data, "%dx%d %p", &w, &h, &rgb); #endif if (w == 0) w = 1; if (h == 0) h = 1; canvas->w = w; canvas->h = h; canvas->yres = res; canvas->xres = res; canvas->w_mm = ((double)w) / res; canvas->h_mm = ((double)h) / res; if (use_alpha) { canvas->bpp = 32; format = CAIRO_FORMAT_ARGB32; } else canvas->bpp = 24; /* fake value, image bpp is always 32 */ if (rgb) surface = cairo_image_surface_create_for_data(rgb, format, w, h, w*32); else surface = cairo_image_surface_create(format, canvas->w, canvas->h); /* Starting Cairo driver */ ctxcanvas = cdcairoCreateCanvas(canvas, cairo_create(surface)); cairo_surface_destroy(surface); if (rgb) { ctxcanvas->user_image = 1; ctxcanvas->rgb = rgb; } else { ctxcanvas->user_image = 0; ctxcanvas->rgb = cairo_image_surface_get_data(cairo_get_target(ctxcanvas->cr)); /* fill with white */ /* transparent, this is the normal alpha coding */ cairo_set_source_rgba(ctxcanvas->cr, 1.0, 1.0, 1.0, 0.0); cairo_rectangle(ctxcanvas->cr, 0, 0, canvas->w, canvas->h); cairo_fill(ctxcanvas->cr); } cdRegisterAttribute(canvas, &stride_attrib); cdRegisterAttribute(canvas, &write2png_attrib); cdRegisterAttribute(canvas, &data_attrib); }
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); }