import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.imageio.stream.*;

public class FontGlyphCheck {
  public static void main (String[]args) {
    if (args.length != 1) {
	System.err.println ("Usage: java FontGlyphCheck fontname");
	System.exit (1);
      }
    System.setProperty ("java.awt.headless", "true");
    //Font font = Font.decode(args[0]);
    try {
      File fontfile = new File (args[0]);
      Font font = Font.createFont (Font.TRUETYPE_FONT, fontfile);
      int black = Color.black.getRGB ();
      for (int size = 10; size < 25; size++) {
	  font = font.deriveFont ((float) size);
	  boolean firstFind = true;
	  for (int i = 0x20; i <= 0xFFFF; i++) {
	      if (!Character.isDefined (i)) continue;
	      if (Character.isISOControl (i)) continue;
	      if (Character.isWhitespace (i)) continue;
	      int type = Character.getType (i);
	      if (type == Character.SPACE_SEPARATOR ||
		  type == Character.FORMAT) continue;
	      if (Character.getType (i) == Character.SPACE_SEPARATOR) continue;
	      if (i == 0xA0 || i == 0x115f || i == 0x1160 ||
		  i == 0x202f || i == 0x2800 || i == 0x3164 || i == 0xffa0) continue;
	      if (i >= 0xE000 && i <= 0xF8FF) continue;
	      if (font.canDisplay (i)) {
		  String text = String.valueOf ((char) i);
		  Rectangle2D rect =
		    font.getStringBounds (text,
					  new FontRenderContext (null, false,
								 false));
		  int width = (int) (Math.ceil (rect.getWidth ()));
		  if (width <= 0) continue;
		  int height = (int) (Math.ceil (rect.getHeight ()));
		  int x = (int) (Math.ceil (rect.getX ())) + width;
		  int y = (int) (Math.ceil (rect.getY () * -1.0)) + height;

		  width *= 3;
		  height *= 3;

		  BufferedImage bufImage =
		    new BufferedImage (width, height,
				       BufferedImage.TYPE_INT_RGB);
		  Graphics2D g = (Graphics2D) bufImage.getGraphics ();
		  g.setColor (Color.black);
		  g.fillRect (0, 0, width, height);
		  g.setColor (Color.white);
		  g.setFont (font);
		  g.drawString (text, x, y);
		  BufferedImage finalImage =
		    bufImage.getSubimage (0, 0, width, height);
		  int cnt = 0;
		  for (int yy = 0; yy < height; yy++) {
		      for (int xx = 0; xx < width; xx++) {
			  if (finalImage.getRGB (xx, yy) != black)
			    cnt++;
			}
		    }
		  if (cnt == 0) {
		      if (firstFind) {
			  System.out.printf ("\nsize:%d ", size);
			  firstFind = false;
			}
		      System.out.printf ("\\u%04x", i);
		    }
		}
	    }
	}
      System.out.println ();
    }
    catch (Exception e)
    {
      System.out.println (e);
    }
  }
}
