/* PIKA - Photo and Image Kooker Application * a rebranding of The GNU Image Manipulation Program (created with heckimp) * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio * * Original copyright, applying to most contents (license remains unchanged): * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include #include #include #include "core-types.h" #include "pikabezierdesc.h" #include "pikaboundary.h" #include "pikabrush.h" #include "pikabrush-boundary.h" #include "pikatempbuf.h" static PikaBezierDesc * pika_brush_transform_boundary_exact (PikaBrush *brush, gdouble scale, gdouble aspect_ratio, gdouble angle, gboolean reflect, gdouble hardness) { const PikaTempBuf *mask; mask = pika_brush_transform_mask (brush, scale, aspect_ratio, angle, reflect, hardness); if (mask) { GeglBuffer *buffer; PikaBoundSeg *bound_segs; gint n_bound_segs; buffer = pika_temp_buf_create_buffer ((PikaTempBuf *) mask); bound_segs = pika_boundary_find (buffer, NULL, babl_format ("Y float"), PIKA_BOUNDARY_WITHIN_BOUNDS, 0, 0, gegl_buffer_get_width (buffer), gegl_buffer_get_height (buffer), 0.0, &n_bound_segs); g_object_unref (buffer); if (bound_segs) { PikaBoundSeg *stroke_segs; gint n_stroke_groups; stroke_segs = pika_boundary_sort (bound_segs, n_bound_segs, &n_stroke_groups); g_free (bound_segs); if (stroke_segs) { PikaBezierDesc *path; path = pika_bezier_desc_new_from_bound_segs (stroke_segs, n_bound_segs, n_stroke_groups); g_free (stroke_segs); return path; } } } return NULL; } static PikaBezierDesc * pika_brush_transform_boundary_approx (PikaBrush *brush, gdouble scale, gdouble aspect_ratio, gdouble angle, gboolean reflect, gdouble hardness) { return pika_brush_transform_boundary_exact (brush, scale, aspect_ratio, angle, reflect, hardness); } PikaBezierDesc * pika_brush_real_transform_boundary (PikaBrush *brush, gdouble scale, gdouble aspect_ratio, gdouble angle, gboolean reflect, gdouble hardness, gint *width, gint *height) { pika_brush_transform_size (brush, scale, aspect_ratio, angle, reflect, width, height); if (*width < 256 && *height < 256) { return pika_brush_transform_boundary_exact (brush, scale, aspect_ratio, angle, reflect, hardness); } return pika_brush_transform_boundary_approx (brush, scale, aspect_ratio, angle, reflect, hardness); }