Skip to content

Commit 3673be4

Browse files
committed
Fix line drawing
1 parent eeae00c commit 3673be4

7 files changed

Lines changed: 744 additions & 106 deletions

File tree

libs/canvas/src/dcel.c

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <math.h>
55
#include <stdint.h>
66
#include <stdlib.h>
7-
#include <string.h>
87

98
#include "arena/arena.h"
109
#include "logger/log.h"
@@ -1112,7 +1111,7 @@ void dcel_rasterize_path_mask(
11121111
uint32_t width,
11131112
uint32_t height,
11141113
double coordinate_scale,
1115-
uint8_t* out_mask,
1114+
Uint8Array* out_mask,
11161115
DcelMaskBounds* out_bounds
11171116
) {
11181117
RELEASE_ASSERT(arena);
@@ -1133,7 +1132,10 @@ void dcel_rasterize_path_mask(
11331132
}
11341133

11351134
size_t pixel_count = (size_t)width * (size_t)height;
1136-
memset(out_mask, 0, pixel_count);
1135+
RELEASE_ASSERT(uint8_array_len(out_mask) == pixel_count);
1136+
for (size_t mask_idx = 0; mask_idx < pixel_count; mask_idx++) {
1137+
uint8_array_set(out_mask, mask_idx, 0);
1138+
}
11371139

11381140
DcelMaskAccum accum =
11391141
{.has_pixels = false, .min_x = 0, .min_y = 0, .max_x = 0, .max_y = 0};
@@ -1312,8 +1314,12 @@ void dcel_rasterize_path_mask(
13121314
for (int64_t px = px_start; px <= px_end; px++) {
13131315
size_t mask_idx =
13141316
(size_t)py * (size_t)width + (size_t)px;
1315-
if (out_mask[mask_idx] == 0) {
1316-
out_mask[mask_idx] = 1;
1317+
uint8_t mask_value = 0;
1318+
RELEASE_ASSERT(
1319+
uint8_array_get(out_mask, mask_idx, &mask_value)
1320+
);
1321+
if (mask_value == 0) {
1322+
uint8_array_set(out_mask, mask_idx, 1);
13171323
dcel_mask_accum_mark(
13181324
&accum,
13191325
(uint32_t)px,
@@ -1383,13 +1389,17 @@ void dcel_rasterize_path_mask(
13831389
pixel_x++) {
13841390
size_t mask_idx =
13851391
(size_t)pixel_y * (size_t)width + (size_t)pixel_x;
1386-
if (out_mask[mask_idx] != 0) {
1392+
uint8_t mask_value = 0;
1393+
RELEASE_ASSERT(
1394+
uint8_array_get(out_mask, mask_idx, &mask_value)
1395+
);
1396+
if (mask_value != 0) {
13871397
continue;
13881398
}
13891399
double sample_x =
13901400
((double)pixel_x + 0.5) / coordinate_scale;
13911401
if (dcel_sample_on_segment(a, b, sample_x, sample_y)) {
1392-
out_mask[mask_idx] = 1;
1402+
uint8_array_set(out_mask, mask_idx, 1);
13931403
dcel_mask_accum_mark(
13941404
&accum,
13951405
(uint32_t)pixel_x,
@@ -1436,13 +1446,17 @@ void dcel_rasterize_path_mask(
14361446
pixel_x++) {
14371447
size_t mask_idx =
14381448
(size_t)pixel_y * (size_t)width + (size_t)pixel_x;
1439-
if (out_mask[mask_idx] != 0) {
1449+
uint8_t mask_value = 0;
1450+
RELEASE_ASSERT(
1451+
uint8_array_get(out_mask, mask_idx, &mask_value)
1452+
);
1453+
if (mask_value != 0) {
14401454
continue;
14411455
}
14421456
double sample_x =
14431457
((double)pixel_x + 0.5) / coordinate_scale;
14441458
if (dcel_sample_on_segment(a, b, sample_x, sample_y)) {
1445-
out_mask[mask_idx] = 1;
1459+
uint8_array_set(out_mask, mask_idx, 1);
14461460
dcel_mask_accum_mark(
14471461
&accum,
14481462
(uint32_t)pixel_x,
@@ -1612,7 +1626,7 @@ static TestResult dcel_test_expect_mask_matches_reference(
16121626
RELEASE_ASSERT(path);
16131627

16141628
size_t pixel_count = (size_t)width * (size_t)height;
1615-
uint8_t* actual_mask = arena_alloc(arena, pixel_count);
1629+
Uint8Array* actual_mask = uint8_array_new(arena, pixel_count);
16161630
DcelMaskBounds actual_bounds;
16171631
dcel_rasterize_path_mask(
16181632
arena,
@@ -1640,8 +1654,12 @@ static TestResult dcel_test_expect_mask_matches_reference(
16401654
sample_y
16411655
);
16421656
size_t idx = (size_t)y * (size_t)width + (size_t)x;
1657+
uint8_t actual_mask_value = 0;
1658+
RELEASE_ASSERT(
1659+
uint8_array_get(actual_mask, idx, &actual_mask_value)
1660+
);
16431661
TEST_ASSERT_EQ(
1644-
(unsigned int)actual_mask[idx],
1662+
(unsigned int)actual_mask_value,
16451663
expected ? 1U : 0U,
16461664
"Mask mismatch at (%u,%u), sample=(%.8f,%.8f)",
16471665
x,

libs/canvas/src/dcel.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <stdint.h>
55

66
#include "arena/arena.h"
7+
#include "arena/common.h"
78

89
typedef struct PathBuilder PathBuilder;
910

@@ -107,6 +108,6 @@ void dcel_rasterize_path_mask(
107108
uint32_t width,
108109
uint32_t height,
109110
double coordinate_scale,
110-
uint8_t* out_mask,
111+
Uint8Array* out_mask,
111112
DcelMaskBounds* out_bounds
112113
);

0 commit comments

Comments
 (0)