}
-static void _growOutlineClose(SwOutline& outline)
+static void _reserveOutlineClose(SwOutline& outline)
{
//Dash outlines are always opened.
//Only normal outlines use this information, it sholud be same to their contour counts.
- outline.closed = static_cast<bool*>(realloc(outline.closed, outline.reservedCntrsCnt * sizeof(bool)));
+ if (outline.closed) free(outline.closed);
+ outline.closed = static_cast<bool*>(calloc(outline.reservedCntrsCnt, sizeof(bool)));
+}
+
+
+static void _resetOutlineClose(SwOutline& outline)
+{
+ memset(outline.closed, 0x0, outline.reservedCntrsCnt * sizeof(bool));
}
static void _outlineEnd(SwOutline& outline)
{
- _growOutlineContour(outline, 1);
-
- if (outline.closed) {
- outline.closed[outline.cntrsCnt] = false;
- }
+ if (outline.ptsCnt == 0) return;
- if (outline.ptsCnt > 0) {
- outline.cntrs[outline.cntrsCnt] = outline.ptsCnt - 1;
- ++outline.cntrsCnt;
- }
+ _growOutlineContour(outline, 1);
+ outline.cntrs[outline.cntrsCnt] = outline.ptsCnt - 1;
+ ++outline.cntrsCnt;
}
}
//Make sure there is at least one point in the current path
- if (outline.ptsCnt == i) {
- outline.closed[outline.cntrsCnt] = false;
- return;
- }
+ if (outline.ptsCnt == i) return;
//Close the path
_growOutlinePoint(outline, 1);
outline.pts[outline.ptsCnt] = outline.pts[i];
outline.types[outline.ptsCnt] = SW_CURVE_TYPE_POINT;
++outline.ptsCnt;
-
outline.closed[outline.cntrsCnt] = true;
}
_growOutlinePoint(*outline, outlinePtsCnt);
if (_growOutlineContour(*outline, outlineCntrsCnt)) {
- _growOutlineClose(*outline);
+ _reserveOutlineClose(*outline);
+ } else {
+ _resetOutlineClose(*outline);
}
//Generate Outlines