|
Blender
V2.59
|
00001 /* 00002 * $Id: space_sequencer.c 36788 2011-05-20 05:27:31Z campbellbarton $ 00003 * 00004 * ***** BEGIN GPL LICENSE BLOCK ***** 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU General Public License 00008 * as published by the Free Software Foundation; either version 2 00009 * of the License, or (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software Foundation, 00018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00019 * 00020 * The Original Code is Copyright (C) 2008 Blender Foundation. 00021 * All rights reserved. 00022 * 00023 * 00024 * Contributor(s): Blender Foundation 00025 * 00026 * ***** END GPL LICENSE BLOCK ***** 00027 */ 00028 00034 #include <string.h> 00035 #include <stdio.h> 00036 00037 #include "DNA_scene_types.h" 00038 00039 #include "MEM_guardedalloc.h" 00040 00041 #include "BLI_blenlib.h" 00042 #include "BLI_math.h" 00043 #include "BLI_path_util.h" 00044 #include "BLI_utildefines.h" 00045 00046 #include "BKE_context.h" 00047 #include "BKE_screen.h" 00048 #include "BKE_sequencer.h" 00049 #include "BKE_global.h" 00050 00051 #include "ED_space_api.h" 00052 #include "ED_sequencer.h" 00053 #include "ED_screen.h" 00054 #include "ED_view3d.h" /* only for sequencer view3d drawing callback */ 00055 00056 #include "WM_api.h" 00057 #include "WM_types.h" 00058 00059 #include "UI_resources.h" 00060 #include "UI_view2d.h" 00061 00062 #include "sequencer_intern.h" // own include 00063 00064 /* ******************** manage regions ********************* */ 00065 00066 ARegion *sequencer_has_buttons_region(ScrArea *sa) 00067 { 00068 ARegion *ar, *arnew; 00069 00070 ar= BKE_area_find_region_type(sa, RGN_TYPE_UI); 00071 if(ar) return ar; 00072 00073 /* add subdiv level; after header */ 00074 ar= BKE_area_find_region_type(sa, RGN_TYPE_HEADER); 00075 00076 /* is error! */ 00077 if(ar==NULL) return NULL; 00078 00079 arnew= MEM_callocN(sizeof(ARegion), "buttons for sequencer"); 00080 00081 BLI_insertlinkafter(&sa->regionbase, ar, arnew); 00082 arnew->regiontype= RGN_TYPE_UI; 00083 arnew->alignment= RGN_ALIGN_RIGHT; 00084 00085 arnew->flag = RGN_FLAG_HIDDEN; 00086 00087 return arnew; 00088 } 00089 00090 static ARegion *sequencer_find_region(ScrArea *sa, short type) 00091 { 00092 ARegion *ar=NULL; 00093 00094 for(ar= sa->regionbase.first; ar; ar= ar->next) 00095 if(ar->regiontype==type) 00096 return ar; 00097 00098 return ar; 00099 } 00100 00101 void ED_sequencer_update_view(bContext *C, int view) 00102 { 00103 ScrArea *sa= CTX_wm_area(C); 00104 00105 ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW); 00106 ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW); 00107 00108 switch (view) { 00109 case SEQ_VIEW_SEQUENCE: 00110 if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { 00111 ar_main->flag &= ~RGN_FLAG_HIDDEN; 00112 ar_main->v2d.flag &= ~V2D_IS_INITIALISED; 00113 } 00114 if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) { 00115 ar_preview->flag |= RGN_FLAG_HIDDEN; 00116 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; 00117 WM_event_remove_handlers(C, &ar_preview->handlers); 00118 } 00119 if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; 00120 if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE; 00121 break; 00122 case SEQ_VIEW_PREVIEW: 00123 if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) { 00124 ar_main->flag |= RGN_FLAG_HIDDEN; 00125 ar_main->v2d.flag &= ~V2D_IS_INITIALISED; 00126 WM_event_remove_handlers(C, &ar_main->handlers); 00127 } 00128 if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { 00129 ar_preview->flag &= ~RGN_FLAG_HIDDEN; 00130 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; 00131 ar_preview->v2d.cur = ar_preview->v2d.tot; 00132 } 00133 if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; 00134 if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE; 00135 break; 00136 case SEQ_VIEW_SEQUENCE_PREVIEW: 00137 if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { 00138 ar_main->flag &= ~RGN_FLAG_HIDDEN; 00139 ar_main->v2d.flag &= ~V2D_IS_INITIALISED; 00140 } 00141 if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { 00142 ar_preview->flag &= ~RGN_FLAG_HIDDEN; 00143 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; 00144 ar_preview->v2d.cur = ar_preview->v2d.tot; 00145 } 00146 if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; 00147 if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP; 00148 break; 00149 } 00150 00151 ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa); 00152 ED_area_tag_redraw(sa); 00153 } 00154 00155 00156 /* ******************** default callbacks for sequencer space ***************** */ 00157 00158 static SpaceLink *sequencer_new(const bContext *C) 00159 { 00160 Scene *scene= CTX_data_scene(C); 00161 ARegion *ar; 00162 SpaceSeq *sseq; 00163 00164 sseq= MEM_callocN(sizeof(SpaceSeq), "initsequencer"); 00165 sseq->spacetype= SPACE_SEQ; 00166 sseq->zoom= 4; 00167 sseq->chanshown = 0; 00168 sseq->view = SEQ_VIEW_SEQUENCE; 00169 sseq->mainb = SEQ_DRAW_IMG_IMBUF; 00170 /* header */ 00171 ar= MEM_callocN(sizeof(ARegion), "header for sequencer"); 00172 00173 BLI_addtail(&sseq->regionbase, ar); 00174 ar->regiontype= RGN_TYPE_HEADER; 00175 ar->alignment= RGN_ALIGN_BOTTOM; 00176 00177 /* buttons/list view */ 00178 ar= MEM_callocN(sizeof(ARegion), "buttons for sequencer"); 00179 00180 BLI_addtail(&sseq->regionbase, ar); 00181 ar->regiontype= RGN_TYPE_UI; 00182 ar->alignment= RGN_ALIGN_RIGHT; 00183 ar->flag = RGN_FLAG_HIDDEN; 00184 00185 /* preview area */ 00186 /* NOTE: if you change values here, also change them in sequencer_init_preview_region */ 00187 ar= MEM_callocN(sizeof(ARegion), "preview area for sequencer"); 00188 BLI_addtail(&sseq->regionbase, ar); 00189 ar->regiontype= RGN_TYPE_PREVIEW; 00190 ar->alignment= RGN_ALIGN_TOP; 00191 ar->flag |= RGN_FLAG_HIDDEN; 00192 /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */ 00193 ar->v2d.keepzoom= V2D_KEEPASPECT | V2D_KEEPZOOM; 00194 ar->v2d.minzoom= 0.00001f; 00195 ar->v2d.maxzoom= 100000.0f; 00196 ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */ 00197 ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */ 00198 ar->v2d.tot.xmax= 960.0f; 00199 ar->v2d.tot.ymax= 540.0f; 00200 ar->v2d.min[0]= 0.0f; 00201 ar->v2d.min[1]= 0.0f; 00202 ar->v2d.max[0]= 12000.0f; 00203 ar->v2d.max[1]= 12000.0f; 00204 ar->v2d.cur= ar->v2d.tot; 00205 ar->v2d.align= V2D_ALIGN_FREE; 00206 ar->v2d.keeptot= V2D_KEEPTOT_FREE; 00207 00208 00209 /* main area */ 00210 ar= MEM_callocN(sizeof(ARegion), "main area for sequencer"); 00211 00212 BLI_addtail(&sseq->regionbase, ar); 00213 ar->regiontype= RGN_TYPE_WINDOW; 00214 00215 00216 /* seq space goes from (0,8) to (0, efra) */ 00217 00218 ar->v2d.tot.xmin= 0.0f; 00219 ar->v2d.tot.ymin= 0.0f; 00220 ar->v2d.tot.xmax= scene->r.efra; 00221 ar->v2d.tot.ymax= 8.0f; 00222 00223 ar->v2d.cur= ar->v2d.tot; 00224 00225 ar->v2d.min[0]= 10.0f; 00226 ar->v2d.min[1]= 4.0f; 00227 00228 ar->v2d.max[0]= MAXFRAMEF; 00229 ar->v2d.max[1]= MAXSEQ; 00230 00231 ar->v2d.minzoom= 0.01f; 00232 ar->v2d.maxzoom= 100.0f; 00233 00234 ar->v2d.scroll |= (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL); 00235 ar->v2d.scroll |= (V2D_SCROLL_LEFT|V2D_SCROLL_SCALE_VERTICAL); 00236 ar->v2d.keepzoom= 0; 00237 ar->v2d.keeptot= 0; 00238 ar->v2d.align= V2D_ALIGN_NO_NEG_Y; 00239 00240 return (SpaceLink *)sseq; 00241 } 00242 00243 /* not spacelink itself */ 00244 static void sequencer_free(SpaceLink *UNUSED(sl)) 00245 { 00246 // SpaceSeq *sseq= (SpaceSequencer*) sl; 00247 00248 // XXX if(sseq->gpd) free_gpencil_data(sseq->gpd); 00249 00250 } 00251 00252 00253 /* spacetype; init callback */ 00254 static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa)) 00255 { 00256 00257 } 00258 00259 static SpaceLink *sequencer_duplicate(SpaceLink *sl) 00260 { 00261 SpaceSeq *sseqn= MEM_dupallocN(sl); 00262 00263 /* clear or remove stuff from old */ 00264 // XXX sseq->gpd= gpencil_data_duplicate(sseq->gpd); 00265 00266 return (SpaceLink *)sseqn; 00267 } 00268 00269 00270 00271 /* *********************** sequencer (main) region ************************ */ 00272 /* add handlers, stuff you only do once or on area/region changes */ 00273 static void sequencer_main_area_init(wmWindowManager *wm, ARegion *ar) 00274 { 00275 wmKeyMap *keymap; 00276 ListBase *lb; 00277 00278 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); 00279 00280 keymap= WM_keymap_find(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0); 00281 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); 00282 00283 /* own keymap */ 00284 keymap= WM_keymap_find(wm->defaultconf, "Sequencer", SPACE_SEQ, 0); 00285 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); 00286 00287 /* add drop boxes */ 00288 lb= WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW); 00289 00290 WM_event_add_dropbox_handler(&ar->handlers, lb); 00291 00292 } 00293 00294 static void sequencer_main_area_draw(const bContext *C, ARegion *ar) 00295 { 00296 // ScrArea *sa= CTX_wm_area(C); 00297 00298 /* NLE - strip editing timeline interface */ 00299 draw_timeline_seq(C, ar); 00300 } 00301 00302 /* ************* dropboxes ************* */ 00303 00304 static int image_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event)) 00305 { 00306 if(drag->type==WM_DRAG_PATH) 00307 if(ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */ 00308 return 1; 00309 return 0; 00310 } 00311 00312 static int movie_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event)) 00313 { 00314 if(drag->type==WM_DRAG_PATH) 00315 if(ELEM3(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK)) /* rule might not work? */ 00316 return 1; 00317 return 0; 00318 } 00319 00320 static int sound_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event)) 00321 { 00322 if(drag->type==WM_DRAG_PATH) 00323 if(ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK)) /* rule might not work? */ 00324 return 1; 00325 return 0; 00326 } 00327 00328 static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop) 00329 { 00330 /* copy drag path to properties */ 00331 if(RNA_struct_find_property(drop->ptr, "filepath")) 00332 RNA_string_set(drop->ptr, "filepath", drag->path); 00333 00334 if(RNA_struct_find_property(drop->ptr, "directory")) { 00335 PointerRNA itemptr; 00336 char dir[FILE_MAX], file[FILE_MAX]; 00337 00338 BLI_split_dirfile(drag->path, dir, file); 00339 00340 RNA_string_set(drop->ptr, "directory", dir); 00341 00342 RNA_collection_clear(drop->ptr, "files"); 00343 RNA_collection_add(drop->ptr, "files", &itemptr); 00344 RNA_string_set(&itemptr, "name", file); 00345 } 00346 } 00347 00348 /* this region dropbox definition */ 00349 static void sequencer_dropboxes(void) 00350 { 00351 ListBase *lb= WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW); 00352 00353 WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy); 00354 WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy); 00355 WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy); 00356 } 00357 00358 /* ************* end drop *********** */ 00359 00360 /* add handlers, stuff you only do once or on area/region changes */ 00361 static void sequencer_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar) 00362 { 00363 ED_region_header_init(ar); 00364 } 00365 00366 static void sequencer_header_area_draw(const bContext *C, ARegion *ar) 00367 { 00368 ED_region_header(C, ar); 00369 } 00370 00371 static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn) 00372 { 00373 /* context changes */ 00374 switch(wmn->category) { 00375 case NC_SCENE: 00376 switch(wmn->data) { 00377 case ND_FRAME: 00378 case ND_FRAME_RANGE: 00379 case ND_MARKERS: 00380 case ND_RENDER_OPTIONS: /* for FPS and FPS Base */ 00381 case ND_SEQUENCER: 00382 ED_region_tag_redraw(ar); 00383 break; 00384 } 00385 break; 00386 case NC_SPACE: 00387 if(wmn->data == ND_SPACE_SEQUENCER) 00388 ED_region_tag_redraw(ar); 00389 break; 00390 case NC_ID: 00391 if(wmn->action == NA_RENAME) 00392 ED_region_tag_redraw(ar); 00393 break; 00394 } 00395 } 00396 00397 /* *********************** preview region ************************ */ 00398 static void sequencer_preview_area_init(wmWindowManager *wm, ARegion *ar) 00399 { 00400 wmKeyMap *keymap; 00401 00402 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); 00403 00404 keymap= WM_keymap_find(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0); 00405 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); 00406 00407 /* own keymap */ 00408 keymap= WM_keymap_find(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0); 00409 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); 00410 } 00411 00412 static void sequencer_preview_area_draw(const bContext *C, ARegion *ar) 00413 { 00414 ScrArea *sa= CTX_wm_area(C); 00415 SpaceSeq *sseq= sa->spacedata.first; 00416 Scene *scene= CTX_data_scene(C); 00417 00418 /* XXX temp fix for wrong setting in sseq->mainb */ 00419 if (sseq->mainb == SEQ_DRAW_SEQUENCE) sseq->mainb = SEQ_DRAW_IMG_IMBUF; 00420 00421 draw_image_seq(C, scene, ar, sseq, scene->r.cfra, 0); 00422 00423 if(scene->ed && scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW && sseq->mainb == SEQ_DRAW_IMG_IMBUF) { 00424 int over_cfra; 00425 00426 if(scene->ed->over_flag & SEQ_EDIT_OVERLAY_ABS) 00427 over_cfra= scene->ed->over_cfra; 00428 else 00429 over_cfra= scene->r.cfra + scene->ed->over_ofs; 00430 00431 if(over_cfra != scene->r.cfra) 00432 draw_image_seq(C, scene, ar, sseq, scene->r.cfra, over_cfra - scene->r.cfra); 00433 } 00434 00435 } 00436 00437 static void sequencer_preview_area_listener(ARegion *ar, wmNotifier *wmn) 00438 { 00439 /* context changes */ 00440 switch(wmn->category) { 00441 case NC_SCENE: 00442 switch(wmn->data) { 00443 case ND_FRAME: 00444 case ND_MARKERS: 00445 case ND_SEQUENCER: 00446 ED_region_tag_redraw(ar); 00447 break; 00448 } 00449 break; 00450 case NC_SPACE: 00451 if(wmn->data == ND_SPACE_SEQUENCER) 00452 ED_region_tag_redraw(ar); 00453 break; 00454 case NC_ID: 00455 switch(wmn->data) { 00456 case NA_RENAME: 00457 ED_region_tag_redraw(ar); 00458 break; 00459 } 00460 break; 00461 } 00462 } 00463 00464 /* *********************** buttons region ************************ */ 00465 00466 /* add handlers, stuff you only do once or on area/region changes */ 00467 static void sequencer_buttons_area_init(wmWindowManager *wm, ARegion *ar) 00468 { 00469 00470 ED_region_panels_init(wm, ar); 00471 00472 } 00473 00474 static void sequencer_buttons_area_draw(const bContext *C, ARegion *ar) 00475 { 00476 ED_region_panels(C, ar, 1, NULL, -1); 00477 } 00478 00479 static void sequencer_buttons_area_listener(ARegion *ar, wmNotifier *wmn) 00480 { 00481 /* context changes */ 00482 switch(wmn->category) { 00483 case NC_SCENE: 00484 switch(wmn->data) { 00485 case ND_FRAME: 00486 case ND_SEQUENCER: 00487 ED_region_tag_redraw(ar); 00488 break; 00489 } 00490 break; 00491 case NC_SPACE: 00492 if(wmn->data == ND_SPACE_SEQUENCER) 00493 ED_region_tag_redraw(ar); 00494 break; 00495 case NC_ID: 00496 if(wmn->action == NA_RENAME) 00497 ED_region_tag_redraw(ar); 00498 break; 00499 } 00500 } 00501 /* ************************************* */ 00502 00503 /* only called once, from space/spacetypes.c */ 00504 void ED_spacetype_sequencer(void) 00505 { 00506 SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype sequencer"); 00507 ARegionType *art; 00508 00509 st->spaceid= SPACE_SEQ; 00510 strncpy(st->name, "Sequencer", BKE_ST_MAXNAME); 00511 00512 st->new= sequencer_new; 00513 st->free= sequencer_free; 00514 st->init= sequencer_init; 00515 st->duplicate= sequencer_duplicate; 00516 st->operatortypes= sequencer_operatortypes; 00517 st->keymap= sequencer_keymap; 00518 st->dropboxes= sequencer_dropboxes; 00519 00520 /* regions: main window */ 00521 art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region"); 00522 art->regionid = RGN_TYPE_WINDOW; 00523 art->init= sequencer_main_area_init; 00524 art->draw= sequencer_main_area_draw; 00525 art->listener= sequencer_main_area_listener; 00526 art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION; 00527 00528 BLI_addhead(&st->regiontypes, art); 00529 00530 /* preview */ 00531 art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region"); 00532 art->regionid = RGN_TYPE_PREVIEW; 00533 art->prefsizey = 240; // XXX 00534 art->init= sequencer_preview_area_init; 00535 art->draw= sequencer_preview_area_draw; 00536 art->listener= sequencer_preview_area_listener; 00537 art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION; 00538 BLI_addhead(&st->regiontypes, art); 00539 00540 /* regions: listview/buttons */ 00541 art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region"); 00542 art->regionid = RGN_TYPE_UI; 00543 art->prefsizex= 220; // XXX 00544 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES; 00545 art->listener= sequencer_buttons_area_listener; 00546 art->init= sequencer_buttons_area_init; 00547 art->draw= sequencer_buttons_area_draw; 00548 BLI_addhead(&st->regiontypes, art); 00549 00550 /* Keep as python only for now 00551 sequencer_buttons_register(art); 00552 */ 00553 00554 /* regions: header */ 00555 art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region"); 00556 art->regionid = RGN_TYPE_HEADER; 00557 art->prefsizey= HEADERY; 00558 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER; 00559 00560 art->init= sequencer_header_area_init; 00561 art->draw= sequencer_header_area_draw; 00562 art->listener= sequencer_main_area_listener; 00563 00564 BLI_addhead(&st->regiontypes, art); 00565 00566 BKE_spacetype_register(st); 00567 00568 /* set the sequencer callback when not in background mode */ 00569 if(G.background==0) { 00570 sequencer_view3d_cb= ED_view3d_draw_offscreen_imbuf_simple; 00571 } 00572 } 00573