PIKApp/plug-ins/ifs-compose/ifs-compose.h

185 lines
6.2 KiB
C

/* 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
*
* IfsCompose is a interface for creating IFS fractals by
* direct manipulation.
* Copyright (C) 1997 Owen Taylor
*
* 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 <https://www.gnu.org/licenses/>.
*/
typedef struct {
gdouble a11,a12,a21,a22,b1,b2;
} Aff2;
typedef struct {
gdouble vals[3][4];
} Aff3;
typedef struct {
GdkPoint *points;
gint npoints;
} IPolygon;
typedef struct {
gdouble x, y;
gdouble theta;
gdouble scale;
gdouble asym;
gdouble shear;
gint flip;
PikaRGB red_color;
PikaRGB green_color;
PikaRGB blue_color;
PikaRGB black_color;
PikaRGB target_color;
gdouble hue_scale;
gdouble value_scale;
gint simple_color;
gdouble prob;
} AffElementVals;
typedef struct
{
gint num_elements;
gint iterations;
gint max_memory;
gint subdivide;
gdouble radius;
gdouble aspect_ratio;
gdouble center_x;
gdouble center_y;
} IfsComposeVals;
typedef struct {
AffElementVals v;
Aff2 trans;
Aff3 color_trans;
gchar *name;
IPolygon *click_boundary;
IPolygon *draw_boundary;
} AffElement;
/* manipulation of affine transforms */
void aff2_translate (Aff2 *naff,
gdouble x,
gdouble y);
void aff2_rotate (Aff2 *naff,
gdouble theta);
void aff2_scale (Aff2 *naff,
gdouble s,
gint flip);
void aff2_distort (Aff2 *naff,
gdouble asym,
gdouble shear);
void aff2_compute_stretch (Aff2 *naff,
gdouble xo,
gdouble yo,
gdouble xn,
gdouble yn);
void aff2_compute_distort (Aff2 *naff,
gdouble xo,
gdouble yo,
gdouble xn,
gdouble yn);
void aff2_compose (Aff2 *naff,
Aff2 *aff1,
Aff2 *aff2);
void aff2_invert (Aff2 *naff,
Aff2 *aff);
void aff2_apply (Aff2 *aff,
gdouble x,
gdouble y,
gdouble *xf,
gdouble *yf);
void aff2_fixed_point (Aff2 *aff,
gdouble *xf,
gdouble *yf);
void aff3_apply (Aff3 *t,
gdouble x,
gdouble y,
gdouble z,
gdouble *xf,
gdouble *yf,
gdouble *zf);
/* manipulation of polygons */
IPolygon *ipolygon_convex_hull (IPolygon *poly);
gint ipolygon_contains (IPolygon *poly,
gint xt,
gint yt);
/* manipulation of composite transforms */
AffElement *aff_element_new (gdouble x,
gdouble y,
PikaRGB *color,
gint count);
void aff_element_free (AffElement *elem);
void aff_element_compute_trans (AffElement *elem,
gdouble width,
gdouble height,
gdouble center_x,
gdouble center_y);
void aff_element_compute_color_trans (AffElement *elem);
void aff_element_decompose_trans (AffElement *elem,
Aff2 *aff,
gdouble width,
gdouble height,
gdouble center_x,
gdouble center_y);
void aff_element_compute_boundary (AffElement *elem,
gint width,
gint height,
AffElement **elements,
gint num_elements);
void aff_element_draw (AffElement *elem,
gint selected,
gint width,
gint height,
cairo_t *cr,
GdkRGBA *color,
PangoLayout *layout);
void ifs_render (AffElement **elements,
gint num_elements,
gint width,
gint height,
gint nsteps,
IfsComposeVals *vals,
gint band_y,
gint band_height,
guchar *data,
guchar *mask,
guchar *nhits,
gboolean preview);
gchar * ifsvals_stringify (IfsComposeVals *vals,
AffElement **elements);
gboolean ifsvals_parse_string (const gchar *str,
IfsComposeVals *vals,
AffElement ***elements);