Commit 61f7422d31d4dd380d0efaa59f50070b2f0c6978

Authored by Perry Werneck
2 parents 634bc2e3 cd3ec12e
Exists in master and in 1 other branch develop

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 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 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 306 // Clear element area
... ... @@ -234,6 +330,7 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270
234 330 }
235 331 else if(attr & LIB3270_ATTR_CG)
236 332 {
  333 +
237 334 switch(chr)
238 335 {
239 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 402 cairo_rel_line_to(cr,rect->width,0);
306 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 412 else if(chr)
... ...