From 4a99615a609eec2b84bb2341d74fac46a5998137 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 25 Jun 2018 13:15:50 +0200 Subject: Pass rect and matrix by value in geometry functions. Several things irk me about passing values as const pointers: * They can be NULL, which is not a valid value. * They require explicit temporary variables for storage. * They don't compose easily in a legible manner, requiring weird pointer passing semantics where the variable being assigned is hidden as an argument in the innermost function call. * We can't change the value through the pointer, requiring yet more local variables to hold copies of the input value. In the device interface where we pass a matrix to a function, we often find ourselves making a local copy of the matrix so we can concatenate other transforms to it. This copying is a lot of unnecessary busywork that I hope to eventually avoid by laying the groundwork with this commit. This is a rather large API change, so I apologize for the inconvenience, but I hope the end result and gain in legibility will be worth the pain. --- platform/gl/gl-annotate.c | 66 ++++++++++++++++++++++------------------------- platform/gl/gl-font.c | 2 +- platform/gl/gl-input.c | 2 +- platform/gl/gl-main.c | 54 ++++++++++++++++---------------------- platform/gl/gl-ui.c | 2 +- 5 files changed, 56 insertions(+), 70 deletions(-) (limited to 'platform/gl') diff --git a/platform/gl/gl-annotate.c b/platform/gl/gl-annotate.c index 92458824..dca7519a 100644 --- a/platform/gl/gl-annotate.c +++ b/platform/gl/gl-annotate.c @@ -115,7 +115,7 @@ static void new_annot(int type) case PDF_ANNOT_SOUND: { fz_rect icon_rect = { 12, 12, 12+20, 12+20 }; - pdf_set_annot_rect(ctx, selected_annot, &icon_rect); + pdf_set_annot_rect(ctx, selected_annot, icon_rect); pdf_set_annot_color(ctx, selected_annot, 3, yellow); } break; @@ -123,7 +123,7 @@ static void new_annot(int type) case PDF_ANNOT_FREE_TEXT: { fz_rect text_rect = { 12, 12, 12+200, 12+100 }; - pdf_set_annot_rect(ctx, selected_annot, &text_rect); + pdf_set_annot_rect(ctx, selected_annot, text_rect); pdf_set_annot_border(ctx, selected_annot, 0); pdf_set_annot_default_appearance(ctx, selected_annot, "Helv", 12, black); } @@ -132,7 +132,7 @@ static void new_annot(int type) case PDF_ANNOT_STAMP: { fz_rect stamp_rect = { 12, 12, 12+190, 12+50 }; - pdf_set_annot_rect(ctx, selected_annot, &stamp_rect); + pdf_set_annot_rect(ctx, selected_annot, stamp_rect); pdf_set_annot_color(ctx, selected_annot, 3, red); } break; @@ -140,7 +140,7 @@ static void new_annot(int type) case PDF_ANNOT_CARET: { fz_rect caret_rect = { 12, 12, 12+18, 12+15 }; - pdf_set_annot_rect(ctx, selected_annot, &caret_rect); + pdf_set_annot_rect(ctx, selected_annot, caret_rect); pdf_set_annot_color(ctx, selected_annot, 3, blue); } break; @@ -158,7 +158,7 @@ static void new_annot(int type) case PDF_ANNOT_CIRCLE: { fz_rect shape_rect = { 12, 12, 12+100, 12+50 }; - pdf_set_annot_rect(ctx, selected_annot, &shape_rect); + pdf_set_annot_rect(ctx, selected_annot, shape_rect); pdf_set_annot_border(ctx, selected_annot, 1); pdf_set_annot_color(ctx, selected_annot, 3, red); } @@ -553,8 +553,8 @@ void do_annotate_panel(void) /* common annotation properties */ - pdf_annot_rect(ctx, selected_annot, &rect); - fz_irect_from_rect(&irect, &rect); + rect = pdf_annot_rect(ctx, selected_annot); + irect = fz_irect_from_rect(rect); ui_label("Rect: %d %d %d %d", irect.x0, irect.y0, irect.x1, irect.y1); do_annotate_flags(); @@ -778,9 +778,8 @@ static void do_edit_icon(fz_irect canvas_area, fz_irect area, fz_rect *rect) moving = 0; if (fz_abs(start_pt.x - rect->x0) > 0.1f || fz_abs(start_pt.x - rect->y0) > 0.1f) { - fz_rect trect = *rect; - fz_transform_rect(&trect, &view_page_inv_ctm); - pdf_set_annot_rect(ctx, selected_annot, &trect); + fz_rect trect = fz_transform_rect(*rect, view_page_inv_ctm); + pdf_set_annot_rect(ctx, selected_annot, trect); } } } @@ -800,7 +799,7 @@ static void do_edit_rect(fz_irect canvas_area, fz_irect area, fz_rect *rect) static fz_rect start_rect; static int state = ER_NONE; - fz_expand_irect(&area, 5); + area = fz_expand_irect(area, 5); if (ui_mouse_inside(&canvas_area) && ui_mouse_inside(&area)) { ui.hot = selected_annot; @@ -839,9 +838,8 @@ static void do_edit_rect(fz_irect canvas_area, fz_irect area, fz_rect *rect) state = ER_NONE; if (rects_differ(&start_rect, rect, 1)) { - fz_rect trect = *rect; - fz_transform_rect(&trect, &view_page_inv_ctm); - pdf_set_annot_rect(ctx, selected_annot, &trect); + fz_rect trect = fz_transform_rect(*rect, view_page_inv_ctm); + pdf_set_annot_rect(ctx, selected_annot, trect); } } } @@ -856,7 +854,7 @@ static void do_edit_line(fz_irect canvas_area, fz_irect area, fz_rect *rect) fz_point a, b; float lw; - fz_expand_irect(&area, 5); + area = fz_expand_irect(area, 5); if (ui_mouse_inside(&canvas_area) && ui_mouse_inside(&area)) { ui.hot = selected_annot; @@ -864,12 +862,12 @@ static void do_edit_line(fz_irect canvas_area, fz_irect area, fz_rect *rect) { ui.active = selected_annot; pdf_annot_line(ctx, selected_annot, &start_a, &start_b); - fz_transform_point(&start_a, &view_page_ctm); - fz_transform_point(&start_b, &view_page_ctm); + start_a = fz_transform_point(start_a, view_page_ctm); + start_b = fz_transform_point(start_b, view_page_ctm); a_grab = fz_make_irect(start_a.x, start_a.y, start_a.x, start_a.y); b_grab = fz_make_irect(start_b.x, start_b.y, start_b.x, start_b.y); - fz_expand_irect(&a_grab, 10); - fz_expand_irect(&b_grab, 10); + a_grab = fz_expand_irect(a_grab, 10); + b_grab = fz_expand_irect(b_grab, 10); state = EL_NONE; if (ui_mouse_inside(&a_grab)) state |= EL_A; if (ui_mouse_inside(&b_grab)) state |= EL_B; @@ -895,7 +893,7 @@ static void do_edit_line(fz_irect canvas_area, fz_irect area, fz_rect *rect) rect->x1 = fz_max(a.x, b.x); rect->y1 = fz_max(a.y, b.y); lw = pdf_annot_border(ctx, selected_annot); - fz_expand_rect(rect, fz_matrix_expansion(&view_page_ctm) * lw); + *rect = fz_expand_rect(*rect, fz_matrix_expansion(view_page_ctm) * lw); /* cancel on right click */ if (ui.right) @@ -907,8 +905,8 @@ static void do_edit_line(fz_irect canvas_area, fz_irect area, fz_rect *rect) state = EL_NONE; if (points_differ(&start_a, &a, 1) || points_differ(&start_b, &b, 1)) { - fz_transform_point(&a, &view_page_inv_ctm); - fz_transform_point(&b, &view_page_inv_ctm); + a = fz_transform_point(a, view_page_inv_ctm); + b = fz_transform_point(b, view_page_inv_ctm); pdf_set_annot_line(ctx, selected_annot, a, b); } } @@ -938,11 +936,11 @@ static void do_edit_polygon(fz_irect canvas_area, int close) if (n > 0) { p = pdf_annot_vertex(ctx, selected_annot, n-1); - fz_transform_point(&p, &view_page_ctm); + p = fz_transform_point(p, view_page_ctm); if (close) { a = pdf_annot_vertex(ctx, selected_annot, 0); - fz_transform_point(&a, &view_page_ctm); + a = fz_transform_point(a, view_page_ctm); } glBegin(GL_LINE_STRIP); glColor4f(1, 0, 0, 1); @@ -966,8 +964,7 @@ static void do_edit_polygon(fz_irect canvas_area, int close) /* commit point on mouse-up */ if (!ui.down) { - fz_point p = { ui.x, ui.y }; - fz_transform_point(&p, &view_page_inv_ctm); + fz_point p = fz_transform_point_xy(ui.x, ui.y, view_page_inv_ctm); pdf_add_annot_vertex(ctx, selected_annot, p); drawing = 0; } @@ -1029,7 +1026,7 @@ static void do_edit_ink(fz_irect canvas_area) if (n > 1) { for (i = 0; i < n; ++i) - fz_transform_point(&p[i], &view_page_inv_ctm); + p[i] = fz_transform_point(p[i], view_page_inv_ctm); pdf_add_annot_ink_list(ctx, selected_annot, n, p); } drawing = 0; @@ -1064,8 +1061,8 @@ static void do_edit_quad_points(void) fz_point page_a = { pt.x, pt.y }; fz_point page_b = { ui.x, ui.y }; - fz_transform_point(&page_a, &view_page_inv_ctm); - fz_transform_point(&page_b, &view_page_inv_ctm); + page_a = fz_transform_point(page_a, view_page_inv_ctm); + page_b = fz_transform_point(page_b, view_page_inv_ctm); n = fz_highlight_selection(ctx, page_text, page_a, page_b, hits, nelem(hits)); @@ -1076,8 +1073,7 @@ static void do_edit_quad_points(void) glBegin(GL_QUADS); for (i = 0; i < n; ++i) { - fz_quad thit = hits[i]; - fz_transform_quad(&thit, &view_page_ctm); + fz_quad thit = fz_transform_quad(hits[i], view_page_ctm); glVertex2f(thit.ul.x, thit.ul.y); glVertex2f(thit.ur.x, thit.ur.y); glVertex2f(thit.lr.x, thit.lr.y); @@ -1114,9 +1110,9 @@ void do_annotate_canvas(fz_irect canvas_area) for (annot = pdf_first_annot(ctx, page); annot; annot = pdf_next_annot(ctx, annot)) { - pdf_bound_annot(ctx, annot, &bounds); - fz_transform_rect(&bounds, &view_page_ctm); - fz_irect_from_rect(&area, &bounds); + bounds = pdf_bound_annot(ctx, annot); + bounds = fz_transform_rect(bounds, view_page_ctm); + area = fz_irect_from_rect(bounds); if (ui_mouse_inside(&canvas_area) && ui_mouse_inside(&area)) { @@ -1189,7 +1185,7 @@ void do_annotate_canvas(fz_irect canvas_area) glEnable(GL_BLEND); glColor4f(1, 1, 1, 1); glBegin(GL_LINE_LOOP); - fz_irect_from_rect(&area, &bounds); + area = fz_irect_from_rect(bounds); glVertex2f(area.x0-0.5f, area.y0-0.5f); glVertex2f(area.x1+0.5f, area.y0-0.5f); glVertex2f(area.x1+0.5f, area.y1+0.5f); diff --git a/platform/gl/gl-font.c b/platform/gl/gl-font.c index 08dd773a..8a331b3e 100644 --- a/platform/gl/gl-font.c +++ b/platform/gl/gl-font.c @@ -137,7 +137,7 @@ static struct glyph *lookup_glyph(fz_font *font, int gid, float *xp, float *yp) int w, h; /* match fitz's glyph cache quantization */ - fz_scale(&trm, g_font_size, -g_font_size); + trm = fz_scale(g_font_size, -g_font_size); trm.e = *xp; trm.f = *yp; fz_subpixel_adjust(ctx, &trm, &subpix_trm, &subx, &suby); diff --git a/platform/gl/gl-input.c b/platform/gl/gl-input.c index 56fcf74d..c3898f50 100644 --- a/platform/gl/gl-input.c +++ b/platform/gl/gl-input.c @@ -409,7 +409,7 @@ int ui_input(struct input *input, int width, int height) area = ui_pack(width, ui.lineheight * height + 6); ui_draw_bevel_rect(area, UI_COLOR_TEXT_BG, 1); - fz_expand_irect(&area, -2); + area = fz_expand_irect(area, -2); if (height > 1) area.x1 -= ui.lineheight; diff --git a/platform/gl/gl-main.c b/platform/gl/gl-main.c index 899dc4ec..5b26a48f 100644 --- a/platform/gl/gl-main.c +++ b/platform/gl/gl-main.c @@ -207,20 +207,18 @@ void update_title(void) void transform_page(void) { - fz_rect rect = page_bounds; + fz_rect rect; fz_matrix matrix; - draw_page_bounds = page_bounds; - - fz_scale(&draw_page_ctm, currentzoom / 72, currentzoom / 72); - fz_pre_rotate(&draw_page_ctm, -currentrotate); + draw_page_ctm = fz_scale(currentzoom / 72, currentzoom / 72); + draw_page_ctm = fz_pre_rotate(draw_page_ctm, -currentrotate); /* fix the page origin at 0,0 after rotation */ - fz_transform_rect(&rect, &draw_page_ctm); - fz_translate(&matrix, -rect.x0, -rect.y0); - fz_concat(&draw_page_ctm, &draw_page_ctm, &matrix); + rect = fz_transform_rect(page_bounds, draw_page_ctm); + matrix = fz_translate(-rect.x0, -rect.y0); + draw_page_ctm = fz_concat(draw_page_ctm, matrix); - fz_transform_rect(&draw_page_bounds, &draw_page_ctm); + draw_page_bounds = fz_transform_rect(page_bounds, draw_page_ctm); } void load_page(void) @@ -245,10 +243,10 @@ void load_page(void) page_text = fz_new_stext_page_from_page(ctx, fzpage, NULL); /* compute bounds here for initial window size */ - fz_bound_page(ctx, fzpage, &page_bounds); + page_bounds = fz_bound_page(ctx, fzpage); transform_page(); - fz_irect_from_rect(&area, &draw_page_bounds); + area = fz_irect_from_rect(draw_page_bounds); page_tex.w = area.x1 - area.x0; page_tex.h = area.y1 - area.y0; } @@ -281,16 +279,14 @@ static struct mark save_mark() { struct mark mark; mark.page = currentpage; - mark.scroll.x = scroll_x; - mark.scroll.y = scroll_y; - fz_transform_point(&mark.scroll, &view_page_inv_ctm); + mark.scroll = fz_transform_point_xy(scroll_x, scroll_y, view_page_inv_ctm); return mark; } static void restore_mark(struct mark mark) { currentpage = mark.page; - fz_transform_point(&mark.scroll, &draw_page_ctm); + mark.scroll = fz_transform_point(mark.scroll, draw_page_ctm); scroll_x = mark.scroll.x; scroll_y = mark.scroll.y; } @@ -337,9 +333,8 @@ static void jump_to_page(int newpage) static void jump_to_page_xy(int newpage, float x, float y) { - fz_point p = { x, y }; + fz_point p = fz_transform_point_xy(x, y, draw_page_ctm); newpage = fz_clampi(newpage, 0, fz_count_pages(ctx, doc) - 1); - fz_transform_point(&p, &draw_page_ctm); clear_future(); push_history(); currentpage = newpage; @@ -427,8 +422,8 @@ static void do_links(fz_link *link) while (link) { bounds = link->rect; - fz_transform_rect(&bounds, &view_page_ctm); - fz_irect_from_rect(&area, &bounds); + bounds = fz_transform_rect(link->rect, view_page_ctm); + area = fz_irect_from_rect(bounds); if (ui_mouse_inside(&area)) { @@ -493,8 +488,8 @@ static void do_page_selection(void) fz_point page_a = { pt.x, pt.y }; fz_point page_b = { ui.x, ui.y }; - fz_transform_point(&page_a, &view_page_inv_ctm); - fz_transform_point(&page_b, &view_page_inv_ctm); + page_a = fz_transform_point(page_a, view_page_inv_ctm); + page_b = fz_transform_point(page_b, view_page_inv_ctm); if (ui.mod == GLUT_ACTIVE_CTRL) fz_snap_selection(ctx, page_text, &page_a, &page_b, FZ_SELECT_WORDS); @@ -510,8 +505,7 @@ static void do_page_selection(void) glBegin(GL_QUADS); for (i = 0; i < n; ++i) { - fz_quad thit = hits[i]; - fz_transform_quad(&thit, &view_page_ctm); + fz_quad thit = fz_transform_quad(hits[i], view_page_ctm); glVertex2f(thit.ul.x, thit.ul.y); glVertex2f(thit.ur.x, thit.ur.y); glVertex2f(thit.lr.x, thit.lr.y); @@ -546,8 +540,7 @@ static void do_search_hits(void) glBegin(GL_QUADS); for (i = 0; i < search_hit_count; ++i) { - fz_quad thit = search_hit_quads[i]; - fz_transform_quad(&thit, &view_page_ctm); + fz_quad thit = fz_transform_quad(search_hit_quads[i], view_page_ctm); glVertex2f(thit.ul.x, thit.ul.y); glVertex2f(thit.ur.x, thit.ur.y); glVertex2f(thit.lr.x, thit.lr.y); @@ -567,9 +560,7 @@ static void do_forms(void) if (!pdf || search_active) return; - p.x = ui.x; - p.y = ui.y; - fz_transform_point(&p, &view_page_inv_ctm); + p = fz_transform_point_xy(ui.x, ui.y, view_page_inv_ctm); if (ui.down && !ui.active) { @@ -1131,10 +1122,9 @@ static void do_canvas(void) view_page_ctm = draw_page_ctm; view_page_ctm.e += page_x; view_page_ctm.f += page_y; - fz_invert_matrix(&view_page_inv_ctm, &view_page_ctm); - view_page_bounds = page_bounds; - fz_transform_rect(&view_page_bounds, &view_page_ctm); - fz_irect_from_rect(&view_page_area, &view_page_bounds); + view_page_inv_ctm = fz_invert_matrix(view_page_ctm); + view_page_bounds = fz_transform_rect(page_bounds, view_page_ctm); + view_page_area = fz_irect_from_rect(view_page_bounds); ui_draw_image(&page_tex, page_x, page_y); diff --git a/platform/gl/gl-ui.c b/platform/gl/gl-ui.c index 2d8fd5be..9539af7b 100644 --- a/platform/gl/gl-ui.c +++ b/platform/gl/gl-ui.c @@ -687,7 +687,7 @@ void ui_dialog_begin(int w, int h) y = (ui.window_h-h)/3; area = fz_make_irect(x, y, x+w, y+h); ui_draw_bevel_rect(area, UI_COLOR_PANEL, 0); - fz_expand_irect(&area, -14); + area = fz_expand_irect(area, -14); ui_pack_push(area); } -- cgit v1.2.3