@@ -139,6 +139,12 @@ enum NSVGflags {
139139 NSVG_FLAGS_VISIBLE = 0x01
140140};
141141
142+ enum NSVGpaintOrder {
143+ NSVG_PAINT_FILL = 0x00 ,
144+ NSVG_PAINT_MARKERS = 0x01 ,
145+ NSVG_PAINT_STROKE = 0x02
146+ };
147+
142148typedef struct NSVGgradientStop {
143149 unsigned int color ;
144150 float offset ;
@@ -183,6 +189,7 @@ typedef struct NSVGshape
183189 char strokeLineCap ; /* Stroke cap type. */
184190 float miterLimit ; /* Miter limit */
185191 char fillRule ; /* Fill rule, see NSVGfillRule. */
192+ unsigned char paintOrder ; /* Encoded paint order (3×2-bit fields) see NSVGpaintOrder */
186193 unsigned char flags ; /* Logical or of NSVG_FLAGS_* flags */
187194 float bounds [4 ]; /* Tight bounding box of the shape [minx,miny,maxx,maxy]. */
188195 char fillGradient [64 ]; // Optional 'id' of fill gradient
@@ -475,6 +482,7 @@ typedef struct NSVGattrib
475482 char hasFill ;
476483 char hasStroke ;
477484 char visible ;
485+ unsigned char paintOrder ;
478486} NSVGattrib ;
479487
480488typedef struct NSVGstyles
@@ -661,6 +669,10 @@ static void nsvg__curveBounds(float* bounds, float* curve)
661669 }
662670}
663671
672+ static unsigned char nsvg__encodePaintOrder (enum NSVGpaintOrder a , enum NSVGpaintOrder b , enum NSVGpaintOrder c ) {
673+ return (a & 0x03 ) | ((b & 0x03 ) << 2 ) | ((c & 0x03 ) << 4 );
674+ }
675+
664676static NSVGparser * nsvg__createParser (void )
665677{
666678 NSVGparser * p ;
@@ -688,6 +700,7 @@ static NSVGparser* nsvg__createParser(void)
688700 p -> attr [0 ].fillRule = NSVG_FILLRULE_NONZERO ;
689701 p -> attr [0 ].hasFill = 1 ;
690702 p -> attr [0 ].visible = NSVG_VIS_DISPLAY | NSVG_VIS_VISIBLE ;
703+ p -> attr [0 ].paintOrder = nsvg__encodePaintOrder (NSVG_PAINT_FILL , NSVG_PAINT_STROKE , NSVG_PAINT_MARKERS );
691704
692705 return p ;
693706
@@ -1032,6 +1045,7 @@ static void nsvg__addShape(NSVGparser* p)
10321045 shape -> miterLimit = attr -> miterLimit ;
10331046 shape -> fillRule = attr -> fillRule ;
10341047 shape -> opacity = attr -> opacity ;
1048+ shape -> paintOrder = attr -> paintOrder ;
10351049
10361050 shape -> paths = p -> plist ;
10371051 p -> plist = NULL ;
@@ -1810,6 +1824,24 @@ static char nsvg__parseFillRule(const char* str)
18101824 return NSVG_FILLRULE_NONZERO ;
18111825}
18121826
1827+ static unsigned char nsvg__parsePaintOrder (const char * str )
1828+ {
1829+ if (strcmp (str , "normal" ) == 0 || strcmp (str , "fill stroke markers" ) == 0 )
1830+ return nsvg__encodePaintOrder (NSVG_PAINT_FILL , NSVG_PAINT_STROKE , NSVG_PAINT_MARKERS );
1831+ else if (strcmp (str , "fill markers stroke" ) == 0 )
1832+ return nsvg__encodePaintOrder (NSVG_PAINT_FILL , NSVG_PAINT_MARKERS , NSVG_PAINT_STROKE );
1833+ else if (strcmp (str , "markers fill stroke" ) == 0 )
1834+ return nsvg__encodePaintOrder (NSVG_PAINT_MARKERS , NSVG_PAINT_FILL , NSVG_PAINT_STROKE );
1835+ else if (strcmp (str , "markers stroke fill" ) == 0 )
1836+ return nsvg__encodePaintOrder (NSVG_PAINT_MARKERS , NSVG_PAINT_STROKE , NSVG_PAINT_FILL );
1837+ else if (strcmp (str , "stroke fill markers" ) == 0 )
1838+ return nsvg__encodePaintOrder (NSVG_PAINT_STROKE , NSVG_PAINT_FILL , NSVG_PAINT_MARKERS );
1839+ else if (strcmp (str , "stroke markers fill" ) == 0 )
1840+ return nsvg__encodePaintOrder (NSVG_PAINT_STROKE , NSVG_PAINT_MARKERS , NSVG_PAINT_FILL );
1841+ /* TODO: handle inherit. */
1842+ return nsvg__encodePaintOrder (NSVG_PAINT_FILL , NSVG_PAINT_STROKE , NSVG_PAINT_MARKERS );
1843+ }
1844+
18131845static const char * nsvg__getNextDashItem (const char * s , char * it )
18141846{
18151847 int n = 0 ;
@@ -1924,6 +1956,8 @@ static int nsvg__parseAttr(NSVGparser* p, const char* name, const char* value)
19241956 attr -> stopOpacity = nsvg__parseOpacity (value );
19251957 } else if (strcmp (name , "offset" ) == 0 ) {
19261958 attr -> stopOffset = nsvg__parseCoordinate (p , value , 0.0f , 1.0f );
1959+ } else if (strcmp (name , "paint-order" ) == 0 ) {
1960+ attr -> paintOrder = nsvg__parsePaintOrder (value );
19271961 } else if (strcmp (name , "id" ) == 0 ) {
19281962 strncpy (attr -> id , value , 63 );
19291963 attr -> id [63 ] = '\0' ;
@@ -2716,7 +2750,7 @@ static void nsvg__parseSVG(NSVGparser* p, const char** attr)
27162750 }
27172751}
27182752
2719- static void nsvg__parseGradient (NSVGparser * p , const char * * attr , char type )
2753+ static void nsvg__parseGradient (NSVGparser * p , const char * * attr , signed char type )
27202754{
27212755 int i ;
27222756 NSVGgradientData * grad = (NSVGgradientData * )NANOSVG_malloc (sizeof (NSVGgradientData ));
@@ -3152,7 +3186,7 @@ NSVGimage* nsvgParse(char* input, const char* units, float dpi)
31523186
31533187 // Create gradients after all definitions have been parsed
31543188 nsvg__createGradients (p );
3155-
3189+
31563190 /* Scale to viewBox */
31573191 nsvg__scaleToViewbox (p , units );
31583192
0 commit comments