Commit 61f7422d31d4dd380d0efaa59f50070b2f0c6978
Exists in
master
and in
1 other branch
Merging updates to allow new Graphic APL chars.
Showing
1 changed file
with
100 additions
and
20 deletions
Show diff stats
src/terminal/drawing/draw.c
@@ -205,6 +205,102 @@ void v3270_draw_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font, | @@ -205,6 +205,102 @@ void v3270_draw_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font, | ||
205 | v3270_draw_text_at(cr,rect->x,rect->y,font,str); | 205 | v3270_draw_text_at(cr,rect->x,rect->y,font,str); |
206 | } | 206 | } |
207 | 207 | ||
208 | +static void draw_small_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font, const char *str, int mode) | ||
209 | +{ | ||
210 | + cairo_status_t status; | ||
211 | + cairo_glyph_t * glyphs = NULL; | ||
212 | + int num_glyphs = 0; | ||
213 | + cairo_text_cluster_t * clusters = NULL; | ||
214 | + int num_clusters = 0; | ||
215 | + double y = (double) rect->y; | ||
216 | + | ||
217 | + cairo_text_cluster_flags_t cluster_flags; | ||
218 | + cairo_scaled_font_t * scaled_font = cairo_get_scaled_font(cr); | ||
219 | + cairo_font_extents_t extents; | ||
220 | + | ||
221 | + cairo_save(cr); | ||
222 | + | ||
223 | + cairo_set_font_face(cr,font->face); | ||
224 | + cairo_set_font_size(cr,font->size/ 1.6); | ||
225 | + cairo_font_extents(cr,&extents); | ||
226 | + | ||
227 | + if(mode == 0) | ||
228 | + { | ||
229 | + y += ((double) extents.height); | ||
230 | + } | ||
231 | + else | ||
232 | + { | ||
233 | + y += font->height; | ||
234 | + } | ||
235 | + | ||
236 | + status = cairo_scaled_font_text_to_glyphs( | ||
237 | + scaled_font, | ||
238 | + (double) rect->x, y, | ||
239 | + str, 1, | ||
240 | + &glyphs, &num_glyphs, | ||
241 | + &clusters, &num_clusters, &cluster_flags ); | ||
242 | + | ||
243 | + if (status == CAIRO_STATUS_SUCCESS) { | ||
244 | + cairo_show_text_glyphs(cr,str,1,glyphs, num_glyphs,clusters, num_clusters, cluster_flags); | ||
245 | + } | ||
246 | + | ||
247 | + if(glyphs) | ||
248 | + cairo_glyph_free(glyphs); | ||
249 | + | ||
250 | + if(clusters) | ||
251 | + cairo_text_cluster_free(clusters); | ||
252 | + | ||
253 | + cairo_restore(cr); | ||
254 | + | ||
255 | +} | ||
256 | + | ||
257 | +static gboolean draw_cg(cairo_t *cr, unsigned char chr, v3270FontInfo *font, GdkRectangle *rect) | ||
258 | +{ | ||
259 | + static const struct CharList | ||
260 | + { | ||
261 | + unsigned char chr; | ||
262 | + const gchar * utf; | ||
263 | + } charlist[] = | ||
264 | + { | ||
265 | + { 0x8c, "≤" }, // CG 0xf7, less or equal "≤" | ||
266 | + { 0xae, "≥" }, // CG 0xd9, greater or equal "≥" | ||
267 | + { 0xbe, "≠" }, // CG 0x3e, not equal "≠" | ||
268 | + { 0xad, "[" }, // "[" | ||
269 | + { 0xbd, "]" }, // "]" | ||
270 | + { 0xb8, "÷" }, // Division Sign ÷ | ||
271 | + | ||
272 | + }; | ||
273 | + | ||
274 | + size_t ix; | ||
275 | + | ||
276 | + if(chr >= 0xf0 && chr <= 0xf9) | ||
277 | + { | ||
278 | + char str[] = { '0' + (chr-0xF0), 0 }; | ||
279 | + draw_small_text(cr, rect, font, str, 0); | ||
280 | + return TRUE; | ||
281 | + } | ||
282 | + | ||
283 | + if(chr >= 0xe1 && chr <= 0xe3) | ||
284 | + { | ||
285 | + char str[] = { '1' + (chr-0xe1), 0 }; | ||
286 | + draw_small_text(cr, rect, font, str, 1); | ||
287 | + return TRUE; | ||
288 | + } | ||
289 | + | ||
290 | + for(ix = 0; ix < G_N_ELEMENTS(charlist); ix++) | ||
291 | + { | ||
292 | + if(chr == charlist[ix].chr) | ||
293 | + { | ||
294 | + v3270_draw_text(cr,rect,font,charlist[ix].utf); | ||
295 | + return TRUE; | ||
296 | + } | ||
297 | + } | ||
298 | + | ||
299 | + debug("%s: Unknown char 0x%02x",__FUNCTION__,(int) chr); | ||
300 | + | ||
301 | + return FALSE; | ||
302 | +} | ||
303 | + | ||
208 | void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *font, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg) | 304 | void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *font, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg) |
209 | { | 305 | { |
210 | // Clear element area | 306 | // Clear element area |
@@ -234,6 +330,7 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 | @@ -234,6 +330,7 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 | ||
234 | } | 330 | } |
235 | else if(attr & LIB3270_ATTR_CG) | 331 | else if(attr & LIB3270_ATTR_CG) |
236 | { | 332 | { |
333 | + | ||
237 | switch(chr) | 334 | switch(chr) |
238 | { | 335 | { |
239 | case 0xd3: // CG 0xab, plus | 336 | case 0xd3: // CG 0xab, plus |
@@ -305,28 +402,11 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 | @@ -305,28 +402,11 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 | ||
305 | cairo_rel_line_to(cr,rect->width,0); | 402 | cairo_rel_line_to(cr,rect->width,0); |
306 | break; | 403 | break; |
307 | 404 | ||
308 | - case 0x8c: // CG 0xf7, less or equal "≤" | ||
309 | - v3270_draw_text(cr,rect,font,"≤"); | ||
310 | - break; | ||
311 | - | ||
312 | - case 0xae: // CG 0xd9, greater or equal "≥" | ||
313 | - v3270_draw_text(cr,rect,font,"≥"); | ||
314 | - break; | ||
315 | - | ||
316 | - case 0xbe: // CG 0x3e, not equal "≠" | ||
317 | - v3270_draw_text(cr,rect,font,"≠"); | ||
318 | - break; | ||
319 | - | ||
320 | - case 0xad: // "[" | ||
321 | - v3270_draw_text(cr,rect,font,"["); | ||
322 | - break; | 405 | + default: |
323 | 406 | ||
324 | - case 0xbd: // "]" | ||
325 | - v3270_draw_text(cr,rect,font,"]"); | ||
326 | - break; | 407 | + if(!draw_cg(cr, chr, font, rect)) |
408 | + cairo_rectangle(cr, rect->x+1, rect->y+1, rect->width-2, rect->height-2); | ||
327 | 409 | ||
328 | - default: | ||
329 | - cairo_rectangle(cr, rect->x+1, rect->y+1, rect->width-2, rect->height-2); | ||
330 | } | 410 | } |
331 | } | 411 | } |
332 | else if(chr) | 412 | else if(chr) |