summaryrefslogtreecommitdiff
path: root/source/fitz/path.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/path.c')
-rw-r--r--source/fitz/path.c42
1 files changed, 13 insertions, 29 deletions
diff --git a/source/fitz/path.c b/source/fitz/path.c
index 04a3a7bc..6c7991b9 100644
--- a/source/fitz/path.c
+++ b/source/fitz/path.c
@@ -7,6 +7,7 @@ fz_new_path(fz_context *ctx)
fz_path *path;
path = fz_malloc_struct(ctx, fz_path);
+ path->refs = 1;
path->last_cmd = 0;
path->current.x = 0;
path->current.y = 0;
@@ -17,48 +18,31 @@ fz_new_path(fz_context *ctx)
}
fz_path *
-fz_clone_path(fz_context *ctx, fz_path *old)
+fz_keep_path(fz_context *ctx, fz_path *path)
{
- fz_path *path;
-
- assert(old);
- path = fz_malloc_struct(ctx, fz_path);
- fz_try(ctx)
- {
- path->cmd_len = old->cmd_len;
- path->cmd_cap = old->cmd_len;
- path->cmds = fz_malloc_array(ctx, path->cmd_cap, sizeof(unsigned char));
- memcpy(path->cmds, old->cmds, sizeof(unsigned char) * path->cmd_len);
-
- path->coord_len = old->coord_len;
- path->coord_cap = old->coord_len;
- path->coords = fz_malloc_array(ctx, path->coord_cap, sizeof(float));
- memcpy(path->coords, old->coords, sizeof(float) * path->coord_len);
- }
- fz_catch(ctx)
- {
- fz_free(ctx, path->cmds);
- fz_free(ctx, path->coords);
- fz_free(ctx, path);
- fz_rethrow(ctx);
- }
-
+ ++path->refs;
return path;
}
void
-fz_free_path(fz_context *ctx, fz_path *path)
+fz_drop_path(fz_context *ctx, fz_path *path)
{
if (path == NULL)
return;
- fz_free(ctx, path->cmds);
- fz_free(ctx, path->coords);
- fz_free(ctx, path);
+ if (--path->refs == 0)
+ {
+ fz_free(ctx, path->cmds);
+ fz_free(ctx, path->coords);
+ fz_free(ctx, path);
+ }
}
static void
push_cmd(fz_context *ctx, fz_path *path, int cmd)
{
+ if (path->refs != 1)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot modify shared paths");
+
if (path->cmd_len + 1 >= path->cmd_cap)
{
int new_cmd_cap = fz_maxi(16, path->cmd_cap * 2);