summaryrefslogtreecommitdiff
path: root/source/html
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-03-28 13:37:38 +0100
committerRobin Watts <robin.watts@artifex.com>2016-03-29 12:59:32 +0100
commit020911485b5433ff135480165d100b10e3b051c7 (patch)
tree2d33400e6cdcbb0e3804c2a6cc9612b02d05483c /source/html
parentc8b2cbbbc3cc9c7112929230b2d2cebe1d58e139 (diff)
downloadmupdf-020911485b5433ff135480165d100b10e3b051c7.tar.xz
Tweak html-layout harfbuff code to placate gcc.
gcc whines about strict-aliasing rules. Tweak the code to avoid them. Short version = gcc dislikes accessing the same memory through different typed pointers unless they are void * or char *.
Diffstat (limited to 'source/html')
-rw-r--r--source/html/html-layout.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/source/html/html-layout.c b/source/html/html-layout.c
index 6ac65845..08a0fb9d 100644
--- a/source/html/html-layout.c
+++ b/source/html/html-layout.c
@@ -1280,18 +1280,27 @@ static void draw_flow_box(fz_context *ctx, fz_html *box, float page_top, float p
ly = 0;
for (gp = 0; gp < walker.glyph_count; gp++)
{
+ /* Need to use this slightly more awkward than
+ * expected void * formulation to avoid gcc's
+ * strict-aliasing type punning whining. */
hb_glyph_position_t *p = &walker.glyph_pos[gp];
+ void *px = &walker.glyph_pos[gp].x_offset;
+ void *py = &walker.glyph_pos[gp].y_offset;
+ hb_position_t x_off = *(hb_position_t *)px;
+ hb_position_t y_off = *(hb_position_t *)py;
+ float fx_off = x + (lx + x_off) * node_scale;
+ float fy_off = x + (lx + y_off) * node_scale;
#ifdef DEBUG_HARFBUZZ
hb_glyph_info_t *g = &walker.glyph_info[gp];
printf("glyph: %x(%d) @ %d %d + %d %d",
- g->codepoint, g->cluster, p->x_offset, p->y_offset,
+ g->codepoint, g->cluster, x_off, y_off,
p->x_advance, p->y_advance);
#endif /* DEBUG_HARFBUZZ */
- *(float *)(&p->x_offset) = x + (lx + p->x_offset) * node_scale;
- *(float *)(&p->y_offset) = y + (ly + p->y_offset) * node_scale;
+ *(float *)px = fx_off;
+ *(float *)py = fy_off;
#ifdef DEBUG_HARFBUZZ
- printf(" => %g %g\n", *(float *)(&p->x_offset), *(float *)(&p->y_offset));
+ printf(" => %g %g\n", fx_off, fy_off);
#endif /* DEBUG_HARFBUZZ */
lx += p->x_advance;
ly += p->y_advance;
@@ -1302,8 +1311,8 @@ static void draw_flow_box(fz_context *ctx, fz_html *box, float page_top, float p
w -= lx * node_scale;
for (gp = 0; gp < walker.glyph_count; gp++)
{
- hb_glyph_position_t *p = &walker.glyph_pos[gp];
- *(float *)(&p->x_offset) += w;
+ void *p = &walker.glyph_pos[gp].x_offset;
+ *(float *)p += w;
}
}
else
@@ -1326,11 +1335,12 @@ static void draw_flow_box(fz_context *ctx, fz_html *box, float page_top, float p
for (gp = 0; gp < walker.glyph_count; gp++)
{
hb_glyph_info_t *g = &glyph_info[gp];
- hb_glyph_position_t *p = &walker.glyph_pos[gp];
+ void *px = &walker.glyph_pos[gp].x_offset;
+ void *py = &walker.glyph_pos[gp].y_offset;
if (g->cluster != idx)
continue;
- trm.e = *(float *)&p->x_offset;
- trm.f = *(float *)&p->y_offset;
+ trm.e = *(float *)px;
+ trm.f = *(float *)py;
fz_show_glyph(ctx, text, walker.font, &trm, g->codepoint, c, 0,
node->bidi_level, node->markup_dir,
node->markup_lang);
@@ -1351,11 +1361,12 @@ static void draw_flow_box(fz_context *ctx, fz_html *box, float page_top, float p
for (gp++ ;gp < walker.glyph_count; gp++)
{
hb_glyph_info_t *g = &glyph_info[gp];
- hb_glyph_position_t *p = &walker.glyph_pos[gp];
+ void *px = &walker.glyph_pos[gp].x_offset;
+ void *py = &walker.glyph_pos[gp].y_offset;
if (g->cluster != idx)
continue;
- trm.e = *(float *)&p->x_offset;
- trm.f = *(float *)&p->y_offset;
+ trm.e = *(float *)px;
+ trm.f = *(float *)py;
fz_show_glyph(ctx, text, walker.font, &trm, g->codepoint, -1, 0, node->bidi_level, node->markup_dir, node->markup_lang);
}
}