2005-12-03 01:27:53 -08:00
|
|
|
#include "evas_common.h"
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
typedef struct _Angular_Data Angular_Data;
|
|
|
|
struct _Angular_Data
|
|
|
|
{
|
|
|
|
float an, cy;
|
2006-09-30 03:18:37 -07:00
|
|
|
|
|
|
|
int sx, sy, s;
|
2006-05-02 00:28:49 -07:00
|
|
|
float off;
|
2006-09-30 03:18:37 -07:00
|
|
|
int len;
|
2005-12-03 01:27:53 -08:00
|
|
|
};
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
static void
|
|
|
|
angular_init(void);
|
|
|
|
|
|
|
|
static void
|
|
|
|
angular_shutdown(void);
|
|
|
|
|
|
|
|
static void
|
|
|
|
angular_init_geom(RGBA_Gradient *gr);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
static void
|
|
|
|
angular_setup_geom(RGBA_Gradient *gr);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_free_geom(void *gdata);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static int
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_has_alpha(RGBA_Gradient *gr, int op);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
static int
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_has_mask(RGBA_Gradient *gr, int op);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static int
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_get_map_len(RGBA_Gradient *gr);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
static Gfx_Func_Gradient_Fill
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
static RGBA_Gradient_Type angular = {"angular", angular_init, angular_shutdown,
|
|
|
|
angular_init_geom, angular_setup_geom, angular_free_geom,
|
|
|
|
angular_has_alpha, angular_has_mask,
|
|
|
|
angular_get_map_len, angular_get_fill_func};
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
|
|
|
|
/** internal functions **/
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RGBA_Gradient_Type *
|
|
|
|
evas_common_gradient_angular_get(void)
|
|
|
|
{
|
|
|
|
return &angular;
|
|
|
|
}
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
static void
|
|
|
|
angular_init(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
angular_shutdown(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
angular_free_geom(void *gdata)
|
|
|
|
{
|
|
|
|
Angular_Data *data = (Angular_Data *)gdata;
|
|
|
|
if (data) free(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
angular_setup_geom(RGBA_Gradient *gr)
|
|
|
|
{
|
|
|
|
Angular_Data *angular_data;
|
|
|
|
|
|
|
|
if (!gr || (gr->type.geometer != &angular)) return;
|
|
|
|
|
|
|
|
angular_data = (Angular_Data *)gr->type.gdata;
|
|
|
|
if (!angular_data) return;
|
|
|
|
angular_data->sx = gr->fill.w;
|
|
|
|
angular_data->sy = gr->fill.h;
|
|
|
|
angular_data->s = angular_data->sx;
|
|
|
|
if (angular_data->sy > angular_data->sx)
|
|
|
|
angular_data->s = angular_data->sy;
|
|
|
|
angular_data->off = gr->map.offset;
|
|
|
|
angular_data->len = (2 * M_PI) * angular_data->s * angular_data->cy;
|
|
|
|
}
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_init_geom(RGBA_Gradient *gr)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
Angular_Data *angular_data;
|
2005-12-03 01:27:53 -08:00
|
|
|
int err = 1;
|
|
|
|
char *s, *p, key[256];
|
2006-09-30 03:18:37 -07:00
|
|
|
float val, an, cy;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
if (!gr || (gr->type.geometer != &angular)) return;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data = (Angular_Data *)gr->type.gdata;
|
|
|
|
if (!angular_data)
|
|
|
|
{
|
|
|
|
angular_data = calloc(1, sizeof(Angular_Data));
|
|
|
|
if (!angular_data) return;
|
|
|
|
angular_data->an = -1.0;
|
|
|
|
angular_data->cy = 1.0;
|
|
|
|
angular_data->sx = 32;
|
|
|
|
angular_data->sy = 32;
|
|
|
|
angular_data->s = 32;
|
|
|
|
angular_data->off = 0.0;
|
|
|
|
angular_data->len = (2 * M_PI) * 32;
|
|
|
|
}
|
|
|
|
gr->type.gdata = angular_data;
|
2005-12-03 01:27:53 -08:00
|
|
|
if (!gr->type.params || !*(gr->type.params))
|
|
|
|
return;
|
|
|
|
|
|
|
|
s = strdup(gr->type.params);
|
|
|
|
if (!s) return;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
an = angular_data->an;
|
|
|
|
cy = angular_data->cy;
|
2005-12-03 01:27:53 -08:00
|
|
|
p = s;
|
2006-01-06 15:13:16 -08:00
|
|
|
while ((p = evas_common_gradient_get_key_fval(p, key, &val)))
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
if (!strcmp(key, "annulus"))
|
|
|
|
{
|
|
|
|
err = 0;
|
|
|
|
an = val;
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "wrap"))
|
|
|
|
{
|
|
|
|
err = 0;
|
|
|
|
cy = val;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
err = 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
break;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!err)
|
|
|
|
{
|
|
|
|
if (an < 0.0) an = 0.0;
|
|
|
|
if (an > 1.0) an = 1.0;
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data->an = an;
|
2005-12-03 01:27:53 -08:00
|
|
|
if (cy < 0.0) cy = 0.0;
|
|
|
|
if (cy > 1.0) cy = 1.0;
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data->cy = cy;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
free(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_has_alpha(RGBA_Gradient *gr, int op)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
Angular_Data *angular_data;
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
if (!gr || (gr->type.geometer != &angular)) return 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
if (gr->has_alpha | gr->map.has_alpha)
|
2005-12-03 01:27:53 -08:00
|
|
|
return 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
|
|
|
|
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
|
|
|
|
return 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data = (Angular_Data *)gr->type.gdata;
|
|
|
|
if (!angular_data) return 0;
|
|
|
|
if ((int)angular_data->an >= 0)
|
2005-12-03 01:27:53 -08:00
|
|
|
return 1;
|
2006-09-30 03:18:37 -07:00
|
|
|
if ( ((gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
|
|
|
|
(gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
|
|
|
|
(gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT))
|
|
|
|
&& (angular_data->cy < 1.0) )
|
2005-12-03 01:27:53 -08:00
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
static int
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_has_mask(RGBA_Gradient *gr, int op)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
Angular_Data *angular_data;
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
if (!gr || (gr->type.geometer != &angular)) return 0;
|
|
|
|
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
|
|
|
|
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data = (Angular_Data *)gr->type.gdata;
|
|
|
|
if (!angular_data) return 0;
|
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
return 1;
|
2006-09-30 03:18:37 -07:00
|
|
|
if ( ((gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
|
|
|
|
(gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
|
|
|
|
(gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT))
|
|
|
|
&& (angular_data->cy < 1.0) )
|
2006-05-02 00:28:49 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
static int
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_get_map_len(RGBA_Gradient *gr)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
Angular_Data *angular_data;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
if (!gr || (gr->type.geometer != &angular)) return 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data = (Angular_Data *)gr->type.gdata;
|
|
|
|
if (!angular_data) return 0;
|
|
|
|
return angular_data->len;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
static Gfx_Func_Gradient_Fill
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
Gfx_Func_Gradient_Fill sfunc = NULL;
|
|
|
|
int masked_op = 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
Angular_Data *angular_data;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
if (!gr || (gr->type.geometer != &angular)) return sfunc;
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data = (Angular_Data *)gr->type.gdata;
|
|
|
|
if (!angular_data) return sfunc;
|
|
|
|
|
|
|
|
angular_data->off = gr->map.offset;
|
2006-05-02 00:28:49 -07:00
|
|
|
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
|
|
|
|
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
|
|
|
|
masked_op = 1;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
switch (gr->fill.spread)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
case _EVAS_TEXTURE_REFLECT:
|
|
|
|
{
|
|
|
|
if (aa)
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_reflect_aa_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_reflect_aa_annulus;
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
else
|
2006-05-02 00:28:49 -07:00
|
|
|
sfunc = angular_reflect_aa;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_reflect_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_reflect_annulus;
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
else
|
|
|
|
sfunc = angular_reflect;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case _EVAS_TEXTURE_REPEAT:
|
|
|
|
{
|
|
|
|
if (aa)
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_repeat_aa_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_repeat_aa_annulus;
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
else
|
|
|
|
sfunc = angular_repeat_aa;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_repeat_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_repeat_annulus;
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
else
|
|
|
|
sfunc = angular_repeat;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case _EVAS_TEXTURE_RESTRICT:
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_data->off = 0;
|
2006-05-02 00:28:49 -07:00
|
|
|
case _EVAS_TEXTURE_RESTRICT_REFLECT:
|
|
|
|
{
|
|
|
|
if (aa)
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_reflect_aa_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_reflect_aa_annulus;
|
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
else if (angular_data->cy < 1.0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_reflect_aa_masked;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_reflect_aa;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_reflect_aa;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_reflect_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_reflect_annulus;
|
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
else if (angular_data->cy < 1.0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_reflect_masked;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_reflect;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_reflect;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case _EVAS_TEXTURE_RESTRICT_REPEAT:
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
if (aa)
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_repeat_aa_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_repeat_aa_annulus;
|
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
else if (angular_data->cy < 1.0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_repeat_aa_masked;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_repeat_aa;
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
else
|
2006-05-02 00:28:49 -07:00
|
|
|
sfunc = angular_restrict_repeat_aa;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_repeat_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_repeat_annulus;
|
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
else if (angular_data->cy < 1.0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_restrict_repeat_masked;
|
|
|
|
else
|
|
|
|
sfunc = angular_restrict_repeat;
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
else
|
2006-05-02 00:28:49 -07:00
|
|
|
sfunc = angular_restrict_repeat;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2006-05-02 00:28:49 -07:00
|
|
|
case _EVAS_TEXTURE_PAD:
|
|
|
|
{
|
|
|
|
if (aa)
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_pad_aa_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_pad_aa_annulus;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sfunc = angular_pad_aa;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
if ((int)angular_data->an >= 0)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
if (masked_op)
|
|
|
|
sfunc = angular_pad_masked_annulus;
|
|
|
|
else
|
|
|
|
sfunc = angular_pad_annulus;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sfunc = angular_pad;
|
|
|
|
}
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
default:
|
2006-05-02 00:28:49 -07:00
|
|
|
sfunc = angular_reflect_aa;
|
2005-12-03 01:27:53 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return sfunc;
|
|
|
|
}
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
#define SETUP_ANGULAR_FILL \
|
|
|
|
if (gdata->sx != gdata->s) \
|
|
|
|
{ \
|
|
|
|
axx = (gdata->s * axx) / gdata->sx; \
|
|
|
|
axy = (gdata->s * axy) / gdata->sx; \
|
|
|
|
} \
|
|
|
|
if (gdata->sy != gdata->s) \
|
|
|
|
{ \
|
|
|
|
ayy = (gdata->s * ayy) / gdata->sy; \
|
|
|
|
ayx = (gdata->s * ayx) / gdata->sy; \
|
|
|
|
} \
|
|
|
|
xx = (axx * x) + (axy * y); \
|
|
|
|
yy = (ayx * x) + (ayy * y);
|
|
|
|
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = (ll >> 16);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
l += ((ll - (l << 16)) >> 15) + off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l];
|
2005-12-03 01:27:53 -08:00
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = (ll >> 16), lp;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
|
|
|
lp = l + off;
|
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
2005-12-03 01:27:53 -08:00
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ((r >= r0) && (r <= r1))
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = (ll >> 16);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
l += ((ll - (l << 16)) >> 15) + off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l];
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ((r >= r0) && (r <= r1))
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = (ll >> 16), lp;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
|
|
|
lp = l + off;
|
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
a = 1 + ((rr - rr0) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r1)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
a = 256 - ((rr - rr1) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ((r >= r0) && (r <= r1))
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
l += ((ll - (l << 16)) >> 15) + off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l]; *mask = 255;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-05-02 00:28:49 -07:00
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
*dst = 0; *mask = 0;
|
2005-12-03 01:27:53 -08:00
|
|
|
if ((r >= r0) && (r <= r1))
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = (ll >> 16), lp;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
|
|
|
lp = l + off;
|
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp]; *mask = 255;
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
|
|
|
*mask = ((rr - rr0) >> 8);
|
|
|
|
if (r == r1)
|
|
|
|
*mask = 255 - ((rr - rr1) >> 8);
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
2006-05-02 00:28:49 -07:00
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2005-12-03 01:27:53 -08:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
l += ((ll - (l << 16)) >> 15) + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l];
|
2005-12-03 01:27:53 -08:00
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = (ll >> 16), lp;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
2005-12-03 01:27:53 -08:00
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
*dst = 0;
|
2006-05-02 00:28:49 -07:00
|
|
|
if ((r >= r0) && (r <= r1))
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
l += ((ll - (l << 16)) >> 15) + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l];
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ((r >= r0) && (r <= r1))
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
|
|
|
{
|
|
|
|
a = 1 + ((rr - rr0) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
if (r == r1)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
a = 256 - ((rr - rr1) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ((r >= r0) && (r <= r1))
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += ((ll - (l << 16)) >> 15) + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l]; *mask = 255;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ((r >= r0) && (r <= r1))
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp]; *mask = 255;
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
|
|
|
*mask = ((rr - rr0) >> 8);
|
|
|
|
if (r == r1)
|
|
|
|
*mask = 255 - ((rr - rr1) >> 8);
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
*dst = 0;
|
2006-05-02 00:28:49 -07:00
|
|
|
l += ((ll - (l << 16)) >> 15);
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
l += off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l];
|
2005-12-03 01:27:53 -08:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
2005-12-03 01:27:53 -08:00
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
2006-05-02 00:28:49 -07:00
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2005-12-03 01:27:53 -08:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
2006-05-02 00:28:49 -07:00
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
2005-12-03 01:27:53 -08:00
|
|
|
*dst = 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
|
|
|
|
|
|
|
|
lp = l + off;
|
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (l == (src_len - 1))
|
|
|
|
*dst = MUL_256(257 - a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l == 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16;
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
2005-12-03 01:27:53 -08:00
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l]; *mask = 255;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
|
|
|
|
|
|
|
|
lp = l + off;
|
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp]; *mask = 255;
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (l == (src_len - 1))
|
2006-05-02 00:28:49 -07:00
|
|
|
*mask = 255 - a0;
|
|
|
|
if (l == 0)
|
|
|
|
*mask = a0;
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l];
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
2005-12-03 01:27:53 -08:00
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-08-12 07:46:15 -07:00
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (l == (src_len - 1))
|
|
|
|
*dst = MUL_256(257 - a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l == 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
|
|
|
{
|
|
|
|
a = 1 + ((rr - rr0) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
if (r == r1)
|
|
|
|
{
|
|
|
|
a = 256 - ((rr - rr1) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
|
|
|
if (l < 0) l = -l;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (l % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
l = (l % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
l = src_len - l - 1;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[l]; *mask = 255;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-08-12 07:46:15 -07:00
|
|
|
if (lp < 0) { lp = -lp; a = 257 - a; }
|
2006-09-30 03:18:37 -07:00
|
|
|
if (lp >= src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
2006-09-30 03:18:37 -07:00
|
|
|
int m = (lp % (2 * src_len));
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = (lp % src_len);
|
|
|
|
if (m >= src_len)
|
|
|
|
{ lp = src_len - lp - 1; a = 257 - a; }
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[lp]; *mask = 255;
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (l == (src_len - 1))
|
2006-05-02 00:28:49 -07:00
|
|
|
*mask = 255 - a0;
|
|
|
|
if (l == 0)
|
|
|
|
*mask = a0;
|
|
|
|
if (r == r0)
|
|
|
|
*mask = ((rr - rr0) >> 8);
|
|
|
|
if (r == r1)
|
|
|
|
*mask = 255 - ((rr - rr1) >> 8);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
l += ((ll - (l << 16)) >> 15);
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l];
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
|
|
|
*dst = 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
|
|
|
if (l == (src_len - 1))
|
|
|
|
*dst = MUL_256(257 - a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l == 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16;
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l]; *mask = 255;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp]; *mask = 255;
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
|
|
|
if (l == (src_len - 1))
|
2006-05-02 00:28:49 -07:00
|
|
|
*mask = 255 - a0;
|
|
|
|
if (l == 0)
|
|
|
|
*mask = a0;
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l];
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp];
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
|
|
|
if (l == (src_len - 1))
|
|
|
|
*dst = MUL_256(257 - a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l == 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a0, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
|
|
|
{
|
|
|
|
a = 1 + ((rr - rr0) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
if (r == r1)
|
|
|
|
{
|
|
|
|
a = 256 - ((rr - rr1) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
l += off;
|
2006-09-30 03:18:37 -07:00
|
|
|
l = l % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (l < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
l += src_len;
|
|
|
|
*dst = src[l]; *mask = 255;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_restrict_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
2006-09-30 03:18:37 -07:00
|
|
|
float off = gdata->off * (src_len - 1);
|
2006-05-02 00:28:49 -07:00
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16, lp;
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l < src_len)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
|
|
|
|
|
|
|
|
lp = l + off;
|
2006-09-30 03:18:37 -07:00
|
|
|
lp = lp % src_len;
|
2006-05-02 00:28:49 -07:00
|
|
|
if (lp < 0)
|
2006-09-30 03:18:37 -07:00
|
|
|
lp += src_len;
|
|
|
|
*dst = src[lp]; *mask = 255;
|
|
|
|
if (lp + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[lp + 1], *dst);
|
|
|
|
if (lp == (src_len - 1))
|
|
|
|
*dst = INTERP_256(a, src[0], *dst);
|
|
|
|
if (l == (src_len - 1))
|
2006-05-02 00:28:49 -07:00
|
|
|
*mask = 255 - a0;
|
|
|
|
if (l == 0)
|
|
|
|
*mask = a0;
|
|
|
|
if (r == r0)
|
|
|
|
*mask = ((rr - rr0) >> 8);
|
|
|
|
if (r == r1)
|
|
|
|
*mask = 255 - ((rr - rr1) >> 8);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
|
|
|
l = src_len - 1;
|
|
|
|
*dst++ = src[l]; xx += axx; yy += ayx;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[l + 1], src[l]);
|
2006-05-02 00:28:49 -07:00
|
|
|
else
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[src_len - 1];
|
2006-05-02 00:28:49 -07:00
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
|
|
|
l = src_len - 1;
|
|
|
|
*dst = src[l];
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[l + 1], src[l]);
|
2006-05-02 00:28:49 -07:00
|
|
|
else
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[src_len - 1];
|
2006-05-02 00:28:49 -07:00
|
|
|
if (r == r0)
|
|
|
|
{
|
|
|
|
a = 1 + ((rr - rr0) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
if (r == r1)
|
|
|
|
{
|
|
|
|
a = 256 - ((rr - rr1) >> 8);
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = MUL_256(a, *dst);
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dst++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
|
|
|
|
l += (ll - (l << 16)) >> 15;
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l >= src_len)
|
|
|
|
l = src_len - 1;
|
|
|
|
*dst = src[l]; *mask = 255;
|
2006-05-02 00:28:49 -07:00
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-09-30 03:18:37 -07:00
|
|
|
angular_pad_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
|
2006-05-02 00:28:49 -07:00
|
|
|
int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
|
|
|
|
{
|
|
|
|
DATA32 *dst_end = dst + dst_len;
|
|
|
|
Angular_Data *gdata = (Angular_Data *)params_data;
|
|
|
|
int xx, yy;
|
|
|
|
int ss = (gdata->s) << 16;
|
|
|
|
int r1 = gdata->s, r0 = gdata->an * r1;
|
|
|
|
int rr0 = r0 << 16, rr1 = r1 << 16;
|
|
|
|
|
2006-06-07 16:30:15 -07:00
|
|
|
SETUP_ANGULAR_FILL
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
while (dst < dst_end)
|
|
|
|
{
|
|
|
|
int rr = hypot(xx, yy), r = (rr >> 16);
|
|
|
|
|
|
|
|
*dst = 0; *mask = 0;
|
|
|
|
if ( (r >= r0) && (r <= r1) )
|
|
|
|
{
|
|
|
|
int ll = ss * (M_PI + atan2(yy, xx));
|
|
|
|
int l = ll >> 16;
|
|
|
|
DATA32 a = 1 + ((ll - (l << 16)) >> 8);
|
|
|
|
|
2006-09-30 03:18:37 -07:00
|
|
|
if (l + 1 < src_len)
|
|
|
|
*dst = INTERP_256(a, src[l + 1], src[l]);
|
2006-05-02 00:28:49 -07:00
|
|
|
else
|
2006-09-30 03:18:37 -07:00
|
|
|
*dst = src[src_len - 1];
|
2006-05-02 00:28:49 -07:00
|
|
|
|
|
|
|
*mask = 255;
|
|
|
|
if (r == r0)
|
|
|
|
*mask = ((rr - rr0) >> 8);
|
|
|
|
if (r == r1)
|
|
|
|
*mask = 255 - ((rr - rr1) >> 8);
|
|
|
|
}
|
|
|
|
dst++; mask++; xx += axx; yy += ayx;
|
|
|
|
}
|
|
|
|
}
|