Browse Source

Curve subdivision!

master
A.Olokhtonov 3 years ago
parent
commit
baf60622e4
  1. 52
      main.c

52
main.c

@ -26,7 +26,7 @@
#define PER_PIXEL 0 #define PER_PIXEL 0
#define PER_ROW 0 #define PER_ROW 0
#define DEBUG_SHOW_POINTS 1 #define DEBUG_SHOW_POINTS 0
/* /*
int total_hits = 0; int total_hits = 0;
@ -408,8 +408,8 @@ render_glyph(struct glyph g, struct line_contour *lines,
int x0 = 0; // g.xmin * scale; int x0 = 0; // g.xmin * scale;
int gwidth = (g.xmax - g.xmin) * scale + 2; int gwidth = (g.xmax - g.xmin) * scale;
int gheight = (g.ymax - g.ymin) * scale + 2; int gheight = (g.ymax - g.ymin) * scale + 1;
pixels = pixels + width * 100 + 100; pixels = pixels + width * 100 + 100;
@ -480,6 +480,7 @@ outline_to_lines(struct glyph g, f32 scale, struct line_contour *dest, int *cnt)
{ {
int nlines = 0; int nlines = 0;
int points_from = 0; int points_from = 0;
int curve_segments = 5;
for (int c = 0; c < g.ncontours; ++c) { for (int c = 0; c < g.ncontours; ++c) {
for (int p = points_from; p < g.end_pts_of_contours[c] + 1; ++p) { for (int p = points_from; p < g.end_pts_of_contours[c] + 1; ++p) {
@ -513,22 +514,43 @@ outline_to_lines(struct glyph g, f32 scale, struct line_contour *dest, int *cnt)
f32 x3 = (nextnextgp.x - g.xmin) * scale; f32 x3 = (nextnextgp.x - g.xmin) * scale;
f32 y3 = nextnextgp.y * scale; f32 y3 = nextnextgp.y * scale;
if (gp.y != nextgp.y) { /* P(t) = P0*t^2 + P1*2*t*(1-t) + P2*(1-t)^2 */
if (dest->data) { f32 t_step = 1.0f / curve_segments;
dest->data[nlines].a = (struct v2f) { x1, y1 }; f32 x_prev = x1;
dest->data[nlines].b = (struct v2f) { x2, y2 }; f32 y_prev = y1;
}
++nlines; /* s = 1 for exact beginning */
for (int s = 1; s <= curve_segments; ++s) {
f32 t_now = t_step * s;
f32 x_now;
f32 y_now;
if (s < curve_segments) {
x_now = x3 * t_now * t_now
+ x2 * 2.0f * t_now * (1.0f - t_now)
+ x1 * (1.0f - t_now) * (1.0f - t_now);
y_now = y3 * t_now * t_now
+ y2 * 2.0f * t_now * (1.0f - t_now)
+ y1 * (1.0f - t_now) * (1.0f - t_now);
} else {
/* For exact match between neighbours */
x_now = x3;
y_now = y3;
} }
if (nextgp.y != nextnextgp.y) { if (abs_f32(y_now - y_prev) > F32EPS) {
if (dest->data) { if (dest->data) {
dest->data[nlines].a = (struct v2f) { x2, y2 }; dest->data[nlines].a = (struct v2f) { x_prev, y_prev };
dest->data[nlines].b = (struct v2f) { x3, y3 }; dest->data[nlines].b = (struct v2f) { x_now, y_now };
} }
++nlines; ++nlines;
} }
x_prev = x_now;
y_prev = y_now;
}
++p; ++p;
} }
} }
@ -604,11 +626,11 @@ main(int argc, char **argv)
printf("Loaded font\n"); printf("Loaded font\n");
//struct glyph g = get_outline(&font, 0x046C); //struct glyph g = get_outline(&font, 0x046C);
int codepoint = 0x0431; int codepoint = 0x0020;
struct glyph g = get_outline(&font, codepoint); struct glyph g = get_outline(&font, codepoint);
int nlines = 0; int nlines = 0;
u32 px_size = 120; u32 px_size = 20;
u32 *pixels = hc_vram; u32 *pixels = hc_vram;
int t = 0; int t = 0;
@ -629,7 +651,7 @@ main(int argc, char **argv)
render_glyph(g, &lines, font, px_size, pixels, width, height); render_glyph(g, &lines, font, px_size, pixels, width, height);
XPutImage(display, window, default_gc, xwindow_buffer, 0, 0, 0, 0, width, height); XPutImage(display, window, default_gc, xwindow_buffer, 0, 0, 0, 0, width, height);
#if 0 #if 1
//printf("%d\n", px_size); //printf("%d\n", px_size);
++px_size; ++px_size;

Loading…
Cancel
Save