EAPI void evas_transform_shear (float sh, float sv, Evas_Transform *t);
/* Left-multiply t by the given transform l */
EAPI void evas_transform_compose (Evas_Transform *l, Evas_Transform *t);
- /* Get bounds of an affine transformation of a given rect */
- /* Note: this will use the inverse of the given transform */
- EAPI void evas_transform_affine_rect_bounds_get (Evas_Transform *t, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Coord *rx, Evas_Coord *ry, Evas_Coord *rw, Evas_Coord *rh);
/* Evas imaging api - exports some of the comon gfx engine routines */
/* this is not complete and should be considered experimental. use at your */
evas_name.c \
evas_object_gradient.c \
evas_object_gradient2.c \
-evas_object_gradient2_linear.c \
-evas_object_gradient2_radial.c \
evas_object_image.c \
evas_object_main.c \
evas_object_inform.c \
evas_transform.c
EXTRA_DIST = \
-evas_object_gradient2.h \
-evas_object_image.h
+evas_object_gradient2_linear.c \
+evas_object_gradient2_radial.c
libevas_canvas_la_DEPENDENCIES = $(top_builddir)/config.h
#include "evas_common.h"
#include "evas_private.h"
-#include "evas_object_gradient2.h"
+
+typedef struct _Evas_Object_Gradient2 Evas_Object_Gradient2;
+
+struct _Evas_Object_Gradient2
+{
+ DATA32 magic;
+
+ struct {
+ struct {
+ Evas_Common_Transform transform;
+ int spread;
+ } fill;
+ unsigned char gradient_opaque : 1;
+ } cur, prev;
+
+ unsigned char gradient_changed : 1;
+};
+
+
/**
* @defgroup Evas_Object_Gradient2_Group Gradient2 Object Functions
evas_object_gradient2_color_np_stop_insert(Evas_Object *obj, int r, int g, int b, int a, float pos)
{
Evas_Object_Gradient2 *og;
+ void *engine_data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
return;
MAGIC_CHECK_END();
- if (og->engine_data)
+ engine_data = obj->func->engine_data_get(obj);
+ if (engine_data)
obj->layer->evas->engine.func->gradient2_color_np_stop_insert(obj->layer->evas->engine.data.output,
- og,
+ engine_data,
r, g, b, a, pos);
og->gradient_changed = 1;
evas_object_change(obj);
evas_object_gradient2_clear(Evas_Object *obj)
{
Evas_Object_Gradient2 *og;
+ void *engine_data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
return;
MAGIC_CHECK_END();
- if (og->engine_data)
+ engine_data = obj->func->engine_data_get(obj);
+ if (engine_data)
obj->layer->evas->engine.func->gradient2_clear(obj->layer->evas->engine.data.output,
- og);
+ engine_data);
og->gradient_changed = 1;
og->cur.gradient_opaque = 0;
evas_object_change(obj);
evas_object_change(obj);
return;
}
- if ( (og->cur.fill.transform.mxx == t->mxx) &&
- (og->cur.fill.transform.mxy == t->mxy) &&
- (og->cur.fill.transform.mxz == t->mxz) &&
- (og->cur.fill.transform.myx == t->myx) &&
- (og->cur.fill.transform.myy == t->myy) &&
- (og->cur.fill.transform.myz == t->myz) &&
- (og->cur.fill.transform.mzx == t->mzx) &&
- (og->cur.fill.transform.mzy == t->mzy) &&
- (og->cur.fill.transform.mzz == t->mzz) )
- return;
+ if ( (og->cur.fill.transform.mxx == t->mxx) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) ||
+ (og->cur.fill.transform.mxy == t->mxy) )
+ return;
og->cur.fill.transform.mxx = t->mxx;
og->cur.fill.transform.mxy = t->mxy;
og->cur.fill.transform.mzy = t->mzy;
og->cur.fill.transform.mzz = t->mzz;
- og->cur.fill.transform.is_identity = 0;
- if ( (t->mxx == 1) && (t->mxy == 0) && (t->mxz == 0) &&
- (t->myx == 0) && (t->myy == 1) && (t->myz == 0) &&
- (t->mzx == 0) && (t->mzy == 0) && (t->mzz == 1) )
- og->cur.fill.transform.is_identity = 1;
og->gradient_changed = 1;
evas_object_change(obj);
}
t->mzz = og->cur.fill.transform.mzz;
}
}
+
+
+
+/**
+ * @}
+ */
+
+#include "evas_object_gradient2_linear.c"
+#include "evas_object_gradient2_radial.c"
+++ /dev/null
-#ifndef EVAS_OBJECT_GRADIENT2_H
-#define EVAS_OBJECT_GRADIENT2_H
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-/* private struct for base gradient object internal data */
-typedef struct _Evas_Object_Gradient2 Evas_Object_Gradient2;
-
-struct _Evas_Object_Gradient2
-{
- DATA32 magic;
-
- void *engine_data;
-
- struct {
- struct {
- Evas_Common_Transform transform;
- int spread;
- } fill;
- unsigned char gradient_opaque : 1;
- } cur, prev;
-
- unsigned char gradient_changed : 1;
-};
-
-
-/* private struct for linear gradient object internal data */
-typedef struct _Evas_Object_Gradient2_Linear Evas_Object_Gradient2_Linear;
-
-struct _Evas_Object_Gradient2_Linear
-{
- Evas_Object_Gradient2 base;
-
- DATA32 magic;
-
- struct {
- struct {
- float x0, y0, x1, y1;
- } fill;
- } cur, prev;
-
- unsigned char gradient_changed : 1;
- unsigned char changed : 1;
-};
-
-/* private struct for radial gradient object internal data */
-typedef struct _Evas_Object_Gradient2_Radial Evas_Object_Gradient2_Radial;
-
-struct _Evas_Object_Gradient2_Radial
-{
- Evas_Object_Gradient2 base;
-
- DATA32 magic;
-
- struct {
- struct {
- float cx, cy, rx, ry;
- } fill;
- } cur, prev;
-
- unsigned char gradient_changed : 1;
- unsigned char changed : 1;
-};
-
-#endif
#include "evas_common.h"
#include "evas_private.h"
-#include "evas_object_gradient2.h"
/* private magic number for linear gradient objects */
static const char lg_type[] = "linear_gradient";
+/* private struct for gradient object internal data */
+typedef struct _Evas_Object_Gradient2_Linear Evas_Object_Gradient2_Linear;
+
+struct _Evas_Object_Gradient2_Linear
+{
+ Evas_Object_Gradient2 base;
+
+ DATA32 magic;
+
+ struct {
+ struct {
+ float x0, y0, x1, y1;
+ } fill;
+ } cur, prev;
+
+ void *engine_data;
+
+ unsigned char gradient_changed : 1;
+ unsigned char changed : 1;
+};
+
/* private methods for linear gradient objects */
static void evas_object_gradient2_linear_init(Evas_Object *obj);
static void *evas_object_gradient2_linear_new(void);
evas_object_inject(obj, e);
if (obj->object_data)
{
- Evas_Object_Gradient2 *o = (Evas_Object_Gradient2 *)(obj->object_data);
+ Evas_Object_Gradient2_Linear *o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
o->engine_data = e->engine.func->gradient2_linear_new(e->engine.data.output);
}
evas_object_gradient2_linear_free(Evas_Object *obj)
{
Evas_Object_Gradient2_Linear *o;
- Evas_Object_Gradient2 *og;
/* frees private object data. very simple here */
o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
return;
MAGIC_CHECK_END();
/* free obj */
- og = (Evas_Object_Gradient2 *)o;
- if (og->engine_data)
+ if (o->engine_data)
obj->layer->evas->engine.func->gradient2_linear_free(obj->layer->evas->engine.data.output,
- og->engine_data);
+ o->engine_data);
free(o);
obj->object_data = NULL;
}
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
- obj->layer->evas->engine.func->context_multiplier_set(output, context,
- obj->cur.cache.clip.r, obj->cur.cache.clip.g,
- obj->cur.cache.clip.b, obj->cur.cache.clip.a);
+ obj->layer->evas->engine.func->context_multiplier_unset(output, context);
obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->cur.anti_alias);
obj->layer->evas->engine.func->context_render_op_set(output, context, obj->cur.render_op);
- obj->layer->evas->engine.func->context_color_interpolation_set(output, context,
- obj->cur.interpolation_color_space);
- if (o)
+ if (o->engine_data)
+ {
obj->layer->evas->engine.func->gradient2_linear_draw(output, context, surface,
- o,
+ o->engine_data,
obj->cur.geometry.x + x,
obj->cur.geometry.y + y,
obj->cur.geometry.w,
obj->cur.geometry.h);
+ }
}
static void
{ o->gradient_changed = 1; o->changed = 1; }
if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
o->changed = 1;
+// if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
+// o->changed = 1;
if (og->gradient_changed)
{ o->gradient_changed = 1; o->changed = 1; }
- if (o->changed && og->engine_data)
+ if (o->changed && o->engine_data)
{
obj->layer->evas->engine.func->context_render_op_set(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context, obj->cur.render_op);
obj->layer->evas->engine.data.context,
obj->cur.interpolation_color_space);
if (o->gradient_changed)
+ {
+ obj->layer->evas->engine.func->gradient2_linear_fill_set(obj->layer->evas->engine.data.output, o->engine_data, o->cur.fill.x0, o->cur.fill.y0, o->cur.fill.x1, o->cur.fill.y1);
+ obj->layer->evas->engine.func->gradient2_fill_transform_set(obj->layer->evas->engine.data.output, o->engine_data,
+ &og->cur.fill.transform);
+ obj->layer->evas->engine.func->gradient2_fill_spread_set(obj->layer->evas->engine.data.output, o->engine_data,
+ og->cur.fill.spread);
obj->layer->evas->engine.func->gradient2_linear_render_pre(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
- o);
+ o->engine_data);
+ }
og->cur.gradient_opaque = obj->layer->evas->engine.func->gradient2_linear_is_opaque(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
- o,
+ o->engine_data,
obj->cur.cache.clip.x, obj->cur.cache.clip.y,
obj->cur.cache.clip.w, obj->cur.cache.clip.h);
+ if (obj->cur.cache.clip.a != 255)
+ og->cur.gradient_opaque = 0;
}
/* now figure what changed and add draw rects */
/* area so if there were updates for it they get wiped. don't do it if we */
/* arent fully opaque and we are visible */
- if (evas_object_is_visible(obj) && evas_object_is_opaque(obj))
- obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
- obj->cur.cache.clip.x,
- obj->cur.cache.clip.y,
- obj->cur.cache.clip.w,
- obj->cur.cache.clip.h);
+ if (evas_object_is_visible(obj) &&
+ evas_object_is_opaque(obj))
+ obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+ obj->cur.cache.clip.x,
+ obj->cur.cache.clip.y,
+ obj->cur.cache.clip.w,
+ obj->cur.cache.clip.h);
done:
evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
static void *evas_object_gradient2_linear_engine_data_get(Evas_Object *obj)
{
- Evas_Object_Gradient2 *o;
+ Evas_Object_Gradient2_Linear *o;
- o = (Evas_Object_Gradient2 *)(obj->object_data);
+ o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
if (!o) return NULL;
return o->engine_data;
}
static int
evas_object_gradient2_linear_is_opaque(Evas_Object *obj)
{
- Evas_Object_Gradient2 *o;
+ Evas_Object_Gradient2_Linear *o;
+ Evas_Object_Gradient2 *og;
/* this returns 1 if the internal object data implies that the object is */
/* currently fully opaque over the entire region it occupies */
- o = (Evas_Object_Gradient2 *)(obj->object_data);
- if (!o || !o->engine_data) return 0;
- return o->cur.gradient_opaque;
+ o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+ if (!o->engine_data) return 0;
+ og = (Evas_Object_Gradient2 *)(o);
+ return og->cur.gradient_opaque;
}
static int
evas_object_gradient2_linear_was_opaque(Evas_Object *obj)
{
- Evas_Object_Gradient2 *o;
+ Evas_Object_Gradient2_Linear *o;
+ Evas_Object_Gradient2 *og;
/* this returns 1 if the internal object data implies that the object was */
/* currently fully opaque over the entire region it occupies */
- o = (Evas_Object_Gradient2 *)(obj->object_data);
- if (!o || !o->engine_data) return 0;
- return o->prev.gradient_opaque;
+ o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+ if (!o->engine_data) return 0;
+ og = (Evas_Object_Gradient2 *)(o);
+ return og->prev.gradient_opaque;
}
#include "evas_common.h"
#include "evas_private.h"
-#include "evas_object_gradient2.h"
/* private magic number for radial gradient objects */
static const char rg_type[] = "radial_gradient";
+/* private struct for gradient object internal data */
+typedef struct _Evas_Object_Gradient2_Radial Evas_Object_Gradient2_Radial;
+
+struct _Evas_Object_Gradient2_Radial
+{
+ Evas_Object_Gradient2 base;
+
+ DATA32 magic;
+
+ struct {
+ struct {
+ float cx, cy, rx, ry;
+ } fill;
+ } cur, prev;
+
+ void *engine_data;
+
+ unsigned char gradient_changed : 1;
+ unsigned char changed : 1;
+};
+
/* private methods for radial gradient objects */
static void evas_object_gradient2_radial_init(Evas_Object *obj);
static void *evas_object_gradient2_radial_new(void);
evas_object_inject(obj, e);
if (obj->object_data)
{
- Evas_Object_Gradient2 *o = (Evas_Object_Gradient2 *)(obj->object_data);
+ Evas_Object_Gradient2_Radial *o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
o->engine_data = e->engine.func->gradient2_radial_new(e->engine.data.output);
}
evas_object_gradient2_radial_free(Evas_Object *obj)
{
Evas_Object_Gradient2_Radial *o;
- Evas_Object_Gradient2 *og;
/* frees private object data. very simple here */
o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
return;
MAGIC_CHECK_END();
/* free obj */
- og = (Evas_Object_Gradient2 *)o;
- if (og->engine_data)
+ if (o->engine_data)
obj->layer->evas->engine.func->gradient2_radial_free(obj->layer->evas->engine.data.output,
- og->engine_data);
+ o->engine_data);
free(o);
obj->object_data = NULL;
}
/* render object to surface with context, and offxet by x,y */
o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
- obj->layer->evas->engine.func->context_multiplier_set(output, context,
- obj->cur.cache.clip.r, obj->cur.cache.clip.g,
- obj->cur.cache.clip.b, obj->cur.cache.clip.a);
+ obj->layer->evas->engine.func->context_multiplier_unset(output, context);
obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->cur.anti_alias);
obj->layer->evas->engine.func->context_render_op_set(output, context, obj->cur.render_op);
- obj->layer->evas->engine.func->context_color_interpolation_set(output, context,
- obj->cur.interpolation_color_space);
- if (o)
+ if (o->engine_data)
+ {
obj->layer->evas->engine.func->gradient2_radial_draw(output, context, surface,
- o,
+ o->engine_data,
obj->cur.geometry.x + x,
obj->cur.geometry.y + y,
obj->cur.geometry.w,
obj->cur.geometry.h);
+ }
}
static void
{ o->gradient_changed = 1; o->changed = 1; }
if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
o->changed = 1;
+// if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
+// o->changed = 1;
if (og->gradient_changed)
{ o->gradient_changed = 1; o->changed = 1; }
- if (o->changed && og->engine_data)
+ if (o->changed && o->engine_data)
{
obj->layer->evas->engine.func->context_render_op_set(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context, obj->cur.render_op);
obj->layer->evas->engine.data.context,
obj->cur.interpolation_color_space);
if (o->gradient_changed)
+ {
+ obj->layer->evas->engine.func->gradient2_radial_fill_set(obj->layer->evas->engine.data.output, o->engine_data, o->cur.fill.cx, o->cur.fill.cy, o->cur.fill.rx, o->cur.fill.ry);
+ obj->layer->evas->engine.func->gradient2_fill_transform_set(obj->layer->evas->engine.data.output, o->engine_data,
+ &og->cur.fill.transform);
+ obj->layer->evas->engine.func->gradient2_fill_spread_set(obj->layer->evas->engine.data.output, o->engine_data,
+ og->cur.fill.spread);
obj->layer->evas->engine.func->gradient2_radial_render_pre(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
- o);
+ o->engine_data);
+ }
og->cur.gradient_opaque = obj->layer->evas->engine.func->gradient2_radial_is_opaque(obj->layer->evas->engine.data.output,
obj->layer->evas->engine.data.context,
- o,
+ o->engine_data,
obj->cur.cache.clip.x, obj->cur.cache.clip.y,
obj->cur.cache.clip.w, obj->cur.cache.clip.h);
+ if (obj->cur.cache.clip.a != 255)
+ og->cur.gradient_opaque = 0;
}
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
/* area so if there were updates for it they get wiped. don't do it if we */
/* arent fully opaque and we are visible */
- if (evas_object_is_visible(obj) && evas_object_is_opaque(obj))
- obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
- obj->cur.cache.clip.x,
- obj->cur.cache.clip.y,
- obj->cur.cache.clip.w,
- obj->cur.cache.clip.h);
+ if (evas_object_is_visible(obj) &&
+ evas_object_is_opaque(obj))
+ obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+ obj->cur.cache.clip.x,
+ obj->cur.cache.clip.y,
+ obj->cur.cache.clip.w,
+ obj->cur.cache.clip.h);
done:
evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
static void *evas_object_gradient2_radial_engine_data_get(Evas_Object *obj)
{
- Evas_Object_Gradient2 *o;
+ Evas_Object_Gradient2_Radial *o;
- o = (Evas_Object_Gradient2 *)(obj->object_data);
+ o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
if (!o) return NULL;
return o->engine_data;
}
static int
evas_object_gradient2_radial_is_opaque(Evas_Object *obj)
{
- Evas_Object_Gradient2 *o;
+ Evas_Object_Gradient2_Radial *o;
+ Evas_Object_Gradient2 *og;
/* this returns 1 if the internal object data implies that the object is */
/* currently fully opaque over the entire region it occupies */
- o = (Evas_Object_Gradient2 *)(obj->object_data);
- if (!o || !o->engine_data) return 0;
- return o->cur.gradient_opaque;
+ o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+ if (!o->engine_data) return 0;
+ og = (Evas_Object_Gradient2 *)(o);
+ return og->cur.gradient_opaque;
}
static int
evas_object_gradient2_radial_was_opaque(Evas_Object *obj)
{
- Evas_Object_Gradient2 *o;
+ Evas_Object_Gradient2_Radial *o;
+ Evas_Object_Gradient2 *og;
/* this returns 1 if the internal object data implies that the object was */
/* currently fully opaque over the entire region it occupies */
- o = (Evas_Object_Gradient2 *)(obj->object_data);
- if (!o || !o->engine_data) return 0;
- return o->prev.gradient_opaque;
+ o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+ if (!o->engine_data) return 0;
+ og = (Evas_Object_Gradient2 *)(o);
+ return og->prev.gradient_opaque;
}
#include "../engines/common/evas_convert_color.h"
#include "../engines/common/evas_convert_colorspace.h"
#include "../engines/common/evas_convert_yuv.h"
-#include "evas_object_image.h"
-
+
/* private magic number for image objects */
static const char o_type[] = "image";
+/* private struct for rectangle object internal data */
+typedef struct _Evas_Object_Image Evas_Object_Image;
+
+struct _Evas_Object_Image
+{
+ DATA32 magic;
+
+ struct {
+ Evas_Common_Transform transform;
+ int spread;
+ Evas_Coord_Rectangle fill;
+ struct {
+ short w, h, stride;
+ } image;
+ struct {
+ short l, r, t, b;
+ unsigned char fill;
+ } border;
+
+ const char *file;
+ const char *key;
+ int cspace;
+
+ unsigned char smooth_scale : 1;
+ unsigned char has_alpha :1;
+ } cur, prev;
+
+ int pixels_checked_out;
+ int load_error;
+ Eina_List *pixel_updates;
+
+ struct {
+ unsigned char scale_down_by;
+ double dpi;
+ short w, h;
+ } load_opts;
+
+ struct {
+ void (*get_pixels) (void *data, Evas_Object *o);
+ void *get_pixels_data;
+ } func;
+
+ void *engine_data;
+
+ unsigned char changed : 1;
+ unsigned char dirty_pixels : 1;
+};
/* private methods for image objects */
static void evas_object_image_unload(Evas_Object *obj);
static void evas_object_image_load(Evas_Object *obj);
+static Evas_Coord evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret);
+static Evas_Coord evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret);
static void evas_object_image_init(Evas_Object *obj);
static void *evas_object_image_new(void);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return;
MAGIC_CHECK_END();
- if (((o->cur.border.center_fill) && (fill)) ||
- ((!o->cur.border.center_fill) && (!fill)))
+ if (((o->cur.border.fill) && (fill)) ||
+ ((!o->cur.border.fill) && (!fill)))
return;
- o->cur.border.center_fill = fill;
+ o->cur.border.fill = fill;
o->changed = 1;
evas_object_change(obj);
}
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return 0;
MAGIC_CHECK_END();
- return o->cur.border.center_fill;
+ return o->cur.border.fill;
}
/**
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return;
MAGIC_CHECK_END();
- if (spread == o->cur.fill.spread) return;
- o->cur.fill.spread = spread;
+ if (spread == o->cur.spread) return;
+ o->cur.spread = spread;
o->changed = 1;
evas_object_change(obj);
}
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return EVAS_TEXTURE_REPEAT;
MAGIC_CHECK_END();
- return o->cur.fill.spread;
+ return o->cur.spread;
}
EAPI void
MAGIC_CHECK_END();
if (!t)
{
- o->cur.fill.transform.mxx = 1;
- o->cur.fill.transform.mxy = 0;
- o->cur.fill.transform.mxz = 0;
- o->cur.fill.transform.myx = 0;
- o->cur.fill.transform.myy = 1;
- o->cur.fill.transform.myz = 0;
- o->cur.fill.transform.mzx = 0;
- o->cur.fill.transform.mzy = 0;
- o->cur.fill.transform.mzz = 1;
- o->cur.fill.transform.is_identity = 1;
+ o->cur.transform.mxx = 1;
+ o->cur.transform.mxy = 0;
+ o->cur.transform.mxz = 0;
+ o->cur.transform.myx = 0;
+ o->cur.transform.myy = 1;
+ o->cur.transform.myz = 0;
+ o->cur.transform.mzx = 0;
+ o->cur.transform.mzy = 0;
+ o->cur.transform.mzz = 1;
+
o->changed = 1;
evas_object_change(obj);
return;
}
- if ( (o->cur.fill.transform.mxx == t->mxx) &&
- (o->cur.fill.transform.mxy == t->mxy) &&
- (o->cur.fill.transform.mxz == t->mxz) &&
- (o->cur.fill.transform.myx == t->myx) &&
- (o->cur.fill.transform.myy == t->myy) &&
- (o->cur.fill.transform.myz == t->myz) &&
- (o->cur.fill.transform.mzx == t->mzx) &&
- (o->cur.fill.transform.mzy == t->mzy) &&
- (o->cur.fill.transform.mzz == t->mzz) )
- return;
-
- o->cur.fill.transform.mxx = t->mxx;
- o->cur.fill.transform.mxy = t->mxy;
- o->cur.fill.transform.mxz = t->mxz;
- o->cur.fill.transform.myx = t->myx;
- o->cur.fill.transform.myy = t->myy;
- o->cur.fill.transform.myz = t->myz;
- o->cur.fill.transform.mzx = t->mzx;
- o->cur.fill.transform.mzy = t->mzy;
- o->cur.fill.transform.mzz = t->mzz;
- o->cur.fill.transform.is_identity = 0;
- if ( (t->mxx == 1) && (t->mxy == 0) && (t->mxz == 0) &&
- (t->myx == 0) && (t->myy == 1) && (t->myz == 0) &&
- (t->mzx == 0) && (t->mzy == 0) && (t->mzz == 1) )
- o->cur.fill.transform.is_identity = 1;
+ if ( (o->cur.transform.mxx == t->mxx) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) ||
+ (o->cur.transform.mxy == t->mxy) )
+ return;
+
+ o->cur.transform.mxx = t->mxx;
+ o->cur.transform.mxy = t->mxy;
+ o->cur.transform.mxz = t->mxz;
+ o->cur.transform.myx = t->myx;
+ o->cur.transform.myy = t->myy;
+ o->cur.transform.myz = t->myz;
+ o->cur.transform.mzx = t->mzx;
+ o->cur.transform.mzy = t->mzy;
+ o->cur.transform.mzz = t->mzz;
+
o->changed = 1;
evas_object_change(obj);
}
MAGIC_CHECK_END();
if (t)
{
- t->mxx = o->cur.fill.transform.mxx;
- t->mxy = o->cur.fill.transform.mxy;
- t->mxz = o->cur.fill.transform.mxz;
- t->myx = o->cur.fill.transform.myx;
- t->myy = o->cur.fill.transform.myy;
- t->myz = o->cur.fill.transform.myz;
- t->mzx = o->cur.fill.transform.mzx;
- t->mzy = o->cur.fill.transform.mzy;
- t->mzz = o->cur.fill.transform.mzz;
+ t->mxx = o->cur.transform.mxx;
+ t->mxy = o->cur.transform.mxy;
+ t->mxz = o->cur.transform.mxz;
+ t->myx = o->cur.transform.myx;
+ t->myy = o->cur.transform.myy;
+ t->myz = o->cur.transform.myz;
+ t->mzx = o->cur.transform.mzx;
+ t->mzy = o->cur.transform.mzy;
+ t->mzz = o->cur.transform.mzz;
}
}
}
}
+static Evas_Coord
+evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret)
+{
+ Evas_Coord w;
+
+ w = ((size * obj->layer->evas->output.w) /
+ (Evas_Coord)obj->layer->evas->viewport.w);
+ if (size <= 0) size = 1;
+ if (start > 0)
+ {
+ while (start - size > 0) start -= size;
+ }
+ else if (start < 0)
+ {
+ while (start < 0) start += size;
+ }
+ start = ((start * obj->layer->evas->output.w) /
+ (Evas_Coord)obj->layer->evas->viewport.w);
+ *size_ret = w;
+ return start;
+}
+
+static Evas_Coord
+evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret)
+{
+ Evas_Coord h;
+
+ h = ((size * obj->layer->evas->output.h) /
+ (Evas_Coord)obj->layer->evas->viewport.h);
+ if (size <= 0) size = 1;
+ if (start > 0)
+ {
+ while (start - size > 0) start -= size;
+ }
+ else if (start < 0)
+ {
+ while (start < 0) start += size;
+ }
+ start = ((start * obj->layer->evas->output.h) /
+ (Evas_Coord)obj->layer->evas->viewport.h);
+ *size_ret = h;
+ return start;
+}
+
static void
evas_object_image_init(Evas_Object *obj)
{
o->cur.fill.w = 1;
o->cur.fill.h = 1;
o->cur.smooth_scale = 1;
- o->cur.border.center_fill = 1;
+ o->cur.border.fill = 1;
o->cur.cspace = EVAS_COLORSPACE_ARGB8888;
- o->cur.fill.transform.mxx = o->cur.fill.transform.myy = o->cur.fill.transform.mzz = 1;
- o->cur.fill.transform.is_identity = 1;
- o->cur.fill.spread = EVAS_TEXTURE_REPEAT;
+ o->cur.transform.mxx = o->cur.transform.myy = o->cur.transform.mzz = 1;
+ o->cur.spread = EVAS_TEXTURE_REPEAT;
o->prev = o->cur;
return o;
}
obj->layer->evas->engine.func->context_render_op_set(output, context,
obj->cur.render_op);
-/*
- obj->layer->evas->engine.func->context_anti_alias_set(output, context,
- obj->cur.anti_alias);
-*/
if (o->engine_data)
{
Evas_Coord idw, idh, idx, idy;
}
o->dirty_pixels = 0;
}
- obj->layer->evas->engine.func->image_draw(output, context, surface, o,
- obj->cur.geometry.x + x,
- obj->cur.geometry.y + y,
- obj->cur.geometry.w,
- obj->cur.geometry.h);
+ o->engine_data = obj->layer->evas->engine.func->image_border_set(output, o->engine_data,
+ o->cur.border.l, o->cur.border.r,
+ o->cur.border.t, o->cur.border.b);
+ idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
+ idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
+ if (idw < 1.0) idw = 1.0;
+ if (idh < 1.0) idh = 1.0;
+ if (idx > 0.0) idx -= idw;
+ if (idy > 0.0) idy -= idh;
+ while ((int)idx < obj->cur.geometry.w)
+ {
+ Evas_Coord ydy;
+ int dobreak_w = 0;
+
+ ydy = idy;
+ ix = idx;
+ if ((o->cur.fill.w == obj->cur.geometry.w) &&
+ (o->cur.fill.x == 0.0))
+ {
+ dobreak_w = 1;
+ iw = obj->cur.geometry.w;
+ }
+ else
+ iw = ((int)(idx + idw)) - ix;
+ while ((int)idy < obj->cur.geometry.h)
+ {
+ int dobreak_h = 0;
+
+ iy = idy;
+ if ((o->cur.fill.h == obj->cur.geometry.h) &&
+ (o->cur.fill.y == 0.0))
+ {
+ ih = obj->cur.geometry.h;
+ dobreak_h = 1;
+ }
+ else
+ ih = ((int)(idy + idh)) - iy;
+ if ((o->cur.border.l == 0) &&
+ (o->cur.border.r == 0) &&
+ (o->cur.border.t == 0) &&
+ (o->cur.border.b == 0) &&
+ (o->cur.border.fill != 0))
+ obj->layer->evas->engine.func->image_draw(output,
+ context,
+ surface,
+ o->engine_data,
+ 0, 0,
+ o->cur.image.w,
+ o->cur.image.h,
+ obj->cur.geometry.x + ix + x,
+ obj->cur.geometry.y + iy + y,
+ iw, ih,
+ o->cur.smooth_scale);
+ else
+ {
+ int inx, iny, inw, inh, outx, outy, outw, outh;
+ int bl, br, bt, bb;
+ int imw, imh, ox, oy;
+
+ ox = obj->cur.geometry.x + ix + x;
+ oy = obj->cur.geometry.y + iy + y;
+ imw = o->cur.image.w;
+ imh = o->cur.image.h;
+ bl = o->cur.border.l;
+ br = o->cur.border.r;
+ bt = o->cur.border.t;
+ bb = o->cur.border.b;
+ if ((bl + br) > iw)
+ {
+ bl = iw / 2;
+ br = iw - bl;
+ }
+ if ((bl + br) > imw)
+ {
+ bl = imw / 2;
+ br = imw - bl;
+ }
+ if ((bt + bb) > ih)
+ {
+ bt = ih / 2;
+ bb = ih - bt;
+ }
+ if ((bt + bb) > imh)
+ {
+ bt = imh / 2;
+ bb = imh - bt;
+ }
+
+ inx = 0; iny = 0;
+ inw = bl; inh = bt;
+ outx = ox; outy = oy;
+ outw = bl; outh = bt;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ inx = bl; iny = 0;
+ inw = imw - bl - br; inh = bt;
+ outx = ox + bl; outy = oy;
+ outw = iw - bl - br; outh = bt;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ inx = imw - br; iny = 0;
+ inw = br; inh = bt;
+ outx = ox + iw - br; outy = oy;
+ outw = br; outh = bt;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+
+ inx = 0; iny = bt;
+ inw = bl; inh = imh - bt - bb;
+ outx = ox; outy = oy + bt;
+ outw = bl; outh = ih - bt - bb;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ if (o->cur.border.fill)
+ {
+ inx = bl; iny = bt;
+ inw = imw - bl - br; inh = imh - bt - bb;
+ outx = ox + bl; outy = oy + bt;
+ outw = iw - bl - br; outh = ih - bt - bb;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ }
+ inx = imw - br; iny = bt;
+ inw = br; inh = imh - bt - bb;
+ outx = ox + iw - br; outy = oy + bt;
+ outw = br; outh = ih - bt - bb;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+
+ inx = 0; iny = imh - bb;
+ inw = bl; inh = bb;
+ outx = ox; outy = oy + ih - bb;
+ outw = bl; outh = bb;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ inx = bl; iny = imh - bb;
+ inw = imw - bl - br; inh = bb;
+ outx = ox + bl; outy = oy + ih - bb;
+ outw = iw - bl - br; outh = bb;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ inx = imw - br; iny = imh - bb;
+ inw = br; inh = bb;
+ outx = ox + iw - br; outy = oy + ih - bb;
+ outw = br; outh = bb;
+ obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+ }
+ idy += idh;
+ if (dobreak_h) break;
+ }
+ idx += idw;
+ idy = ydy;
+ if (dobreak_w) break;
+ }
}
}
if (!o->pixel_updates) goto done;
}
/* if it changed anti_alias */
-/*
if (obj->cur.anti_alias != obj->prev.anti_alias)
{
evas_object_render_pre_prev_cur_add(&rects, obj);
if (!o->pixel_updates) goto done;
}
-*/
if (o->changed)
{
if (((o->cur.file) && (!o->prev.file)) ||
evas_object_render_pre_prev_cur_add(&rects, obj);
if (!o->pixel_updates) goto done;
}
- if (o->cur.fill.spread != o->prev.fill.spread)
- {
- evas_object_render_pre_prev_cur_add(&rects, obj);
- if (!o->pixel_updates) goto done;
- }
- if ( (o->cur.fill.transform.mxx != o->prev.fill.transform.mxx) ||
- (o->cur.fill.transform.mxy != o->prev.fill.transform.mxy) ||
- (o->cur.fill.transform.mxz != o->prev.fill.transform.mxz) ||
- (o->cur.fill.transform.myx != o->prev.fill.transform.myx) ||
- (o->cur.fill.transform.myy != o->prev.fill.transform.myy) ||
- (o->cur.fill.transform.myz != o->prev.fill.transform.myz) )
- {
- evas_object_render_pre_prev_cur_add(&rects, obj);
- if (!o->pixel_updates) goto done;
- }
if (o->dirty_pixels)
{
evas_object_render_pre_prev_cur_add(&rects, obj);
/* if it changed geometry - and obviously not visibility or color */
/* caluclate differences since we have a constant color fill */
/* we really only need to update the differences */
- if ( o->cur.fill.transform.is_identity && o->prev.fill.transform.is_identity &&
- ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+ if (((obj->cur.geometry.x != obj->prev.geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h)) &&
o->pixel_updates = eina_list_remove(o->pixel_updates, rr);
obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, rr->x, rr->y, rr->w, rr->h);
- idx = o->cur.fill.x;
- idw = o->cur.fill.w;
- idy = o->cur.fill.y;
- idh = o->cur.fill.h;
+ idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
+ idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
if (idw < 1) idw = 1;
if (idh < 1) idh = 1;
obj->cur.cache.clip.h);
done:
evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
- if (o->changed)
- obj->layer->evas->engine.func->image_render_pre(obj->layer->evas->engine.data.output,
- obj->layer->evas->engine.data.context,
- o);
}
static void
/* this returns 1 if the internal object data implies that the object is */
/* currently fully opaque over the entire rectangle it occupies */
o = (Evas_Object_Image *)(obj->object_data);
- if (obj->cur.render_op != EVAS_RENDER_BLEND)
- return 0;
if (((o->cur.border.l != 0) ||
(o->cur.border.r != 0) ||
(o->cur.border.t != 0) ||
(o->cur.border.b != 0)) &&
- (!o->cur.border.center_fill)) return 0;
+ (!o->cur.border.fill)) return 0;
if (!o->engine_data) return 0;
+ if (obj->cur.render_op == EVAS_RENDER_COPY)
+ return 1;
if (o->cur.has_alpha) return 0;
- if ((o->cur.fill.spread == EVAS_TEXTURE_RESTRICT) &&
- ((!o->cur.fill.transform.is_identity) || (o->cur.fill.x != 0) || (o->cur.fill.y != 0)))
+ if (obj->cur.render_op != EVAS_RENDER_BLEND)
return 0;
return 1;
}
/* this returns 1 if the internal object data implies that the object was */
/* previously fully opaque over the entire rectangle it occupies */
o = (Evas_Object_Image *)(obj->object_data);
- if (obj->prev.render_op != EVAS_RENDER_BLEND)
- return 0;
if (((o->prev.border.l != 0) ||
(o->prev.border.r != 0) ||
(o->prev.border.t != 0) ||
(o->prev.border.b != 0)) &&
- (!o->prev.border.center_fill)) return 0;
+ (!o->prev.border.fill)) return 0;
if (!o->engine_data) return 0;
+ if (obj->prev.render_op == EVAS_RENDER_COPY)
+ return 1;
if (o->prev.has_alpha) return 0;
- if ((o->prev.fill.spread == EVAS_TEXTURE_RESTRICT) &&
- ((!o->prev.fill.transform.is_identity) || (o->prev.fill.x != 0) || (o->prev.fill.y != 0)))
+ if (obj->prev.render_op != EVAS_RENDER_BLEND)
return 0;
return 1;
}
-/* FIXME: Need to consider the spread = restrict case and transforms */
static int
evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
{
+++ /dev/null
-#ifndef EVAS_OBJECT_IMAGE_H
-#define EVAS_OBJECT_IMAGE_H
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-/* private struct for image object internal data */
-typedef struct _Evas_Object_Image Evas_Object_Image;
-
-struct _Evas_Object_Image
-{
- DATA32 magic;
-
- struct {
- struct {
- Evas_Common_Transform transform;
- int spread;
- int x, y, w, h;
- } fill;
- struct {
- short w, h, stride;
- } image;
- struct {
- short l, r, t, b;
- unsigned char center_fill;
- } border;
-
- const char *file;
- const char *key;
- int cspace;
-
- unsigned char smooth_scale : 1;
- unsigned char has_alpha :1;
- } cur, prev;
-
- int pixels_checked_out;
- int load_error;
- Evas_List *pixel_updates;
-
- struct {
- unsigned char scale_down_by;
- double dpi;
- short w, h;
- } load_opts;
-
- struct {
- void (*get_pixels) (void *data, Evas_Object *o);
- void *get_pixels_data;
- } func;
-
- void *engine_data;
-
- unsigned char changed : 1;
- unsigned char dirty_pixels : 1;
-};
-
-#endif
float myx, myy, myz;
if (!t) return;
- if (angle == 0) return;
- angle = (-angle * M_PI) / 180.0;
+ angle = (angle * M_PI) / 180.0;
ca = cos(angle); sa = sin(angle);
if ((ca == 1) && (sa == 0)) return;
if (!t) return;
if (!dx && !dy) return;
- t->mxx += dx * t->mzx;
- t->mxy += dx * t->mzy;
- t->mxz += dx * t->mzz;
+ t->mxx = dx * t->mzx;
+ t->mxy = dx * t->mzy;
+ t->mxz = dx * t->mzz;
- t->myx += dy * t->mzx;
- t->myy += dy * t->mzy;
- t->myz += dy * t->mzz;
+ t->myx = dy * t->mzx;
+ t->myy = dy * t->mzy;
+ t->myz = dy * t->mzz;
}
EAPI void
t->mzy = (l->mzx * mxy) + (l->mzy * myy) + (l->mzz * mzy);
t->mzz = (l->mzx * mxz) + (l->mzy * myz) + (l->mzz * mzz);
}
-
-EAPI void
-evas_transform_affine_rect_bounds_get(Evas_Transform *t, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Coord *rx, Evas_Coord *ry, Evas_Coord *rw, Evas_Coord *rh)
-{
- double d;
- int axx, axy, ayx, ayy;
-
- if (!t) return;
- if ( (t->mxx == 1) && (t->myy == 1) &&
- (t->mxy == 0) && (t->myx == 0) &&
- (t->mxz == 0) && (t->myz == 0) )
- {
- if (rx) *rx = x;
- if (ry) *ry = y;
- if (rw) *rw = w;
- if (rh) *rh = h;
- return;
- }
- d = (t->mxx * (double)t->myy) - (t->mxy * (double)t->myx);
- if (fabs(d) < 0.000030517578125)
- {
- if (rx) *rx = 0;
- if (ry) *ry = 0;
- if (rw) *rw = 0;
- if (rh) *rh = 0;
- return;
- }
- d = 1.0 / d;
- axx = d * t->myy * 65536; ayy = d * t->mxx * 65536;
- axy = -d * t->mxy * 65536; ayx = -d * t->myx * 65536;
-
- if (rx || rh)
- {
- int z, x0, x1 = x0 = (axx * x) + (axy * y);
-
- z = (axx * (x + w)) + (axy * y);
- if (z < x0) x0 = z;
- if (z > x1) x1 = z;
- z = (axx * x) + (axy * (y + h));
- if (z < x0) x0 = z;
- if (z > x1) x1 = z;
- z = (axx * (x + w)) + (axy * (y + h));
- if (z < x0) x0 = z;
- if (z > x1) x1 = z;
- if (rx)
- {
- z = x0 - (((axx * (t->mxz - 0.5)) + (axy * (t->myz - 0.5)))) - 32768;
- *rx = z >> 16;
- }
- if (rw)
- *rw = ((x1 + 0xffff) >> 16) - ((x0 - 0xffff) >> 16); // kludgy, but...
- }
- if (rx || rh)
- {
- int z, y0, y1 = y0 = (ayx * x) + (ayy * y);
-
- z = (ayx * (x + w)) + (ayy * y);
- if (z < y0) y0 = z;
- if (z > y1) y1 = z;
- z = (ayx * x) + (ayy * (y + h));
- if (z < y0) y0 = z;
- if (z > y1) y1 = z;
- z = (ayx * (x + w)) + (ayy * (y + h));
- if (z < y0) y0 = z;
- if (z > y1) y1 = z;
- if (ry)
- {
- z = y0 - ((ayx * (t->mxz - 0.5)) + (ayy * (t->myz - 0.5))) - 32768;
- *ry = z >> 16;
- }
- if (rh)
- *rh = ((y1 + 0xffff) >> 16) - ((y0 - 0xffff) >> 16); // kludgy, but...
- }
-}
AM_CPPFLAGS = -I. \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib/include \
- -I$(top_srcdir)/src/lib/canvas \
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
evas_image_save.c \
evas_image_main.c \
evas_image_data.c \
-evas_image_fill_main.c \
-evas_image_draw.c \
evas_line_main.c \
evas_polygon_main.c \
evas_rectangle_main.c \
evas_scale_span.c \
evas_tiler.c \
evas_regionbuf.c \
-evas_pipe.c \
-evas_transform.c
+evas_pipe.c
EXTRA_DIST = \
evas_blend.h \
evas_scale_smooth_scaler_downy.c \
evas_scale_smooth_scaler_noscale.c \
evas_scale_smooth_scaler_up.c \
-evas_image_fill_restrict.c \
-evas_image_fill_repeat.c \
-evas_image_fill_reflect.c \
-evas_image_fill_pad.c \
evas_scale_span.h \
-evas_pipe.h \
-evas_transform.h
+evas_pipe.h
libevas_engine_common_la_DEPENDENCIES = \
$(top_builddir)/config.h
#endif
#endif
-
-#define DITHER_TWO_RGB_565 \
- dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; \
- dith2 = dith >> DM_SHF(6); \
- dith >>= DM_SHF(5); \
- r1 = (p & 0xff0000) >> 19; \
- g1 = (p & 0xff00) >> 10; \
- b1 = (p & 0xff) >> 3; \
- if ((r1 < 0x1f) && ((((p & 0xff0000) >> 16) - (r1 << 3)) >= dith )) r1++; \
- if ((g1 < 0x3f) && ((((p & 0xff00) >> 8) - (g1 << 2)) >= dith2)) g1++; \
- if ((b1 < 0x1f) && (((p & 0xff) - (b1 << 3)) >= dith )) b1++; \
- \
- x++; \
- dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; \
- dith2 = dith >> DM_SHF(6); \
- dith >>= DM_SHF(5); \
- r2 = (q & 0xff0000) >> 19; \
- g2 = (q & 0xff00) >> 10; \
- b2 = (q & 0xff) >> 3; \
- if ((r2 < 0x1f) && ((((q & 0xff0000) >> 16) - (r2 << 3)) >= dith )) r2++; \
- if ((g2 < 0x3f) && ((((q & 0xff00) >> 8) - (g2 << 2)) >= dith2)) g2++; \
- if ((b2 < 0x1f) && (((q & 0xff) - (b2 << 3)) >= dith )) b2++;
-
-
-#define DITHER_ONE_RGB_565 \
- dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; \
- dith2 = dith >> DM_SHF(6); \
- dith >>= DM_SHF(5); \
- r = (p & 0xff0000) >> 19; \
- g = (p & 0xff00) >> 10; \
- b = (p & 0xff) >> 3; \
- if ((r < 0x1f) && ((((p & 0xff0000) >> 16) - (r << 3)) >= dith )) r++; \
- if ((g < 0x3f) && ((((p & 0xff00) >> 8) - (g << 2)) >= dith2)) g++; \
- if ((b < 0x1f) && (((p & 0xff) - (b << 3)) >= dith )) b++;
-
-
-#ifndef WORDS_BIGENDIAN
-#define RGB_565_JOIN_TWO(r1,g1,b1,r2,g2,b2) \
- (((r2) << 27) | ((g2) << 21) | ((b2) << 16) | ((r1) << 11) | ((g1) << 5) | (b1))
-#define BGR_565_JOIN_TWO(r1,g1,b1,r2,g2,b2) \
- (((b2) << 27) | ((g2) << 21) | ((r2) << 16) | ((b1) << 11) | ((g1) << 5) | (r1))
-#else
-#define RGB_565_JOIN_TWO(r1,g1,b1,r2,g2,b2) \
- (((r1) << 27) | ((g1) << 21) | ((b1) << 16) | ((r2) << 11) | ((g2) << 5) | (b2))
-#define BGR_565_JOIN_TWO(r1,g1,b1,r2,g2,b2) \
- (((b1) << 27) | ((g1) << 21) | ((r1) << 16) | ((b2) << 11) | ((g2) << 5) | (r2))
-#endif
-
-
#ifdef BUILD_CONVERT_16_RGB_565
#ifdef BUILD_CONVERT_16_RGB_ROT0
void
evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s = src;
DATA16 *d = (DATA16 *)dst;
int r1, g1, b1;
int r2, g2, b2;
int dith, dith2;
int x, y;
+#ifdef BUILD_LINE_DITHER_MASK
for (y = 0; y < h; y++)
{
- for (x = 0; x < w; x++)
+ if ((y + dith_y) & 0x1)
{
- DATA32 p = *s++, q = *s++;
+ for (x = 0; x < w; x+=2)
+ {
+ DATA32 p = *src++, q = *src++;
+ r1 = ((p & 0xff0000) + 0x030000) >> 19;
+ if (r1 > 0x1f) r1 = 0x1f;
+ g1 = ((p & 0xff00) + 0x000100) >> 10;
+ if (g1 > 0x3f) g1 = 0x3f;
+ b1 = ((p & 0xff) + 0x000003) >> 3;
+ if (b1 > 0x1f) b1 = 0x1f;
+ r2 = ((q & 0xff0000) + 0x030000) >> 19;
+ if (r2 > 0x1f) r2 = 0x1f;
+ g2 = ((q & 0xff00) + 0x000100) >> 10;
+ if (g2 > 0x3f) g2 = 0x3f;
+ b2 = ((q & 0xff) + 0x000003) >> 3;
+ if (b2 > 0x1f) b2 = 0x1f;
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) |
+ (r1 << 11) | (g1 << 5) | (b1);
+#else
+ *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) |
+ (r2 << 11) | (g2 << 5) | (b2);
+#endif
+ d += 2;
+ }
+ }
+ else
+ {
+ x = w;
+ while (w > 0)
+ {
+ DATA32 p = *src++, q = *src++;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = RGB_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)d) =
+ (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) |
+ (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3);
+#else
+ *((DATA32 *)d) =
+ (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) |
+ (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3);
+#endif
+ d += 2; w -= 2;
+ }
+ w = x;
+ }
+ src += src_jump;
+ d += dst_jump;
+ }
+#else
+ for (y = 0; y < h; y++)
+ {
+ for (x = 0; x < w; x++)
+ {
+ DATA32 p = *src++, q = *src++;
+
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+ dith2 = dith >> DM_SHF(6);
+ dith >>= DM_SHF(5);
+ r1 = (p & 0xff0000) >> 19;
+ g1 = (p & 0xff00) >> 10;
+ b1 = (p & 0xff) >> 3;
+ if ((r1 < 0x1f) && ((((p & 0xff0000) >> 16) - (r1 << 3)) >= dith )) r1++;
+ if ((g1 < 0x3f) && ((((p & 0xff00) >> 8) - (g1 << 2)) >= dith2)) g1++;
+ if ((b1 < 0x1f) && (((p & 0xff) - (b1 << 3)) >= dith )) b1++;
+
+ x++;
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+ dith2 = dith >> DM_SHF(6);
+ dith >>= DM_SHF(5);
+ r2 = (q & 0xff0000) >> 19;
+ g2 = (q & 0xff00) >> 10;
+ b2 = (q & 0xff) >> 3;
+ if ((r2 < 0x1f) && ((((q & 0xff0000) >> 16) - (r2 << 3)) >= dith )) r2++;
+ if ((g2 < 0x3f) && ((((q & 0xff00) >> 8) - (g2 << 2)) >= dith2)) g2++;
+ if ((b2 < 0x1f) && (((q & 0xff) - (b2 << 3)) >= dith )) b2++;
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) |
+ (r1 << 11) | (g1 << 5) | (b1);
+#else
+ *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) |
+ (r2 << 11) | (g2 << 5) | (b2);
+#endif
d += 2;
}
- s += src_jump; d += dst_jump;
+ src += src_jump;
+ d += dst_jump;
}
+#endif
return;
pal = 0;
#else
- DATA32 *s = src;
DATA16 *d = (DATA16 *)dst;
- int x, y;
+ int w0 = w;
- for (y = 0; y < h; y++)
+ while (h--)
{
- for (x = 0; x < w; x += 2)
+ while (w > 0)
{
- DATA32 p = *s++, q = *s++;
+ DATA32 p = *src++, q = *src++;
- *((DATA32 *)d) = RGB_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- }
- s += src_jump; d += dst_jump;
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)d) =
+ (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) |
+ (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3);
+#else
+ *((DATA32 *)d) =
+ (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) |
+ (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3);
+#endif
+ d += 2; w -= 2;
+ }
+ w = w0;
+ src += src_jump;
+ d += dst_jump;
}
return;
pal = 0;
evas_common_convert_rgba_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s = src;
DATA16 *d = (DATA16 *)dst;
int r, g, b;
int dith, dith2;
int x, y;
+#ifdef BUILD_LINE_DITHER_MASK
+ for (y = 0; y < h; y++)
+ {
+ if ((y + dith_y) & 0x1)
+ {
+ for (x = 0; x < w; x++)
+ {
+ DATA32 p = *src++;
+
+ r = (p & 0xff0000) >> 19;
+ if (r > 0x1f) r = 0x1f;
+ g = (p & 0xff00) >> 10;
+ if (g > 0x3f) g = 0x3f;
+ b = (p & 0xff) >> 3;
+ if (b > 0x1f) b = 0x1f;
+ *d++ = (r << 11) | (g << 5) | b;
+ }
+ }
+ else
+ {
+ x = w;
+ while (w--)
+ {
+ *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3);
+ src++;
+ }
+ w = x;
+ }
+ src += src_jump;
+ d += dst_jump;
+ }
+#else
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x++)
{
- DATA32 p = *s++;
+ DATA32 p = *src++;
+
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+ dith2 = dith >> DM_SHF(6);
+ dith >>= DM_SHF(5);
+ r = (p & 0xff0000) >> 19;
+ g = (p & 0xff00) >> 10;
+ b = (p & 0xff) >> 3;
+ if ((r < 0x1f) && ((((p & 0xff0000) >> 16) - (r << 3)) >= dith )) r++;
+ if ((g < 0x3f) && ((((p & 0xff00) >> 8) - (g << 2)) >= dith2)) g++;
+ if ((b < 0x1f) && (((p & 0xff) - (b << 3)) >= dith )) b++;
- DITHER_ONE_RGB_565
*d++ = (r << 11) | (g << 5) | b;
}
- s += src_jump; d += dst_jump;
+ src += src_jump;
+ d += dst_jump;
}
+#endif
return;
pal = 0;
#else
- DATA32 *s = src;
DATA16 *d = (DATA16 *)dst;
- int x, y;
+ int w0 = w;
- for (y = 0; y < h; y++)
+ while (h--)
{
- for (x = 0; x < w; x++)
+ while (w--)
{
- *d++ = (((*s & 0xff0000) >> 19) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff) >> 3);
- s++;
- }
- s += src_jump; d += dst_jump;
+ *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3);
+ src++;
+ }
+ w = w0;
+ src += src_jump;
+ d += dst_jump;
}
return;
pal = 0;
void
evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s--, q = *s--;
+ dst_ptr = (DATA16 *)dst;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = RGB_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP2_START_ROT_180();
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s--, q = *s--;
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
- *((DATA32 *)d) = RGB_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_180();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (r2 << 27) | (g2 << 21) | (b2 << 16) |
+ (r1 << 11) | (g1 << 5 ) | (b1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (r1 << 27) | (g1 << 21) | (b1 << 16) |
+ (r2 << 11) | (g2 << 5 ) | (b2 );
+#endif
+
+ CONVERT_LOOP2_END_ROT_180();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r, g, b;
- int dith, dith2;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s--;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (r << 11) | (g << 5) | (b);
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP_START_ROT_180();
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff0000) >> 19) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff) >> 3);
- s--;
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (r << 11) | (g << 5) | (b);
+
+ CONVERT_LOOP_END_ROT_180();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + ((w - 1) * (h + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s, q = *(s -= (h + src_jump));
+ dst_ptr = (DATA16 *)dst;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = RGB_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- s -= (h + src_jump);
- }
- s = src + ((w - 1) * (h + src_jump)) + (y + 1);
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP2_START_ROT_270();
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s, q = *(s -= (h + src_jump));
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
- *((DATA32 *)d) = RGB_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- s -= (h + src_jump);
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_270();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (r2 << 27) | (g2 << 21) | (b2 << 16) |
+ (r1 << 11) | (g1 << 5 ) | (b1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (r1 << 27) | (g1 << 21) | (b1 << 16) |
+ (r2 << 11) | (g2 << 5 ) | (b2 );
+#endif
+
+ CONVERT_LOOP2_END_ROT_270();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r, g, b;
- int dith, dith2;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + ((w - 1) * (h + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (r << 11) | (g << 5) | (b);
- s -= (h + src_jump);
- }
- s = src + ((w - 1) * (h + src_jump)) + (y + 1);
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP_START_ROT_270();
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff0000) >> 19) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff) >> 3);
- s -= (h + src_jump);
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (r << 11) | (g << 5) | (b);
+
+ CONVERT_LOOP_END_ROT_270();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s, q = *(s += (h + src_jump));
+ dst_ptr = (DATA16 *)dst;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = RGB_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP2_START_ROT_90();
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s, q = *(s += (h + src_jump));
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
- *((DATA32 *)d) = RGB_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_90();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (r2 << 27) | (g2 << 21) | (b2 << 16) |
+ (r1 << 11) | (g1 << 5 ) | (b1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (r1 << 27) | (g1 << 21) | (b1 << 16) |
+ (r2 << 11) | (g2 << 5 ) | (b2 );
+#endif
+
+ CONVERT_LOOP2_END_ROT_90();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r, g, b;
- int dith, dith2;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (r << 11) | (g << 5) | (b);
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP_START_ROT_90();
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff0000) >> 19) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff) >> 3);
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (r << 11) | (g << 5) | (b);
+
+ CONVERT_LOOP_END_ROT_90();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba2_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s = src;
- DATA16 *d = (DATA16 *)dst;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s++, q = *s++;
+ dst_ptr = (DATA16 *)dst;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = BGR_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- }
- s += src_jump; d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s = src;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP2_START_ROT_0();
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s++, q = *s++;
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
- *((DATA32 *)d) = BGR_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- }
- s += src_jump; d += dst_jump;
- }
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_0();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (b2 << 27) | (g2 << 21) | (r2 << 16) |
+ (b1 << 11) | (g1 << 5 ) | (r1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (b1 << 27) | (g1 << 21) | (r1 << 16) |
+ (b2 << 11) | (g2 << 5 ) | (r2 );
+#endif
+
+ CONVERT_LOOP2_END_ROT_0();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s = src;
- DATA16 *d = (DATA16 *)dst;
- int r, g, b;
- int dith, dith2;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s++;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (b << 11) | (g << 5) | r;
- }
- s += src_jump; d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s = src;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP_START_ROT_0();
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff) >> 3) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff0000) >> 19);
- s++;
- }
- s += src_jump; d += dst_jump;
- }
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (b << 11) | (g << 5) | (r);
+
+ CONVERT_LOOP_END_ROT_0();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s--, q = *s--;
+ dst_ptr = (DATA16 *)dst;
+
+ CONVERT_LOOP2_START_ROT_180();
+
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_180();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = BGR_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s--, q = *s--;
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (b2 << 27) | (g2 << 21) | (r2 << 16) |
+ (b1 << 11) | (g1 << 5 ) | (r1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (b1 << 27) | (g1 << 21) | (r1 << 16) |
+ (b2 << 11) | (g2 << 5 ) | (r2 );
+#endif
- *((DATA32 *)d) = BGR_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+ CONVERT_LOOP2_END_ROT_180();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r, g, b;
- int dith, dith2;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s--;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (b << 11) | (g << 5) | (r);
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
-// fprintf(stderr, "evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180\n");
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ fprintf(stderr, "evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180\n");
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff) >> 3) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff0000) >> 19);
- s--;
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+ CONVERT_LOOP_START_ROT_180();
+
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (b << 11) | (g << 5) | (r);
+
+ CONVERT_LOOP_END_ROT_180();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + ((w - 1) * (h + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s, q = *(s -= (h + src_jump));
+ dst_ptr = (DATA16 *)dst;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = BGR_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- s -= (h + src_jump);
- }
- s = src + ((w - 1) * (h + src_jump)) + (y + 1);
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP2_START_ROT_270();
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s, q = *(s -= (h + src_jump));
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
- *((DATA32 *)d) = BGR_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- s -= (h + src_jump);
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_270();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (b2 << 27) | (g2 << 21) | (r2 << 16) |
+ (b1 << 11) | (g1 << 5 ) | (r1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (b1 << 27) | (g1 << 21) | (r1 << 16) |
+ (b2 << 11) | (g2 << 5 ) | (r2 );
+#endif
+
+ CONVERT_LOOP2_END_ROT_270();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r, g, b;
- int dith, dith2;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + ((w - 1) * (h + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (b << 11) | (g << 5) | (r);
- s -= (h + src_jump);
- }
- s = src + ((w - 1) * (h + src_jump)) + (y + 1);
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP_START_ROT_270();
- s = src + (w - 1) + ((h - 1) * (w + src_jump));
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff) >> 3) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff0000) >> 19);
- s -= (h + src_jump);
- }
- s = src + (w - 1) + ((h - y - 2) * (w + src_jump));
- d += dst_jump;
- }
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (b << 11) | (g << 5) | (r);
+
+ CONVERT_LOOP_END_ROT_270();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r1, g1, b1;
- int r2, g2, b2;
- int dith, dith2;
+ DATA8 r1, g1, b1;
+ DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s, q = *(s += (h + src_jump));
+ dst_ptr = (DATA16 *)dst;
- DITHER_TWO_RGB_565
- *((DATA32 *)d) = BGR_565_JOIN_TWO(r1,g1,b1,r2,g2,b2);
- d += 2;
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP2_START_ROT_90();
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x += 2)
- {
- DATA32 p = *s, q = *(s += (h + src_jump));
+ r1 = (R_VAL(src_ptr)) >> 3;
+ g1 = (G_VAL(src_ptr)) >> 2;
+ b1 = (B_VAL(src_ptr)) >> 3;
- *((DATA32 *)d) = BGR_565_JOIN_TWO((p & 0xff0000) >> 19, (p & 0xff00) >> 10, (p & 0xff) >> 3, (q & 0xff0000) >> 19, (q & 0xff00) >> 10, (q & 0xff) >> 3);
- d += 2;
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+ if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+ if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+ CONVERT_LOOP2_INC_ROT_90();
+
+ r2 = (R_VAL(src_ptr)) >> 3;
+ g2 = (G_VAL(src_ptr)) >> 2;
+ b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+ if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+ if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+ *((DATA32 *)dst_ptr) =
+ (b2 << 27) | (g2 << 21) | (r2 << 16) |
+ (b1 << 11) | (g1 << 5 ) | (r1 );
+#else
+ *((DATA32 *)dst_ptr) =
+ (b1 << 27) | (g1 << 21) | (r1 << 16) |
+ (b2 << 11) | (g2 << 5 ) | (r2 );
+#endif
+
+ CONVERT_LOOP2_END_ROT_90();
return;
pal = 0;
-#endif
}
#endif
#endif
void
evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
{
-#ifndef BUILD_NO_DITHER_MASK
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
+ DATA32 *src_ptr;
+ DATA16 *dst_ptr;
int x, y;
- int r, g, b;
- int dith, dith2;
+ DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+ DATA8 dith, dith2;
+#endif
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- DATA32 p = *s;
+ dst_ptr = (DATA16 *)dst;
- DITHER_ONE_RGB_565
- *d++ = (b << 11) | (g << 5) | (r);
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
- return;
- pal = 0;
-#else
- DATA32 *s;
- DATA16 *d = (DATA16 *)dst;
- int x, y;
+ CONVERT_LOOP_START_ROT_90();
- s = src + (h - 1);
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- *d++ = (((*s & 0xff) >> 3) << 11) | (((*s & 0xff00) >> 10) << 5) | ((*s & 0xff0000) >> 19);
- s += (h + src_jump);
- }
- s = src + (h - 1) - y - 1;
- d += dst_jump;
- }
+ r = (R_VAL(src_ptr)) >> 3;
+ g = (G_VAL(src_ptr)) >> 2;
+ b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+ dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+ dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+ if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+ if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+ if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+ *dst_ptr = (b << 11) | (g << 5) | (r);
+
+ CONVERT_LOOP_END_ROT_90();
return;
pal = 0;
-#endif
}
#endif
#endif
}
#endif
#endif
+
r = LUT_CLIP((y + (_crv * v)) >> RES);
g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
- *((DATA32 *)dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
dp1 += 4;
r = LUT_CLIP((y + (_crv * v)) >> RES);
g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
- *((DATA32 *)dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
dp1 += 4;
}
r = LUT_CLIP((y + (_crv * v)) >> RES);
g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
- *((DATA32 *)dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
dp1 += 4;
r = LUT_CLIP((y + (_crv * v)) >> RES);
g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
- *((DATA32 *)dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
dp1 += 4;
}
int xx, yy;
int y, u, v, r, g, b;
unsigned char *yp1, *yp2, *up, *vp;
- DATA32 *dp1, *dp2;
+ unsigned char *dp1, *dp2;
int crv, cbu, cgu, cgv;
/* destination pointers */
- dp1 = (DATA32 *)rgb;
- dp2 = dp1 + w;
+ dp1 = rgb;
+ dp2 = rgb + (w * 4);
+
+ crv = CRV; /* 1.596 */
+ cbu = CBU; /* 2.018 */
+ cgu = CGU; /* 0.391 */
+ cgv = CGV; /* 0.813 */
for (yy = 0; yy < h; yy += 2)
{
u = (*up++) - 128;
v = (*vp++) - 128;
- crv = (CRV * v);
- cgu = (CGU * u);
- cgv = (CGV * v) - OFF;
- cbu = (CBU * u) + OFF;
-
/* do the top 2 pixels of the 2x2 block whcih shared u & v */
/* yuv to rgb */
y = YMUL * ((*yp1++) - 16);
- r = LUT_CLIP((y + crv) >> 16);
- g = LUT_CLIP((y - cgu - cgv) >>16);
- b = LUT_CLIP((y + cbu) >> 16);
- *dp1 = 0xff000000 + RGB_JOIN(r,g,b);
+ r = LUT_CLIP((y + (crv * v)) >> 16);
+ g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+ b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
dp1 += 4;
/* yuv to rgb */
y = YMUL * ((*yp1++) - 16);
- r = LUT_CLIP((y + crv) >> 16);
- g = LUT_CLIP((y - cgu - cgv) >>16);
- b = LUT_CLIP((y + cbu) >> 16);
- *dp1++ = 0xff000000 + RGB_JOIN(r,g,b);
+ r = LUT_CLIP((y + (crv * v)) >> 16);
+ g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+ b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+ dp1 += 4;
/* do the bottom 2 pixels */
/* yuv to rgb */
y = YMUL * ((*yp2++) - 16);
- r = LUT_CLIP((y + crv) >> 16);
- g = LUT_CLIP((y - cgu - cgv) >>16);
- b = LUT_CLIP((y + cbu) >> 16);
- *dp2++ = 0xff000000 + RGB_JOIN(r,g,b);
+ r = LUT_CLIP((y + (crv * v)) >> 16);
+ g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+ b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+ *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(r,g,b);
+
+ dp2 += 4;
/* yuv to rgb */
y = YMUL * ((*yp2++) - 16);
- r = LUT_CLIP((y + crv) >> 16);
- g = LUT_CLIP((y - cgu - cgv) >>16);
- b = LUT_CLIP((y + cbu) >> 16);
- *dp2++ = 0xff000000 + RGB_JOIN(r,g,b);
+ r = LUT_CLIP((y + (crv * v)) >> 16);
+ g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+ b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+ *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(r,g,b);
+
+ dp2 += 4;
}
/* jump down one line since we are doing 2 at once */
- dp1 += w;
- dp2 += w;
+ dp1 += (w * 4);
+ dp2 += (w * 4);
}
#endif
}
int xx, yy;
int y, u, v;
unsigned char *yp1, *yp2, *up, *vp;
- DATA32 *dp1, *dp2;
+ unsigned char *dp1, *dp2;
/* destination pointers */
- dp1 = (DATA32 *)rgb;
- dp2 = dp1 + w;
+ dp1 = rgb;
+ dp2 = rgb + (w * 4);
for (yy = 0; yy < h; yy += 2)
{
/* do the top 2 pixels of the 2x2 block whcih shared u & v */
/* yuv to rgb */
y = _v1164[*yp1++];
- *dp1++ = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+
+ dp1 += 4;
/* yuv to rgb */
y = _v1164[*yp1++];
- *dp1++ = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+ *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+
+ dp1 += 4;
/* do the bottom 2 pixels */
/* yuv to rgb */
y = _v1164[*yp2++];
- *dp2++ = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+ *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+
+ dp2 += 4;
/* yuv to rgb */
y = _v1164[*yp2++];
- *dp2++ = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+ *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+ dp2 += 4;
}
/* jump down one line since we are doing 2 at once */
- dp1 += w;
- dp2 += w;
+ dp1 += (w * 4);
+ dp2 += (w * 4);
}
#endif
}
#endif
+
EAPI RGBA_Gradient_Type *evas_common_gradient_geometer_get (const char *name);
-EAPI void evas_common_gradient2_clear (void *pgr);
-EAPI void evas_common_gradient2_color_np_stop_insert (void *pgr, int r, int g, int b, int a, float pos);
-EAPI void evas_common_gradient2_map (RGBA_Draw_Context *dc, void *pgr, int len);
-EAPI int evas_common_gradient2_opaque (RGBA_Draw_Context *dc, void *pgr, int x, int y, int w, int h);
-EAPI void evas_common_gradient2_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, void *pgr, int x, int y, int w, int h);
-EAPI void evas_common_rgba_gradient2_free (RGBA_Gradient2 *rgba_gr);
-
-EAPI RGBA_Gradient2 *evas_common_rgba_gradient2_linear_new (void);
-EAPI void evas_common_gradient2_linear_render_pre (RGBA_Draw_Context *dc, void *pgr);
-EAPI void evas_common_gradient2_linear_render_post (void *pgr);
-
-EAPI RGBA_Gradient2 *evas_common_rgba_gradient2_radial_new (void);
-EAPI void evas_common_gradient2_radial_render_pre (RGBA_Draw_Context *dc, void *pgr);
-EAPI void evas_common_gradient2_radial_render_post (void *pgr);
+EAPI void evas_common_gradient2_free (RGBA_Gradient2 *gr);
+EAPI RGBA_Gradient2 *evas_common_gradient2_linear_new (void);
+EAPI void evas_common_gradient2_linear_fill_set (RGBA_Gradient2 *gr, float x0, float y0, float x1, float y1);
+EAPI RGBA_Gradient2 *evas_common_gradient2_radial_new (void);
+EAPI void evas_common_gradient2_radial_fill_set (RGBA_Gradient2 *gr, float cx, float cy, float rx, float ry);
+EAPI void evas_common_gradient2_clear (RGBA_Gradient2 *gr);
+EAPI void evas_common_gradient2_color_np_stop_insert (RGBA_Gradient2 *gr, int r, int g, int b, int a, float pos);
+EAPI void evas_common_gradient2_fill_spread_set (RGBA_Gradient2 *gr, int spread);
+EAPI void evas_common_gradient2_fill_transform_set (RGBA_Gradient2 *gr, Evas_Common_Transform *t);
+EAPI void evas_common_gradient2_map (RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len);
+EAPI void evas_common_gradient2_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient2 *gr);
EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_linear_get (void);
EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_radial_get (void);
#include "evas_common.h"
#include "evas_private.h"
-#include "evas_object_gradient2.h"
#include <math.h>
#define LINEAR_EPSILON 0.000030517578125
struct _Linear_Data
{
float x0, y0, x1, y1;
- int x00, y00;
+ float fx0, fy0;
int ayx, ayy;
int len;
unsigned char int_axis_aligned : 1;
static void
linear_shutdown(void);
+static void
+linear_init_geom(RGBA_Gradient2 *gr);
+
static void
-linear_update_geom(void *pgr);
+linear_update_geom(RGBA_Gradient2 *gr);
static void
-linear_free_geom(void *pgr);
+linear_free_geom(void *gdata);
static int
-linear_has_alpha(void *pgr, int op);
+linear_has_alpha(RGBA_Gradient2 *gr, int op);
static int
-linear_has_mask(void *pgr, int op);
+linear_has_mask(RGBA_Gradient2 *gr, int op);
+
+static int
+linear_get_map_len(RGBA_Gradient2 *gr);
static Gfx_Func_Gradient2_Fill
-linear_get_fill_func(void *pgr, int op);
+linear_get_fill_func(RGBA_Gradient2 *gr, int op);
static RGBA_Gradient2_Type linear = {"linear", linear_init, linear_shutdown,
- linear_free_geom,
+ linear_init_geom,
+ linear_update_geom, linear_free_geom,
linear_has_alpha, linear_has_mask,
- linear_get_fill_func};
+ linear_get_map_len, linear_get_fill_func};
EAPI RGBA_Gradient2_Type *
}
EAPI RGBA_Gradient2 *
-evas_common_rgba_gradient2_linear_new(void)
+evas_common_gradient2_linear_new(void)
{
RGBA_Gradient2 *gr;
- Linear_Data *linear_data;
gr = calloc(1, sizeof(RGBA_Gradient2));
if (!gr) return NULL;
- linear_data = calloc(1, sizeof(Linear_Data));
- if (!linear_data) return NULL;
-
gr->references = 1;
gr->type.id = MAGIC_OBJ_GRADIENT_LINEAR;
gr->type.geometer = &linear;
- linear_data->ayy = 65536; linear_data->ayx = 0;
- gr->type.gdata = linear_data;
-
+ linear_init_geom(gr);
return gr;
}
-
EAPI void
-evas_common_gradient2_linear_render_pre(RGBA_Draw_Context *dc, void *pgr)
+evas_common_gradient2_linear_fill_set(RGBA_Gradient2 *gr, float x0, float y0, float x1, float y1)
{
- Evas_Object_Gradient2 *ogr = pgr;
- Evas_Object_Gradient2_Linear *lgr;
- RGBA_Gradient2 *gr;
Linear_Data *linear_data;
- if (!dc || !ogr) return;
- gr = ogr->engine_data;
if (!gr) return;
- lgr = (Evas_Object_Gradient2_Linear *)(ogr);
- if (!lgr) return;
if (gr->type.id != MAGIC_OBJ_GRADIENT_LINEAR) return;
if (gr->type.geometer != &linear) return;
linear_data = (Linear_Data *)gr->type.gdata;
if (!linear_data) return;
- linear_data->x0 = lgr->cur.fill.x0; linear_data->y0 = lgr->cur.fill.y0;
- linear_data->x1 = lgr->cur.fill.x1; linear_data->y1 = lgr->cur.fill.y1;
-
- linear_update_geom(ogr);
-
- evas_common_gradient2_map(dc, ogr, linear_data->len);
+ linear_data->x0 = x0; linear_data->y0 = y0;
+ linear_data->x1 = x1; linear_data->y1 = y1;
}
-EAPI void
-evas_common_gradient2_linear_render_post(void *pgr)
-{
-}
/** internal functions **/
static void
linear_free_geom(void *gdata)
{
- Linear_Data *linear_data = gdata;
+ Linear_Data *data = (Linear_Data *)gdata;
+ if (data) free(data);
+}
+
+static void
+linear_init_geom(RGBA_Gradient2 *gr)
+{
+ Linear_Data *linear_data;
- if (linear_data) free(linear_data);
+ if (!gr || (gr->type.geometer != &linear)) return;
+ linear_data = (Linear_Data *)gr->type.gdata;
+ if (!linear_data)
+ {
+ linear_data = calloc(1, sizeof(Linear_Data));
+ if (!linear_data) return;
+ linear_data->ayy = 65536; linear_data->ayx = 0;
+ }
+ gr->type.gdata = linear_data;
}
+
static void
-linear_update_geom(void *pgr)
+linear_update_geom(RGBA_Gradient2 *gr)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
Linear_Data *linear_data;
double f;
double fx0, fy0, fx1, fy1;
int len;
- if (!ogr) return;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &linear)) return;
linear_data = (Linear_Data *)gr->type.gdata;
if (!linear_data) return;
linear_data->int_axis_aligned = 0;
linear_data->len = 0;
- f = (ogr->cur.fill.transform.mxx * (double)ogr->cur.fill.transform.myy) - (ogr->cur.fill.transform.mxy * (double)ogr->cur.fill.transform.myx);
+ f = (gr->fill.transform.mxx * (double)gr->fill.transform.myy) - (gr->fill.transform.mxy * (double)gr->fill.transform.myx);
if (fabs(f) < LINEAR_EPSILON) return;
f = 1.0 / f;
- fx0 = (((ogr->cur.fill.transform.myy * (double)linear_data->x0) - (ogr->cur.fill.transform.mxy * (double)linear_data->y0)) * f) - ogr->cur.fill.transform.mxz;
- fy0 = ((-(ogr->cur.fill.transform.myx * (double)linear_data->x0) + (ogr->cur.fill.transform.mxx * (double)linear_data->y0)) * f) - ogr->cur.fill.transform.myz;
+ fx0 = (((gr->fill.transform.myy * (double)linear_data->x0) - (gr->fill.transform.mxy * (double)linear_data->y0)) * f) - gr->fill.transform.mxz;
+ fy0 = ((-(gr->fill.transform.myx * (double)linear_data->x0) + (gr->fill.transform.mxx * (double)linear_data->y0)) * f) - gr->fill.transform.myz;
- fx1 = (((ogr->cur.fill.transform.myy * (double)linear_data->x1) - (ogr->cur.fill.transform.mxy * (double)linear_data->y1)) * f) - ogr->cur.fill.transform.mxz;
- fy1 = ((-(ogr->cur.fill.transform.myx * (double)linear_data->x1) + (ogr->cur.fill.transform.mxx * (double)linear_data->y1)) * f) - ogr->cur.fill.transform.myz;
+ fx1 = (((gr->fill.transform.myy * (double)linear_data->x1) - (gr->fill.transform.mxy * (double)linear_data->y1)) * f) - gr->fill.transform.mxz;
+ fy1 = ((-(gr->fill.transform.myx * (double)linear_data->x1) + (gr->fill.transform.mxx * (double)linear_data->y1)) * f) - gr->fill.transform.myz;
f = hypot(fx1 - fx0, fy1 - fy0);
linear_data->len = len = f + 0.5;
if (!len) return;
- linear_data->ayx = ((fx1 - fx0) * 65536) / f;
- linear_data->ayy = ((fy1 - fy0) * 65536) / f;
+ linear_data->ayx = ((fx1 - fx0) / f) * 65536;
+ linear_data->ayy = ((fy1 - fy0) / f) * 65536;
if (fabs(fy0 - fy1) < LINEAR_INT_TOLERANCE)
{
(fabs(((int)fx1) - fx1) < LINEAR_INT_TOLERANCE) )
{ linear_data->int_axis_aligned = 1; linear_data->ayx = 0; }
}
- linear_data->x00 = linear_data->ayx * fx0;
- linear_data->y00 = linear_data->ayy * fy0;
+ linear_data->fx0 = fx0;
+ linear_data->fy0 = fy0;
}
static int
-linear_has_alpha(void *pgr, int op)
+linear_has_alpha(RGBA_Gradient2 *gr, int op)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
-
- if (!ogr) return 0;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &linear)) return 0;
if (gr->has_alpha | gr->map.has_alpha)
return 1;
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
return 0;
- if (ogr->cur.fill.spread == _EVAS_TEXTURE_RESTRICT)
+ if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
return 1;
return 0;
}
static int
-linear_has_mask(void *pgr, int op)
+linear_has_mask(RGBA_Gradient2 *gr, int op)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
-
- if (!ogr) return 0;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &linear)) return 0;
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
{
- if (ogr->cur.fill.spread == _EVAS_TEXTURE_RESTRICT)
+ if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
return 1;
}
return 0;
}
+static int
+linear_get_map_len(RGBA_Gradient2 *gr)
+{
+ Linear_Data *linear_data;
+
+ if (!gr || (gr->type.geometer != &linear)) return 0;
+ linear_data = (Linear_Data *)gr->type.gdata;
+ if (!linear_data) return 0;
+ return linear_data->len;
+}
static Gfx_Func_Gradient2_Fill
-linear_get_fill_func(void *pgr, int op)
+linear_get_fill_func(RGBA_Gradient2 *gr, int op)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
Linear_Data *linear_data;
Gfx_Func_Gradient2_Fill sfunc = NULL;
int masked_op = 0;
- if (!ogr) return sfunc;
- gr = ogr->engine_data;
-
if (!gr || (gr->type.geometer != &linear))
return sfunc;
linear_data = (Linear_Data *)gr->type.gdata;
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
masked_op = 1;
- switch (ogr->cur.fill.spread)
+ switch (gr->fill.spread)
{
case _EVAS_TEXTURE_REPEAT:
sfunc = linear_repeat_aa;
Linear_Data *gdata = (Linear_Data *)params_data;
int yy;
- yy = (gdata->ayx * x) - gdata->x00 + (gdata->ayx >> 1) +
- (gdata->ayy * y) - gdata->y00 + (gdata->ayy >> 1) - 32768;
+ evas_common_cpu_end_opt();
+ yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
if (gdata->int_axis_aligned && (gdata->ayx == 0))
{
int l = (yy >> 16);
int a = 1 + ((yy & 0xffff) >> 8);
- if ((l >= src_len) || (l < -src_len)) l = l % src_len;
- if (l < 0) l += src_len;
+ if ((l >= src_len) || (l < 0))
+ { l = l % src_len; if (l < 0) l += src_len; }
#ifdef BUILD_MMX
MOV_P2R(src[l], mm1, mm0)
Linear_Data *gdata = (Linear_Data *)params_data;
int yy;
- yy = (gdata->ayx * x) - gdata->x00 + (gdata->ayx >> 1) +
- (gdata->ayy * y) - gdata->y00 + (gdata->ayy >> 1) - 32768;
+ evas_common_cpu_end_opt();
+ yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
if (gdata->int_axis_aligned && (gdata->ayx == 0))
{
Linear_Data *gdata = (Linear_Data *)params_data;
int yy;
- yy = (gdata->ayx * x) - gdata->x00 + (gdata->ayx >> 1) +
- (gdata->ayy * y) - gdata->y00 + (gdata->ayy >> 1) - 32768;
+ evas_common_cpu_end_opt();
+ yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
if (gdata->int_axis_aligned && (gdata->ayx == 0))
{
Linear_Data *gdata = (Linear_Data *)params_data;
int yy;
- yy = (gdata->ayx * x) - gdata->x00 + (gdata->ayx >> 1) +
- (gdata->ayy * y) - gdata->y00 + (gdata->ayy >> 1) - 32768;
+ evas_common_cpu_end_opt();
+ yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
#ifdef BUILD_MMX
pxor_r2r(mm0, mm0);
Linear_Data *gdata = (Linear_Data *)params_data;
int yy;
- yy = (gdata->ayx * x) - gdata->x00 + (gdata->ayx >> 1) +
- (gdata->ayy * y) - gdata->y00 + (gdata->ayy >> 1) - 32768;
+ evas_common_cpu_end_opt();
+ yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
#ifdef BUILD_MMX
pxor_r2r(mm0, mm0);
#include "evas_common.h"
#include "evas_blend_private.h"
#include "evas_private.h"
-#include "evas_object_gradient2.h"
#include <math.h>
static void _evas_common_gradient2_stops_free(RGBA_Gradient2 *gr);
static void _evas_common_gradient2_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len);
static void _evas_common_gradient2_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len);
-static void _evas_common_gradient2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pgr,
- int x, int y, int w, int h);
-
-/*
static int grad_initialised = 0;
EAPI void
grad_initialised = 1;
}
-EAPI void
+void
evas_common_gradient2_shutdown(void)
{
RGBA_Gradient2_Type *geom;
geom->shutdown();
grad_initialised = 0;
}
-*/
static void
_evas_common_gradient2_stops_free(RGBA_Gradient2 *gr)
{
- if (gr && gr->stops.stops)
+ if (!gr) return;
+ if (gr->stops.stops)
{
Eina_Inlist *l;
}
EAPI void
-evas_common_rgba_gradient2_free(RGBA_Gradient2 *gr)
+evas_common_gradient2_free(RGBA_Gradient2 *gr)
{
if (!gr) return;
gr->references--;
if (gr->references > 0) return;
- _evas_common_gradient2_stops_free(gr);
+ evas_common_gradient2_clear(gr);
+ if (gr->stops.cdata) free(gr->stops.cdata);
+ if (gr->stops.adata) free(gr->stops.adata);
if (gr->type.geometer && gr->type.gdata)
gr->type.geometer->geom_free(gr->type.gdata);
if (gr->map.data) free(gr->map.data);
}
EAPI void
-evas_common_gradient2_clear(void *pgr)
+evas_common_gradient2_clear(RGBA_Gradient2 *gr)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
-
- if (!ogr) return;
- gr = ogr->engine_data;
if (!gr) return;
+
_evas_common_gradient2_stops_free(gr);
gr->has_alpha = 0;
}
EAPI void
-evas_common_gradient2_color_np_stop_insert(void *pgr, int r, int g, int b, int a, float pos)
+evas_common_gradient2_color_np_stop_insert(RGBA_Gradient2 *gr, int r, int g, int b, int a, float pos)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
RGBA_Gradient2_Color_Np_Stop *gc;
Eina_Inlist *l;
- if (!ogr) return;
- gr = ogr->engine_data;
if (!gr) return;
if (!gr->stops.stops)
{
gr->has_alpha = 1;
}
-
-EAPI int
-evas_common_gradient2_opaque(RGBA_Draw_Context *dc, void *pgr,
- int x, int y, int w, int h)
+EAPI void
+evas_common_gradient2_fill_transform_set(RGBA_Gradient2 *gr, Evas_Common_Transform *t)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
-
- if (!dc || !ogr) return 0;
- gr = ogr->engine_data;
- if (!gr || !gr->type.geometer) return 0;
- if (dc->render_op != _EVAS_RENDER_BLEND)
- return 0;
- return !(gr->type.geometer->has_alpha(ogr, dc->render_op) |
- gr->type.geometer->has_mask(ogr, dc->render_op));
+ if (!gr) return;
+ if (!t)
+ {
+ gr->fill.transform.mxx = 1; gr->fill.transform.mxy = 0; gr->fill.transform.mxz = 0;
+ gr->fill.transform.myx = 0; gr->fill.transform.myy = 1; gr->fill.transform.myz = 0;
+ gr->fill.transform.mzx = 1; gr->fill.transform.mzy = 0; gr->fill.transform.mzz = 1;
+ return;
+ }
+ gr->fill.transform.mxx = t->mxx; gr->fill.transform.mxy = t->mxy; gr->fill.transform.mxz = t->mxz;
+ gr->fill.transform.myx = t->myx; gr->fill.transform.myy = t->myy; gr->fill.transform.myz = t->myz;
+ gr->fill.transform.mzx = t->mzx; gr->fill.transform.mzy = t->mzy; gr->fill.transform.mzz = t->mzz;
}
EAPI void
-evas_common_gradient2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pgr,
- int x, int y, int w, int h)
+evas_common_gradient2_fill_spread_set(RGBA_Gradient2 *gr, int spread)
{
- Cutout_Rects *rects;
- Cutout_Rect *r;
- int c, cx, cy, cw, ch;
- int i;
-
- /* handle cutouts here! */
-
- if ((w <= 0) || (h <= 0)) return;
- if (!(RECTS_INTERSECT(x, y, w, h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
- return;
- /* save out clip info */
- c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
- evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
- /* no cutouts - cut right to the chase */
- if (!dc->cutout.rects)
- {
- _evas_common_gradient2_draw(dst, dc, pgr, x, y, w, h);
- }
- else
- {
- evas_common_draw_context_clip_clip(dc, x, y, w, h);
- /* our clip is 0 size.. abort */
- if ((dc->clip.w > 0) && (dc->clip.h > 0))
- {
- rects = evas_common_draw_context_apply_cutouts(dc);
- for (i = 0; i < rects->active; ++i)
- {
- r = rects->rects + i;
- evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
- _evas_common_gradient2_draw(dst, dc, pgr, x, y, w, h);
- }
- evas_common_draw_context_apply_clear_cutouts(rects);
- }
- }
- /* restore clip info */
- dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
- evas_common_cpu_end_opt();
+ if (!gr) return;
+ gr->fill.spread = spread;
}
-static void
-_evas_common_gradient2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pgr,
- int x, int y, int w, int h)
+EAPI void
+evas_common_gradient2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+ int x, int y, int w, int h, RGBA_Gradient2 *gr)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
- Gfx_Func_Gradient2_Fill gfunc;
+ Gfx_Func_Gradient2_Fill gfunc;
RGBA_Gfx_Func bfunc;
int len;
int xin, yin, xoff, yoff;
int clx, cly, clw, clh;
DATA32 *pdst, *dst_end, *buf, *map;
- RGBA_Image argb_buf;
+ RGBA_Image *argb_buf = NULL, *alpha_buf = NULL;
DATA8 *mask = NULL;
void *gdata;
int direct_copy = 0, buf_step = 0;
- if (!dc || !ogr || !dst || !dst->image.data)
+ if (!dst || !dc || !gr || !dst || !dst->image.data)
return;
- gr = ogr->engine_data;
- if (!gr || !gr->map.data || !gr->type.geometer)
+ if (!gr->map.data || !gr->type.geometer)
return;
if ((w < 1) || (h < 1))
return;
xoff = (x - xin);
yoff = (y - yin);
- if (!gr->type.geometer->has_mask(ogr, dc->render_op))
+ if (!gr->type.geometer->has_mask(gr, dc->render_op))
{
if ((dc->render_op == _EVAS_RENDER_FILL) ||
(dc->render_op == _EVAS_RENDER_COPY))
{
direct_copy = 1; buf_step = dst->cache_entry.w;
- if (gr->type.geometer->has_alpha(ogr, dc->render_op))
+ if (gr->type.geometer->has_alpha(gr, dc->render_op))
dst->cache_entry.flags.alpha = 1;
}
else if ((dc->render_op == _EVAS_RENDER_BLEND) &&
- !gr->type.geometer->has_alpha(ogr, dc->render_op))
+ !gr->type.geometer->has_alpha(gr, dc->render_op))
{
direct_copy = 1; buf_step = dst->cache_entry.w;
}
}
if (!direct_copy)
{
- buf = alloca(w * sizeof(DATA32));
- if (!buf) return;
- argb_buf.cache_entry.flags.alpha = gr->type.geometer->has_alpha(ogr, dc->render_op);
- argb_buf.cache_entry.flags.alpha_sparse = 0;
+ argb_buf = evas_common_image_line_buffer_obtain(w);
+ if (!argb_buf)
+ return;
+ argb_buf->cache_entry.flags.alpha = gr->type.geometer->has_alpha(gr, dc->render_op) ? 1 : 0;
- if (gr->type.geometer->has_mask(ogr, dc->render_op))
+ if (gr->type.geometer->has_mask(gr, dc->render_op))
{
- mask = alloca(w * sizeof(DATA8));
- if (!mask) return;
- bfunc = evas_common_gfx_func_composite_pixel_mask_span_get(&argb_buf, dst, w, dc->render_op);
+ alpha_buf = evas_common_image_alpha_line_buffer_obtain(w);
+ if (!alpha_buf)
+ {
+ evas_common_image_line_buffer_release(argb_buf);
+ return;
+ }
+ bfunc = evas_common_gfx_func_composite_pixel_mask_span_get(argb_buf, dst, w, dc->render_op);
}
else
- {
- if (ogr->cur.fill.spread == _EVAS_TEXTURE_RESTRICT)
- argb_buf.cache_entry.flags.alpha_sparse = 1;
- bfunc = evas_common_gfx_func_composite_pixel_span_get(&argb_buf, dst, w, dc->render_op);
- }
- if (!bfunc) return;
+ bfunc = evas_common_gfx_func_composite_pixel_span_get(argb_buf, dst, w, dc->render_op);
}
- gfunc = gr->type.geometer->get_fill_func(ogr, dc->render_op);
+ gfunc = gr->type.geometer->get_fill_func(gr, dc->render_op);
gdata = gr->type.gdata;
- if (!gdata) return;
+ if (!gdata)
+ {
+ if (!direct_copy)
+ {
+ evas_common_image_line_buffer_release(argb_buf);
+ if (alpha_buf)
+ evas_common_image_alpha_line_buffer_release(alpha_buf);
+ }
+ return;
+ }
map = gr->map.data;
len = gr->map.len;
pdst = dst->image.data + (y * dst->cache_entry.w) + x;
dst_end = pdst + (h * dst->cache_entry.w);
- if (direct_copy) buf = pdst;
+ if (!direct_copy)
+ {
+ buf = argb_buf->image.data;
+ if (alpha_buf)
+ mask = (DATA8 *)alpha_buf->image.data;
+ }
+ else
+ buf = pdst;
while (pdst < dst_end)
{
#ifdef EVAS_SLI
if ((y % dc->sli.h) == dc->sli.y)
- {
#endif
+ {
gfunc(map, len, buf, mask, w, xoff, yoff, gdata);
if (!direct_copy)
bfunc(buf, mask, 0, pdst, w);
-#ifdef EVAS_SLI
- y++;
}
-#endif
buf += buf_step;
pdst += dst->cache_entry.w;
yoff++;
+#ifdef EVAS_SLI
+ y++;
+#endif
}
+
+ if (!direct_copy)
+ {
+ evas_common_image_line_buffer_release(argb_buf);
+ if (alpha_buf)
+ evas_common_image_alpha_line_buffer_release(alpha_buf);
+ }
+ evas_common_cpu_end_opt();
}
static void
{
Eina_Inlist *lc;
RGBA_Gradient2_Color_Np_Stop *gc, *gc_next;
- DATA32 *map, *pmap, *map_end;
- DATA8 *amap = NULL, *pamap = NULL;
+ DATA32 *pmap, *map_end;
+ DATA8 *pamap = NULL;
int i, dii;
int r, g, b, a;
int next_r, next_g, next_b, next_a;
int rr, drr, gg, dgg, bb, dbb, aa, daa;
- map = alloca(gr->stops.len * sizeof(DATA32));
- if (!map) return;
- pmap = map; map_end = pmap + gr->stops.len;
+ gr->stops.cdata = realloc(gr->stops.cdata, gr->stops.len * sizeof(DATA32));
+ if (!gr->stops.cdata) return;
+ pmap = gr->stops.cdata; map_end = pmap + gr->stops.len;
if (gr->has_alpha)
{
- amap = alloca(gr->stops.len * sizeof(DATA8));
- if (!amap) return;
- pamap = amap;
+ gr->stops.adata = realloc(gr->stops.adata, gr->stops.len * sizeof(DATA8));
+ if (!gr->stops.adata)
+ { free(gr->stops.cdata); gr->stops.cdata = NULL; return; }
+ pamap = gr->stops.adata;
}
gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
if (pamap) *pamap++ = gc->a;
}
}
+ }
- if (map && amap)
+ if (gr->stops.cdata && gr->stops.adata)
{
- evas_common_scale_rgba_a8_span(map, amap, gr->stops.len,
+ evas_common_scale_rgba_a8_span(gr->stops.cdata, gr->stops.adata, gr->stops.len,
dc->mul.col, gr->map.data, gr->map.len, 1);
return;
}
- evas_common_scale_rgba_span(map, NULL, gr->stops.len,
+ evas_common_scale_rgba_span(gr->stops.cdata, NULL, gr->stops.len,
dc->mul.col, gr->map.data, gr->map.len, 1);
- }
gr->map.has_alpha |= (!!(255 - (dc->mul.col >> 24)));
}
{
Eina_Inlist *lc;
RGBA_Gradient2_Color_Np_Stop *gc, *gc_next;
- DATA32 *map, *pmap, *map_end;
- DATA8 *amap = NULL, *pamap = NULL;
+ DATA32 *pmap, *map_end;
+ DATA8 *pamap = NULL;
int i, dii;
int h, s, v;
int next_h, next_s, next_v;
int r, g, b, a;
int next_r, next_g, next_b, next_a;
- map = alloca(gr->stops.len * sizeof(DATA32));
- if (!map) return;
- pmap = map; map_end = pmap + gr->stops.len;
+ gr->stops.cdata = realloc(gr->stops.cdata, gr->stops.len * sizeof(DATA32));
+ if (!gr->stops.cdata) return;
+ pmap = gr->stops.cdata; map_end = pmap + gr->stops.len;
if (gr->has_alpha)
{
- amap = alloca(gr->stops.len * sizeof(DATA8));
- if (!amap)
- return;
- pamap = amap;
+ gr->stops.adata = realloc(gr->stops.adata, gr->stops.len * sizeof(DATA8));
+ if (!gr->stops.adata)
+ { free(gr->stops.cdata); gr->stops.cdata = NULL; return; }
+ pamap = gr->stops.adata;
}
gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
if (pamap) *pamap++ = gc->a;
}
}
+ }
- if (map && amap)
+ if (gr->stops.cdata && gr->stops.adata)
{
- evas_common_scale_hsva_a8_span(map, amap, gr->stops.len,
+ evas_common_scale_hsva_a8_span(gr->stops.cdata, gr->stops.adata, gr->stops.len,
dc->mul.col, gr->map.data, gr->map.len, 1);
return;
}
- evas_common_scale_hsva_span(map, NULL, gr->stops.len,
+ evas_common_scale_hsva_span(gr->stops.cdata, NULL, gr->stops.len,
dc->mul.col, gr->map.data, gr->map.len, 1);
- }
gr->map.has_alpha |= (!!(255 - (dc->mul.col >> 24)));
}
EAPI void
-evas_common_gradient2_map(RGBA_Draw_Context *dc, void *pgr, int len)
+evas_common_gradient2_map(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
-
- if (!ogr || !dc) return;
- gr = ogr->engine_data;
- if (!gr) return;
+ if (!gr || !dc) return;
if (dc->interpolation.color_space == _EVAS_COLOR_SPACE_AHSV)
{
_evas_common_gradient2_map_ahsv(dc, gr, len);
#include "evas_common.h"
#include "evas_private.h"
-#include "evas_object_gradient2.h"
#include <math.h>
#define RADIAL_EPSILON 0.000030517578125
radial_shutdown(void);
static void
-radial_update_geom(void *pgr);
+radial_init_geom(RGBA_Gradient2 *gr);
+
+static void
+radial_update_geom(RGBA_Gradient2 *gr);
static void
radial_free_geom(void *gdata);
static int
-radial_has_alpha(void *pgr, int op);
+radial_has_alpha(RGBA_Gradient2 *gr, int op);
+
+static int
+radial_has_mask(RGBA_Gradient2 *gr, int op);
static int
-radial_has_mask(void *pgr, int op);
+radial_get_map_len(RGBA_Gradient2 *gr);
static Gfx_Func_Gradient2_Fill
-radial_get_fill_func(void *pgr, int op);
+radial_get_fill_func(RGBA_Gradient2 *gr, int op);
static RGBA_Gradient2_Type radial = {"radial", radial_init, radial_shutdown,
- radial_free_geom,
+ radial_init_geom,
+ radial_update_geom, radial_free_geom,
radial_has_alpha, radial_has_mask,
- radial_get_fill_func};
+ radial_get_map_len, radial_get_fill_func};
EAPI RGBA_Gradient2_Type *
}
EAPI RGBA_Gradient2 *
-evas_common_rgba_gradient2_radial_new(void)
+evas_common_gradient2_radial_new(void)
{
RGBA_Gradient2 *gr;
- Radial_Data *radial_data;
gr = calloc(1, sizeof(RGBA_Gradient2));
if (!gr) return NULL;
- radial_data = calloc(1, sizeof(Radial_Data));
- if (!radial_data) return;
gr->references = 1;
gr->type.id = MAGIC_OBJ_GRADIENT_RADIAL;
gr->type.geometer = &radial;
-
- radial_data->cx = radial_data->cy = 0;
- radial_data->rx = radial_data->ry = 0;
- radial_data->axx = 65536; radial_data->axy = 0;
- radial_data->ayx = 0; radial_data->ayy = 65536;
- radial_data->len = 0;
- gr->type.gdata = radial_data;
-
+ radial_init_geom(gr);
return gr;
}
EAPI void
-evas_common_gradient2_radial_render_pre(RGBA_Draw_Context *dc, void *pgr)
+evas_common_gradient2_radial_fill_set(RGBA_Gradient2 *gr, float cx, float cy, float rx, float ry)
{
- Evas_Object_Gradient2 *ogr = pgr;
- Evas_Object_Gradient2_Radial *rgr;
- RGBA_Gradient2 *gr;
Radial_Data *radial_data;
- float rx, ry;
- if (!dc || !ogr) return;
- rgr = (Evas_Object_Gradient2_Radial *)(ogr);
- if (!rgr) return;
- gr = ogr->engine_data;
if (!gr) return;
if (gr->type.id != MAGIC_OBJ_GRADIENT_RADIAL) return;
if (gr->type.geometer != &radial) return;
radial_data = (Radial_Data *)gr->type.gdata;
if (!radial_data) return;
- radial_data->cx = rgr->cur.fill.cx; radial_data->cy = rgr->cur.fill.cy;
- rx = rgr->cur.fill.rx; ry = rgr->cur.fill.ry;
if (rx < 0) rx = -rx; if (ry < 0) ry = -ry;
+ radial_data->cx = cx; radial_data->cy = cy;
radial_data->rx = 1 + rx; radial_data->ry = 1 + ry;
-
- radial_update_geom(ogr);
-
- evas_common_gradient2_map(dc, ogr, radial_data->len);
-}
-
-EAPI void
-evas_common_gradient2_radial_render_post(void *pgr)
-{
}
static void
radial_free_geom(void *gdata)
{
- Radial_Data *radial_data = (Radial_Data *)gdata;
- if (radial_data) free(radial_data);
+ Radial_Data *data = (Radial_Data *)gdata;
+ if (data) free(data);
}
+static void
+radial_init_geom(RGBA_Gradient2 *gr)
+{
+ Radial_Data *radial_data;
+
+ if (!gr || (gr->type.geometer != &radial)) return;
+
+ radial_data = (Radial_Data *)gr->type.gdata;
+ if (!radial_data)
+ {
+ radial_data = calloc(1, sizeof(Radial_Data));
+ if (!radial_data) return;
+ radial_data->cx = radial_data->cy = 0;
+ radial_data->rx = radial_data->ry = 0;
+ radial_data->axx = 65536; radial_data->axy = 0;
+ radial_data->ayx = 0; radial_data->ayy = 65536;
+ radial_data->len = 0;
+ }
+ gr->type.gdata = radial_data;
+}
static void
-radial_update_geom(void *pgr)
+radial_update_geom(RGBA_Gradient2 *gr)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
Radial_Data *radial_data;
double f, flen;
double fx1, fy1;
int len;
- if (!ogr) return;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &radial)) return;
radial_data = (Radial_Data *)gr->type.gdata;
if ((radial_data->rx < RADIAL_EPSILON) || (radial_data->ry < RADIAL_EPSILON)) return;
radial_data->len = 0;
- f = (ogr->cur.fill.transform.mxx * (double)ogr->cur.fill.transform.myy) - (ogr->cur.fill.transform.mxy * (double)ogr->cur.fill.transform.myx);
+ f = (gr->fill.transform.mxx * (double)gr->fill.transform.myy) - (gr->fill.transform.mxy * (double)gr->fill.transform.myx);
if (fabs(f) < RADIAL_EPSILON) return;
f = 1.0 / f;
- radial_data->cx0 = (((ogr->cur.fill.transform.myy * (double)radial_data->cx) - (ogr->cur.fill.transform.mxy * (double)radial_data->cy)) * f) - ogr->cur.fill.transform.mxz;
- radial_data->cy0 = ((-(ogr->cur.fill.transform.myx * (double)radial_data->cx) + (ogr->cur.fill.transform.mxx * (double)radial_data->cy)) * f) - ogr->cur.fill.transform.myz;
+ radial_data->cx0 = (((gr->fill.transform.myy * (double)radial_data->cx) - (gr->fill.transform.mxy * (double)radial_data->cy)) * f) - gr->fill.transform.mxz;
+ radial_data->cy0 = ((-(gr->fill.transform.myx * (double)radial_data->cx) + (gr->fill.transform.mxx * (double)radial_data->cy)) * f) - gr->fill.transform.myz;
- fx1 = (ogr->cur.fill.transform.myy * (double)radial_data->rx) * f;
- fy1 = (ogr->cur.fill.transform.myx * (double)radial_data->rx) * f;
+ fx1 = (gr->fill.transform.myy * (double)radial_data->rx) * f;
+ fy1 = (gr->fill.transform.myx * (double)radial_data->rx) * f;
flen = hypot(fx1, fy1);
- fx1 = (ogr->cur.fill.transform.mxy * (double)radial_data->ry) * f;
- fy1 = (ogr->cur.fill.transform.mxx * (double)radial_data->ry) * f;
+ fx1 = (gr->fill.transform.mxy * (double)radial_data->ry) * f;
+ fy1 = (gr->fill.transform.mxx * (double)radial_data->ry) * f;
flen = sqrt(flen * hypot(fx1, fy1));
radial_data->len = len = flen + 0.5;
if (!len) return;
- radial_data->axx = (((double)ogr->cur.fill.transform.mxx * 65536) * flen) / radial_data->rx;
- radial_data->axy = (((double)ogr->cur.fill.transform.mxy * 65536) * flen) / radial_data->rx;
+ radial_data->axx = (((double)gr->fill.transform.mxx * 65536) * flen) / radial_data->rx;
+ radial_data->axy = (((double)gr->fill.transform.mxy * 65536) * flen) / radial_data->rx;
- radial_data->ayx = (((double)ogr->cur.fill.transform.myx * 65536) * flen) / radial_data->ry;
- radial_data->ayy = (((double)ogr->cur.fill.transform.myy * 65536) * flen) / radial_data->ry;
+ radial_data->ayx = (((double)gr->fill.transform.myx * 65536) * flen) / radial_data->ry;
+ radial_data->ayy = (((double)gr->fill.transform.myy * 65536) * flen) / radial_data->ry;
}
static int
-radial_has_alpha(void *pgr, int op)
+radial_has_alpha(RGBA_Gradient2 *gr, int op)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
+ Radial_Data *radial_data;
- if (!ogr) return 0;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &radial)) return 0;
if (gr->has_alpha | gr->map.has_alpha)
return 1;
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
return 0;
- if (ogr->cur.fill.spread == _EVAS_TEXTURE_RESTRICT)
+ radial_data = (Radial_Data *)gr->type.gdata;
+ if (!radial_data) return 0;
+ if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
return 1;
return 0;
}
static int
-radial_has_mask(void *pgr, int op)
+radial_has_mask(RGBA_Gradient2 *gr, int op)
{
- Evas_Object_Gradient2 *ogr= pgr;
- RGBA_Gradient2 *gr;
+ Radial_Data *radial_data;
- if (!ogr) return 0;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &radial)) return 0;
if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
{
- if (ogr->cur.fill.spread == _EVAS_TEXTURE_RESTRICT)
+ radial_data = (Radial_Data *)gr->type.gdata;
+ if (!radial_data) return 0;
+ if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
return 1;
}
return 0;
}
+static int
+radial_get_map_len(RGBA_Gradient2 *gr)
+{
+ Radial_Data *radial_data;
+
+ if (!gr || (gr->type.geometer != &radial)) return 0;
+ radial_data = (Radial_Data *)gr->type.gdata;
+ if (!radial_data) return 0;
+ return radial_data->len;
+}
+
static Gfx_Func_Gradient2_Fill
-radial_get_fill_func(void *pgr, int op)
+radial_get_fill_func(RGBA_Gradient2 *gr, int op)
{
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
Radial_Data *radial_data;
Gfx_Func_Gradient2_Fill sfunc = NULL;
int masked_op = 0;
- if (!ogr) return 0;
- gr = ogr->engine_data;
if (!gr || (gr->type.geometer != &radial)) return sfunc;
radial_data = (Radial_Data *)gr->type.gdata;
if (!radial_data) return sfunc;
(op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
masked_op = 1;
- switch (ogr->cur.fill.spread)
+ switch (gr->fill.spread)
{
case _EVAS_TEXTURE_REPEAT:
sfunc = radial_repeat_aa;
EAPI RGBA_Image *evas_common_load_image_from_file (const char *file, const char *key, RGBA_Image_Loadopts *lo);
EAPI int evas_common_save_image_to_file (RGBA_Image *im, const char *file, const char *key, int quality, int compress);
-EAPI void evas_common_image_render_pre (RGBA_Draw_Context *dc, void *pim);
-EAPI void evas_common_image_draw2 (RGBA_Image *dst, RGBA_Draw_Context *dc, void *pim, int x, int y, int w, int h);
-EAPI int evas_common_image_is_opaque(RGBA_Draw_Context *dc, void *pim, int x, int y, int w, int h);
-EAPI Gfx_Func_Image_Fill evas_common_image_fill_func_get(void *pim, int render_op);
#endif /* _EVAS_IMAGE_H */
+++ /dev/null
-#include "evas_common.h"
-#include "evas_blend_private.h"
-#include "evas_private.h"
-#include "evas_object_image.h"
-#include "./evas_image_private.h"
-#include <math.h>
-
-
-/* simple func that assumes a bunch of stuff... */
-static void
-_evas_common_image_draw_simple(RGBA_Image *dst, RGBA_Draw_Context *dc,
- RGBA_Image *im, int sx, int sy, int x, int y, int w, int h)
-{
- RGBA_Gfx_Func bfunc;
- int sw, dw;
- DATA32 *pdst, *dst_end, *src;
-// DATA8 *mask = NULL;
- int use_col = 1;
- DATA32 col;
-
- sw = im->cache_entry.w; dw = dst->cache_entry.w;
- col = dc->mul.col;
- if ((!dc->mul.use) || (dc->mul.col == 0xffffffff))
- use_col = 0;
- if (!use_col)
- bfunc = evas_common_gfx_func_composite_pixel_span_get(im, dst, w, dc->render_op);
- else
- bfunc = evas_common_gfx_func_composite_pixel_color_span_get(im, col, dst, w, dc->render_op);
- if (!bfunc) return;
-
- src = im->image.data + (sy * im->cache_entry.w) + sx;
- pdst = dst->image.data + (y * dst->cache_entry.w) + x;
- dst_end = pdst + (h * dst->cache_entry.w);
-
- while (pdst < dst_end)
- {
-#ifdef EVAS_SLI
- if ((y % dc->sli.h) == dc->sli.y)
- {
-#endif
- bfunc(src, NULL, col, pdst, w);
-#ifdef EVAS_SLI
- y++;
- }
-#endif
- src += sw; pdst += dw;
- }
-}
-
-static void
-_evas_common_image_draw2(RGBA_Image *dst, RGBA_Draw_Context *dc,
- void *pim, int x, int y, int w, int h)
-{
- Evas_Object_Image *oim = pim;
- RGBA_Image *im;
- Gfx_Func_Image_Fill ifunc;
- RGBA_Gfx_Func bfunc;
- int xin, yin, xoff, yoff;
- int clx, cly, clw, clh;
- int sw, sh, dw;
- DATA32 *pdst, *dst_end, *buf, *src;
- RGBA_Image argb_buf;
-// DATA8 *mask = NULL;
- Image_Draw_Data idata;
- int direct_copy = 0, buf_step = 0;
- int buf_has_alpha, use_col = 1;
- DATA32 col;
-
- if (!dc || !oim || !dst || !dst->image.data) return;
- if ((w < 1) || (h < 1)) return;
-
- im = oim->engine_data;
- if (!im || !im->image.data) return;
- sw = im->cache_entry.w; sh = im->cache_entry.h;
- if ((sw < 1) || (sh < 1)) return;
-
- clx = 0; cly = 0; clw = dst->cache_entry.w; clh = dst->cache_entry.h;
- if ((clw < 1) || (clh < 1)) return;
-
- if (dc->clip.use)
- RECTS_CLIP_TO_RECT(clx,cly,clw,clh, dc->clip.x,dc->clip.y,dc->clip.w,dc->clip.h);
- if ((clw < 1) || (clh < 1)) return;
-
- xin = x; yin = y;
- RECTS_CLIP_TO_RECT(x,y,w,h, clx,cly,clw,clh);
- if ((w < 1) || (h < 1)) return;
-
- if ((oim->cur.fill.spread == _EVAS_TEXTURE_RESTRICT) && (dc->render_op != _EVAS_RENDER_FILL))
- {
- int x0 = 0, y0 = 0, w0 = 0, h0 = 0;
-
- /* use one pixel border around fill to account for fuzzies... */
- evas_common_transform_affine_rect_bounds_get(&oim->cur.fill.transform,
- oim->cur.fill.x - 1, oim->cur.fill.y - 1,
- oim->cur.fill.w + 2, oim->cur.fill.h + 2,
- &x0, &y0, &w0, &h0);
- RECTS_CLIP_TO_RECT(x,y,w,h, x0 + xin,y0 + yin,w0,h0);
- if ((w < 1) || (h < 1)) return;
- }
-
- xoff = (x - xin);
- yoff = (y - yin);
-
- /*
- a quick hackism to take care of a simple but somewhat important case,
- will have a better go at this a bit later.
- */
- if ( oim->cur.fill.transform.is_identity && (oim->cur.fill.w == sw) && (oim->cur.fill.h == sh) &&
- (xoff >= oim->cur.fill.x) && (yoff >= oim->cur.fill.y) &&
- ((oim->cur.fill.x + sw) >= (xoff + w)) && ((oim->cur.fill.y + sh) >= (yoff + h)) )
- {
- _evas_common_image_draw_simple(dst, dc, im,
- xoff - oim->cur.fill.x, yoff - oim->cur.fill.y, x, y, w, h);
- return;
- }
-
- if (!evas_common_image_draw_data_setup(oim, &idata)) return;
-
- buf_has_alpha = im->cache_entry.flags.alpha;
- if ( (oim->cur.fill.spread == _EVAS_TEXTURE_RESTRICT) || (!oim->cur.border.center_fill) )
- buf_has_alpha = 1;
-
- /* we'll ignore masked stuff for now. */
-
- dw = dst->cache_entry.w;
- col = dc->mul.col;
- if ((!dc->mul.use) || (dc->mul.col == 0xffffffff))
- use_col = 0;
- if (!use_col && ((dc->render_op == _EVAS_RENDER_FILL) || (dc->render_op == _EVAS_RENDER_COPY)))
- {
- direct_copy = 1; buf_step = dw;
- if (buf_has_alpha)
- dst->cache_entry.flags.alpha = 1;
- }
- else if (!use_col && (dc->render_op == _EVAS_RENDER_BLEND) && (!buf_has_alpha))
- {
- direct_copy = 1; buf_step = dw;
- }
-
- if (!direct_copy)
- {
- buf = alloca(w * sizeof(DATA32));
- if (!buf) return;
- argb_buf.cache_entry.flags.alpha = buf_has_alpha;
- argb_buf.cache_entry.flags.alpha_sparse = im->cache_entry.flags.alpha_sparse;
- if ( (oim->cur.fill.spread == _EVAS_TEXTURE_RESTRICT) || (!oim->cur.border.center_fill) )
- argb_buf.cache_entry.flags.alpha_sparse = 1;
-
- if (!use_col)
- bfunc = evas_common_gfx_func_composite_pixel_span_get(&argb_buf, dst, w, dc->render_op);
- else
- bfunc = evas_common_gfx_func_composite_pixel_color_span_get(&argb_buf, col, dst, w, dc->render_op);
- if (!bfunc) return;
- }
-
- ifunc = evas_common_image_fill_func_get(oim, dc->render_op);
- if (!ifunc) return;
-
- src = im->image.data;
- pdst = dst->image.data + (y * dw) + x;
- dst_end = pdst + (h * dw);
- if (direct_copy) buf = pdst;
-
- while (pdst < dst_end)
- {
-#ifdef EVAS_SLI
- if ((y % dc->sli.h) == dc->sli.y)
- {
-#endif
- ifunc(src, sw, sh, buf, NULL, w, xoff, yoff, &idata);
- if (!direct_copy)
- bfunc(buf, NULL, col, pdst, w);
-#ifdef EVAS_SLI
- y++;
- }
-#endif
- buf += buf_step;
- pdst += dw;
- yoff++;
- }
-}
-
-
-EAPI void
-evas_common_image_render_pre(RGBA_Draw_Context *dc, void *pim)
-{
- Evas_Object_Image *oim = pim;
- RGBA_Image *im;
-
- if (!oim) return;
- im = oim->engine_data;
- if (!im) return;
- if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&im->cache_entry);
- evas_common_image_colorspace_normalize(im);
-}
-
-
-EAPI void
-evas_common_image_draw2(RGBA_Image *dst, RGBA_Draw_Context *dc,
- void *pim, int x, int y, int w, int h)
-{
- Cutout_Rects *rects;
- Cutout_Rect *r;
- int c, cx, cy, cw, ch;
- int i;
-
- /* handle cutouts here! */
-
- if (!dc || !dst || !dst->image.data) return;
- if ((w < 1) || (h < 1)) return;
- if (!(RECTS_INTERSECT(x, y, w, h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
- return;
- /* save out clip info */
- c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
- evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
- /* no cutouts - cut right to the chase */
- if (!dc->cutout.rects)
- {
- _evas_common_image_draw2(dst, dc, pim, x, y, w, h);
- }
- else
- {
- evas_common_draw_context_clip_clip(dc, x, y, w, h);
- /* our clip is 0 size.. abort */
- if ((dc->clip.w > 0) && (dc->clip.h > 0))
- {
- rects = evas_common_draw_context_apply_cutouts(dc);
- for (i = 0; i < rects->active; ++i)
- {
- r = rects->rects + i;
- evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
- _evas_common_image_draw2(dst, dc, pim, x, y, w, h);
- }
- evas_common_draw_context_apply_clear_cutouts(rects);
- }
- }
- /* restore clip info */
- dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
- evas_common_cpu_end_opt();
-}
EAPI Gfx_Func_Image_Fill
evas_common_image_fill_func_get(void *pim, int render_op)
{
- Evas_Object_Image *oim = pim;
- RGBA_Image *im;
- Gfx_Func_Image_Fill sfunc = NULL;
- int masked_op = 0;
-
- if (!oim) return sfunc;
- im = oim->engine_data;
- if (!im) return sfunc;
-
- if ( (render_op == _EVAS_RENDER_COPY) || (render_op == _EVAS_RENDER_COPY_REL) ||
- (render_op == _EVAS_RENDER_MASK) || (render_op == _EVAS_RENDER_MUL) )
- masked_op = 1;
-
- switch (oim->cur.fill.spread)
- {
- case _EVAS_TEXTURE_REPEAT:
- sfunc = image_repeat_affine_get(oim, render_op);
+ Evas_Object_Image *oim = pim;
+ RGBA_Image *im;
+ Gfx_Func_Image_Fill sfunc = NULL;
+ int masked_op = 0;
+
+ if (!oim) return sfunc;
+ im = oim->engine_data;
+ if (!im) return sfunc;
+
+ if ( (render_op == _EVAS_RENDER_COPY) || (render_op == _EVAS_RENDER_COPY_REL) ||
+ (render_op == _EVAS_RENDER_MASK) || (render_op == _EVAS_RENDER_MUL) )
+ masked_op = 1;
+
+ switch (oim->cur.fill.spread)
+ {
+ case _EVAS_TEXTURE_REPEAT:
+ sfunc = image_repeat_affine_get(oim, render_op);
break;
- case _EVAS_TEXTURE_REFLECT:
- sfunc = image_reflect_affine_get(oim, render_op);
+ case _EVAS_TEXTURE_REFLECT:
+ sfunc = image_reflect_affine_get(oim, render_op);
break;
- case _EVAS_TEXTURE_RESTRICT:
- if (masked_op)
- sfunc = image_restrict_masked_affine_get(oim, render_op);
- else
- sfunc = image_restrict_affine_get(oim, render_op);
+ case _EVAS_TEXTURE_RESTRICT:
+ if (masked_op)
+ sfunc = image_restrict_masked_affine_get(oim, render_op);
+ else
+ sfunc = image_restrict_affine_get(oim, render_op);
break;
- case _EVAS_TEXTURE_PAD:
- sfunc = image_pad_affine_get(oim, render_op);
+ case _EVAS_TEXTURE_PAD:
+ sfunc = image_pad_affine_get(oim, render_op);
break;
- default:
- sfunc = image_repeat_affine_get(oim, render_op);
+ default:
+ sfunc = image_repeat_affine_get(oim, render_op);
break;
- }
- return sfunc;
+ }
+ return sfunc;
}
+++ /dev/null
-
-
-/* pad funcs */
-
-/* FIXME: implement pad */
-
-static Gfx_Func_Image_Fill image_pad_affine_get(void *pim, int render_op)
-{
- return NULL;
-}
+++ /dev/null
-
-
-/* reflect funcs */
-
-
-/* FIXME: implement optimiztions and special-cases for this mode */
-
-
-static void
-src_a8r8g8b8_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ax = 1 + ((xx >> 8) & 0xff);
- int ay = 1 + ((yy >> 8) & 0xff);
- DATA32 *p, p3, p2, p1, p0;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; ax = 257 - ax; }
- if (x >= iw)
- {
- int m = (x % (2 * iw));
-
- x = (x % iw);
- if (m >= iw)
- { x = iw - x - 1; ax = 257 - ax; }
- }
-
- if (y < 0) { y = -y; ay = 257 - ay; }
- if (y >= ih)
- {
- int m = (y % (2 * ih));
-
- y = (y % ih);
- if (m >= ih)
- { y = ih - y - 1; ay = 257 - ay; }
- }
-
- p = im + (y * iw) + x;
- p0 = p1 = p2 = p3 = *p;
- if ((x + 1) < iw)
- p1 = *(p + 1);
- if ((y + 1) < ih)
- {
- p2 = *(p + iw);
- if ((x + 1) < iw)
- p3 = *(p + iw + 1);
- }
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- axx = (axx * iaxx) >> 16; axy = (axy * iaxx) >> 16;
- axz = ((axz - 32768) * iaxx) >> 16;
- ayx = (ayx * iayy) >> 16; ayy = (ayy * iayy) >> 16;
- ayz = ((ayz - 32768) * iayy) >> 16;
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ax = 1 + ((xx >> 8) & 0xff), ay = 1 + ((yy >> 8) & 0xff);
- DATA32 *p, p3, p2, p1, p0;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; ax = 257 - ax; }
- if (x >= iw)
- {
- int m = (x % (2 * iw));
-
- x = (x % iw);
- if (m >= iw)
- { x = iw - x - 1; ax = 257 - ax; }
- }
-
- if (y < 0) { y = -y; ay = 257 - ay; }
- if (y >= ih)
- {
- int m = (y % (2 * ih));
-
- y = (y % ih);
- if (m >= ih)
- { y = ih - y - 1; ay = 257 - ay; }
- }
-
- p = im + (y * iw) + x;
- p0 = p1 = p2 = p3 = *p;
- if ((x + 1) < iw)
- p1 = *(p + 1);
- if ((y + 1) < ih)
- {
- p2 = *(p + iw);
- if ((x + 1) < iw)
- p3 = *(p + iw + 1);
- }
-
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_u_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p2, p1, p0 = 0;
- int sgnx = 1, sgny = 1;
- int ay;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- x = xx >> 16; y = yy >> 16;
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
- iyy = (iayy * y); iy = iyy >> 16;
- ixx = (iaxx * x); ix = ixx >> 16;
-
- ay = 1 + ((iyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm6)
-#endif
- p = im + (iy * iw) + ix;
-
- txx = (ibxx * ix); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
-
- while (ix < iw)
- {
- p1 = p2 = *p;
- if (iy + 1 < ih) p2 = *(p + iw);
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p2)
- {
- MOV_P2R(p2, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p2)
- p1 = INTERP_256(ay, p2, p1);
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_u_d_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- int ixx, iyy, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *p, p3, p1, p0 = 0;
- int sgnx = 1, sgny = 1;
- int ax;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
- ixx = (iaxx * x); ix = ixx >> 16;
- iyy = (iayy * y); iy = iyy >> 16;
-
- ax = 1 + ((ixx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- p = im + (iy * iw) + ix;
-
- tyy = (ibyy * iy); ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
-
- while (iy < ih)
- {
- p3 = p1 = *p;
- if ((ix + 1) < iw) p3 = *(p + 1);
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_d_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day, dax = idata->dax;
- int ibyy = idata->ibyy, ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- int ixx, iyy, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p3, p2, p0 = 0;
- int sgnx = 1, sgny = 1;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
- ixx = (iaxx * x); ix0 = (ixx >> 16);
- iyy = (iayy * y); iy = (iyy >> 16);
-
- ps = im + (iy * iw);
-
- tyy = (ibyy * iy); ty = (tyy >> 16);
- ntyy = tyy + ibyy; nty = (ntyy >> 16);
-
- txx0 = (ibxx * ix0); tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- p2 = 0;
-#endif
- while (ix < iw)
- {
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p2 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p2 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p2 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ixx, ix, iyy, iy;
- int ax, ay;
- int sgnx = 1, sgny = 1;
- DATA32 *p, p3, p2, p1, p0;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
- ixx = (iaxx * (x - l)); ix = l + (ixx >> 16);
- iyy = (iayy * (y - t)); iy = t + (iyy >> 16);
-
- ax = 1 + ((ixx >> 8) & 0xff);
- ay = 1 + ((iyy >> 8) & 0xff);
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- if (sgnx < 0) ax = 257 - ax;
- }
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- if (sgny < 0) ay = 257 - ay;
- }
-
- p = im + (iy * iw) + ix;
- p0 = p1 = p2 = p3 = *p;
- if ((ix + 1) < iw)
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_u_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx;
- int dax = idata->dax;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p3, p2, p1, p0 = 0;
- int sgnx = 1, sgny = 1;
- int ay, ax;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
- iyy = (iayy * (y - t)); iy = t + (iyy >> 16);
- ay = 1 + ((iyy >> 8) & 0xff);
-
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- if (sgny < 0) ay = 257 - ay;
- }
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm7)
-#endif
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- if (sgnx < 0) ax = 257 - ax;
-
- p = im + (iy * iw) + ix;
- p0 = p1 = p2 = p3 = *p;
- if ((ix + 1) < iw)
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- INTERP_256_R2R(mm7, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- ixx = iaxx * (x - l); ix = (ixx >> 16);
- txx = (ibxx * ix) + ll; ix += l;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- p = im + (iy * iw) + ix;
-
- while (ix < iw)
- {
- p3 = p1 = *p;
- if (iy + 1 < ih) p3 = *(p + iw);
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- done:
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_u_d_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibyy = idata->ibyy;
- int day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *p, p3, p2, p1, p0 = 0;
- int sgnx = 1, sgny = 1;
- int ay, ax;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
- ixx = (iaxx * (x - l)); ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- if (sgnx < 0) ax = 257 - ax;
- }
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm7)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- if (sgny < 0) ay = 257 - ay;
-
- p = im + (iy * iw) + ix;
- p0 = p1 = p2 = p3 = *p;
- if ((ix + 1) < iw)
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm7, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- iyy = (iayy * (y - t)); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt; iy += t;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- p = im + (iy * iw) + ix;
-
- while (iy < ih)
- {
- p3 = p1 = *p;
- if ((ix + 1) < iw) p3 = *(p + 1);
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- done:
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_d_reflect(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx, ibyy = idata->ibyy;
- int dax = idata->dax, day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p3, p2, p1, p0 = 0;
- int sgnx = 1, sgny = 1;
- int ay, ax;
-
- x = (xx >> 16); y = (yy >> 16);
- if (x < 0) { x = -x; sgnx *= -1; }
- if (x >= fw)
- {
- int m = (x % (2 * fw));
-
- x = (x % fw);
- if (m >= fw)
- { x = fw - x - 1; sgnx *= -1; }
- }
-
- if (y < 0) { y = -y; sgny *= -1; }
- if (y >= fh)
- {
- int m = (y % (2 * fh));
-
- y = (y % fh);
- if (m >= fh)
- { y = fh - y - 1; sgny *= -1; }
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- if (sgny < 0) ay = 257 - ay;
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm6)
-#endif
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- if (sgnx < 0) ax = 257 - ax;
-
- p = im + (iy * iw) + ix;
- p0 = p1 = p2 = p3 = *p;
-
- if ((ix + 1) < iw)
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p0, mm1, mm0)
- if (p0 | p1 | p2 | p3)
- {
- MOV_A2R(ax, mm3)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm4, mm0)
- INTERP_256_R2R(mm3, mm4, mm2, mm5)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_A2R(dax, mm4)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
- ixx = iaxx * (x - l); ix = ixx >> 16;
- txx = (ibxx * ix) + ll; ix += l;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
-
- p = im + (iy * iw) + ix;
- while (ix < iw)
- {
- p3 = p1 = *p;
- if (iy + 1 < ih) p3 = *(p + iw);
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- goto done;
- }
-
- iyy = iayy * (y - t); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt; iy += t;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- if (sgnx < 0) ax = 257 - ax;
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
-
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- p3 = p1 = *p;
- if ((ix + 1) < iw) p3 = *(p + 1);
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- goto done;
- }
-
- ixx = iaxx * (x - l); ix0 = ixx >> 16;
- txx0 = (ibxx * ix0) + ll; ix0 += l;
- tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = im + (iy * iw);
-
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- p1 = 0;
-#endif
- while (ix < iw)
- {
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p1 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p1 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p1 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- done:
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-
-
-static Gfx_Func_Image_Fill image_reflect_affine_get(void *pim, int render_op)
-{
- Evas_Object_Image *oim = pim;
- Gfx_Func_Image_Fill func = NULL;
- int src_scaled = 0, src_smooth = 0, src_border = 0;
-
- if ((oim->cur.image.w != oim->cur.fill.w) || (oim->cur.image.h != oim->cur.fill.h))
- src_scaled = 1;
- if (oim->cur.smooth_scale)
- src_smooth = 1;
- if ((oim->cur.image.w <= oim->cur.fill.w) && (oim->cur.image.h <= oim->cur.fill.h))
- src_smooth = 0;
- if ( (oim->cur.border.l > 0) || (oim->cur.border.r > 0) ||
- (oim->cur.border.t > 0) || (oim->cur.border.b > 0) )
- src_border = 1;
- if (!src_scaled && oim->cur.border.center_fill)
- src_border = 0;
-
- func = src_a8r8g8b8_reflect;
- if (src_scaled)
- {
- if (src_border)
- {
- func = src_a8r8g8b8_border_scaled_reflect;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_u_reflect;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_u_d_reflect;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_d_reflect;
- }
- }
- else
- {
- func = src_a8r8g8b8_scaled_reflect;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_u_reflect;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_u_d_reflect;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_d_reflect;
- }
- }
- }
-
- return func;
-}
+++ /dev/null
-
-/* repeat funcs */
-
-
-/* identity transform */
-
-static void
-src_a8r8g8b8_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *q, *qe;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= iw) || (x < -iw)) x = x % iw;
- if (x < 0) x += iw;
- if ((y >= ih) || (y < -ih)) y = y % ih;
- if (y < 0) y += ih;
- im += (y * iw);
-
- q = im + x;
- if (x + len <= iw)
- {
- while (d < e)
- *d++ = *q++;
- return;
- }
-
- qe = im + iw;
- while (d < e)
- {
- *d++ = *q++;
- if (q == qe) q = im;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_x_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *p;
- int iaxx = idata->iaxx;
- int fw = idata->fw;
- int ixx, iww = iw << 16;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= ih) || (y < -ih)) y = y % ih;
- if (y < 0) y += ih;
- p = im + (y * iw);
- ixx = iaxx * x;
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ix;
- int ax;
- DATA32 *q0, *q1;
- DATA32 p0, p1;
-
- if (ixx >= iww) ixx = 0;
- ix = ixx >> 16;
- q0 = p + ix; q1 = p;
- if ((ix + 1) < iw)
- q1 = p + ix + 1;
- p0 = *q0; p1 = *q1;
- if (p0 | p1)
-#ifdef BUILD_MMX
- {
- ax = 1 + ((ixx >> 8) & 0xff);
- MOV_A2R(ax, mm3)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- ax = 1 + ((ixx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- }
-#endif
- *d++ = p0; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_y_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *p;
- int iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int iyy, iy;
- int ay;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= iw) || (x < -iw)) x = x % iw;
- if (x < 0) x += iw;
- iyy = iayy * y;
- iy = iyy >> 16;
- if ((iy >= ih) || (iy < -ih)) iy = iy % ih;
- if (iy < 0) iy += ih;
- p = im + (iy * iw);
- ay = 1 + ((iyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm3)
-#endif
- while (d < e)
- {
- DATA32 *q0, *q2;
- DATA32 p0, p2;
-
- if (x == iw) x = 0;
- q0 = p + x; q2 = im + x;
- if ((iy + 1) < ih)
- q2 = p + iw + x;
- p0 = *q0; p2 = *q2;
- if (p0 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ay, p2, p0);
-#endif
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len, *p;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int ixx, iyy, ay, iww = iw << 16;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
- ixx = (iaxx * x);
- iyy = (iayy * y);
- if (iyy >= (ih << 16)) iyy = 0;
- y = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- p = im + (y * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm4)
-#endif
- while (d < e)
- {
- int ix;
- int ax;
- DATA32 *q3, *q2, *q1, *q0;
- DATA32 p3, p2, p1, p0;
-
- if (ixx >= iww) ixx = 0;
- ix = ixx >> 16;
- q0 = p + ix;
- q1 = q0 - ix; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = q0 + 1;
- if (y + 1 < ih)
- {
- q2 = q0 + iw;
- q3 = q1 + iw;
- }
- p0 = *q0; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((ixx >> 8) & 0xff);
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- INTERP_256_R2R(mm4, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((ixx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_dx_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- DATA32 *q;
- int no_alpha = !idata->has_alpha;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= ih) || (y < -ih)) y = y % ih;
- if (y < 0) y += ih;
- q = im + (y * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- int ixx, ix;
- int txx, ntxx, tx, ntx;
- int ay;
- DATA32 *p;
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if (x == fw) x = 0;
- ixx = iaxx * x; ix = ixx >> 16;
- txx = (ibxx * ix); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- p = q + ix;
- while (ix < iw)
- {
- DATA32 p1 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
- else if (p1 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
- if (no_alpha) *d |= 0xff000000;
-#else
- if (no_alpha) p0 |= 0xff000000;
- *d = p0;
-#endif
- d++; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_dy_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int iyy0, iy0;
- int tyy0, ty0, ntyy0, nty0;
- DATA32 *q;
- int no_alpha = !idata->has_alpha;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= iw) || (x < -iw)) x = x % iw;
- if (x < 0) x += iw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
- iyy0 = (iayy * y);
- iy0 = iyy0 >> 16;
- tyy0 = (ibyy * iy0); ty0 = tyy0 >> 16;
- ntyy0 = tyy0 + ibyy; nty0 = ntyy0 >> 16;
- q = im + (iy0 * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- int iy = iy0;
- int tyy = tyy0, ntyy = ntyy0, ty = ty0, nty = nty0;
- DATA32 *p;
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if (x == iw) x = 0;
- p = q + x;
- while (iy < ih)
- {
- DATA32 p2 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p2, mm2, mm0)
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
- else if (p2 && (ty == y))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(day, p2);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
- if (no_alpha) *d |= 0xff000000;
-#else
- if (no_alpha) p0 |= 0xff000000;
- *d = p0;
-#endif
- d++; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_u_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int iyy, iy;
- int ay;
- DATA32 *q;
- int no_alpha = !idata->has_alpha;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- iyy = (iayy * y); iy = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- q = im + (iy * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(ay, mm6)
-#endif
- while (d < e)
- {
- int ixx, ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p;
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if (x == fw) x = 0;
- ixx = (iaxx * x); ix = ixx >> 16;
- txx = (ibxx * ix); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- p = q + ix;
- while (ix < iw)
- {
- DATA32 *q3, p3, p1;
-
- q3 = im + ix;
- if ((iy + 1) < ih)
- q3 = p + iw;
- p1 = *p; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
- if (no_alpha) *d |= 0xff000000;
-#else
- if (no_alpha) p0 |= 0xff000000;
- *d = p0;
-#endif
- d++; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_u_d_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int ixx, iyy0, iy0;
- int tyy0, ty0, ntyy0, nty0;
- DATA32 *q;
- int iww = iw << 16;
- int no_alpha = !idata->has_alpha;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
-
- ixx = (iaxx * x);
- if (ixx >= iww) ixx = 0;
- iyy0 = (iayy * y); iy0 = iyy0 >> 16;
- tyy0 = (ibyy * iy0); ty0 = tyy0 >> 16;
- ntyy0 = tyy0 + ibyy; nty0 = ntyy0 >> 16;
- q = im + (iy0 * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- int ix, iy = iy0;
- int tyy = tyy0, ntyy = ntyy0, ty = ty0, nty = nty0;
- int ax;
- DATA32 *p;
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if (ixx >= iww) ixx = 0;
- ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- p = q + ix;
- while (iy < ih)
- {
- DATA32 *q3 = q, p3, p2;
-
- if ((ix + 1) < iw)
- q3 = p + 1;
- p2 = *p; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p2, mm2, mm0)
- if (p2 | p3)
- {
- MOV_P2R(p3, mm7, mm0)
- INTERP_256_R2R(mm6, mm7, mm2, mm5)
- }
-#else
- if (p2 | p3)
- p2 = INTERP_256(ax, p3, p2);
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
- if (no_alpha) *d |= 0xff000000;
-#else
- if (no_alpha) p0 |= 0xff000000;
- *d = p0;
-#endif
- d++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_d_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day, dax = idata->dax;
- int ibyy = idata->ibyy, ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int iyy0, iy0;
- int tyy0, ty0, ntyy0, nty0;
- DATA32 *q;
- int no_alpha = !idata->has_alpha;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- iyy0 = (iayy * y); iy0 = iyy0 >> 16;
- tyy0 = (ibyy * iy0); ty0 = tyy0 >> 16;
- ntyy0 = tyy0 + ibyy; nty0 = ntyy0 >> 16;
- q = im + (iy0 * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm5)
-#endif
- while (d < e)
- {
- int ixx, ix, ix0, iy = iy0;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy = tyy0, ntyy = ntyy0, ty = ty0, nty = nty0;
- DATA32 *p, *ps;
- DATA32 p0 = 0;
-
- if (x == fw) x = 0;
- ixx = (iaxx * x); ix0 = (ixx >> 16);
- txx0 = (ibxx * ix0); tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = q;
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (iy < ih)
- {
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- DATA32 p2 = 0;
-#endif
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
- while (ix < iw)
- {
- DATA32 p3 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p2 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p2 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p2 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm5, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; x++;
- }
-}
-
-
-static void
-src_a8r8g8b8_border_scaled_x_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx;
- int l = idata->l, r = idata->r;
- int fw = idata->fw, fh = idata->fh;
- DATA32 *p;
-// int center_fill = idata->border_center_fill;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= ih) || (y < -ih)) y = y % ih;
- if (y < 0) y += ih;
- p = im + (y * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ixx, ix;
- int ax;
- DATA32 *q1;
- DATA32 p1, p0;
-
- if (x == fw) x = 0;
- ixx = iaxx * (x - l); ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- q1 = p;
- if ((ix + 1) < iw)
- q1 = (p + ix + 1);
- p0 = *(p + ix); p1 = *q1;
- if (ax && (p0 | p1))
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- MOV_A2R(ax, mm3)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_y_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iayy = idata->iayy;
- int t = idata->t, b = idata->b;
- int fh = idata->fh;
- int iyy, iy;
- int ay;
- DATA32 *p;
-// int center_fill = idata->border_center_fill;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= iw) || (x < -iw)) x = x % iw;
- if (x < 0) x += iw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- if ((y + 2) > (fh - b))
- y += (ih - fh);
- p = im + (y * iw);
- while (d < e)
- {
- if (x == iw) x = 0;
- *d++ = *(p + x); x++;
- }
- return;
- }
-
- iyy = iayy * (y - t);
- iy = t + (iyy >> 16);
- ay = 1 + ((iyy >> 8) & 0xff);
- p = im + (iy * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm3)
-#endif
- while (d < e)
- {
- DATA32 *q2;
- DATA32 p2, p0;
-
- if (x == iw) x = 0;
- q2 = im + x;
- if ((iy + 1) < ih)
- q2 = p + iw + x;
- p0 = *(p + x); p2 = *q2;
- if (p0 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ay, p2, p0);
-#endif
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int ay, iy;
- DATA32 *q;
-// int center_fill = idata->border_center_fill;
-
- x += (idata->axz >> 16); y += (idata->ayz >> 16);
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
-
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
-
- q = im + (iy * iw);
- while (d < e)
- {
- int ixx, ix;
- int ax;
- DATA32 p1, p0;
-
- if (x == fw) x = 0;
- ixx = iaxx * (x - l);
- ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
-
- p0 = *(q + ix); p1 = *q;
- if (ix + 1 < iw)
- p1 = *(q + ix + 1);
-
- if (ax && (p0 | p1))
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- MOV_A2R(ax, mm3)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- *d++ = p0; x++;
- }
- return;
- }
-
- iy = iayy * (y - t);
- ay = 1 + ((iy >> 8) & 0xff);
- iy = t + (iy >> 16);
- q = im + (iy * iw);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm4)
-#endif
- while (d < e)
- {
- int ixx, ix;
- int ax;
- DATA32 *q3, *q2, *q1, *q0;
- DATA32 p3, p2, p1, p0;
-
- if (x == fw) x = 0;
- ixx = iaxx * (x - l);
- ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- q0 = q + ix;
- q1 = q; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = q0 + 1;
- if (iy + 1 < ih)
- {
- q2 = q0 + iw;
- q3 = q1 + iw;
- }
- p0 = *q0; p1 = *q1; p2 = *q2; p3 = *q3;
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- if (ax)
- {
- MOV_P2R(p1, mm3, mm0)
- MOV_A2R(ax, mm6)
- INTERP_256_R2R(mm6, mm3, mm1, mm5)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
- INTERP_256_R2R(mm4, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- if (ax)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- }
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_u_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx;
- int dax = idata->dax;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int iyy, iy;
- int ay;
- DATA32 *q;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-// int center_fill = idata->border_center_fill;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- iyy = (iayy * (y - t)); iy = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- iy += t;
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 0;
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- }
- q = im + (iy * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm6)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- int ixx, ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p, *q2;
- DATA32 p2, p0 = 0;
-
- if (x == fw) x = 0;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- p = q + ix;
- p0 = *p;
- if (ay)
- {
- q2 = (im + ix);
- if ((iy + 1) < ih)
- q2 = (p + iw);
- p2 = *q2;
- if (p0 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ay, p2, p0);
-#endif
- }
- goto done;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- ixx = (iaxx * (x - l)); ix = ixx >> 16;
- txx = (ibxx * ix) + ll;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ix += l;
- p = q + ix;
- while (ix < iw)
- {
- DATA32 p1 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ay)
- {
- q2 = (im + ix);
- if ((iy + 1) < ih)
- q2 = (p + iw);
- p2 = *q2;
- if (p1 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p2, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- p1 = INTERP_256(ay, p2, p1);
-#endif
- }
-
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- done:
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_u_d_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibyy = idata->ibyy;
- int day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-// int center_fill = idata->border_center_fill;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- DATA32 *p;
- int iy = y;
-
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- p = im + (iy * iw);
- while (d < e)
- {
- int ixx, ix;
- int ax;
- DATA32 *q1, p1, p0;
-
- if (x == fw) x = 0;
- ixx = (iaxx * (x - l)); ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- ix += l;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- p0 = *(p + ix);
- if (ax)
- {
- q1 = p;
- if ((ix + 1) < iw)
- q1 = (p + ix + 1);
- p1 = *q1;
- if (p0 | p1)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- MOV_A2R(ax, mm3)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- }
- *d++ = p0; x++;
- }
- return;
- }
-
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int tyy, ntyy, ty, nty;
- int ax;
- DATA32 *p, p0 = 0;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if (x == fw) x = 0;
- ixx = (iaxx * (x - l)); ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- ix += l;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- iyy = (iayy * (y - t)); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- iy += t;
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- DATA32 *q3, p3, p1 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ax)
- {
- q3 = (p - ix);
- if ((ix + 1) < iw)
- q3 = (p + 1);
- p3 = *q3;
- if (p1 | p3)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p3, mm3, mm0)
- MOV_A2R(ax, mm6)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- p1 = INTERP_256(ax, p3, p1);
-#endif
- }
-
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_d_repeat_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx, ibyy = idata->ibyy;
- int dax = idata->dax, day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-// int center_fill = idata->border_center_fill;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm5)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- DATA32 *q;
- int iy = y;
-
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- q = im + (iy * iw);
- while (d < e)
- {
- int ixx, ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p1, p0 = 0;
- int ax;
-
- if (x == fw) x = 0;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- p0 = *(q + ix);
- goto done_t;
- }
-
- ixx = iaxx * (x - l); ix = ixx >> 16;
- txx = (ibxx * ix) + ll;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ix += l;
- p = q + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (ix < iw)
- {
- p1 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
- else if (p1 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- done_t:
- *d++ = p0; x++;
- }
- return;
- }
-
- while (d < e)
- {
- int iyy, ixx, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p0 = 0;
- int ay, ax;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- iyy = iayy * (y - t); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- iy += t;
- if (x == fw) x = 0;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- DATA32 p1 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
- else if (p1 && (ty == y))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm5, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- goto done;
- }
-
- ixx = iaxx * (x - l); ix0 = ixx >> 16;
- txx0 = (ibxx * ix0) + ll;
- tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = im + (iy * iw);
- ix0 += l;
- while (iy < ih)
- {
- DATA32 p1 = 0;
-
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#endif
- while (ix < iw)
- {
- DATA32 p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p1 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p1 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p1 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm5, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- done:
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; x++;
- }
-}
-
-/* also maybe border_scaled_dx/dy_repeat_simple */
-
-
-/* with transform */
-
-static void
-src_a8r8g8b8_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ax, ay;
- DATA32 *q3, *q2, *q1, *q0;
- DATA32 p3, p2, p1, p0;
-
- x = xx >> 16;
- if ((x >= iw) || (x < -iw))
- x = x % iw;
- if (x < 0)
- x += iw;
- y = yy >> 16;
- if ((y >= ih) || (y < -ih))
- y = y % ih;
- if (y < 0)
- y += ih;
-
- q0 = im + (y * iw) + x;
- q1 = q0 - x; q2 = im + x; q3 = im;
- if (x + 1 < iw)
- q1 = q0 + 1;
- if (y + 1 < ih)
- {
- q2 = q0 + iw;
- q3 = q1 + iw;
- }
- p0 = *q0; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- ay = 1 + ((yy >> 8) & 0xff);
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- ay = 1 + ((yy >> 8) & 0xff);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- axx = (axx * iaxx) >> 16; axy = (axy * iaxx) >> 16;
- axz = ((axz - 32768) * iaxx) >> 16;
- ayx = (ayx * iayy) >> 16; ayy = (ayy * iayy) >> 16;
- ayz = ((ayz - 32768) * iayy) >> 16;
- xx = (axx * (x + 0.5)) + (axy * (y + 0.5)) + axz;
- yy = (ayx * (x + 0.5)) + (ayy * (y + 0.5)) + ayz;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ix = xx >> 16, iy = yy >> 16;
- int ax, ay;
- DATA32 *q3, *q2, *q1, *q0;
- DATA32 p3, p2, p1, p0;
-
- if ((ix >= iw) || (ix < -iw))
- ix = ix % iw;
- if (ix < 0)
- ix += iw;
- if ((iy >= ih) || (iy < -ih))
- iy = iy % ih;
- if (iy < 0)
- iy += ih;
-
- q0 = im + (iy * iw) + ix;
- q1 = q0 - ix; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = q0 + 1;
- if (iy + 1 < ih)
- {
- q2 = q0 + iw;
- q3 = q1 + iw;
- }
- p0 = *q0; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- ay = 1 + ((yy >> 8) & 0xff);
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- ay = 1 + ((yy >> 8) & 0xff);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_u_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int txx, ntxx, tx, ntx;
- DATA32 *q0, *q2, p2, p1, p0 = 0;
- int ax, ay;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- iyy = (iayy * y); iy = iyy >> 16;
- ixx = (iaxx * x); ix = ixx >> 16;
-
- q0 = im + (iy * iw) + ix;
- ay = 1 + ((iyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm6)
-#endif
- txx = (ibxx * ix); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
-
- while (ix < iw)
- {
- q2 = im + ix;
- if (iy + 1 < ih) q2 = q0 + iw;
- p1 = *q0; p2 = *q2;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p2)
- {
- MOV_P2R(p2, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p2)
- p1 = INTERP_256(ay, p2, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- q0++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_u_d_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- int ixx, iyy, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *q0, *q3, p3, p1, p0 = 0;
- int ax;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- ixx = (iaxx * x); ix = ixx >> 16;
- iyy = (iayy * y); iy = iyy >> 16;
-
- ax = 1 + ((ixx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- q0 = im + (iy * iw);
-
- tyy = (ibyy * iy); ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
-
- while (iy < ih)
- {
- q3 = q0;
- if ((ix + 1) < iw) q3 = q0 + ix + 1;
- p1 = *(q0 + ix); p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- q0 += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_d_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day, dax = idata->dax;
- int ibyy = idata->ibyy, ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- int ixx, iyy, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p3, p2, p0 = 0;
-
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- ixx = (iaxx * x); ix0 = (ixx >> 16);
- iyy = (iayy * y); iy = (iyy >> 16);
-
- ps = im + (iy * iw);
-
- tyy = (ibyy * iy); ty = (tyy >> 16);
- ntyy = tyy + ibyy; nty = (ntyy >> 16);
-
- txx0 = (ibxx * ix0); tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- p2 = 0;
-#endif
- while (ix < iw)
- {
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p2 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p2 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p2 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-// int center_fill = idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- int ixx, ix, iyy, iy;
- int ax, ay;
- DATA32 *q3, *q2, *q1, *q0;
- DATA32 p3, p2, p1, p0;
-
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- ixx = (iaxx * (x - l)); ix = l + (ixx >> 16);
- iyy = (iayy * (y - t)); iy = t + (iyy >> 16);
-
- ax = 1 + ((ixx >> 8) & 0xff);
- ay = 1 + ((iyy >> 8) & 0xff);
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- }
-
- q0 = im + (iy * iw) + ix;
- q1 = q0 - ix; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = q0 + 1;
- if (iy + 1 < ih)
- {
- q2 = q0 + iw;
- q3 = q1 + iw;
- }
- p0 = *q0; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_u_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx;
- int dax = idata->dax;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-// int center_fill = idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int txx, ntxx, tx, ntx;
- DATA32 *p, *q3, *q2, *q1;
- DATA32 p3, p2, p1, p0 = 0;
- int ay, ax;
-
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- iyy = (iayy * (y - t)); iy = t + (iyy >> 16);
- ay = 1 + ((iyy >> 8) & 0xff);
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- }
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm7)
-#endif
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
- q1 = p - ix; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = p + 1;
- if (iy + 1 < ih)
- {
- q2 = p + iw;
- q3 = q1 + iw;
- }
- p0 = *p; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- INTERP_256_R2R(mm7, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- ixx = iaxx * (x - l); ix = (ixx >> 16);
- txx = (ibxx * ix) + ll; ix += l;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- p = im + (iy * iw) + ix;
-
- while (ix < iw)
- {
- q3 = im + ix;
- if (iy + 1 < ih) q3 = p + iw;
- p1 = *p; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- done:
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_u_d_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibyy = idata->ibyy;
- int day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-// int center_fill = idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *q3, *q2, *q1;
- DATA32 p3, p2, p1, p0 = 0;
- int ay, ax;
-
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
- ixx = (iaxx * (x - l)); ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm7)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
-
- p = im + (iy * iw) + ix;
- q1 = p - ix; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = p + 1;
- if (iy + 1 < ih)
- {
- q2 = p + iw;
- q3 = q1 + iw;
- }
- p0 = *p; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- if (p0 | p1 | p2 | p3)
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm7, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- ay = 1 + ((yy >> 8) & 0xff);
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- ay = 1 + ((yy >> 8) & 0xff);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- iyy = (iayy * (y - t)); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt; iy += t;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- p = im + (iy * iw) + ix;
-
- while (iy < ih)
- {
- q3 = p - ix;
- if ((ix + 1) < iw) q3 = p + 1;
- p1 = *p; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- done:
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-
-static void
-src_a8r8g8b8_border_scaled_d_d_repeat(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx, ibyy = idata->ibyy;
- int dax = idata->dax, day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
- int no_alpha = !idata->has_alpha && idata->border_center_fill;
-// int center_fill = idata->border_center_fill;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- int iyy, ixx, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, *q3, *q2, *q1;
- DATA32 p3, p2, p1, p0 = 0;
- int ay, ax;
-
- x = xx >> 16;
- if ((x >= fw) || (x < -fw)) x = x % fw;
- if (x < 0) x += fw;
- y = yy >> 16;
- if ((y >= fh) || (y < -fh)) y = y % fh;
- if (y < 0) y += fh;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm6)
-#endif
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
-
- q1 = p - ix; q2 = im + ix; q3 = im;
- if (ix + 1 < iw)
- q1 = p + 1;
- if (iy + 1 < ih)
- {
- q2 = p + iw;
- q3 = q1 + iw;
- }
- p0 = *p; p1 = *q1; p2 = *q2; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p0, mm1, mm0)
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm3)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm4, mm0)
- INTERP_256_R2R(mm3, mm4, mm2, mm5)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_A2R(dax, mm4)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
- ixx = iaxx * (x - l); ix = ixx >> 16;
- txx = (ibxx * ix) + ll; ix += l;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
-
- p = im + (iy * iw) + ix;
- while (ix < iw)
- {
- q3 = im + ix;
- if (iy + 1 < ih) q3 = p + iw;
- p1 = *p; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- goto done;
- }
-
- iyy = iayy * (y - t); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt; iy += t;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- q3 = p - ix;
- if ((ix + 1) < iw) q3 = p + 1;
- p1 = *p; p3 = *q3;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- goto done;
- }
-
- ixx = iaxx * (x - l); ix0 = ixx >> 16;
- txx0 = (ibxx * ix0) + ll; ix0 += l;
- tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = im + (iy * iw);
-
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- p1 = 0;
-#endif
- while (ix < iw)
- {
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p1 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p1 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p1 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- done:
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- if (no_alpha) p0 |= 0xff000000;
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-/* also maybe [border_]scaled_x/y/dx/dy_repeat */
-
-
-static Gfx_Func_Image_Fill image_repeat_affine_get(void *pim, int render_op)
-{
- Evas_Object_Image *oim = pim;
- Gfx_Func_Image_Fill func = NULL;
- int src_scaled = 0, src_smooth = 0, src_border = 0;
-
- if ((oim->cur.image.w != oim->cur.fill.w) || (oim->cur.image.h != oim->cur.fill.h))
- src_scaled = 1;
- if (oim->cur.smooth_scale)
- src_smooth = 1;
- if ((oim->cur.image.w <= oim->cur.fill.w) && (oim->cur.image.h <= oim->cur.fill.h))
- src_smooth = 0;
- if ( (oim->cur.border.l > 0) || (oim->cur.border.r > 0) ||
- (oim->cur.border.t > 0) || (oim->cur.border.b > 0) )
- src_border = 1;
- if (!src_scaled && oim->cur.border.center_fill)
- src_border = 0;
-
- func = src_a8r8g8b8_repeat;
- if (oim->cur.fill.transform.is_identity)
- {
- func = src_a8r8g8b8_repeat_simple;
- if (src_scaled)
- {
- if (src_border)
- {
- func = src_a8r8g8b8_border_scaled_repeat_simple;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_u_repeat_simple;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_u_d_repeat_simple;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_d_repeat_simple;
- }
- else // scaled, bordered, not smooth or uu
- {
- if (oim->cur.image.h == oim->cur.fill.h)
- return src_a8r8g8b8_border_scaled_x_repeat_simple;
- if (oim->cur.image.w == oim->cur.fill.w)
- return src_a8r8g8b8_border_scaled_y_repeat_simple;
- }
- return func;
- }
- else // scaled, no borders
- {
- func = src_a8r8g8b8_scaled_repeat_simple;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h < oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_u_repeat_simple;
- if ((oim->cur.image.w < oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_u_d_repeat;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_d_repeat_simple;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h == oim->cur.fill.h))
- return src_a8r8g8b8_scaled_dx_repeat_simple;
- if ((oim->cur.image.w == oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_dy_repeat_simple;
- }
- else // not smooth or uu
- {
- if (oim->cur.image.h == oim->cur.fill.h)
- return src_a8r8g8b8_scaled_x_repeat_simple;
- if (oim->cur.image.w == oim->cur.fill.w)
- return src_a8r8g8b8_scaled_y_repeat_simple;
- }
- return func;
- }
- }
- return func;
- }
-
- // non-identity transform
- if (src_scaled)
- {
- if (src_border)
- {
- func = src_a8r8g8b8_border_scaled_repeat;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_u_repeat;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_u_d_repeat;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_d_repeat;
- }
- }
- else // scaled, no borders
- {
- func = src_a8r8g8b8_scaled_repeat;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_u_repeat;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_u_d_repeat;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_d_repeat;
- }
- }
- }
- return func;
-}
+++ /dev/null
-
-/* restrict funcs */
-
-
-/* identity transform */
-
-static void
-src_a8r8g8b8_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *p;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= ih))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
- p = im + (y * iw) + x;
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < iw)
- p0 = *p;
- *d++ = p0; p++; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_x_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *p;
- int iaxx = idata->iaxx;
- int fw = idata->fw;
- int ixx;
-
- y += idata->ayz >> 16;
- if ((y < 0) || (y >= ih))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
- x += idata->axz >> 16;
- ixx = iaxx * x;
- p = im + (y * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < fw)
- {
- int ix = ixx >> 16;
- int ax = 1 + ((ixx >> 8) & 0xff);
- DATA32 p1 = p0 = *(p + ix);
-
- if ((ix + 1) < iw)
- p1 = *(p + ix + 1);
- if (p0 | p1)
-#ifdef BUILD_MMX
- {
- MOV_A2R(ax, mm3)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- }
- *d++ = p0; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_y_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *p;
- int iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int iyy, iy;
- int ay;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- iyy = iayy * y;
- iy = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- p = im + (iy * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm3)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < fw)
- {
- DATA32 p2 = p0 = *(p + x);
-
- if ((iy + 1) < ih)
- p2 = *(p + iw + x);
- if (p0 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ay, p2, p0);
-#endif
- }
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- DATA32 *q;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int ixx, iyy, iy;
- int ay;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- ixx = iaxx * x; iyy = iayy * y;
- iy = iyy >> 16;
- q = im + (iy * iw);
- ay = 1 + ((iyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < fw)
- {
- int ix = ixx >> 16;
- int ax = 1 + ((ixx >> 8) & 0xff);
- DATA32 *p = q + ix, p3, p2, p1;
-
- p0 = p1 = p2 = p3 = *p;
- if ((ix + 1) < iw)
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- INTERP_256_R2R(mm4, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- }
- *d++ = p0; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_dx_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axz = idata->axz;
- int ayz = idata->ayz;
- int ixx;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- ixx = (iaxx * x);
- q = im + (y * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if ((unsigned) x < fw)
- {
- int ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p;
- int ay;
-
- ix = ixx >> 16;
- txx = (ibxx * ix); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- p = q + ix;
- while (ix < iw)
- {
- DATA32 p1 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
- else if (p1 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
-#else
- *d = p0;
-#endif
- d++; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_dy_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int axz = idata->axz;
- int ayz = idata->ayz;
- int iyy0, iy0;
- int tyy0, ty0, ntyy0, nty0;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- iyy0 = (iayy * y); iy0 = iyy0 >> 16;
- tyy0 = (ibyy * iy0); ty0 = tyy0 >> 16;
- ntyy0 = tyy0 + ibyy; nty0 = ntyy0 >> 16;
- q = im + (iy0 * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if ((unsigned) x < fw)
- {
- int iy = iy0;
- int tyy = tyy0, ntyy = ntyy0, ty = ty0, nty = nty0;
- DATA32 *p = q + x;
-
- while (iy < ih)
- {
- DATA32 p2 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p2, mm2, mm0)
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
- else if (p2 && (ty == y))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(day, p2);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
-#else
- *d = p0;
-#endif
- d++; x++;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_u_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axz = idata->axz;
- int ayz = idata->ayz;
- int ixx, iyy, iy;
- int ay;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- ixx = (iaxx * x);
- iyy = (iayy * y); iy = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- q = im + (iy * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(ay, mm6)
-#endif
- while (d < e)
- {
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if ((unsigned) x < fw)
- {
- int ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p;
-
- ix = ixx >> 16;
- txx = (ibxx * ix); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- p = q + ix;
- while (ix < iw)
- {
- DATA32 p3, p1 = p3 = *p;
-
- if ((iy + 1) < ih)
- p3 = *(p + iw);
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
-#else
- *d = p0;
-#endif
- d++; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_u_d_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int axz = idata->axz;
- int ayz = idata->ayz;
- int ixx, iyy0, iy0;
- int tyy0, ty0, ntyy0, nty0;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- ixx = (iaxx * x);
- iyy0 = (iayy * y); iy0 = iyy0 >> 16;
- tyy0 = (ibyy * iy0); ty0 = tyy0 >> 16;
- ntyy0 = tyy0 + ibyy; nty0 = ntyy0 >> 16;
- q = im + (iy0 * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
-#ifndef BUILD_MMX
- DATA32 p0 = 0;
-#else
- pxor_r2r(mm1, mm1);
-#endif
- if ((unsigned) x < fw)
- {
- int ix, iy = iy0;
- int tyy = tyy0, ntyy = ntyy0, ty = ty0, nty = nty0;
- DATA32 *p;
- int ax;
-
- ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- p = q + ix;
- while (iy < ih)
- {
- DATA32 p3, p2 = p3 = *p;
-
- if ((ix + 1) < iw)
- p3 = *(p + 1);
-#ifdef BUILD_MMX
- MOV_P2R(p2, mm2, mm0)
- if (p2 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p2 | p3)
- p2 = INTERP_256(ax, p3, p2);
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, *d, mm0)
-#else
- *d = p0;
-#endif
- d++; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_d_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day, dax = idata->dax;
- int ibyy = idata->ibyy, ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axz = idata->axz;
- int ayz = idata->ayz;
- int ixx, iyy0, iy0;
- int tyy0, ty0, ntyy0, nty0;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- ixx = (iaxx * x);
- iyy0 = (iayy * y); iy0 = iyy0 >> 16;
- tyy0 = (ibyy * iy0); ty0 = tyy0 >> 16;
- ntyy0 = tyy0 + ibyy; nty0 = ntyy0 >> 16;
- q = im + (iy0 * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if ((unsigned) x < fw)
- {
- int ix, ix0, iy = iy0;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy = tyy0, ntyy = ntyy0, ty = ty0, nty = nty0;
- DATA32 *p, *ps;
-
- ix0 = (ixx >> 16);
- txx0 = (ibxx * ix0); tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = q;
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (iy < ih)
- {
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- DATA32 p2 = 0;
-#endif
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
- while (ix < iw)
- {
- DATA32 p3 = *p;
-
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p2 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p2 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p2 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
- *d++ = p0; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_x_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx;
- int l = idata->l, r = idata->r;
- int fw = idata->fw, fh = idata->fh;
- int ixx;
- DATA32 *p;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
- ixx = iaxx * (x - l);
- p = im + (y * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < fw)
- {
- int ix;
- int ax;
- DATA32 p1;
-
- ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- p0 = p1 = *(p + ix);
- if ((ix + 1) < iw)
- p1 = *(p + ix + 1);
- if (ax && (p0 | p1))
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- MOV_A2R(ax, mm3)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- }
- *d++ = p0; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_y_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iayy = idata->iayy;
- int t = idata->t, b = idata->b;
- int fh = idata->fh;
- int iyy, iy;
- int ay;
- DATA32 *p;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- if ((y + 2) > (fh - b))
- y += (ih - fh);
- p = im + (y * iw) + x;
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < iw)
- p0 = *p;
- *d++ = p0; p++; x++;
- }
- return;
- }
-
- iyy = iayy * (y - t);
- iy = t + (iyy >> 16);
- ay = 1 + ((iyy >> 8) & 0xff);
- p = im + (iy * iw) + x;
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm3)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < iw)
- {
- DATA32 p2 = p0 = *p;
-
- if ((iy + 1) < ih)
- p2 = *(p + iw);
- if (p0 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ay, p2, p0);
-#endif
- }
- *d++ = p0; p++; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int ixx, iyy, iy;
- int ay;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- ixx = iaxx * (x - l);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
-
- q = im + (iy * iw);
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < fw)
- {
- int ix;
- int ax;
- DATA32 p1;
-
- ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
-
- p0 = *(q + ix); p1 = *q;
- if (ix + 1 < iw)
- p1 = *(q + ix + 1);
-
- if (ax && (p0 | p1))
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- MOV_A2R(ax, mm3)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- }
- *d++ = p0; x++; ixx += iaxx;
- }
- return;
- }
-
- iyy = iayy * (y - t);
- ay = 1 + ((iyy >> 8) & 0xff);
- iy = t + (iyy >> 16);
- q = im + (iy * iw);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if (((unsigned) x) < fw)
- {
- int ix;
- int ax;
- DATA32 *p, p3, p2, p1;
-
- ix = l + (ixx >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- p = q + ix;
- p0 = p1 = p2 = p3 = *p;
- if ((ix + 1) < iw)
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- if (ax)
- {
- MOV_P2R(p1, mm3, mm0)
- MOV_A2R(ax, mm6)
- INTERP_256_R2R(mm6, mm3, mm1, mm5)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
- INTERP_256_R2R(mm4, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- if (ax)
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- }
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- }
- *d++ = p0; x++; ixx += iaxx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_u_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx;
- int dax = idata->dax;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int iyy, iy;
- int ay;
- DATA32 *q;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
- iyy = (iayy * (y - t)); iy = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- iy += t;
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 0;
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- }
- q = im + (iy * iw);
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(ay, mm6)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if ((unsigned) x < fw)
- {
- int ixx, ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p2;
- int ax;
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = q + ix;
- p0 = *p;
- if (ay)
- {
- p2 = p0;
- if ((iy + 1) < ih)
- p2 = *(p + iw);
- if (p0 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p2, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ay, p2, p0);
-#endif
- }
- goto done;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- ixx = (iaxx * (x - l)); ix = ixx >> 16;
- txx = (ibxx * ix) + ll;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ix += l;
- p = q + ix;
- while (ix < iw)
- {
- DATA32 p1 = p2 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ay && ((iy + 1) < ih))
- {
- p2 = *(p + iw);
- if (p1 | p2)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p2, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- p1 = INTERP_256(ay, p2, p1);
-#endif
- }
-
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
- p0 = MUL_256(ax, p1);
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- done:
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_u_d_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibyy = idata->ibyy;
- int day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- DATA32 *p;
- int iy = y;
-
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- p = im + (iy * iw);
- while (d < e)
- {
- DATA32 p0 = 0;
-
- if ((unsigned) x < fw)
- {
- int ixx, ix;
- DATA32 p1;
- int ax;
-
- ixx = (iaxx * (x - l)); ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- ix += l;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- p0 = *(p + ix);
- if (ax)
- {
- p1 = p0;
- if ((ix + 1) < iw)
- p1 = *(p + ix + 1);
- if (p0 | p1)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- MOV_A2R(ax, mm3)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- p0 = INTERP_256(ax, p1, p0);
-#endif
- }
- }
- *d++ = p0; x++;
- }
- return;
- }
-
- while (d < e)
- {
- DATA32 p0 = 0;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ((unsigned) x < fw)
- {
- int iyy, ixx, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *p, p3, p1;
- int ay, ax;
-
- ixx = (iaxx * (x - l)); ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- ix += l;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 0;
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- iyy = (iayy * (y - t)); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- iy += t;
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- p3 = p1 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ax)
- {
- if ((ix + 1) < iw)
- p3 = *(p + 1);
- if (p1 | p3)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p3, mm3, mm0)
- MOV_A2R(ax, mm6)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- p1 = INTERP_256(ax, p3, p1);
-#endif
- }
-
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- *d++ = p0; x++;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_d_restrict_simple(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx, ibyy = idata->ibyy;
- int dax = idata->dax, day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
-
- x += idata->axz >> 16; y += idata->ayz >> 16;
- if ((y < 0) || (y >= fh))
- {
- while (d < e)
- *d++ = 0;
- return;
- }
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm5)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- DATA32 *q;
- int iy = y;
-
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- q = im + (iy * iw);
- while (d < e)
- {
- int ixx, ix;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p1, p0 = 0;
- int ax;
-
- if ((unsigned) x < fw)
- {
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- p0 = *(q + ix);
- goto done_t;
- }
- ixx = iaxx * (x - l); ix = ixx >> 16;
- txx = (ibxx * ix) + ll;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ix += l;
- p = q + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (ix < iw)
- {
- p1 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
- else if (p1 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- done_t:
- *d++ = p0; x++;
- }
- return;
- }
-
- while (d < e)
- {
- DATA32 p0 = 0;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ((unsigned) x < fw)
- {
- int iyy, ixx, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p3, p1;
- int ay, ax;
-
- iyy = iayy * (y - t); iy = iyy >> 16;
- tyy = (ibyy * iy) + tt;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- iy += t;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- p1 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
- else if (p1 && (ty == y))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm5, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- goto done;
- }
-
- ixx = iaxx * (x - l); ix0 = ixx >> 16;
- txx0 = (ibxx * ix0) + ll;
- tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = im + (iy * iw);
- ix0 += l;
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
- p1 = 0;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#endif
- while (ix < iw)
- {
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p1 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p1 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p1 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm5, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
- done:
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- *d++ = p0; x++;
- }
-}
-
-/* also maybe border_scaled_dx/dy_restrict_simple */
-
-
-/* with transform */
-
-static void
-src_a8r8g8b8_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
- if ( (((unsigned) (x + 1)) < (iw + 1)) && (((unsigned) (y + 1)) < (ih + 1)) )
- {
- DATA32 p3 = 0, p2 = 0, p1 = 0;
- DATA32 *p = im + (y * iw) + x;
- int ax, ay;
-
- if ((x > -1) && (y > -1))
- p0 = *p;
- if ((y > -1) && ((x + 1) < iw))
- p1 = *(p + 1);
- if ((y + 1) < ih)
- {
- if (x > -1)
- p2 = *(p + iw);
- if ((x + 1) < iw)
- p3 = *(p + iw + 1);
- }
-
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- ay = 1 + ((yy >> 8) & 0xff);
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- ay = 1 + ((yy >> 8) & 0xff);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- }
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
- #ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int ixx, ix, iyy, iy;
- int ax, ay;
- DATA32 *p, p3 = 0, p2 = 0, p1 = 0;
-
- ixx = (iaxx * xx) >> 16; ix = ixx >> 16;
- iyy = (iayy * yy) >> 16; iy = iyy >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- ay = 1 + ((iyy >> 8) & 0xff);
- if ((x < 0) || ((x + 2) > fw))
- ax = 1 + ((xx >> 8) & 0xff);
- if ((y < 0) || ((y + 2) > fh))
- ay = 1 + ((yy >> 8) & 0xff);
-
- p = im + (iy * iw) + ix;
-
- if ((ix > -1) && (iy > -1))
- p0 = *p;
- if ((iy > -1) && ((ix + 1) < iw))
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- if (ix > -1)
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- }
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_u_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int dax = idata->dax;
- int ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int iyy, ixx, ix, iy;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p3 = 0, p1 = 0;
- int ay;
-
- iyy = (iayy * yy) >> 16; iy = iyy >> 16;
- ixx = (iaxx * xx) >> 16; ix = ixx >> 16;
- txx = (ibxx * ix) - (xx & 0xffff); tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- if ((y < 0) || ((y + 2) > fh))
- ay = 1 + ((yy >> 8) & 0xff);
- p = im + (iy * iw) + ix;
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm6)
-#endif
- while (ix < iw)
- {
- p3 = p1 = 0;
- if (ix > -1)
- {
- if (iy > -1)
- p1 = *p;
- if ((iy + 1) < ih)
- p3 = *(p + iw);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_u_d_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day;
- int ibyy = idata->ibyy;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int ixx, iyy, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *p, p3 = 0, p2 = 0;
- int ax;
-
- ixx = (iaxx * xx) >> 16; ix = ixx >> 16;
- iyy = (iayy * yy) >> 16; iy = iyy >> 16;
- tyy = (ibyy * iy) - (yy & 0xffff); ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- if ((x < 0) || ((x + 2) > fw))
- ax = 1 + ((xx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- p = im + (iy * iw) + ix;
-
- while (iy < ih)
- {
- p3 = p2 = 0;
- if (iy > -1)
- {
- if (ix > -1)
- p2 = *p;
- if ((ix + 1) < iw)
- p3 = *(p + 1);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p2, mm2, mm0)
- if (p2 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p2 | p3)
- p2 = INTERP_256(ax, p3, p2);
-#endif
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_scaled_d_d_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int day = idata->day, dax = idata->dax;
- int ibyy = idata->ibyy, ibxx = idata->ibxx;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int ixx, iyy, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p3, p2;
-
- ixx = ((iaxx * xx) >> 16); ix0 = (ixx >> 16);
- iyy = ((iayy * yy) >> 16); iy = (iyy >> 16);
- tyy = (ibyy * iy) - (yy & 0xffff); ty = (tyy >> 16);
- ntyy = tyy + ibyy; nty = (ntyy >> 16);
- txx0 = (ibxx * ix0) - (xx & 0xffff); tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = im + (iy * iw);
-
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#else
- p2 = 0;
-#endif
- while (ix < iw)
- {
- p3 = 0;
- if ((ix > -1) && (iy > -1))
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- int ax;
-
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p2 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p2 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p2 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- int ay;
-
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p2);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p2);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p2 && (ty == y))
- p0 += MUL_256(day, p2);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibyy = idata->ibyy, ibxx = idata->ibxx;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int ixx, ix, iyy, iy;
- int ax, ay;
- DATA32 *p, p3 = 0, p2 = 0, p1 = 0;
-
- ixx = (iaxx * (xx - ll)) >> 16; ix = l + (ixx >> 16);
- iyy = (iayy * (yy - tt)) >> 16; iy = t + (iyy >> 16);
- ax = 1 + ((ixx >> 8) & 0xff);
- ay = 1 + ((iyy >> 8) & 0xff);
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- }
-
- p = im + (iy * iw) + ix;
-
- if ((ix > -1) && (iy > -1))
- p0 = *p;
- if ((iy > -1) && ((ix + 1) < iw))
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- if (ix > -1)
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- }
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_u_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx;
- int dax = idata->dax;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int iyy, ixx, ix, iy;
- int txx, ntxx, tx, ntx;
- DATA32 *p, p3 = 0, p2 = 0, p1 = 0;
- int ay, ax;
-
- iyy = (iayy * (yy - tt)) >> 16; iy = iyy >> 16;
- ay = 1 + ((iyy >> 8) & 0xff);
- iy += t;
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
- }
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm7)
-#endif
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
-
- if ((ix > -1) && (iy > -1))
- p0 = *p;
- if ((iy > -1) && ((ix + 1) < iw))
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- if (ix > -1)
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm6)
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- INTERP_256_R2R(mm7, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
- ixx = (iaxx * (xx - ll)) >> 16; ix = ixx >> 16;
- txx = (ibxx * ix) - (xx & 0xffff) + ll;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ix += l;
- p = im + (iy * iw) + ix;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (ix < iw)
- {
- p1 = p3 = 0;
- if (ix > -1)
- {
- if (iy > -1)
- p1 = *p;
- if ((iy + 1) < ih)
- p3 = *(p + iw);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- done:
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_u_d_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibyy = idata->ibyy;
- int day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(day, mm4)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int iyy, ixx, ix, iy;
- int tyy, ntyy, ty, nty;
- DATA32 *p, p3 = 0, p2 = 0, p1 = 0;
- int ay, ax;
-
- ixx = (iaxx * (xx - ll)) >> 16; ix = ixx >> 16;
- ax = 1 + ((ixx >> 8) & 0xff);
- ix += l;
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
- }
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm7)
-#endif
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
-
- p = im + (iy * iw) + ix;
-
- if ((ix > -1) && (iy > -1))
- p0 = *p;
- if ((iy > -1) && ((ix + 1) < iw))
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- if (ix > -1)
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-
- if (p0 | p1 | p2 | p3)
-#ifdef BUILD_MMX
- {
- MOV_P2R(p0, mm1, mm0)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm7, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- ay = 1 + ((yy >> 8) & 0xff);
- MOV_A2R(ay, mm6)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_R2P(mm1, p0, mm0)
- }
-#else
- {
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- ay = 1 + ((yy >> 8) & 0xff);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
- iyy = (iayy * (yy - tt)) >> 16; iy = iyy >> 16;
- tyy = (ibyy * iy) - (yy & 0xffff) + tt;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- iy += t;
- p = im + (iy * iw) + ix;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- while (iy < ih)
- {
- p1 = p3 = 0;
- if (iy > -1)
- {
- if (ix > -1)
- p1 = *p;
- if ((ix + 1) < iw)
- p3 = *(p + 1);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm7, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- done:
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-static void
-src_a8r8g8b8_border_scaled_d_d_restrict(DATA32 *im, int iw, int ih, DATA32 *buf, DATA8 *mask, int len,
- int x, int y, void *data)
-{
- Image_Draw_Data *idata = data;
- DATA32 *d = buf, *e = d + len;
- long long int iaxx = idata->iaxx, iayy = idata->iayy;
- int ibxx = idata->ibxx, ibyy = idata->ibyy;
- int dax = idata->dax, day = idata->day;
- int l = idata->l, ll = (l << 16), r = idata->r;
- int t = idata->t, tt = (t << 16), b = idata->b;
- int fw = idata->fw, fh = idata->fh;
- int axx = idata->axx, axy = idata->axy, axz = idata->axz;
- int ayx = idata->ayx, ayy = idata->ayy, ayz = idata->ayz;
- int xx, yy;
-
- xx = (axx * x) + (axx >> 1) + (axy * y) + (axy >> 1) + axz - 32768;
- yy = (ayx * x) + (ayx >> 1) + (ayy * y) + (ayy >> 1) + ayz - 32768;
-
-#ifdef BUILD_MMX
- pxor_r2r(mm0, mm0);
- MOV_A2R(ALPHA_255, mm5)
- MOV_A2R(dax, mm4)
- MOV_A2R(day, mm7)
-#endif
- while (d < e)
- {
- DATA32 p0 = 0;
-
- x = (xx >> 16);
- y = (yy >> 16);
-
-#ifdef BUILD_MMX
- pxor_r2r(mm1, mm1);
-#endif
- if ( (((unsigned) (x + 1)) < (fw + 1)) && (((unsigned) (y + 1)) < (fh + 1)) )
- {
- int iyy, ixx, ix, ix0, iy;
- int txx, txx0, ntxx, ntxx0, tx, tx0, ntx, ntx0;
- int tyy, ntyy, ty, nty;
- DATA32 *p, *ps, p3 = 0, p2 = 0, p1 = 0;
- int ay, ax;
-
- if ((y < t) || ((y + 2) > (fh - b)))
- {
- ay = 1 + ((yy >> 8) & 0xff);
- iy = y;
- if ((y + 2) > (fh - b))
- iy += (ih - fh);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm6)
-#endif
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
-
- if ((ix > -1) && (iy > -1))
- p0 = *p;
- if ((iy > -1) && ((ix + 1) < iw))
- p1 = *(p + 1);
- if ((iy + 1) < ih)
- {
- if (ix > -1)
- p2 = *(p + iw);
- if ((ix + 1) < iw)
- p3 = *(p + iw + 1);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p0, mm1, mm0)
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- MOV_A2R(ax, mm3)
- MOV_P2R(p1, mm2, mm0)
- INTERP_256_R2R(mm3, mm2, mm1, mm5)
- MOV_P2R(p2, mm2, mm0)
- MOV_P2R(p3, mm4, mm0)
- INTERP_256_R2R(mm3, mm4, mm2, mm5)
- INTERP_256_R2R(mm6, mm2, mm1, mm5)
- MOV_A2R(dax, mm4)
- }
-#else
- if (p0 | p1 | p2 | p3)
- {
- ax = 1 + ((xx >> 8) & 0xff);
- p0 = INTERP_256(ax, p1, p0);
- p2 = INTERP_256(ax, p3, p2);
- p0 = INTERP_256(ay, p2, p0);
- }
-#endif
- goto done;
- }
-
- ixx = (iaxx * (xx - ll)) >> 16; ix = ixx >> 16;
- txx = (ibxx * ix) - (xx & 0xffff) + ll;
- tx = txx >> 16;
- ntxx = txx + ibxx; ntx = ntxx >> 16;
- ix += l;
- p = im + (iy * iw) + ix;
- while (ix < iw)
- {
- p1 = p3 = 0;
- if (ix > -1)
- {
- if (iy > -1)
- p1 = *p;
- if ((iy + 1) < ih)
- p3 = *(p + iw);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ay, p3, p1);
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ax, p1);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ax, p1);
-#endif
- tx = ntx;
- }
-#ifdef BUILD_MMX
- else if (tx == x)
- {
- MUL4_256_R2R(mm4, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (tx == x))
- p0 += MUL_256(dax, p1);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
- goto done;
- }
-
- iyy = (iayy * (yy - tt)) >> 16; iy = iyy >> 16;
- tyy = (ibyy * iy) - (yy & 0xffff) + tt;
- ty = tyy >> 16;
- ntyy = tyy + ibyy; nty = ntyy >> 16;
- iy += t;
-
- if ((x < l) || ((x + 2) > (fw - r)))
- {
- ax = 1 + ((xx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm6)
-#endif
- ix = x;
- if ((x + 2) > (fw - r))
- ix += (iw - fw);
-
- p = im + (iy * iw) + ix;
- while (iy < ih)
- {
- p1 = p3 = 0;
- if (iy > -1)
- {
- if (ix > -1)
- p1 = *p;
- if ((ix + 1) < iw)
- p3 = *(p + 1);
- }
-#ifdef BUILD_MMX
- MOV_P2R(p1, mm2, mm0)
- if (p1 | p3)
- {
- MOV_P2R(p3, mm3, mm0)
- INTERP_256_R2R(mm6, mm3, mm2, mm5)
- }
-#else
- if (p1 | p3)
- p1 = INTERP_256(ax, p3, p1);
-#endif
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- p += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- goto done;
- }
-
- ixx = (iaxx * (xx - ll)) >> 16; ix0 = ixx >> 16;
- txx0 = (ibxx * ix0) - (xx & 0xffff) + ll;
- tx0 = (txx0 >> 16);
- ntxx0 = (txx0 + ibxx); ntx0 = (ntxx0 >> 16);
- ps = im + (iy * iw);
- ix0 += l;
-
- while (iy < ih)
- {
- txx = txx0; tx = tx0;
- ntxx = ntxx0; ntx = ntx0;
- ix = ix0; p = ps + ix;
- p1 = 0;
-#ifdef BUILD_MMX
- pxor_r2r(mm2, mm2);
-#endif
- while (ix < iw)
- {
- p3 = 0;
- if ((ix > -1) && (iy > -1))
- p3 = *p;
-#ifdef BUILD_MMX
- MOV_P2R(p3, mm6, mm0)
-#endif
- if (ntx != tx)
- {
- if (ntx != x)
- {
- ax = 256 - ((txx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- paddw_r2r(mm6, mm2);
-#else
- p1 += MUL_256(ax, p3);
-#endif
- break;
- }
- ax = 1 + ((ntxx >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ax, mm3)
- MUL4_256_R2R(mm3, mm6)
- movq_r2r(mm6, mm2);
-#else
- p1 = MUL_256(ax, p3);
-#endif
- tx = ntx;
- }
- else if (p3 && (tx == x))
-#ifdef BUILD_MMX
- {
- MUL4_256_R2R(mm4, mm6)
- paddw_r2r(mm6, mm2);
- }
-#else
- p1 += MUL_256(dax, p3);
-#endif
- p++; ix++;
- txx = ntxx; ntxx += ibxx; ntx = ntxx >> 16;
- }
-
- if (nty != ty)
- {
- if (nty != y)
- {
- ay = 256 - ((tyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- paddw_r2r(mm2, mm1);
-#else
- p0 += MUL_256(ay, p1);
-#endif
- break;
- }
- ay = 1 + ((ntyy >> 8) & 0xff);
-#ifdef BUILD_MMX
- MOV_A2R(ay, mm3)
- MUL4_256_R2R(mm3, mm2)
- movq_r2r(mm2, mm1);
-#else
- p0 = MUL_256(ay, p1);
-#endif
- ty = nty;
- }
-#ifdef BUILD_MMX
- else if (ty == y)
- {
- MUL4_256_R2R(mm7, mm2)
- paddw_r2r(mm2, mm1);
- }
-#else
- else if (p1 && (ty == y))
- p0 += MUL_256(day, p1);
-#endif
- ps += iw; iy++;
- tyy = ntyy; ntyy += ibyy; nty = ntyy >> 16;
- }
- }
- done:
-#ifdef BUILD_MMX
- MOV_R2P(mm1, p0, mm0)
-#endif
- *d++ = p0; xx += axx; yy += ayx;
- }
-}
-
-/* also maybe [border_]scaled_x/y/dx/dy_restrict */
-
-
-static Gfx_Func_Image_Fill image_restrict_affine_get(void *pim, int render_op)
-{
- Evas_Object_Image *oim = pim;
- Gfx_Func_Image_Fill func = NULL;
- int src_scaled = 0, src_smooth = 0, src_border = 0;
-
- if ((oim->cur.image.w != oim->cur.fill.w) || (oim->cur.image.h != oim->cur.fill.h))
- src_scaled = 1;
- if (oim->cur.smooth_scale)
- src_smooth = 1;
- if ((oim->cur.image.w <= oim->cur.fill.w) && (oim->cur.image.h <= oim->cur.fill.h))
- src_smooth = 0;
- if ( (oim->cur.border.l > 0) || (oim->cur.border.r > 0) ||
- (oim->cur.border.t > 0) || (oim->cur.border.b > 0) )
- src_border = 1;
- if (!src_scaled && oim->cur.border.center_fill)
- src_border = 0;
-
- func = src_a8r8g8b8_restrict;
- if (oim->cur.fill.transform.is_identity)
- {
- func = src_a8r8g8b8_restrict_simple;
- if (src_scaled)
- {
- if (src_border)
- {
- func = src_a8r8g8b8_border_scaled_restrict_simple;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_u_restrict_simple;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_u_d_restrict_simple;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_d_restrict_simple;
- }
- else // scaled, bordered, not smooth or uu
- {
- if (oim->cur.image.h == oim->cur.fill.h)
- return src_a8r8g8b8_border_scaled_x_restrict_simple;
- if (oim->cur.image.w == oim->cur.fill.w)
- return src_a8r8g8b8_border_scaled_y_restrict_simple;
- }
- return func;
- }
- else // scaled, no borders
- {
- func = src_a8r8g8b8_scaled_restrict_simple;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h < oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_u_restrict_simple;
- if ((oim->cur.image.w < oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_u_d_restrict;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_d_restrict_simple;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h == oim->cur.fill.h))
- return src_a8r8g8b8_scaled_dx_restrict_simple;
- if ((oim->cur.image.w == oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_dy_restrict_simple;
- }
- else // not smooth or uu
- {
- if (oim->cur.image.h == oim->cur.fill.h)
- return src_a8r8g8b8_scaled_x_restrict_simple;
- if (oim->cur.image.w == oim->cur.fill.w)
- return src_a8r8g8b8_scaled_y_restrict_simple;
- }
- return func;
- }
- }
- return func;
- }
-
- // non-identity transform
- if (src_scaled)
- {
- if (src_border)
- {
- func = src_a8r8g8b8_border_scaled_restrict;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_u_restrict;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_u_d_restrict;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_border_scaled_d_d_restrict;
- }
- }
- else // scaled, no borders
- {
- func = src_a8r8g8b8_scaled_restrict;
- if (src_smooth)
- {
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h <= oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_u_restrict;
- if ((oim->cur.image.w <= oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_u_d_restrict;
- if ((oim->cur.image.w > oim->cur.fill.w) & (oim->cur.image.h > oim->cur.fill.h))
- return src_a8r8g8b8_scaled_d_d_restrict;
- }
- }
- }
- return func;
-}
-
-
-/* masked restrict funcs */
-
-/* FIXME: implement masked restrict (fairly straightforward) */
-
-static Gfx_Func_Image_Fill image_restrict_masked_affine_get(void *pim, int render_op)
-{
- return NULL;
-}
#ifndef _EVAS_IMAGE_PRIVATE_H
#define _EVAS_IMAGE_PRIVATE_H
-typedef struct _Image_Draw_Data Image_Draw_Data;
-struct _Image_Draw_Data
-{
- int axx, axy, axz;
- int ayx, ayy, ayz;
-
- int fw, fh;
- int iaxx, iayy;
- int ibxx, ibyy;
- int dax, day;
-
- int l, r, t, b;
- unsigned char has_alpha : 1;
- unsigned char border_center_fill : 1;
-};
-
int evas_common_load_rgba_image_module_from_file (Image_Entry *im);
int evas_common_load_rgba_image_data_from_file (Image_Entry *im);
int evas_common_rgba_image_from_data (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
int evas_common_rgba_image_colorspace_set (Image_Entry* dst, int cspace);
-int evas_common_image_draw_data_setup(void *pim, Image_Draw_Data *idata);
#endif /* _EVAS_IMAGE_PRIVATE_H */
static void
_op_mul_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
DATA32 *e = d + l;
- pxor_r2r(mm0, mm0);
MOV_P2R(c, mm2, mm0)
c = ~c;
MOV_P2R(c, mm3, mm0)
MOV_A2R(ALPHA_255, mm5)
+ pxor_r2r(mm0, mm0);
while (d < e) {
DATA32 a = *m;
switch(a)
_op_mul_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
s = m + 1;
c = ~c;
- pxor_r2r(mm0, mm0);
MOV_P2R(c, mm3, mm0)
MOV_A2R(ALPHA_255, mm4)
+ pxor_r2r(mm0, mm0);
MOV_A2R(s, mm1)
MUL4_256_R2R(mm3, mm1)
psubw_r2r(mm1, mm4);
}
/**************** GRAD2 ******************/
-#include "evas_object_gradient2.h"
static void
evas_common_pipe_op_grad2_free(RGBA_Pipe_Op *op)
{
- Evas_Object_Gradient2 *ogr = op->op.grad2.grad;
- if (ogr)
- evas_common_rgba_gradient2_free(ogr->engine_data);
+ evas_common_gradient2_free(op->op.grad2.grad);
evas_common_pipe_op_free(op);
}
#else
evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
#endif
- evas_common_gradient2_draw(dst, &(context), op->op.grad2.grad,
+ evas_common_gradient2_draw(dst, &(context),
op->op.grad2.x, op->op.grad2.y,
- op->op.grad2.w, op->op.grad2.h);
+ op->op.grad2.w, op->op.grad2.h,
+ op->op.grad2.grad);
}
else
- evas_common_gradient2_draw(dst, &(op->context), op->op.grad2.grad,
+ evas_common_gradient2_draw(dst, &(op->context),
op->op.grad2.x, op->op.grad2.y,
- op->op.grad2.w, op->op.grad2.h);
+ op->op.grad2.w, op->op.grad2.h,
+ op->op.grad2.grad);
}
EAPI void
-evas_common_pipe_grad2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pgr,
- int x, int y, int w, int h)
+evas_common_pipe_grad2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+ int x, int y, int w, int h, RGBA_Gradient2 *gr)
{
RGBA_Pipe_Op *op;
- Evas_Object_Gradient2 *ogr = pgr;
- RGBA_Gradient2 *gr;
- if (!ogr) return;
- gr = ogr->engine_data;
if (!gr) return;
dst->pipe = evas_common_pipe_add(dst->pipe, &op);
if (!dst->pipe) return;
op->op.grad2.w = w;
op->op.grad2.h = h;
gr->references++;
- op->op.grad2.grad = ogr;
+ op->op.grad2.grad = gr;
op->op_func = evas_common_pipe_grad2_draw_do;
op->free_func = evas_common_pipe_op_grad2_free;
evas_common_pipe_draw_context_copy(dc, op);
}
/**************** IMAGE *****************/
-#include "evas_object_image.h"
static void
evas_common_pipe_op_image_free(RGBA_Pipe_Op *op)
{
- Evas_Object_Image *oim = op->op.image.im;
- RGBA_Image *im;
-
- if (!oim) return;
- im = oim->engine_data;
- im->ref--;
- if (im->ref == 0)
- evas_cache_image_drop(&im->cache_entry);
+ op->op.image.src->ref--;
+ if (op->op.image.src->ref == 0)
+ evas_cache_image_drop(&op->op.image.src->cache_entry);
evas_common_pipe_op_free(op);
}
#else
evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
#endif
- evas_common_image_draw2(dst, &(context), op->op.image.im,
- op->op.image.x, op->op.image.y,
- op->op.image.w, op->op.image.h);
+ if (op->op.image.smooth)
+ evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src,
+ dst, &(context),
+ op->op.image.sx,
+ op->op.image.sy,
+ op->op.image.sw,
+ op->op.image.sh,
+ op->op.image.dx,
+ op->op.image.dy,
+ op->op.image.dw,
+ op->op.image.dh);
+ else
+ evas_common_scale_rgba_in_to_out_clip_sample(op->op.image.src,
+ dst, &(context),
+ op->op.image.sx,
+ op->op.image.sy,
+ op->op.image.sw,
+ op->op.image.sh,
+ op->op.image.dx,
+ op->op.image.dy,
+ op->op.image.dw,
+ op->op.image.dh);
}
else
- evas_common_image_draw2(dst, &(op->context), op->op.image.im,
- op->op.image.x, op->op.image.y,
- op->op.image.w, op->op.image.h);
+ {
+ if (op->op.image.smooth)
+ evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src,
+ dst, &(op->context),
+ op->op.image.sx,
+ op->op.image.sy,
+ op->op.image.sw,
+ op->op.image.sh,
+ op->op.image.dx,
+ op->op.image.dy,
+ op->op.image.dw,
+ op->op.image.dh);
+ else
+ evas_common_scale_rgba_in_to_out_clip_sample(op->op.image.src,
+ dst, &(op->context),
+ op->op.image.sx,
+ op->op.image.sy,
+ op->op.image.sw,
+ op->op.image.sh,
+ op->op.image.dx,
+ op->op.image.dy,
+ op->op.image.dw,
+ op->op.image.dh);
+ }
}
EAPI void
-evas_common_pipe_image_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pim,
- int x, int y, int w, int h)
+evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst,
+ RGBA_Draw_Context *dc, int smooth,
+ int src_region_x, int src_region_y,
+ int src_region_w, int src_region_h,
+ int dst_region_x, int dst_region_y,
+ int dst_region_w, int dst_region_h)
{
RGBA_Pipe_Op *op;
- Evas_Object_Image *oim = pim;
- RGBA_Image *im;
- if (!oim || !dst) return;
- im = oim->engine_data;
- if (!im) return;
+ if (!src) return;
+// evas_common_pipe_flush(src);
dst->pipe = evas_common_pipe_add(dst->pipe, &op);
if (!dst->pipe) return;
- op->op.image.x = x;
- op->op.image.y = y;
- op->op.image.w = w;
- op->op.image.h = h;
- im->ref++;
- op->op.image.im = oim;
+ op->op.image.smooth = smooth;
+ op->op.image.sx = src_region_x;
+ op->op.image.sy = src_region_y;
+ op->op.image.sw = src_region_w;
+ op->op.image.sh = src_region_h;
+ op->op.image.dx = dst_region_x;
+ op->op.image.dy = dst_region_y;
+ op->op.image.dw = dst_region_w;
+ op->op.image.dh = dst_region_h;
+ src->ref++;
+ op->op.image.src = src;
op->op_func = evas_common_pipe_image_draw_do;
op->free_func = evas_common_pipe_op_image_free;
evas_common_pipe_draw_context_copy(dc, op);
EAPI void evas_common_pipe_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
EAPI void evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points);
EAPI void evas_common_pipe_grad_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient *gr);
+EAPI void evas_common_pipe_grad2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient2 *gr);
EAPI void evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text);
-
-EAPI void evas_common_pipe_grad2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pgr, int x, int y, int w, int h);
-
-EAPI void evas_common_pipe_image_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, void *pim, int x, int y, int w, int h);
+EAPI void evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int smooth, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
#endif /* _EVAS_PIPE_H */
+++ /dev/null
-#include "evas_common.h"
-#include "evas_private.h"
-#include <math.h>
-
-EAPI void
-evas_common_transform_affine_rect_bounds_get(Evas_Common_Transform *t,
- int x, int y, int w, int h,
- int *x_out, int *y_out, int *w_out, int *h_out)
-{
- double d;
- int axx, axy, ayx, ayy;
- int z, x0, x1, y0, y1;
-
- evas_common_cpu_end_opt(); // work damn it!
-
- if (!t || !x_out || !y_out || !w_out || !h_out) return;
- if (t->is_identity)
- {
- *x_out = x; *y_out = y;
- *w_out = w; *h_out = h;
- return;
- }
- d = (t->mxx * (double)t->myy) - (t->mxy * (double)t->myx);
- if (fabs(d) < 0.000030517578125)
- {
- *x_out = 0; *y_out = 0;
- *w_out = 0; *h_out = 0;
- return;
- }
- d = 1.0 / d;
- axx = d * t->myy * 65536; ayy = d * t->mxx * 65536;
- axy = -d * t->mxy * 65536; ayx = -d * t->myx * 65536;
-
- x0 = x1 = (axx * x) + (axy * y);
- z = (axx * (x + w)) + (axy * y);
- if (z < x0) x0 = z;
- if (z > x1) x1 = z;
- z = (axx * x) + (axy * (y + h));
- if (z < x0) x0 = z;
- if (z > x1) x1 = z;
- z = (axx * (x + w)) + (axy * (y + h));
- if (z < x0) x0 = z;
- if (z > x1) x1 = z;
- z = x0 - (((axx * (t->mxz - 0.5)) + (axy * (t->myz - 0.5)))) - 32768;
- *x_out = z >> 16;
- *w_out = ((x1 + 65535) >> 16) - ((x0 - 65535) >> 16); // kludgy, but...
-
- y0 = y1 = (ayx * x) + (ayy * y);
- z = (ayx * (x + w)) + (ayy * y);
- if (z < y0) y0 = z;
- if (z > y1) y1 = z;
- z = (ayx * x) + (ayy * (y + h));
- if (z < y0) y0 = z;
- if (z > y1) y1 = z;
- z = (ayx * (x + w)) + (ayy * (y + h));
- if (z < y0) y0 = z;
- if (z > y1) y1 = z;
- z = y0 - ((ayx * (t->mxz - 0.5)) + (ayy * (t->myz - 0.5))) - 32768;
- *y_out = z >> 16;
- *h_out = ((y1 + 65535) >> 16) - ((y0 - 65535) >> 16); // kludgy, but...
-}
+++ /dev/null
-#ifndef _EVAS_TRANSFORM_H
-#define _EVAS_TRANSFORM_H
-
-EAPI void evas_common_transform_affine_rect_bounds_get(Evas_Common_Transform *t, int x, int y, int w, int h,
- int *x_out, int *y_out, int *w_out, int *h_out);
-
-#endif /* _EVAS_TRANSFORM_H */
int x, int y,
void *geom_data);
-typedef void (*Gfx_Func_Image_Fill)(DATA32 *src, int src_w, int src_h,
- DATA32 *dst, DATA8 *mask, int len,
- int x, int y,
- void *geom_data);
#include "../cache/evas_cache.h"
/*****************************************************************************/
float mxx, mxy, mxz;
float myx, myy, myz;
float mzx, mzy, mzz;
- unsigned char is_identity : 1;
- unsigned char is_projective : 1;
};
struct _RGBA_Draw_Context
int x, y, w, h;
} grad;
struct {
- void *grad;
+ RGBA_Gradient2 *grad;
int x, y, w, h;
} grad2;
struct {
char *text;
} text;
struct {
- void *im;
- int x, y, w, h;
+ RGBA_Image *src;
+ int sx, sy, sw, sh, dx, dy, dw, dh;
+ int smooth;
+ char *text;
} image;
} op;
};
struct {
Eina_Inlist *stops;
int nstops;
+ DATA32 *cdata;
+ DATA8 *adata;
int len;
} stops;
struct
{
+ Evas_Common_Transform transform;
+ int spread;
+ } fill;
+ struct
+ {
int id;
RGBA_Gradient2_Type *geometer;
void *gdata;
const char *name;
void (*init)(void);
void (*shutdown)(void);
+ void (*geom_init)(RGBA_Gradient2 *gr);
+ void (*geom_update)(RGBA_Gradient2 *gr);
void (*geom_free)(void *gdata);
- int (*has_alpha)(void *ogr, int render_op);
- int (*has_mask)(void *ogr, int render_op);
- Gfx_Func_Gradient2_Fill (*get_fill_func)(void *ogr, int render_op);
+ int (*has_alpha)(RGBA_Gradient2 *gr, int render_op);
+ int (*has_mask)(RGBA_Gradient2 *gr, int render_op);
+ int (*get_map_len)(RGBA_Gradient2 *gr);
+ Gfx_Func_Gradient2_Fill (*get_fill_func)(RGBA_Gradient2 *gr, int render_op);
};
EAPI int evas_common_cpu_count (void);
/****/
-#include "../engines/common/evas_transform.h"
#include "../engines/common/evas_blend.h"
EAPI Gfx_Func_Copy evas_common_draw_func_copy_get (int pixels, int reverse);
void (*gradient2_color_np_stop_insert) (void *data, void *gradient, int r, int g, int b, int a, float pos);
void (*gradient2_clear) (void *data, void *gradient);
+ void (*gradient2_fill_transform_set) (void *data, void *gradient, void *transform);
+ void (*gradient2_fill_spread_set) (void *data, void *gradient, int spread);
void *(*gradient2_linear_new) (void *data);
void (*gradient2_linear_free) (void *data, void *linear_gradient);
+ void (*gradient2_linear_fill_set) (void *data, void *linear_gradient, float x0, float y0, float x1, float y1);
int (*gradient2_linear_is_opaque) (void *data, void *context, void *linear_gradient, int x, int y, int w, int h);
int (*gradient2_linear_is_visible) (void *data, void *context, void *linear_gradient, int x, int y, int w, int h);
void (*gradient2_linear_render_pre) (void *data, void *context, void *linear_gradient);
void *(*gradient2_radial_new) (void *data);
void (*gradient2_radial_free) (void *data, void *radial_gradient);
+ void (*gradient2_radial_fill_set) (void *data, void *radial_gradient, float cx, float cy, float rx, float ry);
int (*gradient2_radial_is_opaque) (void *data, void *context, void *radial_gradient, int x, int y, int w, int h);
int (*gradient2_radial_is_visible) (void *data, void *context, void *radial_gradient, int x, int y, int w, int h);
void (*gradient2_radial_render_pre) (void *data, void *context, void *radial_gradient);
void (*image_data_preload_cancel) (void *data, void *image);
void *(*image_alpha_set) (void *data, void *image, int has_alpha);
int (*image_alpha_get) (void *data, void *image);
- int (*image_is_opaque) (void *data, void *context, void *image, int x, int y, int w, int h);
- void (*image_render_pre) (void *data, void *context, void *image);
- void (*image_render_post) (void *data, void *image);
- void (*image_draw) (void *data, void *context, void *surface, void *image, int x, int y, int w, int h);
+ void *(*image_border_set) (void *data, void *image, int l, int r, int t, int b);
+ void (*image_border_get) (void *data, void *image, int *l, int *r, int *t, int *b);
+ void (*image_draw) (void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth);
char *(*image_comment_get) (void *data, void *image, char *key);
char *(*image_format_get) (void *data, void *image);
void (*image_colorspace_set) (void *data, void *image, int cspace);
{
}
+static void
+eng_gradient2_fill_transform_set(void *data, void *gradient, void *transform)
+{
+}
+
+static void
+eng_gradient2_fill_spread_set
+(void *data, void *gradient, int spread)
+{
+}
+
static void *
eng_gradient2_linear_new(void *data)
{
{
}
+static void
+eng_gradient2_linear_fill_set(void *data, void *linear_gradient, int x0, int y0, int x1, int y1)
+{
+}
+
static int
eng_gradient2_linear_is_opaque(void *data, void *context, void *linear_gradient, int x, int y, int w, int h)
{
{
}
+static void
+eng_gradient2_radial_fill_set(void *data, void *radial_gradient, float cx, float cy, float rx, float ry)
+{
+}
+
static int
eng_gradient2_radial_is_opaque(void *data, void *context, void *radial_gradient, int x, int y, int w, int h)
{
return image;
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ Render_Engine *re;
+
+ re = (Render_Engine *)data;
+ return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ Render_Engine *re;
+
+ re = (Render_Engine *)data;
+}
+
static char *
eng_image_comment_get(void *data, void *image, char *key)
{
evas_cache_image_preload_cancel(&im->cache_entry);
}
-static int
-eng_image_is_opaque(void *data, void *context, void *image, int x, int y, int w, int h)
-{
- return 0;
-}
-
-static void
-eng_image_render_pre(void *data, void *context, void *image)
-{
-}
-
-static void
-eng_image_render_post(void *data, void *image)
-{
-}
-
-#if 0
static void
eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
{
dst_x, dst_y, dst_w, dst_h,
smooth);
}
-#endif
-
-static void
-eng_image_draw(void *data, void *context, void *surface, void *image, int x, int y, int w, int h)
-{
-}
static void
eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
ORD(context_cutout_clear);
ORD(output_flush);
ORD(output_idle_flush);
-
ORD(rectangle_draw);
ORD(line_draw);
ORD(polygon_point_add);
ORD(gradient2_color_np_stop_insert);
ORD(gradient2_clear);
+ ORD(gradient2_fill_transform_set);
+ ORD(gradient2_fill_spread_set);
ORD(gradient2_linear_new);
ORD(gradient2_linear_free);
+ ORD(gradient2_linear_fill_set);
ORD(gradient2_linear_is_opaque);
ORD(gradient2_linear_is_visible);
ORD(gradient2_linear_render_pre);
ORD(gradient2_linear_draw);
ORD(gradient2_radial_new);
ORD(gradient2_radial_free);
+ ORD(gradient2_radial_fill_set);
ORD(gradient2_radial_is_opaque);
ORD(gradient2_radial_is_visible);
ORD(gradient2_radial_render_pre);
ORD(gradient_render_pre);
ORD(gradient_render_post);
ORD(gradient_draw);
-
ORD(image_load);
ORD(image_new_from_data);
ORD(image_new_from_copied_data);
ORD(image_data_preload_cancel);
ORD(image_alpha_set);
ORD(image_alpha_get);
- ORD(image_is_opaque);
- ORD(image_render_pre);
- ORD(image_render_post);
+ ORD(image_border_set);
+ ORD(image_border_get);
ORD(image_draw);
ORD(image_comment_get);
ORD(image_format_get);
ORD(image_colorspace_get);
ORD(image_native_set);
ORD(image_native_get);
-
ORD(font_draw);
/* now advertise out own api */
em->functions = (void *)(&func);
}
}
-/* new gradient engine funcs */
static void
eng_gradient2_color_np_stop_insert(void *data, void *gradient, int r, int g, int b, int a, float pos)
{
evas_common_gradient2_clear(gradient);
}
+static void
+eng_gradient2_fill_transform_set(void *data, void *gradient, void *transform)
+{
+ evas_common_gradient2_fill_transform_set(gradient, transform);
+}
+
+static void
+eng_gradient2_fill_spread_set
+(void *data, void *gradient, int spread)
+{
+ evas_common_gradient2_fill_spread_set(gradient, spread);
+}
+
static void *
eng_gradient2_linear_new(void *data)
{
- return evas_common_rgba_gradient2_linear_new();
+ return evas_common_gradient2_linear_new();
}
static void
eng_gradient2_linear_free(void *data, void *linear_gradient)
{
- evas_common_rgba_gradient2_free(linear_gradient);
+ evas_common_gradient2_free(linear_gradient);
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data, void *linear_gradient, float x0, float y0, float x1, float y1)
+{
+ evas_common_gradient2_linear_fill_set(linear_gradient, x0, y0, x1, y1);
}
static int
eng_gradient2_linear_is_opaque(void *data, void *context, void *linear_gradient, int x, int y, int w, int h)
{
- return evas_common_gradient2_opaque(context, linear_gradient, x, y, w, h);
+ RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+ RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+
+ if (!dc || !gr || !gr->type.geometer) return 0;
+ return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+ gr->type.geometer->has_mask(gr, dc->render_op));
}
static int
static void
eng_gradient2_linear_render_pre(void *data, void *context, void *linear_gradient)
{
- if (!context || !linear_gradient) return;
- evas_common_gradient2_linear_render_pre(context, linear_gradient);
+ RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+ RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+ int len;
+
+ if (!dc || !gr || !gr->type.geometer) return;
+ gr->type.geometer->geom_update(gr);
+ len = gr->type.geometer->get_map_len(gr);
+ evas_common_gradient2_map(dc, gr, len);
}
static void
{
#ifdef BUILD_PTHREAD
if (cpunum > 1)
- evas_common_pipe_grad2_draw(surface, context, linear_gradient, x, y, w, h);
+ evas_common_pipe_grad2_draw(surface, context, x, y, w, h, linear_gradient);
else
#endif
- evas_common_gradient2_draw(surface, context, linear_gradient, x, y, w, h);
+ evas_common_gradient2_draw(surface, context, x, y, w, h, linear_gradient);
}
static void *
eng_gradient2_radial_new(void *data)
{
- return evas_common_rgba_gradient2_radial_new();
+ return evas_common_gradient2_radial_new();
}
static void
eng_gradient2_radial_free(void *data, void *radial_gradient)
{
- evas_common_rgba_gradient2_free(radial_gradient);
+ evas_common_gradient2_free(radial_gradient);
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data, void *radial_gradient, float cx, float cy, float rx, float ry)
+{
+ evas_common_gradient2_radial_fill_set(radial_gradient, cx, cy, rx, ry);
}
static int
eng_gradient2_radial_is_opaque(void *data, void *context, void *radial_gradient, int x, int y, int w, int h)
{
- return evas_common_gradient2_opaque(context, radial_gradient, x, y, w, h);
+ RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+ RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+
+ if (!dc || !gr || !gr->type.geometer) return 0;
+ return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+ gr->type.geometer->has_mask(gr, dc->render_op));
}
static int
static void
eng_gradient2_radial_render_pre(void *data, void *context, void *radial_gradient)
{
- if (!context || !radial_gradient) return;
- evas_common_gradient2_radial_render_pre(context, radial_gradient);
+ RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+ RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+ int len;
+
+ if (!dc || !gr || !gr->type.geometer) return;
+ gr->type.geometer->geom_update(gr);
+ len = gr->type.geometer->get_map_len(gr);
+ evas_common_gradient2_map(dc, gr, len);
}
static void
{
#ifdef BUILD_PTHREAD
if (cpunum > 1)
- evas_common_pipe_grad2_draw(surface, context, radial_gradient, x, y, w, h);
+ evas_common_pipe_grad2_draw(surface, context, x, y, w, h, radial_gradient);
else
#endif
- evas_common_gradient2_draw(surface, context, radial_gradient, x, y, w, h);
+ evas_common_gradient2_draw(surface, context, x, y, w, h, radial_gradient);
}
-/* old gradient engine funcs */
static void *
eng_gradient_new(void *data)
{
}
}
-/* image engine funcs */
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+ Image_Entry *im;
+
+ if (!image) return 1;
+ im = image;
+ switch (im->space)
+ {
+ case EVAS_COLORSPACE_ARGB8888:
+ if (im->flags.alpha) return 1;
+ default:
+ break;
+ }
+ return 0;
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+ Image_Entry *im;
+
+ if (!image) return EVAS_COLORSPACE_ARGB8888;
+ im = image;
+ return im->space;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+ RGBA_Image *im;
+
+ if (!image) return NULL;
+ im = image;
+ if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
+ {
+ im->cache_entry.flags.alpha = 0;
+ return im;
+ }
+ im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
+ evas_common_image_colorspace_dirty(im);
+
+ im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+ return im;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ RGBA_Image *im;
+
+ im = image;
+ return im;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ RGBA_Image *im;
+
+ im = image;
+}
+
+static char *
+eng_image_comment_get(void *data, void *image, char *key)
+{
+ RGBA_Image *im;
+
+ if (!image) return NULL;
+ im = image;
+ return im->info.comment;
+}
+
+static char *
+eng_image_format_get(void *data, void *image)
+{
+ return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+ Image_Entry *im;
+
+ if (!image) return;
+ im = image;
+ evas_cache_image_colorspace(im, cspace);
+}
+
+static void
+eng_image_native_set(void *data, void *image, void *native)
+{
+}
+
+static void *
+eng_image_native_get(void *data, void *image)
+{
+ return NULL;
+}
+
static void *
eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
{
return im;
}
-static int eng_image_alpha_get(void *data, void *image);
-static int eng_image_colorspace_get(void *data, void *image);
-
static void *
eng_image_data_put(void *data, void *image, DATA32 *image_data)
{
evas_cache_image_preload_cancel(&im->cache_entry);
}
-static void *
-eng_image_alpha_set(void *data, void *image, int has_alpha)
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
{
RGBA_Image *im;
- if (!image) return NULL;
- im = image;
- if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
- {
- im->cache_entry.flags.alpha = 0;
- return im;
- }
- im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
- evas_common_image_colorspace_dirty(im);
-
- im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
- return im;
-}
-
-static int
-eng_image_alpha_get(void *data, void *image)
-{
- Image_Entry *im;
-
- if (!image) return 1;
+ if (!image) return;
im = image;
- switch (im->space)
- {
- case EVAS_COLORSPACE_ARGB8888:
- if (im->flags.alpha) return 1;
- default:
- break;
- }
- return 0;
-}
-
-/* maybe just get rid of this func? */
-static int
-eng_image_is_opaque(void *data, void *context, void *image, int x, int y, int w, int h)
-{
- return 0;
-}
-
-static void
-eng_image_render_pre(void *data, void *context, void *image)
-{
- evas_common_image_render_pre(context, image);
-}
-
-static void
-eng_image_render_post(void *data, void *image)
-{
-}
-
-static void
-eng_image_draw(void *data, void *context, void *surface, void *image, int x, int y, int w, int h)
-{
+ if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+ evas_cache_image_load_data(&im->cache_entry);
+ evas_common_image_colorspace_normalize(im);
#ifdef BUILD_PTHREAD
if (cpunum > 1)
- evas_common_pipe_image_draw(surface, context, image, x, y, w, h);
+ evas_common_pipe_image_draw(im, surface, context, smooth,
+ src_x, src_y, src_w, src_h,
+ dst_x, dst_y, dst_w, dst_h);
else
#endif
- evas_common_image_draw2(surface, context, image, x, y, w, h);
-}
-
-static char *
-eng_image_comment_get(void *data, void *image, char *key)
-{
- RGBA_Image *im;
-
- if (!image) return NULL;
- im = image;
- return im->info.comment;
-}
-
-static char *
-eng_image_format_get(void *data, void *image)
-{
- return NULL;
-}
-
-static void
-eng_image_colorspace_set(void *data, void *image, int cspace)
-{
- Image_Entry *im;
-
- if (!image) return;
- im = image;
- evas_cache_image_colorspace(im, cspace);
-}
-
-static int
-eng_image_colorspace_get(void *data, void *image)
-{
- Image_Entry *im;
-
- if (!image) return EVAS_COLORSPACE_ARGB8888;
- im = image;
- return im->space;
-}
-
-static void
-eng_image_native_set(void *data, void *image, void *native)
-{
-}
-
-static void *
-eng_image_native_get(void *data, void *image)
-{
- return NULL;
+ {
+ if (smooth)
+ evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context,
+ src_x, src_y, src_w, src_h,
+ dst_x, dst_y, dst_w, dst_h);
+ else
+ evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context,
+ src_x, src_y, src_w, src_h,
+ dst_x, dst_y, dst_w, dst_h);
+ evas_common_cpu_end_opt();
+ }
}
static void
eng_polygon_point_add,
eng_polygon_points_clear,
eng_polygon_draw,
-
- /* gradient2 engine funcs */
+ /* gradient draw funcs */
eng_gradient2_color_np_stop_insert,
eng_gradient2_clear,
+ eng_gradient2_fill_transform_set,
+ eng_gradient2_fill_spread_set,
eng_gradient2_linear_new,
eng_gradient2_linear_free,
+ eng_gradient2_linear_fill_set,
eng_gradient2_linear_is_opaque,
eng_gradient2_linear_is_visible,
eng_gradient2_linear_render_pre,
eng_gradient2_radial_new,
eng_gradient2_radial_free,
+ eng_gradient2_radial_fill_set,
eng_gradient2_radial_is_opaque,
eng_gradient2_radial_is_visible,
eng_gradient2_radial_render_pre,
eng_gradient2_radial_render_post,
eng_gradient2_radial_draw,
- /* old gradient funcs */
eng_gradient_new,
eng_gradient_free,
eng_gradient_color_stop_add,
eng_gradient_render_pre,
eng_gradient_render_post,
eng_gradient_draw,
-
- /* image emgine funcs */
+ /* image draw funcs */
eng_image_load,
eng_image_new_from_data,
eng_image_new_from_copied_data,
eng_image_data_preload_cancel,
eng_image_alpha_set,
eng_image_alpha_get,
- eng_image_is_opaque,
- eng_image_render_pre,
- eng_image_render_post,
+ eng_image_border_set,
+ eng_image_border_get,
eng_image_draw,
eng_image_comment_get,
eng_image_format_get,
eng_image_cache_flush,
eng_image_cache_set,
eng_image_cache_get,
-
- /* font engine functions */
+ /* font draw functions */
eng_font_load,
eng_font_memory_load,
eng_font_add,
_xre_poly_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, (RGBA_Polygon_Point *)polygon);
}
+
static void
eng_gradient2_color_np_stop_insert(void *data, void *gradient, int r, int g, int b, int a, float pos)
{
{
}
+static void
+eng_gradient2_fill_transform_set(void *data, void *gradient, void *transform)
+{
+}
+
+static void
+eng_gradient2_fill_spread_set
+(void *data, void *gradient, int spread)
+{
+}
+
static void *
eng_gradient2_linear_new(void *data)
{
{
}
+static void
+eng_gradient2_linear_fill_set(void *data, void *linear_gradient, int x0, int y0, int x1, int y1)
+{
+}
+
static int
eng_gradient2_linear_is_opaque(void *data, void *context, void *linear_gradient, int x, int y, int w, int h)
{
{
}
+static void
+eng_gradient2_radial_fill_set(void *data, void *radial_gradient, float cx, float cy, float rx, float ry)
+{
+}
+
static int
eng_gradient2_radial_is_opaque(void *data, void *context, void *radial_gradient, int x, int y, int w, int h)
{
return im;
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ if (!image) return image;
+ _xre_image_border_set((XR_Image *)image, l, r, t, b);
+ return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ if (!image) return;
+ _xre_image_border_get((XR_Image *)image, l, r, t, b);
+}
+
static char *
eng_image_comment_get(void *data, void *image, char *key)
{
evas_cache_image_preload_cancel(&im->cache_entry);
}
-static int
-eng_image_is_opaque(void *data, void *context, void *image, int x, int y, int w, int h)
-{
- return 0;
-}
-
-static void
-eng_image_render_pre(void *data, void *context, void *image)
-{
-}
-
-static void
-eng_image_render_post(void *data, void *image)
-{
-}
-
-#if 0
static void
eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
{
dst_x, dst_y, dst_w, dst_h,
smooth);
}
-#endif
-
-static void
-eng_image_draw(void *data, void *context, void *surface, void *image, int x, int y, int w, int h)
-{
-}
static void
eng_image_cache_flush(void *data)
ORD(gradient2_color_np_stop_insert);
ORD(gradient2_clear);
+ ORD(gradient2_fill_transform_set);
+ ORD(gradient2_fill_spread_set);
ORD(gradient2_linear_new);
ORD(gradient2_linear_free);
+ ORD(gradient2_linear_fill_set);
ORD(gradient2_linear_is_opaque);
ORD(gradient2_linear_is_visible);
ORD(gradient2_linear_render_pre);
ORD(gradient2_linear_draw);
ORD(gradient2_radial_new);
ORD(gradient2_radial_free);
+ ORD(gradient2_radial_fill_set);
ORD(gradient2_radial_is_opaque);
ORD(gradient2_radial_is_visible);
ORD(gradient2_radial_render_pre);
ORD(gradient_render_pre);
ORD(gradient_render_post);
ORD(gradient_draw);
-
ORD(image_load);
ORD(image_new_from_data);
ORD(image_new_from_copied_data);
ORD(image_data_preload_cancel);
ORD(image_alpha_set);
ORD(image_alpha_get);
- ORD(image_is_opaque);
- ORD(image_render_pre);
- ORD(image_render_post);
+ ORD(image_border_set);
+ ORD(image_border_get);
ORD(image_draw);
ORD(image_comment_get);
ORD(image_format_get);
ORD(image_cache_flush);
ORD(image_cache_set);
ORD(image_cache_get);
-
ORD(font_draw);
/* now advertise out own api */
em->functions = (void *)(&func);