void
DumpProc (Widget w, XtPointer client_data, XtPointer call_data)
{
- int g_width, g_height, g_x, g_y, pix_width, pix_height;
- int margin = 20 * 300 / 25.4;
- int a4_width = 210 * 300 / 25.4 - margin * 2;
- int a4_height = 297 * 300 / 25.4 - margin * 2;
- int size = 100;
- Pixmap pixmap;
- XImage ximage, *image;
- int i, x, y;
- char *data;
- int bytes_per_line;
+ int g_width, g_height;
+ float g_x, g_y;
+ /* unit in points (1/72 inch); to fit in both US-letter and A4 */
+ static int xoff = 30, yoff = 30;
+ static int unit = 30;
+ static int margin = 2;
+ static int title_height = 20, label_height = 10;
+ int total_width = (unit + margin * 2) * 16;
+ int total_height = (unit + margin * 2 + label_height) * 16 + title_height;
+ /* pixel size (dots) */
+ int size = 128;
+ int i, j, k, l;
+ char *name = alloca (strlen (filename) + 10);
+ FILE *fp;
+ int index = (glyph_index / 0x100) * 0x100;
+ float scale;
+
+ sprintf (name, "%s-%04X.ps", face->family_name, index);
+ printf ("Writing %s ... ", name);
+ fflush (stdout);
+ fp = fopen (name, "w");
+
+ fprintf (fp, "%s\n", "%!PS-Adobe-2.0 EPSF-2.0");
+ fprintf (fp, "%s\n", "%%Creater: otfview");
+ fprintf (fp, "%s %s(%s)-%04X\n", "%%Title:",
+ face->family_name, face->style_name, index);
+ fprintf (fp, "%s\n", "%%Pages: 1");
+ fprintf (fp, "%s %d %d %d %d\n", "%%BoundingBox:",
+ xoff, yoff, xoff + total_width, yoff + total_height);
+ fprintf (fp, "%s\n", "%%EndComments");
+ fprintf (fp, "%s\n", "%%BeginProlog");
+ fprintf (fp, "/W %d def\n", unit + margin * 2);
+ fprintf (fp, "/H %d def\n", unit + margin * 2 + label_height);
+ fprintf (fp, "/STR 10 string def\n");
+ fprintf (fp, "/DrawIndex {\n");
+ fprintf (fp, " I 16 lt { (000) show } { I 256 lt { (00) show } { I 4096 lt { (0) show} if } ifelse } ifelse I 16 STR cvrs show\n");
+ fprintf (fp, "} def\n");
+ fprintf (fp, "/DrawTitle {\n");
+ fprintf (fp, " /Courier findfont 20 scalefont setfont\n");
+ fprintf (fp, " %d %d 4 add moveto\n", xoff + total_width / 2,
+ yoff + total_height - title_height + 2);
+ fprintf (fp, " (%s(%s)-%04X) dup stringwidth pop 2 div neg 0 rmoveto show\n",
+ face->family_name, face->style_name, index);
+ fprintf (fp, "} def\n");
+ fprintf (fp, "/DrawFrame { gsave %d %d translate 0 setlinewidth\n",
+ xoff, yoff);
+ fprintf (fp, " /Courier findfont 10 scalefont setfont\n");
+ fprintf (fp, " /I %d def\n", index);
+ fprintf (fp, " 0 1 16 { W mul 0 moveto 0 H 16 mul rlineto stroke } for\n");
+ fprintf (fp, " 0 1 16 { H mul 0 exch moveto W 16 mul 0 rlineto stroke } for\n");
+ fprintf (fp, " 0 1 15 { H mul %d add 0 exch moveto W 16 mul 0 rlineto stroke } for\n", label_height);
+ fprintf (fp, " 15 -1 0 { gsave H mul 0 exch translate 0 0 moveto\n");
+ fprintf (fp, " 0 1 15 { gsave W mul 0 moveto\n");
+ fprintf (fp, " 4 2 rmoveto DrawIndex /I I 1 add def grestore} for\n");
+ fprintf (fp, " grestore } for grestore } def\n");
+ fprintf (fp, "%s\n", "%%EndProlog");
+ fprintf (fp, "DrawTitle DrawFrame\n");
+
+ g_width = face->bbox.xMax - face->bbox.xMin;
+ g_height = face->bbox.yMax - face->bbox.yMin;
+ scale = ((g_width > g_height) ? g_width : g_height) * size;
+ scale /= face->units_per_EM;
+ g_x = face->bbox.xMin * scale / unit / face->units_per_EM;
+ g_y = face->bbox.yMin * scale / unit / face->units_per_EM;
FT_Set_Pixel_Sizes (face, 0, size);
- g_width = ((face->bbox.xMax - face->bbox.xMin) * size / face->units_per_EM);
- g_height = ((face->bbox.yMax - face->bbox.yMin) * size / face->units_per_EM);
- pix_width = (g_width + 1) * 16 + margin + 1;
- pix_height = (g_height + 1 + FONT_HEIGHT) * 16 + margin + 1;
- while (pix_width > a4_width || pix_height > a4_height)
- {
- size--;
- FT_Set_Pixel_Sizes (face, 0, size);
- g_width = ((face->bbox.xMax - face->bbox.xMin)
- * size / face->units_per_EM);
- g_height = ((face->bbox.yMax - face->bbox.yMin)
- * size / face->units_per_EM);
- pix_width = (g_width + 1) * 16 + margin + 1;
- pix_height = (g_height + 1 + FONT_HEIGHT) * 16 + margin + 1;
- }
-
- g_x = - (face->bbox.xMin * size / face->units_per_EM);
- g_y = face->bbox.yMax * size / face->units_per_EM;
- for (i = 0; i < 0xFF; i++)
- {
- int idx;
-
- if (charmap_index >= 0)
- idx = FT_Get_Char_Index (face, (FT_ULong) i);
- else
- idx = i;
- if (FT_Load_Glyph (face, idx, FT_LOAD_RENDER | FT_LOAD_MONOCHROME) == 0)
- {
- if (g_x < - face->glyph->bitmap_left)
- g_x = - face->glyph->bitmap_left;
- if (g_y < face->glyph->bitmap_top)
- g_y = face->glyph->bitmap_top;
- if (g_width
- < g_x + face->glyph->bitmap_left + face->glyph->bitmap.width)
- g_width
- = g_x + face->glyph->bitmap_left + face->glyph->bitmap.width;
- if (g_height
- < g_y - face->glyph->bitmap_top + face->glyph->bitmap.rows)
- g_height
- = g_y - face->glyph->bitmap_top + face->glyph->bitmap.rows;
- }
- }
- pix_width = (g_width + 1) * 16 + margin + 1;
- pix_height = (g_height + FONT_HEIGHT + 1) * 16 + margin + 1;
- pixmap = XCreatePixmap (display,
- RootWindow (display, DefaultScreen (display)),
- pix_width, pix_height, 1);
- XFillRectangle (display, pixmap, gc, 0, 0, pix_width, pix_height);
-
- for (i = 0, x = margin; i <= 16; i++, x += g_width + 1)
- XDrawLine (display, pixmap, gc_set, x, margin,
- x, margin + (g_height + FONT_HEIGHT + 1) * 16);
- for (i = 0, y = margin; i <= 16; i++, y += g_height + FONT_HEIGHT + 1)
- XDrawLine (display, pixmap, gc_set, margin, y,
- margin + (g_width + 1) * 16, y);
- for (i = 0; i < 256; i++)
- {
- char str[5];
- int idx;
-
- if (charmap_index >= 0)
- idx = FT_Get_Char_Index (face, (FT_ULong) i);
- else
- idx = i;
- x = margin + (g_width + 1) * (i % 16);
- y = margin + (g_height + FONT_HEIGHT + 1) * (i / 16);
- if (FT_Load_Glyph (face, idx, FT_LOAD_RENDER | FT_LOAD_MONOCHROME) == 0)
- {
- ximage.height = face->glyph->bitmap.rows;
- ximage.width = face->glyph->bitmap.width;
- ximage.depth = 1;
- ximage.bits_per_pixel = 1;
- ximage.xoffset = 0;
- ximage.format = XYPixmap;
- ximage.data = (char *) face->glyph->bitmap.buffer;
- ximage.byte_order = MSBFirst;
- ximage.bitmap_unit = 8;
- ximage.bitmap_bit_order = MSBFirst;
- ximage.bitmap_pad = 8;
- ximage.bytes_per_line = face->glyph->bitmap.pitch;
- XInitImage (&ximage);
- XPutImage (display, pixmap, gc, &ximage, 0, 0,
- x + g_x + face->glyph->bitmap_left,
- y + g_y - face->glyph->bitmap_top,
- ximage.width, ximage.height);
- }
- sprintf (str, "0x%02X", i);
- XDrawString (display, pixmap, gc_inv,
- x + (g_width - XTextWidth (font, str, 4))/ 2,
- y + g_height + FONT_ASCENT, str, 4);
- }
+ for (i = 0; i < 16; i++)
+ for (j = 0; j < 16; j++, index++)
+ {
+ int idx;
+
+ if (charmap_index >= 0)
+ idx = FT_Get_Char_Index (face, (FT_ULong) index);
+ else
+ idx = index;
+ if (FT_Load_Glyph (face, idx, FT_LOAD_RENDER | FT_LOAD_MONOCHROME) == 0
+ && face->glyph->bitmap.rows > 0
+ && face->glyph->bitmap.width > 0)
+ {
+ unsigned char *p = face->glyph->bitmap.buffer;
+ int width = (face->glyph->bitmap.width - 1) / 8 + 1;
+
+ fprintf (fp, "gsave %f %f translate %d %d scale 0 0 moveto\n",
+ xoff + (unit + margin * 2) * j + margin - g_x,
+ yoff + (unit + label_height + margin * 2) * (15 - i) + label_height + margin - g_y,
+ unit, unit);
+ fprintf (fp, "%d %d true [%f 0 0 %f %d %d]\n",
+ width * 8, face->glyph->bitmap.rows,
+ scale, -scale, face->glyph->bitmap_left,
+ face->glyph->bitmap_top);
+ fprintf (fp, "{< ");
+ for (k = 0; k < face->glyph->bitmap.rows;
+ k++, p += face->glyph->bitmap.pitch)
+ {
+ for (l = 0; l < width; l++)
+ fprintf (fp, "%02X", p[l]);
+ fprintf (fp, "\n");
+ }
+ fprintf (fp, ">} imagemask grestore\n");
+ }
+ }
+ fprintf (fp, "showpage\n");
+ fclose (fp);
+ printf ("done\n");
- image = XGetImage (display, pixmap, 0, 0, pix_width, pix_height,
- AllPlanes, XYPixmap);
- XInitImage (image);
- {
- char *name = alloca (strlen (filename) + 5);
- FILE *fp;
-
- sprintf (name, "%s.pbm", filename);
- printf ("Writing %s ...", name);
- fp = fopen (name, "w");
- fprintf (fp, "P4\n%d %d\n", image->width, image->height);
- bytes_per_line = (image->width + 7) / 8;
- data = image->data;
- for (y = 0; y < image->height; y++, data += image->bytes_per_line)
- fwrite (data, 1, bytes_per_line, fp);
- fclose (fp);
- printf ("done\n");
- }
FT_Set_Pixel_Sizes (face, 0, (int) pixel_size);
}
command_area, arg, 1);
XtAddCallback (quit, XtNcallback, QuitProc, NULL);
- dump = XtCreateManagedWidget ("Dump Image", commandWidgetClass,
+ dump = XtCreateManagedWidget ("DumpImage", commandWidgetClass,
command_area, arg, 1);
XtAddCallback (dump, XtNcallback, DumpProc, NULL);