Commit dfefe3cf21415cc63fc6484ac12289d094e983ba

Authored by Perry Werneck
1 parent c312bb7f
Exists in master and in 1 other branch develop

Adjustments on CG character drawing.

Showing 1 changed file with 76 additions and 20 deletions   Show diff stats
src/terminal/drawing/draw.c
... ... @@ -205,6 +205,78 @@ void v3270_draw_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font,
205 205 v3270_draw_text_at(cr,rect->x,rect->y,font,str);
206 206 }
207 207  
  208 +static gboolean draw_cg(cairo_t *cr, unsigned char chr, v3270FontInfo *font, GdkRectangle *rect)
  209 +{
  210 + static const struct CharList
  211 + {
  212 + unsigned char chr;
  213 + const gchar * utf;
  214 + } charlist[] =
  215 + {
  216 + { 0x8c, "≤" }, // CG 0xf7, less or equal "≤"
  217 + { 0xae, "≥" }, // CG 0xd9, greater or equal "≥"
  218 + { 0xbe, "≠" }, // CG 0x3e, not equal "≠"
  219 + { 0xad, "[" }, // "["
  220 + { 0xbd, "]" }, // "]"
  221 + };
  222 +
  223 + size_t ix;
  224 +
  225 + if(chr >= 0xf0 && chr <= 0xf9)
  226 + {
  227 + char str[] = { '0' + (chr-0xF0), 0 };
  228 +
  229 + cairo_status_t status;
  230 + cairo_glyph_t * glyphs = NULL;
  231 + int num_glyphs = 0;
  232 + cairo_text_cluster_t * clusters = NULL;
  233 + int num_clusters = 0;
  234 + cairo_text_cluster_flags_t cluster_flags;
  235 + cairo_scaled_font_t * scaled_font = cairo_get_scaled_font(cr);
  236 + cairo_font_extents_t extents;
  237 +
  238 + cairo_save(cr);
  239 +
  240 + cairo_set_font_face(cr,font->face);
  241 + cairo_set_font_size(cr,font->size/1.3);
  242 + cairo_font_extents(cr,&extents);
  243 +
  244 + status = cairo_scaled_font_text_to_glyphs(
  245 + scaled_font,
  246 + (double) rect->x, (double) (rect->y+extents.height),
  247 + str, 1,
  248 + &glyphs, &num_glyphs,
  249 + &clusters, &num_clusters, &cluster_flags );
  250 +
  251 + if (status == CAIRO_STATUS_SUCCESS) {
  252 + cairo_show_text_glyphs(cr,str,1,glyphs, num_glyphs,clusters, num_clusters, cluster_flags);
  253 + }
  254 +
  255 + if(glyphs)
  256 + cairo_glyph_free(glyphs);
  257 +
  258 + if(clusters)
  259 + cairo_text_cluster_free(clusters);
  260 +
  261 + cairo_restore(cr);
  262 +
  263 + return TRUE;
  264 + }
  265 +
  266 + for(ix = 0; ix < G_N_ELEMENTS(charlist); ix++)
  267 + {
  268 + if(chr == charlist[ix].chr)
  269 + {
  270 + v3270_draw_text(cr,rect,font,charlist[ix].utf);
  271 + return TRUE;
  272 + }
  273 + }
  274 +
  275 + debug("%s: Unknown char 0x%02x",__FUNCTION__,(int) chr);
  276 +
  277 + return FALSE;
  278 +}
  279 +
208 280 void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *font, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg)
209 281 {
210 282 // Clear element area
... ... @@ -234,6 +306,7 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270
234 306 }
235 307 else if(attr & LIB3270_ATTR_CG)
236 308 {
  309 +
237 310 switch(chr)
238 311 {
239 312 case 0xd3: // CG 0xab, plus
... ... @@ -305,28 +378,11 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270
305 378 cairo_rel_line_to(cr,rect->width,0);
306 379 break;
307 380  
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;
  381 + default:
319 382  
320   - case 0xad: // "["
321   - v3270_draw_text(cr,rect,font,"[");
322   - break;
  383 + if(!draw_cg(cr, chr, font, rect))
  384 + cairo_rectangle(cr, rect->x+1, rect->y+1, rect->width-2, rect->height-2);
323 385  
324   - case 0xbd: // "]"
325   - v3270_draw_text(cr,rect,font,"]");
326   - break;
327   -
328   - default:
329   - cairo_rectangle(cr, rect->x+1, rect->y+1, rect->width-2, rect->height-2);
330 386 }
331 387 }
332 388 else if(chr)
... ...