[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/android 712c7450ce 2/4: Remove bresenham stuff
From: |
Po Lu |
Subject: |
feature/android 712c7450ce 2/4: Remove bresenham stuff |
Date: |
Tue, 7 Feb 2023 10:11:11 -0500 (EST) |
branch: feature/android
commit 712c7450ced2c396315afaa13deabf6f7d80e9e1
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Remove bresenham stuff
* src/sfnt.c (sfnt_step_edge, sfnt_step_edge_n)
(sfnt_build_outline_edges, sfnt_test_edge, main):
* src/sfnt.h (struct sfnt_edge): Stop using error corrected line
drawing, as it's actually slower.
---
src/sfnt.c | 73 ++++++++++++++------------------------------------------------
src/sfnt.h | 15 +------------
2 files changed, 17 insertions(+), 71 deletions(-)
diff --git a/src/sfnt.c b/src/sfnt.c
index 13a73f057b..cef8408041 100644
--- a/src/sfnt.c
+++ b/src/sfnt.c
@@ -3580,35 +3580,8 @@ typedef void (*sfnt_span_proc) (struct sfnt_edge *,
sfnt_fixed, void *);
static void
sfnt_step_edge (struct sfnt_edge *edge)
{
- /* Add error accumulator. */
- edge->error += edge->step_x;
-
- while (edge->error > 0)
- {
- /* Subtract error and add 1. */
- edge->x += edge->signed_step;
- edge->error -= 65536;
- }
-}
-
-/* Move EDGE->x forward, assuming that the scanline has moved upwards
- by N, and that N is less than or equal to SFNT_POLY_STEP. */
-
-static void
-sfnt_step_edge_n (struct sfnt_edge *edge, sfnt_fixed n)
-{
- /* Add error accumulator. */
- edge->error += sfnt_mul_fixed (edge->step_x, n);
-
- /* See if error is more than 0, and bring the line back to where it
- should be. */
-
- while (edge->error > 0)
- {
- /* Subtract error and add 1. */
- edge->x += edge->signed_step;
- edge->error -= 65536;
- }
+ /* Add step. */
+ edge->x += edge->step_x;
}
/* Build a list of edges for each contour in OUTLINE, applying xmin
@@ -3623,7 +3596,6 @@ sfnt_build_outline_edges (struct sfnt_glyph_outline
*outline,
struct sfnt_edge *edges;
size_t i, edge, next_vertex;
sfnt_fixed dx, dy, bot, step_x, ymin, xmin;
- int inc_x;
size_t top, bottom, y;
edges = alloca (outline->outline_used * sizeof *edges);
@@ -3699,30 +3671,18 @@ sfnt_build_outline_edges (struct sfnt_glyph_outline
*outline,
if (y >= edges[edge].top)
continue;
- /* Compute the slope error. This is how much X changes for each
+ /* Compute the step X. This is how much X changes for each
increase in Y. */
- if (dx >= 0)
- step_x = sfnt_div_fixed (dx, dy);
- else
- step_x = sfnt_div_fixed (-dx, dy);
-
- /* Compute the increment. This is which direction X moves in
- for each increase in Y. */
-
- if (dx >= 0)
- inc_x = 1;
- else
- inc_x = -1;
-
- edges[edge].signed_step = SFNT_POLY_STEP * inc_x;
+ step_x = sfnt_div_fixed (dx, dy);
edges[edge].next = NULL;
- /* Set the initial Bresenham terms. */
- edges[edge].error = step_x - 65536;
- edges[edge].step_x = step_x;
+ /* Compute the step X scaled to the poly step. */
+ edges[edge].step_x
+ = sfnt_mul_fixed (step_x, SFNT_POLY_STEP);
- sfnt_step_edge_n (&edges[edge], bot - y);
+ /* Step to the grid point. */
+ edges[edge].x += sfnt_mul_fixed (step_x, bot - y);
/* Set the bottom position. */
edges[edge].bottom = y;
@@ -11454,13 +11414,12 @@ sfnt_test_edge (struct sfnt_edge *edges, size_t
num_edges,
for (i = 0; i < num_edges; ++i)
{
printf ("/* edge x, top, bot: %g, %g - %g. winding: %d */\n"
- "/* edge step_x: %g, sign: %d */\n",
+ "/* edge step_x: %g */\n",
sfnt_coerce_fixed (edges[i].x),
sfnt_coerce_fixed (edges[i].top),
sfnt_coerce_fixed (edges[i].bottom),
edges[i].winding,
- sfnt_coerce_fixed (edges[i].step_x),
- edges[i].signed_step);
+ sfnt_coerce_fixed (edges[i].step_x));
#ifdef TEST_VERTEX
printf ("ctx.fillRect (%g, %g, 1, 1);\n",
sfnt_coerce_fixed (edges[i].x),
@@ -15103,7 +15062,7 @@ main (int argc, char **argv)
cvt ? cvt->num_elements : 0ul);
interpreter = sfnt_make_interpreter (maxp, cvt, head,
- 12, 12);
+ 20, 20);
state = interpreter->state;
if (fpgm)
@@ -15279,7 +15238,7 @@ main (int argc, char **argv)
/* Time this important bit. */
clock_gettime (CLOCK_THREAD_CPUTIME_ID, &start);
outline = sfnt_build_glyph_outline (glyph, head,
- 12,
+ 20,
sfnt_test_get_glyph,
sfnt_test_free_glyph,
&dcontext);
@@ -15321,7 +15280,7 @@ main (int argc, char **argv)
clock_gettime (CLOCK_THREAD_CPUTIME_ID, &start);
- for (i = 0; i < 1; ++i)
+ for (i = 0; i < 400; ++i)
{
xfree (raster);
raster = sfnt_raster_glyph_outline (outline);
@@ -15346,7 +15305,7 @@ main (int argc, char **argv)
if (hmtx && head)
{
- if (!sfnt_lookup_glyph_metrics (code, 12,
+ if (!sfnt_lookup_glyph_metrics (code, 20,
&metrics,
hmtx, hhea,
head, maxp))
@@ -15414,7 +15373,7 @@ main (int argc, char **argv)
printf ("time spent building edges: %lld sec %ld nsec\n",
(long long) sub1.tv_sec, sub1.tv_nsec);
printf ("time spent rasterizing: %lld sec %ld nsec\n",
- (long long) sub2.tv_sec / 1, sub2.tv_nsec / 1);
+ (long long) sub2.tv_sec / 400, sub2.tv_nsec / 400);
xfree (outline);
}
diff --git a/src/sfnt.h b/src/sfnt.h
index 4852296004..409c45085b 100644
--- a/src/sfnt.h
+++ b/src/sfnt.h
@@ -698,13 +698,6 @@ struct sfnt_raster
unsigned short refcount;
};
-/* Bresenham's algorithm.
- This rasterizer uses Bresenham's algorithm, with the minor
- detail being that it does not use device pixels, but rather
- pixels in a sample grid defined by SFNT_POLY_SHIFT, which is
- normally set to 4x oversampling. See sfnt_poly_edges for
- an explanation of how Bresenham's algorithm works. */
-
struct sfnt_edge
{
/* Next edge in this chain. */
@@ -716,14 +709,8 @@ struct sfnt_edge
/* X position, top and bottom of edges. */
sfnt_fixed x, top, bottom;
- /* Slope error. */
+ /* Amount to move X by upon each change of Y. */
sfnt_fixed step_x;
-
- /* SFNT_POLY_STEP times the direction of movement. */
- sfnt_fixed signed_step;
-
- /* Slope error accumulator. */
- sfnt_fixed error;
};