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 ,
0 commit comments