Commit: 1d73b724abe1418bb3cb821b8dd19a5da6b4a536
Author: Julian Eisel
Date:   Tue Mar 31 16:21:08 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB1d73b724abe1418bb3cb821b8dd19a5da6b4a536

Sequencer image resize widget: Make it resize the image buffer

===================================================================

M       source/blender/editors/space_sequencer/sequencer_view.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_generic_widgets.c

===================================================================

diff --git a/source/blender/editors/space_sequencer/sequencer_view.c 
b/source/blender/editors/space_sequencer/sequencer_view.c
index d343d1a..2062f31 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -49,6 +49,7 @@
 #include "ED_image.h"
 #include "ED_screen.h"
 #include "ED_space_api.h"
+#include "ED_sequencer.h"
 
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
@@ -246,6 +247,8 @@ void SEQUENCER_OT_sample(wmOperatorType *ot)
 /******** Backdrop Transform *******/
 
 typedef struct OverDropTransformData {
+       ImBuf *ibuf; /* image to be transformed (preview image transformation 
widget) */
+       int init_size[2];
        float init_zoom;
        float init_offset[2];
        int event_type;
@@ -408,22 +411,20 @@ static int sequencer_image_transform_widget_poll(bContext 
*C)
 static void widgetgroup_image_transform_draw(const struct bContext *C, struct 
wmWidgetGroup *wgroup)
 {
        ARegion *ar = CTX_wm_region(C);
-//     wmOperator *op = wgroup->type->op;
        View2D *v2d = &ar->v2d;
+       wmOperator *op = wgroup->type->op;
        wmWidget *cage;
        float origin[3];
        float viewrect[2];
        float scale[2];
 
        sequencer_display_size(CTX_data_scene(C), CTX_wm_space_seq(C), 
viewrect);
-
        UI_view2d_scale_get(v2d, &scale[0], &scale[1]);
 
        cage = WIDGET_rect_transform_new(wgroup, 
WIDGET_RECT_TRANSFORM_STYLE_SCALE_UNIFORM |
                                         WIDGET_RECT_TRANSFORM_STYLE_TRANSLATE,
                                         viewrect[0] * scale[0], viewrect[1] * 
scale[1]);
-//     WM_widget_property(cage, RECT_TRANSFORM_SLOT_OFFSET, op->ptr, "offset");
-//     WM_widget_property(cage, RECT_TRANSFORM_SLOT_SCALE, op->ptr, "scale");
+       WM_widget_property(cage, RECT_TRANSFORM_SLOT_SCALE, op->ptr, "scale");
 
        origin[0] = -(v2d->cur.xmin * scale[0]);
        origin[1] = -(v2d->cur.ymin * scale[1]);
@@ -433,21 +434,27 @@ static void widgetgroup_image_transform_draw(const struct 
bContext *C, struct wm
 static int sequencer_image_transform_widget_invoke(bContext *C, wmOperator 
*op, const wmEvent *event)
 {
        ScrArea *sa = CTX_wm_area(C);
+       ARegion *ar = CTX_wm_region(C);
        SpaceSeq *sseq = CTX_wm_space_seq(C);
+       Scene *scene = CTX_data_scene(C);
        /* no poll, lives always for the duration of the operator */
        wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, 
widgetgroup_image_transform_draw, CTX_data_main(C),
                                                             "Seq_Canvas", 
SPACE_SEQ, RGN_TYPE_PREVIEW, false);
        struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
        OverDropTransformData *data = 
MEM_mallocN(sizeof(OverDropTransformData), "overdrop transform data");
-       WM_modal_handler_attach_widgetgroup(C, handler, cagetype, op);
+       ImBuf *ibuf = sequencer_ibuf_get(CTX_data_main(C), scene, sseq, CFRA, 
0);
 
-       RNA_float_set_array(op->ptr, "offset", sseq->overdrop_offset);
-       RNA_float_set(op->ptr, "scale", sseq->overdrop_zoom);
+       if (!ibuf || !ED_space_sequencer_check_show_imbuf(sseq)) {
+               return OPERATOR_CANCELLED;
+       }
 
-       copy_v2_v2(data->init_offset, sseq->overdrop_offset);
-       data->init_zoom = sseq->overdrop_zoom;
+       WM_modal_handler_attach_widgetgroup(C, handler, cagetype, op);
+
+       copy_v2_v2_int(data->init_size, &ibuf->x);
+       data->init_zoom = 0.0f;
        data->cagetype = cagetype;
        data->event_type = event->type;
+       data->ibuf = ibuf;
 
        op->customdata = data;
 
@@ -460,7 +467,7 @@ static void 
sequencer_image_transform_widget_finish(bContext *C, OverDropTransfo
 {
        ScrArea *sa = CTX_wm_area(C);
        ED_area_headerprint(sa, NULL);
-//     WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
+       WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
        MEM_freeN(data);
 }
 
@@ -480,12 +487,30 @@ static int 
sequencer_image_transform_widget_modal(bContext *C, wmOperator *op, c
        }
 
        switch (event->type) {
-               case EVT_WIDGET_UPDATE: {
-//                     SpaceSeq *sseq = CTX_wm_space_seq(C);
-//                     RNA_float_get_array(op->ptr, "offset", 
sseq->overdrop_offset);
-//                     sseq->overdrop_zoom = RNA_float_get(op->ptr, "scale");
-//                     break;
-                       return OPERATOR_RUNNING_MODAL;
+               case EVT_WIDGET_UPDATE:
+               {
+                       ARegion *ar = CTX_wm_region(C);
+                       Scene *scene = CTX_data_scene(C);
+                       wmWidgetMap *wmap = ar->widgetmaps.first;
+                       float scale_fac = RNA_float_get(op->ptr, "scale");
+                       float new_size[2];
+                       float offset[2];
+
+                       new_size[0] = (float)data->init_size[0] * scale_fac;
+                       new_size[1] = (float)data->init_size[1] * scale_fac;
+
+                       /* sale image */
+                       IMB_scalefastImBuf(data->ibuf, (unsigned 
int)new_size[0], (unsigned int)new_size[1]);
+
+                       /* update view */
+                       scene->r.xsch = (int)(new_size[0] / 
((float)scene->r.size / 100));
+                       scene->r.ysch = (int)(new_size[1] / 
((float)scene->r.size / 100));
+
+                       /* no offset needed in this case */
+                       offset[0] = offset[1] = 0;
+                       WIDGET_rect_transform_set_offset(wmap->active_widget, 
offset);
+
+                       break;
                }
 
                case RKEY:
@@ -500,8 +525,7 @@ static int sequencer_image_transform_widget_modal(bContext 
*C, wmOperator *op, c
                        ED_region_tag_redraw(ar);
                        /* add a mousemove to refresh the widget */
                        WM_event_add_mousemove(C);
-//                     break;
-                       return OPERATOR_RUNNING_MODAL;
+                       break;
                }
                case RETKEY:
                case PADENTER:
@@ -528,8 +552,6 @@ static int sequencer_image_transform_widget_modal(bContext 
*C, wmOperator *op, c
 
 void SEQUENCER_OT_image_transform_widget(struct wmOperatorType *ot)
 {
-       float default_offset[2] = {0.0f, 0.0f};
-
        /* identifiers */
        ot->name = "Image Transform";
        ot->idname = "SEQUENCER_OT_image_transform_widget";
@@ -544,7 +566,6 @@ void SEQUENCER_OT_image_transform_widget(struct 
wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-       RNA_def_float_array(ot->srna, "offset", 2, default_offset, FLT_MIN, 
FLT_MAX, "Offset", "Offset of the backdrop", FLT_MIN, FLT_MAX);
        RNA_def_float(ot->srna, "scale", 1.0f, 0.0f, FLT_MAX, "Scale", "Scale 
of the backdrop", 0.0f, FLT_MAX);
 }
 
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index d24bbb0..2fb3351 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -547,6 +547,7 @@ void WIDGET_dial_set_color(struct wmWidget *widget, float 
color[4]);
 void WIDGET_dial_set_direction(struct wmWidget *widget, float direction[3]);
 
 struct wmWidget *WIDGET_rect_transform_new(struct wmWidgetGroup *wgroup, int 
style, float width, float height);
+void WIDGET_rect_transform_set_offset(struct wmWidget *widget, float 
offset[2]);
 
 struct wmWidget *WIDGET_facemap_new(struct wmWidgetGroup *wgroup, int style, 
struct Object *ob, int facemap);
 void WIDGET_facemap_set_color(struct wmWidget *widget, float color[4]);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 49287bd..9b37894 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -1042,6 +1042,13 @@ struct wmWidget *WIDGET_rect_transform_new(struct 
wmWidgetGroup *wgroup, int sty
        return (wmWidget *)cage;
 }
 
+void WIDGET_rect_transform_set_offset(struct wmWidget *widget, float offset[2])
+{
+       RectTransformWidget *cage = (RectTransformWidget *)widget;
+
+       copy_v2_v2(cage->offset, offset);
+}
+
 /********* Facemap widget ************/
 
 typedef struct FacemapWidget {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to