/* %F cdCreateCanvas para DBuffer. O DC é um BITMAP em memoria. */ static void cdcreatecanvas(cdCanvas* canvas, void *data) { int w, h; cdCanvas* canvas_dbuffer = (cdCanvas*)data; if (!canvas_dbuffer) return; cdCanvasActivate(canvas_dbuffer); /* Update size */ w = canvas_dbuffer->w; h = canvas_dbuffer->h; if (w==0) w=1; if (h==0) h=1; Bitmap* bitmap = new Bitmap(w, h, PixelFormat24bppRGB); bitmap->SetResolution((REAL)(canvas_dbuffer->xres*25.4), (REAL)(canvas_dbuffer->yres*25.4)); Graphics imggraphics(bitmap); imggraphics.Clear(Color::White); Graphics* graphics = new Graphics(bitmap); canvas->w = w; canvas->h = h; canvas->bpp = 24; /* Initialize base driver */ cdCtxCanvas* ctxcanvas = cdwpCreateCanvas(canvas, graphics, CDW_BMP); ctxcanvas->bitmap = bitmap; ctxcanvas->canvas_dbuffer = canvas_dbuffer; }
/* %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; }
static void cdcreatecanvas(cdCanvas* canvas, void *data) { int w, h; cdCanvas* canvas_dbuffer = (cdCanvas*)data; if (!canvas_dbuffer) return; cdCanvasActivate(canvas_dbuffer); /* Update size */ w = canvas_dbuffer->w; h = canvas_dbuffer->h; if (w==0) w=1; if (h==0) h=1; Bitmap* bitmap = new Bitmap(w, h, PixelFormat24bppRGB); bitmap->SetResolution((REAL)(canvas_dbuffer->xres*25.4), (REAL)(canvas_dbuffer->yres*25.4)); Graphics imggraphics(bitmap); imggraphics.Clear(Color((ARGB)Color::White)); Graphics* graphics = new Graphics(bitmap); canvas->w = w; canvas->h = h; canvas->bpp = 24; /* Initialize base driver */ cdCtxCanvas* ctxcanvas = cdwpCreateCanvas(canvas, graphics, CDW_BMP); ctxcanvas->bitmap = bitmap; ctxcanvas->canvas_dbuffer = canvas_dbuffer; { char* mode = cdCanvasGetAttribute(canvas_dbuffer, "UTF8MODE"); int utf8mode = mode? (mode[0]=='1'? 1: 0): 0; if (utf8mode) cdCanvasSetAttribute(canvas, "UTF8MODE", "1"); } }
static void cdcreatecanvas(cdCanvas* canvas, void *data) { char *data_str = (char*) data; char docname[256] = "CD - Canvas Draw Document"; int dialog = 0; /* Inicializa parametros */ if (data_str == NULL) return; if (data_str[0] != 0) { const char *ptr = strstr(data_str, "-d"); if (ptr != NULL) dialog = 1; if (data_str[0] != '-') { strcpy(docname, data_str); if (dialog) docname[ptr - data_str - 1] = 0; } } PRINTDLG pd; ZeroMemory(&pd, sizeof(PRINTDLG)); pd.lStructSize = sizeof(PRINTDLG); pd.nCopies = 1; if (dialog) { pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | PD_COLLATE | PD_NOPAGENUMS | PD_NOSELECTION; pd.hwndOwner = GetForegroundWindow(); } else { pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT; } if (!PrintDlg(&pd)) { if(pd.hDevMode) GlobalFree(pd.hDevMode); if(pd.hDevNames) GlobalFree(pd.hDevNames); return; } HDC hDC = pd.hDC; DEVMODE* devideMode = (DEVMODE*)GlobalLock(pd.hDevMode); HANDLE printerHandle; OpenPrinter((char*)devideMode->dmDeviceName, &printerHandle, NULL); GlobalUnlock(pd.hDevMode); { /* Inicializa documento */ DOCINFO docInfo; ZeroMemory(&docInfo, sizeof(docInfo)); docInfo.cbSize = sizeof(docInfo); docInfo.lpszDocName = docname; StartDoc(hDC, &docInfo); } StartPage(hDC); canvas->w = GetDeviceCaps(hDC, HORZRES); canvas->h = GetDeviceCaps(hDC, VERTRES); canvas->bpp = GetDeviceCaps(hDC, BITSPIXEL); Graphics* graphics = new Graphics(hDC, printerHandle); /* Inicializa driver WIN32 */ cdCtxCanvas* ctxcanvas = cdwpCreateCanvas(canvas, graphics, CDW_EMF); ctxcanvas->hDC = hDC; ctxcanvas->printerHandle = printerHandle; if(pd.hDevMode) GlobalFree(pd.hDevMode); if(pd.hDevNames) GlobalFree(pd.hDevNames); }
/* %F cdCreateCanvas para Clipboard O DC pode ser um WMF ou um BITMAP. */ static void cdcreatecanvas(cdCanvas* canvas, void *data) { char* str_data = (char*)data; int w = 0, h = 0, wtype = CDW_EMF; /* default clipboard type */ double res = 0; Metafile* metafile = NULL; Bitmap* bitmap = NULL; Graphics* graphics = NULL; /* Inicializa parametros */ if (str_data == NULL) return; if (strstr(str_data, "-b") != NULL) wtype = CDW_BMP; else if (strstr(str_data, "-m") != NULL) wtype = -1; /* CD METAFILE */ if (wtype != -1) { sscanf(str_data,"%dx%d %lg",&w, &h, &res); if (w == 0 || h == 0) return; } if (wtype == CDW_EMF) { HDC ScreenDC = GetDC(NULL); if (res) { canvas->xres = res; canvas->yres = res; } else { /* 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(ScreenDC, frameRect, MetafileFrameUnitGdi, EmfTypeEmfPlusDual, NULL); ReleaseDC(NULL, ScreenDC); if (!metafile) return; graphics = new Graphics(metafile); } else if (wtype == CDW_BMP) { if (res) { canvas->xres = res; canvas->yres = res; } else { HDC ScreenDC = GetDC(NULL); canvas->xres = (double)GetDeviceCaps(ScreenDC, HORZRES) / (double)GetDeviceCaps(ScreenDC, HORZSIZE); canvas->yres = (double)GetDeviceCaps(ScreenDC, VERTRES) / (double)GetDeviceCaps(ScreenDC, VERTSIZE); ReleaseDC(NULL, ScreenDC); } bitmap = new Bitmap(w, h, PixelFormat24bppRGB); if (!bitmap) return; bitmap->SetResolution((REAL)(canvas->xres*25.4), (REAL)(canvas->xres*25.4)); graphics = new Graphics(bitmap); } if (wtype == -1) { char tmpPath[10240]; if (!cdStrTmpFileName(tmpPath)) return; strcat(tmpPath, " "); strcat(tmpPath, str_data); cdcreatecanvasMF(canvas, tmpPath); } else { cdCtxCanvas* ctxcanvas = cdwpCreateCanvas(canvas, graphics, wtype); canvas->w = w; canvas->h = h; canvas->bpp = 24; if (wtype == CDW_BMP) ctxcanvas->bitmap = bitmap; else ctxcanvas->metafile = metafile; } }