Changed new_width for new_with. Typo fix
[tbo.git] / src / textobj.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <gtk/gtk.h>
4 #include <cairo.h>
5 #include "textobj.h"
6 #include "text-tool.h"
7 #include "tbo-types.h"
8
9 typedef struct
10 {
11     GString *text;
12     PangoFontDescription *description;
13     Color *font_color;
14 } text_data;
15
16 text_data *
17 text_data_new (const char *text, char *font, double r, double g, double b)
18 {
19     text_data *txt = malloc (sizeof (text_data));
20     txt->text = g_string_new (text);
21     Color *color = malloc (sizeof (Color));
22     color->r = r;
23     color->g = g;
24     color->b = b;
25     txt->font_color = color;
26     txt->description = pango_font_description_from_string (font);
27
28     return txt;
29 }
30
31 void
32 text_data_free (text_data *txt)
33 {
34     free (txt->font_color);
35     g_string_free (txt->text, TRUE);
36     pango_font_description_free (txt->description);
37     free (txt);
38 }
39
40 void
41 tbo_text_change_font (TextObj *self, char *font)
42 {
43     text_data *txt = (text_data*)self->data;
44     pango_font_description_free (txt->description);
45     txt->description = pango_font_description_from_string (font);
46 }
47
48 void
49 tbo_text_change_color (TextObj *self, double r, double g, double b)
50 {
51     text_data *txt = (text_data*)self->data;
52     txt->font_color->r = r;
53     txt->font_color->g = g;
54     txt->font_color->b = b;
55 }
56
57 TextObj *
58 tbo_text_new ()
59 {
60     TextObj *text;
61     text = malloc (sizeof(TextObj));
62     text->data = text_data_new ("text", "Sans Normal 27", 0, 0, 0);
63     text->free = tbo_text_free;
64     text->draw = tbo_text_draw;
65     text->save = tbo_text_save;
66     text->clone = tbo_text_clone;
67     text->type = TEXTOBJ;
68     text->flipv = FALSE;
69     text->fliph = FALSE;
70     return text;
71 }
72
73 TextObj *
74 tbo_text_new_with_params (int x,
75                            int y,
76                            int width,
77                            int height,
78                            const char *text,
79                            char *font,
80                            double r, double g, double b)
81 {
82     TextObj *textobj;
83     textobj = tbo_text_new ();
84     textobj->x = x;
85     textobj->y = y;
86     textobj->width = width;
87     textobj->height = height;
88     textobj->data = text_data_new (text, font, r, g, b);
89     textobj->type = TEXTOBJ;
90     textobj->flipv = FALSE;
91     textobj->fliph = FALSE;
92     return textobj;
93 }
94
95 void
96 tbo_text_free (TextObj *self)
97 {
98     text_data_free (self->data);
99     free (self);
100 }
101
102 void
103 tbo_text_draw (TextObj *self, Frame *frame, cairo_t *cr)
104 {
105     text_data *data = self->data;
106     gchar *text = data->text->str;
107
108     PangoLayout *layout;
109     PangoFontDescription *desc = data->description;
110
111     int w;
112     int h;
113
114     cairo_set_source_rgb(cr, data->font_color->r, data->font_color->g, data->font_color->b);
115
116     layout = pango_cairo_create_layout (cr);
117     pango_layout_set_text (layout, text, -1);
118     pango_layout_set_font_description (layout, desc);
119     pango_layout_get_size (layout, &w, &h);
120     pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
121     w = (double)w / PANGO_SCALE;
122     h = (double)h / PANGO_SCALE;
123
124     if (!self->width) self->width = w;
125     if (!self->height) self->height = h;
126
127     float factorw = (float)self->width / (float)w;
128     float factorh = (float)self->height / (float)h;
129     if (factorh == 1)
130     {
131         factorh = factorw;
132         self->height = self->height * factorw;
133     }
134
135     cairo_matrix_t mx = {1, 0, 0, 1, 0, 0};
136     tbo_object_get_flip_matrix (self, &mx);
137
138     cairo_rectangle(cr, frame->x+2, frame->y+2, frame->width-4, frame->height-4);
139     cairo_clip (cr);
140     cairo_translate (cr, frame->x+self->x, frame->y+self->y);
141     cairo_rotate (cr, self->angle);
142     cairo_transform (cr, &mx);
143     cairo_scale (cr, factorw, factorh);
144
145     pango_cairo_show_layout (cr, layout);
146
147     cairo_scale (cr, 1/factorw, 1/factorh);
148     cairo_transform (cr, &mx);
149     cairo_rotate (cr, -self->angle);
150     cairo_translate (cr, -(frame->x+self->x), -(frame->y+self->y));
151     cairo_reset_clip (cr);
152 }
153
154 char *
155 tbo_text_get_text (TextObj *self)
156 {
157     return ((text_data *)self->data)->text->str;
158 }
159
160 void
161 tbo_text_set_text (TextObj *self, const char *text)
162 {
163     g_string_assign (((text_data *)self->data)->text, text);
164     self->height = 0;
165 }
166
167 void
168 tbo_text_get_color (TextObj *self, GdkColor *color)
169 {
170     text_data *data = (text_data*)self->data;
171     color->red = data->font_color->r * 65535;
172     color->green = data->font_color->g * 65535;
173     color->blue = data->font_color->b * 65535;
174 }
175
176 char *
177 tbo_text_get_string (TextObj *self)
178 {
179     text_data *data = (text_data *)self->data;
180     return pango_font_description_to_string (data->description);
181 }
182
183 void
184 tbo_text_save (TextObj *self, FILE *file)
185 {
186     char buffer[1024];
187
188     text_data *data = (text_data*)self->data;
189     snprintf (buffer, 1024, "   <text x=\"%d\" y=\"%d\" "
190                            "width=\"%d\" height=\"%d\" "
191                            "angle=\"%f\" flipv=\"%d\" fliph=\"%d\" "
192                            "font=\"%s\" "
193                            "r=\"%f\" g=\"%f\" b=\"%f\">\n",
194                            self->x, self->y, self->width, self->height,
195                            self->angle, self->flipv, self->fliph,
196                            pango_font_description_to_string (data->description),
197                            data->font_color->r, data->font_color->g,
198                            data->font_color->b);
199     fwrite (buffer, sizeof (char), strlen (buffer), file);
200
201     snprintf (buffer, 1024, "%s", data->text->str);
202     fwrite (buffer, sizeof (char), strlen (buffer), file);
203
204     snprintf (buffer, 1024, "\n   </text>\n");
205     fwrite (buffer, sizeof (char), strlen (buffer), file);
206 }
207
208 TextObj *
209 tbo_text_clone (TextObj *self)
210 {
211     TextObj *newtext;
212     text_data *data;
213     data = (text_data*)self->data;
214
215     newtext = tbo_text_new ();
216     newtext->flipv = self->flipv;
217     newtext->fliph = self->fliph;
218     tbo_text_change_color (newtext, data->font_color->r,
219                                     data->font_color->g,
220                                     data->font_color->b);
221     tbo_text_change_font (newtext, tbo_text_get_string (self));
222     tbo_text_set_text (newtext, data->text->str);
223     newtext->angle = self->angle;
224     newtext->x = self->x;
225     newtext->y = self->y;
226     newtext->width = self->width;
227     newtext->height = self->height;
228
229     return newtext;
230 }