[Bf-blender-cvs] [1d73b72] wiggly-widgets: Sequencer image resize widget: Make it resize the image buffer
Julian Eisel
noreply at git.blender.org
Tue Mar 31 16:23:56 CEST 2015
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 {
More information about the Bf-blender-cvs
mailing list