*** empty log message ***
[m17n/m17n-test.git] / gtkdraw.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <gtk/gtk.h>
5 #include <m17n-gui.h>
6
7 gint
8 delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
9 {
10   return FALSE; 
11 }
12
13 void
14 destroy (GtkWidget *widget, gpointer data)
15 {
16   gtk_main_quit ();
17 }
18
19 int
20 main (int argc, char **argv)
21 {
22   MSymbol lang;
23   MText *mt;
24   GdkPixmap *gdk_pixmap;
25   GtkWidget *window, *box, *text, *label;
26
27   char title[256];
28   int len;
29
30   gtk_init (&argc, &argv);
31
32   if (argc < 2)
33     {
34       fprintf (stderr, "Usage: gtk-m17n LANGUAGE\n");
35       exit (1);
36     }
37
38   M17N_INIT ();
39   lang = msymbol (argv[1]);
40   mt = mlanguage_text (lang);
41   if (! mt)
42     {
43       fprintf (stderr, "No native name for the language \"%s\".\n", argv[1]);
44       exit (1);
45     }
46
47   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
48   box = gtk_vbox_new (FALSE, 0);
49   text = gtk_drawing_area_new ();
50   label = gtk_label_new (title);
51   gtk_box_pack_start (GTK_BOX (box), text, TRUE, FALSE, 0);
52   gtk_box_pack_start (GTK_BOX (box), label, TRUE, FALSE, 0);
53   gtk_container_add (GTK_CONTAINER (window), box);
54   gtk_signal_connect (GTK_OBJECT (window), "delete_event",
55                       GTK_SIGNAL_FUNC (delete_event), NULL);
56   gtk_signal_connect (GTK_OBJECT (window), "destroy",
57                       GTK_SIGNAL_FUNC (destroy), NULL);
58
59   /* Draw on TEXT widget by m17n-lib.  */
60   {
61     Display *display;
62     Pixmap Pixmap;
63     MFrame *frame;
64     MPlist *param = mplist ();
65     MFace *face = mface ();
66     MFontset *fontset = mfontset ("generic");
67     MDrawMetric metric;
68
69     gdk_pixmap = gdk_pixmap_new (window->window, 
70
71     mface_put_prop (face, Msize, (void *) -600);
72     mface_put_prop (face, Mfontset, fontset);
73     if (argc > 2)
74       mface_put_prop (face, Mfamily, msymbol (argv[2]));
75     mplist_add (param, Mdevice, 
76     mplist_add (param, Mface, face);
77     frame = mframe (param);
78     m17n_object_unref (face);
79     m17n_object_unref (param);
80
81     if (! frame)
82       {
83         fprintf (stderr, "Frame creation failed.  Perhaps no GD library.\n");
84         exit (1);
85       }
86   }
87
88   {
89     MDrawControl control;
90
91     memset (&control, 0, sizeof (control));
92     control.anti_alias = 1;
93     mdraw_text_extents (frame, mt, 0, mtext_len (mt), &control,
94                         &metric, NULL, NULL);
95
96     image = gdImageCreateTrueColor (metric.width, metric.height);
97     bg_color = gdImageColorAllocate (image, 255, 255, 255);
98     gdImageFilledRectangle (image, 0, 0, metric.width - 1, metric.height - 1,
99                             bg_color);
100
101     mdraw_text_with_control (frame, (MDrawWindow) image,
102                              - metric.x, - metric.y,
103                              mt, 0, mtext_len (mt), &control);
104   }
105
106   m17n_object_unref (frame);
107
108
109
110
111   gtk_label_set_attributes (GTK_LABEL (label), attr_list);
112
113   len = mconv_encode_buffer (msymbol ("utf-8"), mt,
114                              (unsigned char *) title, 256);
115   title[len] = '\0';
116
117   M17N_FINI ();
118
119   {
120     GdkPixbuf *pixbuf;
121     GtkWidget *window, *box, *text, *label;
122     int n_channels, rowstride;
123     guchar *pixels, *p;
124     int x, y;
125     PangoAttrList *attr_list = pango_attr_list_new ();
126     PangoAttribute *attr = pango_attr_size_new (60 * PANGO_SCALE);
127
128     pango_attr_list_insert (attr_list, attr);
129
130     pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, 0, 8,
131                              metric.width, metric.height);
132     n_channels = gdk_pixbuf_get_n_channels (pixbuf);
133     rowstride = gdk_pixbuf_get_rowstride (pixbuf);
134     pixels = gdk_pixbuf_get_pixels (pixbuf);
135
136     for (y = 0; y < metric.height; y++)
137       for (x = 0; x < metric.width; x++)
138         {
139           int cid = gdImageGetPixel (image, x, y);
140           p = pixels + y * rowstride + x * n_channels;
141
142           p[0] = gdImageRed (image, cid);
143           p[1] = gdImageGreen (image, cid);
144           p[2] = gdImageBlue (image, cid);
145         }
146     gdImageDestroy (image);
147
148     gtk_widget_show (text);
149     gtk_widget_show (label);
150     gtk_widget_show (box);
151     gtk_widget_show (window);
152     gtk_main ();
153   }
154   exit (0);
155 }