/* width and height are in mm */ metafile newmetafile(const char *name, double width, double height) { metafile obj; HDC hDC; RECT wr; static double cppix=-1, ppix, cppiy, ppiy; /* * In theory, (cppix=ppix) and (cppiy=ppiy). However, we * use the ratio to adjust the 'reference dimension' * in case.... ("Importing graph in MsWord" thread) */ if (cppix < 0) { cppix = 25.40 * devicewidth(NULL) / devicewidthmm(NULL); ppix = 100 * devicepixelsx(NULL); cppiy = 25.40 * deviceheight(NULL) / deviceheightmm(NULL); ppiy = 100 * devicepixelsy(NULL); } /* This is all very peculiar. We would really like to create a metafile measured in some sensible units, but it seems we get it in units of 0.01mm *on the current screen* with horizontal and vertical resolution set for that screen. And of course Windows is famous for getting screen sizes wrong. */ wr.left = 0; wr.top = 0 ; wr.right = (ppix * width) / cppix ; wr.bottom = (ppiy * height) / cppiy ; /* Here the size is in 0.01mm units */ hDC = CreateEnhMetaFile(NULL, strlen(name) ? name : NULL, &wr, "GraphApp\0\0"); if ( !hDC ) { R_ShowMessage(_("Unable to create metafile")); return NULL; } obj = new_object(MetafileObject, (HANDLE) hDC, get_metafile_base()); if ( !obj ) { R_ShowMessage(_("Insufficient memory to create metafile")); DeleteEnhMetaFile(CloseEnhMetaFile(hDC)); return NULL; } /* In looks like Windows rounds up the width and height, so we do too. 1 out is common, but 2 out has been seen. This is needed to get complete painting of the background. */ obj->rect = rect(0, 0, 2+(ppix * width)/2540, 2+(ppiy * height)/2540); obj->depth = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); obj->die = private_delmetafile; obj->drawstate = copydrawstate(); obj->drawstate->dest = obj; settext(obj, name ? name : ""); return obj; }
static void editorprint(control m) { printer lpr; font f; textbox t = getdata(m); const char *contents = gettext(t); char msg[LF_FACESIZE + 128]; char *linebuf = NULL; int cc, rr, fh, page, linep, i, j, istartline; int top, left; if (!(lpr = newprinter(0.0, 0.0, ""))) return; f = gnewfont(lpr, strcmp(fontname, "FixedFont") ? fontname : "Courier New", fontsty, pointsize, 0.0, 1); top = devicepixelsy(lpr) / 5; left = devicepixelsx(lpr) / 5; fh = fontheight(f); rr = getheight(lpr) - top; cc = getwidth(lpr) - 2*left; linep = rr; /* line in printer page */ page = 1; i = 0; while (i < strlen(contents)) { if ( linep + fh >= rr ) { /* new page */ if (page > 1) nextpage(lpr); snprintf(msg, LF_FACESIZE + 128, "Page %d", page++); gdrawstr(lpr, f, Black, pt(cc - gstrwidth(lpr, f, msg) - 1, top), msg); linep = top + 2*fh; } j = 0; istartline = i; while (contents[i] != '\n' && contents[i] != '\0') { ++i; ++j; } linebuf = realloc(linebuf, (j+1)*sizeof(char)); strncpy(linebuf, &contents[istartline], j); linebuf[j] = '\0'; gdrawstr(lpr, f, Black, pt(left, linep), linebuf); linep += fh; ++i; } free(linebuf); if (f != FixedFont) del(f); del(lpr); }