74
79
/* we draw an outer box in one winding direction and an inner one in the
75
80
* opposite direction. This works for both cairo windings rules.
77
* what we really want is cairo_stroke_to_path().
82
* what we really want is cairo_stroke_to_path(), but that's not
83
* implemented in cairo yet.
81
cairo_rectangle (crenderer->cr, x-d2, y-d2, width+d, height+d);
87
cairo_rectangle (cr, x-d2, y-d2, width+d, height+d);
83
cairo_rectangle (crenderer->cr, x+d2 + (width-d), y+d2, - (width-d), height-d);
92
/* delicacies of computing the joint... this is REALLY slow */
94
double alpha, tan_alpha2, cos_alpha;
97
alpha = atan2 (height, width);
99
tan_alpha2 = tan (alpha * .5);
100
if (tan_alpha2 < 1e-5 || (sx = d2 / tan_alpha2, 2. * sx > width - d))
101
sx = (width - d) * .5;
103
cos_alpha = cos (alpha);
104
if (cos_alpha < 1e-5 || (sy = d2 / cos_alpha, 2. * sy > height - d))
105
sy = (height - d) * .5;
108
cairo_new_sub_path (cr);
109
cairo_line_to (cr, x+width-sx, y+d2);
110
cairo_line_to (cr, x+sx, y+d2);
111
cairo_line_to (cr, x+.5*width, y+.5*height-sy);
112
cairo_close_path (cr);
114
/* bottom triangle */
115
cairo_new_sub_path (cr);
116
cairo_line_to (cr, x+width-sx, y+height-d2);
117
cairo_line_to (cr, x+.5*width, y+.5*height+sy);
118
cairo_line_to (cr, x+sx, y+height-d2);
119
cairo_close_path (cr);
122
alpha = G_PI_2 - alpha;
123
tan_alpha2 = tan (alpha * .5);
124
if (tan_alpha2 < 1e-5 || (sy = d2 / tan_alpha2, 2. * sy > height - d))
125
sy = (width - d) * .5;
127
cos_alpha = cos (alpha);
128
if (cos_alpha < 1e-5 || (sx = d2 / cos_alpha, 2. * sx > width - d))
129
sx = (width - d) * .5;
132
cairo_new_sub_path (cr);
133
cairo_line_to (cr, x+d2, y+sy);
134
cairo_line_to (cr, x+d2, y+height-sy);
135
cairo_line_to (cr, x+.5*width-sx, y+.5*height);
136
cairo_close_path (cr);
139
cairo_new_sub_path (cr);
140
cairo_line_to (cr, x+width-d2, y+sy);
141
cairo_line_to (cr, x+.5*width+sx, y+.5*height);
142
cairo_line_to (cr, x+width-d2, y+height-sy);
143
cairo_close_path (cr);
146
cairo_rectangle (cr, x+width-d2, y+d2, - (width-d), height-d);
87
cairo_rectangle (crenderer->cr, x, y, width, height);
88
cairo_set_line_width (crenderer->cr, line_width);
89
cairo_stroke (crenderer->cr);
150
cairo_rectangle (cr, x, y, width, height);
156
cairo_new_sub_path (cr);
157
cairo_move_to (cr, x, y);
158
cairo_rel_line_to (cr, width, height);
160
cairo_new_sub_path (cr);
161
cairo_move_to (cr, x + width, y);
162
cairo_rel_line_to (cr, -width, height);
164
cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
167
cairo_set_line_width (cr, line_width);
168
cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
169
cairo_set_miter_limit (cr, 2.);
128
211
double temp_x, temp_y;
129
212
PangoCairoFontHexBoxInfo *hbi;
214
gboolean invalid_input;
132
216
cairo_save (crenderer->cr);
133
217
cairo_get_current_point (crenderer->cr, &temp_x, &temp_y);
219
ch = gi->glyph & ~PANGO_GLYPH_UNKNOWN_FLAG;
220
invalid_input = G_UNLIKELY (gi->glyph == PANGO_GLYPH_INVALID_INPUT || ch > 0x10FFFF);
135
222
hbi = _pango_cairo_font_get_hex_box_info ((PangoCairoFont *)font);
137
223
if (!hbi || !_pango_cairo_font_install ((PangoFont *)(hbi->font), crenderer->cr))
139
_pango_cairo_renderer_draw_box_glyph (crenderer, gi, cx, cy);
225
_pango_cairo_renderer_draw_box_glyph (crenderer, gi, cx, cy, invalid_input);
143
ch = gi->glyph & ~PANGO_GLYPH_UNKNOWN_FLAG;
145
229
rows = hbi->rows;
146
cols = (ch > 0xffff ? 6 : 4) / rows;
147
g_snprintf (buf, sizeof(buf), (ch > 0xffff) ? "%06X" : "%04X", ch);
230
if (G_UNLIKELY (invalid_input))
236
cols = (ch > 0xffff ? 6 : 4) / rows;
237
g_snprintf (buf, sizeof(buf), (ch > 0xffff) ? "%06X" : "%04X", ch);
149
240
_pango_cairo_renderer_draw_frame (crenderer,
150
241
cx + hbi->pad_x * 1.5,
151
242
cy + hbi->box_descent - hbi->box_height + hbi->pad_y * 0.5,
152
243
(double)gi->geometry.width / PANGO_SCALE - 3 * hbi->pad_x,
153
244
(hbi->box_height - hbi->pad_y),
156
251
x0 = cx + hbi->pad_x * 3.0;
157
252
y0 = cy + hbi->box_descent - hbi->pad_y * 2;