summaryrefslogtreecommitdiff
path: root/platform/gl
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-06-25 13:15:50 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-07-05 15:32:34 +0200
commit4a99615a609eec2b84bb2341d74fac46a5998137 (patch)
tree486eacff07448e4c655df1fa1bcb20df709dd8df /platform/gl
parent2aa62902447760764e7a763dea322145d9c4808c (diff)
downloadmupdf-4a99615a609eec2b84bb2341d74fac46a5998137.tar.xz
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.
Diffstat (limited to 'platform/gl')
-rw-r--r--platform/gl/gl-annotate.c66
-rw-r--r--platform/gl/gl-font.c2
-rw-r--r--platform/gl/gl-input.c2
-rw-r--r--platform/gl/gl-main.c54
-rw-r--r--platform/gl/gl-ui.c2
5 files changed, 56 insertions, 70 deletions
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);
}