aboutsummaryrefslogtreecommitdiff
path: root/modules/pdp_zoom.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/pdp_zoom.c')
-rw-r--r--modules/pdp_zoom.c112
1 files changed, 78 insertions, 34 deletions
diff --git a/modules/pdp_zoom.c b/modules/pdp_zoom.c
index 33207ce..c89efb1 100644
--- a/modules/pdp_zoom.c
+++ b/modules/pdp_zoom.c
@@ -38,11 +38,7 @@ typedef struct pdp_zoom_struct
int x_dropped;
int x_queue_id;
- float x_zoom_x;
- float x_zoom_y;
-
- float x_center_x;
- float x_center_y;
+ void *x_zoom;
int x_quality; //not used
@@ -67,10 +63,10 @@ static void pdp_zoom_process_yv12(t_pdp_zoom *x)
unsigned int voffset = size;
unsigned int uoffset = size + (size>>2);
+ pdp_imageproc_resample_affinemap_process(x->x_zoom, src_image, dst_image, w, h);
+ pdp_imageproc_resample_affinemap_process(x->x_zoom, src_image+voffset, dst_image+voffset, w>>1, h>>1);
+ pdp_imageproc_resample_affinemap_process(x->x_zoom, src_image+uoffset, dst_image+uoffset, w>>1, h>>1);
- pdp_resample_zoom_tiled_bilin(src_image, dst_image, w, h, x->x_zoom_x, x->x_zoom_y, x->x_center_x, x->x_center_y);
- pdp_resample_zoom_tiled_bilin(src_image+voffset, dst_image+voffset, w>>1, h>>1, x->x_zoom_x, x->x_zoom_y, x->x_center_x, x->x_center_y);
- pdp_resample_zoom_tiled_bilin(src_image+uoffset, dst_image+uoffset, w>>1, h>>1, x->x_zoom_x, x->x_zoom_y, x->x_center_x, x->x_center_y);
return;
}
@@ -89,7 +85,7 @@ static void pdp_zoom_process_grey(t_pdp_zoom *x)
short int *src_image = (short int *)data0;
short int *dst_image = (short int *)data1;
- pdp_resample_zoom_tiled_bilin(src_image, dst_image, w, h, x->x_zoom_x, x->x_zoom_y, x->x_center_x, x->x_center_y);
+ pdp_imageproc_resample_affinemap_process(x->x_zoom, src_image, dst_image, w, h);
return;
@@ -160,30 +156,35 @@ static void pdp_zoom_input_0(t_pdp_zoom *x, t_symbol *s, t_floatarg f)
-static void pdp_zoom_x(t_pdp_zoom *x, t_floatarg f)
+static void pdp_zoom_zoom_x(t_pdp_zoom *x, t_floatarg f)
{
- x->x_zoom_x = f;
+ pdp_imageproc_resample_affinemap_setzoomx(x->x_zoom, f);
}
-static void pdp_zoom_y(t_pdp_zoom *x, t_floatarg f)
+static void pdp_zoom_angle(t_pdp_zoom *x, t_floatarg f)
{
- x->x_zoom_y = f;
+ pdp_imageproc_resample_affinemap_setangle(x->x_zoom, f);
}
-static void pdp_zoom(t_pdp_zoom *x, t_floatarg f)
+static void pdp_zoom_zoom_y(t_pdp_zoom *x, t_floatarg f)
{
- pdp_zoom_x(x, f);
- pdp_zoom_y(x, f);
+ pdp_imageproc_resample_affinemap_setzoomy(x->x_zoom, f);
+}
+
+static void pdp_zoom_zoom(t_pdp_zoom *x, t_floatarg f)
+{
+ pdp_zoom_zoom_x(x, f);
+ pdp_zoom_zoom_y(x, f);
}
static void pdp_zoom_center_x(t_pdp_zoom *x, t_floatarg f)
{
- x->x_center_x = (f + 0.5f);
+ pdp_imageproc_resample_affinemap_setcenterx(x->x_zoom, f);
}
static void pdp_zoom_center_y(t_pdp_zoom *x, t_floatarg f)
{
- x->x_center_y = (f + 0.5f);
+ pdp_imageproc_resample_affinemap_setcentery(x->x_zoom, f);
}
static void pdp_zoom_center(t_pdp_zoom *x, t_floatarg fx, t_floatarg fy)
{
@@ -191,6 +192,7 @@ static void pdp_zoom_center(t_pdp_zoom *x, t_floatarg fx, t_floatarg fy)
pdp_zoom_center_y(x, fy);
}
+// not used
static void pdp_zoom_quality(t_pdp_zoom *x, t_floatarg f)
{
if (f==0) x->x_quality = 0;
@@ -205,30 +207,69 @@ t_class *pdp_zoom_class;
void pdp_zoom_free(t_pdp_zoom *x)
{
pdp_queue_finish(x->x_queue_id);
+ pdp_imageproc_resample_affinemap_delete(x->x_zoom);
pdp_packet_mark_unused(x->x_packet0);
pdp_packet_mark_unused(x->x_packet1);
}
-void *pdp_zoom_new(t_floatarg fw, t_floatarg zoom)
+
+void pdp_zoom_init_common(t_pdp_zoom *x)
+{
+ x->x_outlet0 = outlet_new(&x->x_obj, &s_anything);
+ x->x_packet0 = -1;
+ x->x_packet1 = -1;
+ x->x_queue_id = -1;
+
+ x->x_zoom = pdp_imageproc_resample_affinemap_new();
+
+ //quality is not used: all routines are "high quality" bilinear
+ //pdp_zoom_quality(x, 1);
+ pdp_zoom_center_x(x, 0.5f);
+ pdp_zoom_center_y(x, 0.5f);
+
+}
+
+
+void *pdp_zoom_new(t_floatarg zoom)
{
t_pdp_zoom *x = (t_pdp_zoom *)pd_new(pdp_zoom_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("zoom"));
-
+ pdp_zoom_init_common(x);
- x->x_outlet0 = outlet_new(&x->x_obj, &s_anything);
+ if (zoom == 0.0f) zoom = 1.0f;
+ pdp_zoom_zoom(x, zoom);
+ pdp_zoom_angle(x, 0.0f);
- x->x_packet0 = -1;
- x->x_packet1 = -1;
- x->x_queue_id = -1;
+ return (void *)x;
+}
+
+void *pdp_zrot_new(t_floatarg zoom, t_floatarg angle)
+{
+ t_pdp_zoom *x = (t_pdp_zoom *)pd_new(pdp_zoom_class);
- pdp_zoom_quality(x, 1);
- pdp_zoom_center_x(x, 0);
- pdp_zoom_center_y(x, 0);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("zoom"));
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("angle"));
- if (zoom = 0.0f) zoom = 1.0f;
- pdp_zoom(x, zoom);
+ pdp_zoom_init_common(x);
+
+ if (zoom == 0.0f) zoom = 1.0f;
+ pdp_zoom_zoom(x, zoom);
+ pdp_zoom_angle(x, angle);
+
+ return (void *)x;
+}
+
+void *pdp_rotate_new(t_floatarg angle)
+{
+ t_pdp_zoom *x = (t_pdp_zoom *)pd_new(pdp_zoom_class);
+
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("angle"));
+
+ pdp_zoom_init_common(x);
+ pdp_zoom_zoom(x, 1.0f);
+ pdp_zoom_angle(x, angle);
return (void *)x;
}
@@ -243,18 +284,21 @@ extern "C"
void pdp_zoom_setup(void)
{
-
pdp_zoom_class = class_new(gensym("pdp_zoom"), (t_newmethod)pdp_zoom_new,
- (t_method)pdp_zoom_free, sizeof(t_pdp_zoom), 0, A_DEFFLOAT, A_DEFFLOAT, A_NULL);
+ (t_method)pdp_zoom_free, sizeof(t_pdp_zoom), 0, A_DEFFLOAT, A_NULL);
+
+ class_addcreator((t_newmethod)pdp_zrot_new, gensym("pdp_zrot"), A_DEFFLOAT, A_DEFFLOAT, A_NULL);
+ class_addcreator((t_newmethod)pdp_rotate_new, gensym("pdp_rotate"), A_DEFFLOAT, A_NULL);
class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_quality, gensym("quality"), A_FLOAT, A_NULL);
class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_center_x, gensym("centerx"), A_FLOAT, A_NULL);
class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_center_y, gensym("centery"), A_FLOAT, A_NULL);
class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_center, gensym("center"), A_FLOAT, A_FLOAT, A_NULL);
- class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_x, gensym("zoomx"), A_FLOAT, A_NULL);
- class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_y, gensym("zoomy"), A_FLOAT, A_NULL);
- class_addmethod(pdp_zoom_class, (t_method)pdp_zoom, gensym("zoom"), A_FLOAT, A_NULL);
+ class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_zoom_x, gensym("zoomx"), A_FLOAT, A_NULL);
+ class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_zoom_y, gensym("zoomy"), A_FLOAT, A_NULL);
+ class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_zoom, gensym("zoom"), A_FLOAT, A_NULL);
+ class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_angle, gensym("angle"), A_FLOAT, A_NULL);
class_addmethod(pdp_zoom_class, (t_method)pdp_zoom_input_0, gensym("pdp"), A_SYMBOL, A_DEFFLOAT, A_NULL);
}