+static struct {
+ MPlist *realized_fontset_list;
+ MPlist *realized_font_list;
+ MPlist *realized_face_list;
+} null_device;
+
+static void
+null_device_close (MFrame *frame)
+{
+}
+
+static void *
+null_device_get_prop (MFrame *frame, MSymbol key)
+{
+ return NULL;
+}
+
+static void
+null_device_realize_face (MRealizedFace *rface)
+{
+ rface->info = NULL;
+}
+
+static void
+null_device_free_realized_face (MRealizedFace *rface)
+{
+}
+
+static MDeviceDriver null_driver =
+ {
+ null_device_close,
+ null_device_get_prop,
+ null_device_realize_face,
+ null_device_free_realized_face
+ };
+
+static int
+null_device_init ()
+{
+ null_device.realized_fontset_list = mplist ();
+ null_device.realized_font_list = mplist ();
+ null_device.realized_face_list = mplist ();
+ return 0;
+}
+
+static int
+null_device_fini ()
+{
+ MPlist *plist;
+
+ MPLIST_DO (plist, null_device.realized_fontset_list)
+ mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
+ M17N_OBJECT_UNREF (null_device.realized_fontset_list);
+
+ MPLIST_DO (plist, null_device.realized_face_list)
+ mface__free_realized ((MRealizedFace *) MPLIST_VAL (plist));
+ M17N_OBJECT_UNREF (null_device.realized_face_list);
+
+ if (MPLIST_VAL (null_device.realized_font_list))
+ mfont__free_realized (MPLIST_VAL (null_device.realized_font_list));
+ M17N_OBJECT_UNREF (null_device.realized_font_list);
+ return 0;
+}
+
+static int
+null_device_open (MFrame *frame, MPlist *param)
+{
+ MFace *face;
+
+ frame->device = NULL;
+ frame->device_type = 0;
+ frame->dpi = (int) mplist_get (param, Mresolution);
+ if (frame->dpi == 0)
+ frame->dpi = 100;
+ frame->driver = &null_driver;
+ frame->font_driver_list = mplist ();
+ mplist_add (frame->font_driver_list, Mfreetype, &mfont__ft_driver);
+ frame->realized_font_list = null_device.realized_font_list;
+ frame->realized_face_list = null_device.realized_face_list;
+ frame->realized_fontset_list = null_device.realized_fontset_list;
+ face = mface_copy (mface__default);
+ mplist_push (param, Mface, face);
+ M17N_OBJECT_UNREF (face);
+ return 0;
+}
+
+static MDeviceLibraryInterface null_interface =
+ { NULL, NULL, null_device_init, null_device_open, null_device_fini };
+
+#endif
+\f
+/* Internal API */