More printing tweaks (nicer looking simulated windows...)

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4158 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Michael R Sweet 2005-03-21 19:35:43 +00:00
parent 880928146d
commit 55002148cd

View File

@ -857,6 +857,26 @@ void print_menu_cb(Fl_Widget *, void *) {
print_panel->show(); print_panel->show();
} }
// Quote a string for PostScript printing
static const char *ps_string(const char *s) {
char *bufptr;
static char buffer[2048];
if (!s) {
buffer[0] = '\0';
} else {
for (bufptr = buffer; bufptr < (buffer + sizeof(buffer) - 3) && *s;) {
if (*s == '(' || *s == ')' || *s == '\\') *bufptr++ = '\\';
*bufptr++ = *s++;
}
*bufptr = '\0';
}
return (buffer);
}
// Actually print... // Actually print...
void print_cb(Fl_Return_Button *, void *) { void print_cb(Fl_Return_Button *, void *) {
FILE *outfile; // Output file or pipe to print command FILE *outfile; // Output file or pipe to print command
@ -931,9 +951,15 @@ void print_cb(Fl_Return_Button *, void *) {
} else { } else {
// Print to file... // Print to file...
fl_ok = "Print"; fl_ok = "Print";
const char *outname = fl_file_chooser("Print To", "PostScript (*.ps)", NULL); const char *outname = fl_file_chooser("Print To", "PostScript (*.ps)", NULL, 1);
fl_ok = "OK"; fl_ok = "OK";
if (outname && !access(outname, 0)) {
if (fl_choice("The file \"%s\" already exists.\n"
"Do you want to replace it?", "Cancel",
"Replace", NULL, outname) == 0) outname = NULL;
}
if (outname) outfile = fopen(outname, "w"); if (outname) outfile = fopen(outname, "w");
else outfile = NULL; else outfile = NULL;
} }
@ -987,11 +1013,23 @@ void print_cb(Fl_Return_Button *, void *) {
"%%%%Pages: %d\n" "%%%%Pages: %d\n"
"%%%%LanguageLevel: 1\n" "%%%%LanguageLevel: 1\n"
"%%%%DocumentData: Clean7Bit\n" "%%%%DocumentData: Clean7Bit\n"
"%%%%DocumentNeededResources: font Helvetica\n" "%%%%DocumentNeededResources: font Helvetica-Bold\n"
"%%%%Creator: FLUID %.4f\n" "%%%%Creator: FLUID %.4f\n"
"%%%%CreationDate: %s\n" "%%%%CreationDate: %s\n"
"%%%%Title: (%s)\n" "%%%%Title: (%s)\n"
"%%%%EndComments\n" "%%%%EndComments\n"
"%%%%BeginProlog\n"
"%%languagelevel 1 eq {\n"
" /rectfill {\n"
" newpath 4 2 roll moveto dup 0 exch rlineto exch 0 rlineto\n"
" neg 0 exch rlineto closepath fill\n"
" } bind def\n"
" /rectstroke {\n"
" newpath 4 2 roll moveto dup 0 exch rlineto exch 0 rlineto\n"
" neg 0 exch rlineto closepath stroke\n"
" } bind def\n"
"%%} if\n"
"%%%%EndProlog\n"
"%%%%BeginSetup\n" "%%%%BeginSetup\n"
"%%%%BeginFeature: *PageSize %s\n" "%%%%BeginFeature: *PageSize %s\n"
"languagelevel 1 ne {\n" "languagelevel 1 ne {\n"
@ -1037,11 +1075,11 @@ void print_cb(Fl_Return_Button *, void *) {
// Draw header... // Draw header...
fprintf(outfile, fprintf(outfile,
"0 setgray\n" "0 setgray\n"
"/Helvetica findfont 14 scalefont setfont\n" "/Helvetica-Bold findfont 14 scalefont setfont\n"
"%d %d moveto (%s) show\n" "%d %d moveto (%s) show\n"
"%.1f %d moveto (%s) dup stringwidth pop -0.5 mul 0 rmoveto show\n" "%.1f %d moveto (%s) dup stringwidth pop -0.5 mul 0 rmoveto show\n"
"%d %d moveto (%d/%d) dup stringwidth pop neg 0 rmoveto show\n", "%d %d moveto (%d/%d) dup stringwidth pop neg 0 rmoveto show\n",
left, top - 15, basename, left, top - 15, ps_string(basename),
0.5 * (left + right), top - 15, date, 0.5 * (left + right), top - 15, date,
right, top - 15, winpage + 1, num_windows); right, top - 15, winpage + 1, num_windows);
@ -1052,7 +1090,9 @@ void print_cb(Fl_Return_Button *, void *) {
float border; // Width of 1 pixel float border; // Width of 1 pixel
float llx, lly, // Lower-lefthand corner float llx, lly, // Lower-lefthand corner
urx, ury; // Upper-righthand corner urx, ury; // Upper-righthand corner
Fl_Window *win; // Window widget
win = (Fl_Window *)(windows[winpage]->o);
pixels = windows[winpage]->read_image(w, h); pixels = windows[winpage]->read_image(w, h);
// Figure out the window size, first at 100 PPI and then scaled // Figure out the window size, first at 100 PPI and then scaled
@ -1079,39 +1119,113 @@ void print_cb(Fl_Return_Button *, void *) {
ury = 0.5 * (top - bottom + hh); ury = 0.5 * (top - bottom + hh);
// Draw a simulated window border... // Draw a simulated window border...
fprintf(outfile,
"0.75 setgray\n" // Gray background
"newpath %.2f %.2f %.2f 180 90 arcn\n" // Top left
"%.2f %.2f %.2f 90 0 arcn\n" // Top right
"%.2f %.2f %.2f 0 -90 arcn\n" // Bottom right
"%.2f %.2f %.2f -90 -180 arcn\n" // Bottom left
"closepath gsave fill grestore\n" // Fill
"0 setlinewidth 0 setgray stroke\n", // Outline
llx, ury + 12 * border, 4 * border,
urx, ury + 12 * border, 4 * border,
urx, lly, 4 * border,
llx, lly, 4 * border);
// Title bar...
if (output_mode & 2) { if (output_mode & 2) {
fputs("0.25 setgray\n", outfile); fputs("0.25 setgray\n", outfile);
} else { } else {
fputs("0.1 0.2 0.6 setrgbcolor\n", outfile); fputs("0.1 0.2 0.6 setrgbcolor\n", outfile);
} }
fprintf(outfile, fprintf(outfile, "%.2f %.2f %.2f %.2f rectfill\n",
"newpath %.2f %.2f %.2f 180 90 arcn\n" // Top left llx + 12 * border, ury,
"%.2f %.2f %.2f 90 0 arcn\n" // Top right ww - (24 + 16 * (!win->modal() || win->resizable()) +
"%.2f %.2f %.2f 0 -90 arcn\n" // Bottom right 16 * (!win->modal() && win->resizable())) * border,
"%.2f %.2f %.2f -90 -180 arcn\n" // Bottom left 16 * border);
"closepath fill\n", // Fill
llx, ury + 12 * border, 4 * border,
urx, ury + 12 * border, 4 * border,
urx, lly, 4 * border,
llx, lly, 4 * border);
if (windows[winpage]->label()) { if (win->resizable()) {
fprintf(outfile,
"%.2f %.2f %.2f -90 -180 arcn\n" // Bottom left
"0 %.2f rlineto %.2f 0 rlineto 0 -%.2f rlineto closepath fill\n"
"%.2f %.2f %.2f 0 -90 arcn\n" // Bottom right
"-%.2f 0 rlineto 0 %.2f rlineto %.2f 0 rlineto closepath fill\n",
llx, lly, 4 * border,
12 * border, 16 * border, 16 * border,
urx, lly, 4 * border,
12 * border, 16 * border, 16 * border);
}
// Inside outline and button shading...
fprintf(outfile,
"%.2f setlinewidth 0.5 setgray\n"
"%.2f %.2f %.2f %.2f rectstroke\n"
"%.2f %.2f moveto 0 %.2f rlineto\n"
"%.2f %.2f moveto 0 %.2f rlineto\n",
border,
llx - 0.5 * border, lly - 0.5 * border, ww + border, hh + border,
llx + 12 * border, ury, 16 * border,
urx - 12 * border, ury, 16 * border);
if (!win->modal() || win->resizable()) {
fprintf(outfile, "%.2f %.2f moveto 0 %.2f rlineto\n",
urx - 28 * border, ury, 16 * border);
}
if (!win->modal() && win->resizable()) {
fprintf(outfile, "%.2f %.2f moveto 0 %.2f rlineto\n",
urx - 44 * border, ury, 16 * border);
}
fprintf(outfile, "%.2f %.2f moveto %.2f 0 rlineto stroke\n",
llx - 3.5 * border, ury + 0.5 * border, ww + 7 * border);
// Button icons...
fprintf(outfile,
"%.2f setlinewidth 0 setgray\n"
"%.2f %.2f moveto %.2f -%.2f rlineto %.2f %.2f rlineto\n"
"%.2f %.2f moveto -%.2f -%.2f rlineto 0 %.2f rmoveto %.2f -%.2f rlineto\n",
2 * border,
llx, ury + 10 * border, 4 * border, 4 * border, 4 * border, 4 * border,
urx, ury + 12 * border, 8 * border, 8 * border, 8 * border, 8 * border, 8 * border);
float x = urx - 16 * border;
if (win->resizable()) {
// Maximize button
fprintf(outfile,
"%.2f %.2f moveto -%.2f 0 rlineto 0 -%.2f rlineto "
"%.2f 0 rlineto 0 %.2f rlineto\n",
x, ury + 12 * border, 8 * border, 8 * border,
8 * border, 8 * border);
x -= 16 * border;
}
if (!win->modal()) {
// Minimize button
fprintf(outfile,
"%.2f %.2f moveto -%.2f 0 rlineto\n",
x, ury + 4 * border, 8 * border);
}
fputs("stroke\n", outfile);
if (win->label()) {
// Add window title... // Add window title...
fprintf(outfile, fprintf(outfile,
"1 setgray\n" "1 setgray\n"
"/Helvetica findfont %.2f scalefont setfont\n" "/Helvetica-Bold findfont %.2f scalefont setfont\n"
"%.2f %.2f moveto\n" "(%s) %.2f %.2f moveto show\n",
"(%s) dup stringwidth pop -0.5 mul 0 rmoveto show\n",
12 * border, 12 * border,
0.5 * (llx + urx), ury + 4 * border, ps_string(win->label()), llx + 16 * border, ury + 4 * border);
windows[winpage]->label());
} }
fprintf(outfile, fprintf(outfile,
"gsave\n" "gsave\n"
"%.2f %.2f translate %.2f %.2f scale\n", "%.2f %.2f translate %.2f %.2f scale\n",
llx, ury, border, border); llx, ury - border, border, border);
if (output_mode & 2) { if (output_mode & 2) {
// Grayscale image... // Grayscale image...