diff options
Diffstat (limited to 'source/blender/python/api2_2x/Draw.c')
-rw-r--r-- | source/blender/python/api2_2x/Draw.c | 2197 |
1 files changed, 0 insertions, 2197 deletions
diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c deleted file mode 100644 index 621c72efc2a..00000000000 --- a/source/blender/python/api2_2x/Draw.c +++ /dev/null @@ -1,2197 +0,0 @@ -/* - * $Id: Draw.c 12893 2007-12-15 18:24:16Z campbellbarton $ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Campbell Barton, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* This file is the Blender.Draw part of opy_draw.c, from the old - * bpython/intern dir, with minor changes to adapt it to the new Python - * implementation. Non-trivial original comments are marked with an - * @ symbol at their beginning. */ - -#include "Draw.h" /*This must come first*/ - -#include "BLI_blenlib.h" -#include "MEM_guardedalloc.h" -#include "BMF_Api.h" -#include "DNA_screen_types.h" -#include "BKE_global.h" -#include "BKE_image.h" -#include "BKE_object.h" -#include "BKE_main.h" -#include "BKE_utildefines.h" -#include "BIF_gl.h" -#include "BIF_mywindow.h" -#include "BIF_screen.h" -#include "BIF_space.h" -#include "BIF_interface.h" -#include "BIF_toolbox.h" -#include "BPI_script.h" /* script struct */ -#include "Image.h" /* for accessing Blender.Image objects */ -#include "IMB_imbuf_types.h" /* for the IB_rect define */ -#include "interface.h" -#include "mydevice.h" /*@ for all the event constants */ -#include "gen_utils.h" -#include "Window.h" -#include "../BPY_extern.h" - -/* used so we can get G.scene->r.cfra for getting the -current image frame, some images change frame if they are a sequence */ -#include "DNA_scene_types.h" - -/* these delimit the free range for button events */ -#define EXPP_BUTTON_EVENTS_OFFSET 1001 -#define EXPP_BUTTON_EVENTS_MIN 0 -#define EXPP_BUTTON_EVENTS_MAX 15382 /* 16384 - 1 - OFFSET */ - -#define ButtonObject_Check(v) ((v)->ob_type == &Button_Type) - -#define UI_METHOD_ERRORCHECK \ - if (check_button_event(&event) == -1)\ - return EXPP_ReturnPyObjError( PyExc_AttributeError,\ - "button event argument must be in the range [0, 16382]");\ - if (callback && !PyCallable_Check(callback))\ - return EXPP_ReturnPyObjError( PyExc_ValueError,\ - "callback is not a python function");\ - -/* pointer to main dictionary defined in Blender.c */ -extern PyObject *g_blenderdict; - -/*@ hack to flag that window redraw has happened inside slider callback: */ -int EXPP_disable_force_draw = 0; - -/* forward declarations for internal functions */ -static void Button_dealloc( PyObject * self ); -static PyObject *Button_getattr( PyObject * self, char *name ); -static PyObject *Button_repr( PyObject * self ); -static PyObject *Button_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type); -static int Button_setattr( PyObject * self, char *name, PyObject * v ); - -static Button *newbutton( void ); - -/* GUI interface routines */ - -static void exit_pydraw( SpaceScript * sc, short error ); -static void exec_callback( SpaceScript * sc, PyObject * callback, - PyObject * args ); -static void spacescript_do_pywin_buttons( SpaceScript * sc, - unsigned short event ); - -static PyObject *Method_Exit( PyObject * self ); -static PyObject *Method_Register( PyObject * self, PyObject * args ); -static PyObject *Method_Redraw( PyObject * self, PyObject * args ); -static PyObject *Method_Draw( PyObject * self ); -static PyObject *Method_Create( PyObject * self, PyObject * args ); -static PyObject *Method_UIBlock( PyObject * self, PyObject * args ); - -static PyObject *Method_Button( PyObject * self, PyObject * args ); -static PyObject *Method_Menu( PyObject * self, PyObject * args ); -static PyObject *Method_Toggle( PyObject * self, PyObject * args ); -static PyObject *Method_Slider( PyObject * self, PyObject * args ); -static PyObject *Method_Scrollbar( PyObject * self, PyObject * args ); -static PyObject *Method_ColorPicker( PyObject * self, PyObject * args ); -static PyObject *Method_Normal( PyObject * self, PyObject * args ); -static PyObject *Method_Number( PyObject * self, PyObject * args ); -static PyObject *Method_String( PyObject * self, PyObject * args ); -static PyObject *Method_GetStringWidth( PyObject * self, PyObject * args ); -static PyObject *Method_Text( PyObject * self, PyObject * args ); -static PyObject *Method_Label( PyObject * self, PyObject * args ); -/* by Campbell: */ -static PyObject *Method_PupMenu( PyObject * self, PyObject * args ); -static PyObject *Method_PupIntInput( PyObject * self, PyObject * args ); -static PyObject *Method_PupFloatInput( PyObject * self, PyObject * args ); -static PyObject *Method_PupStrInput( PyObject * self, PyObject * args ); -static PyObject *Method_BeginAlign( PyObject * self, PyObject * args ); -static PyObject *Method_EndAlign( PyObject * self, PyObject * args ); -/* next by Jonathan Merritt (lancelet): */ -static PyObject *Method_Image( PyObject * self, PyObject * args); -/* CLEVER NUMBUT */ -static PyObject *Method_PupBlock( PyObject * self, PyObject * args ); - -static uiBlock *Get_uiBlock( void ); - -static void py_slider_update( void *butv, void *data2_unused ); - -/* hack to get 1 block for the UIBlock, only ever 1 at a time */ -static uiBlock *uiblock=NULL; - -static char Draw_doc[] = "The Blender.Draw submodule"; - -static char Method_UIBlock_doc[] = "(drawfunc, x,y) - Popup dialog where buttons can be drawn (expemental)"; - -static char Method_Register_doc[] = - "(draw, event, button) - Register callbacks for windowing\n\n\ -(draw) A function to draw the screen, taking no arguments\n\ -(event) A function to handle events, taking 2 arguments (evt, val)\n\ - (evt) The event number\n\ - (val) The value modifier (for key and mouse press/release)\n\ -(button) A function to handle button events, taking 1 argument (evt)\n\ - (evt) The button number\n\n\ -A None object can be passed if a callback is unused."; - - -static char Method_Redraw_doc[] = "([after]) - Queue a redraw event\n\n\ -[after=0] Determines whether the redraw is processed before\n\ -or after other input events.\n\n\ -Redraw events are buffered so that regardless of how many events\n\ -are queued the window only receives one redraw event."; - -static char Method_Draw_doc[] = "() - Force an immediate redraw\n\n\ -Forced redraws are not buffered, in other words the window is redrawn\n\ -exactly once for everytime this function is called."; - - -static char Method_Create_doc[] = - "(value) - Create a default Button object\n\n\ - (value) - The value to store in the button\n\n\ - Valid values are ints, floats, and strings"; - -static char Method_Button_doc[] = - "(name, event, x, y, width, height, [tooltip]) - Create a new Button \ -(push) button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -[tooltip=] The button's tooltip\n\n\ -This function can be called as Button() or PushButton()."; - -static char Method_BeginAlign_doc[] = - "Buttons after this function will draw aligned (button layout only)"; - -static char Method_EndAlign_doc[] = - "Use after BeginAlign() to stop aligning the buttons (button layout only)."; - -static char Method_Menu_doc[] = - "(name, event, x, y, width, height, default, [tooltip]) - Create a new Menu \ -button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(default) The number of the option to be selected by default\n\ -[tooltip=" "] The button's tooltip\n\n\ -The menu options are specified through the name of the\n\ -button. Options are followed by a format code and separated\n\ -by the '|' (pipe) character.\n\ -Valid format codes are\n\ - %t - The option should be used as the title\n\ - %xN - The option should set the integer N in the button value."; - -static char Method_Toggle_doc[] = - "(name, event, x, y, width, height, default, [tooltip]) - Create a new Toggle \ -button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(default) An integer (0 or 1) specifying the default state\n\ -[tooltip=] The button's tooltip"; - - -static char Method_Slider_doc[] = - "(name, event, x, y, width, height, initial, min, max, [update, tooltip]) - \ -Create a new Slider button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial, min, max) Three values (int or float) specifying the initial \ - and limit values.\n\ -[update=1] A value controlling whether the slider will emit events as it \ -is edited.\n\ - A non-zero value (default) enables the events. A zero value supresses them.\n\ -[tooltip=] The button's tooltip"; - - -static char Method_Scrollbar_doc[] = - "(event, x, y, width, height, initial, min, max, [update, tooltip]) - Create a \ -new Scrollbar\n\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial, min, max) Three values (int or float) specifying the initial and limit values.\n\ -[update=1] A value controlling whether the slider will emit events as it is edited.\n\ - A non-zero value (default) enables the events. A zero value supresses them.\n\ -[tooltip=] The button's tooltip"; - -static char Method_ColorPicker_doc[] = - "(event, x, y, width, height, initial, [tooltip]) - Create a new Button \ -Color picker button\n\n\ -(event) The event number to pass to the button event function when the color changes\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial) 3-Float tuple of the color (values between 0 and 1)\ -[tooltip=] The button's tooltip"; - -static char Method_Normal_doc[] = - "(event, x, y, width, height, initial, [tooltip]) - Create a new Button \ -Normal button (a sphere that you can roll to change the normal)\n\n\ -(event) The event number to pass to the button event function when the color changes\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height - non square will gave odd results\n\ -(initial) 3-Float tuple of the normal vector (values between -1 and 1)\ -[tooltip=] The button's tooltip"; - -static char Method_Number_doc[] = - "(name, event, x, y, width, height, initial, min, max, [tooltip]) - Create a \ -new Number button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial, min, max) Three values (int or float) specifying the initial and \ -limit values.\n\ -[tooltip=] The button's tooltip"; - -static char Method_String_doc[] = - "(name, event, x, y, width, height, initial, length, [tooltip]) - Create a \ -new String button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial) The string to display initially\n\ -(length) The maximum input length\n\ -[tooltip=] The button's tooltip"; - -static char Method_GetStringWidth_doc[] = - "(text, font = 'normal') - Return the width in pixels of the given string\n\ -(font) The font size: 'normal' (default), 'small' or 'tiny'."; - -static char Method_Text_doc[] = - "(text, font = 'normal') - Draw text onscreen\n\n\ -(text) The text to draw\n\ -(font) The font size: 'normal' (default), 'small' or 'tiny'.\n\n\ -This function returns the width of the drawn string."; - -static char Method_Label_doc[] = - "(text, x, y) - Draw a text label onscreen\n\n\ -(text) The text to draw\n\ -(x, y) The lower left coordinate of the lable"; - -static char Method_PupMenu_doc[] = - "(string, maxrow = None) - Display a pop-up menu at the screen.\n\ -The contents of the pop-up are specified through the 'string' argument,\n\ -like with Draw.Menu.\n\ -'maxrow' is an optional int to control how many rows the pop-up should have.\n\ -Options are followed by a format code and separated\n\ -by the '|' (pipe) character.\n\ -Valid format codes are\n\ - %t - The option should be used as the title\n\ - %xN - The option should set the integer N in the button value.\n\n\ -Ex: Draw.PupMenu('OK?%t|QUIT BLENDER') # should be familiar ..."; - -static char Method_PupIntInput_doc[] = - "(text, default, min, max) - Display an int pop-up input.\n\ -(text) - text string to display on the button;\n\ -(default, min, max) - the default, min and max int values for the button;\n\ -Return the user input value or None on user exit"; - -static char Method_PupFloatInput_doc[] = - "(text, default, min, max, clickStep, floatLen) - Display a float pop-up input.\n\ -(text) - text string to display on the button;\n\ -(default, min, max) - the default, min and max float values for the button;\n\ -(clickStep) - float increment/decrement for each click on the button arrows;\n\ -(floatLen) - an integer defining the precision (number of decimal places) of \n\ -the float value show.\n\ -Return the user input value or None on user exit"; - -static char Method_Image_doc[] = - "(image, x, y, zoomx = 1.0, zoomy = 1.0, [clipx, clipy, clipw, cliph])) \n\ - - Draw an image.\n\ -(image) - Blender.Image to draw.\n\ -(x, y) - floats specifying the location of the image.\n\ -(zoomx, zoomy) - float zoom factors in horizontal and vertical directions.\n\ -(clipx, clipy, clipw, cliph) - integers specifying a clipping rectangle within the original image."; - -static char Method_PupStrInput_doc[] = - "(text, default, max = 20) - Display a float pop-up input.\n\ -(text) - text string to display on the button;\n\ -(default) - the initial string to display (truncated to 'max' chars);\n\ -(max = 20) - The maximum number of chars the user can input;\n\ -Return the user input value or None on user exit"; - -static char Method_PupBlock_doc[] = - "(title, sequence) - Display a pop-up block.\n\ -(title) - The title of the block.\n\ -(sequence) - A sequence defining what the block contains. \ -The order of the list is the order of appearance, from top down.\n\ -Possible format for sequence items:\n\ -[value is an object created with Create]\n\ -\ttext: Defines a label in the block\n\ -\t(text, value, tooltip = ''): Defines a toggle button \n\ -\t(text, value, min, max, tooltip = ''): Defines a num or string button \n\ -\t\t\tdepending on the value.\n\ -\t\tFor string, max is the maximum length of the text and min is unused.\n\ -Return 1 if the pop-up is confirmed, 0 otherwise. \n\ -Warning: On cancel, the value objects are brought back to there previous values, \ -\texcept for string values which will still contain the modified values.\n"; - -static char Method_Exit_doc[] = "() - Exit the windowing interface"; - -/*This is needed for button callbacks. Any button that uses a callback gets added to this list. - On the C side of drawing begin, this list should be cleared. - Each entry is a tuple of the form (button, callback py object) -*/ -PyObject *M_Button_List = NULL; - -static struct PyMethodDef Draw_methods[] = { - {"Create", (PyCFunction)Method_Create, METH_VARARGS, Method_Create_doc}, - {"UIBlock", (PyCFunction)Method_UIBlock, METH_VARARGS, Method_UIBlock_doc}, - {"Button", (PyCFunction)Method_Button, METH_VARARGS, Method_Button_doc}, - {"Toggle", (PyCFunction)Method_Toggle, METH_VARARGS, Method_Toggle_doc}, - {"Menu", (PyCFunction)Method_Menu, METH_VARARGS, Method_Menu_doc}, - {"Slider", (PyCFunction)Method_Slider, METH_VARARGS, Method_Slider_doc}, - {"Scrollbar", (PyCFunction)Method_Scrollbar, METH_VARARGS, Method_Scrollbar_doc}, - {"ColorPicker", (PyCFunction)Method_ColorPicker, METH_VARARGS, Method_ColorPicker_doc}, - {"Normal", (PyCFunction)Method_Normal, METH_VARARGS, Method_Normal_doc}, - {"Number", (PyCFunction)Method_Number, METH_VARARGS, Method_Number_doc}, - {"String", (PyCFunction)Method_String, METH_VARARGS, Method_String_doc}, - {"GetStringWidth", (PyCFunction)Method_GetStringWidth, METH_VARARGS, Method_GetStringWidth_doc}, - {"Text", (PyCFunction)Method_Text, METH_VARARGS, Method_Text_doc}, - {"Label", (PyCFunction)Method_Label, METH_VARARGS, Method_Label_doc}, - {"PupMenu", (PyCFunction)Method_PupMenu, METH_VARARGS, Method_PupMenu_doc}, - {"PupIntInput", (PyCFunction)Method_PupIntInput, METH_VARARGS, Method_PupIntInput_doc}, - {"PupFloatInput", (PyCFunction)Method_PupFloatInput, METH_VARARGS, Method_PupFloatInput_doc}, - {"PupStrInput", (PyCFunction)Method_PupStrInput, METH_VARARGS, Method_PupStrInput_doc}, - {"PupBlock", (PyCFunction)Method_PupBlock, METH_VARARGS, Method_PupBlock_doc}, - {"Image", (PyCFunction)Method_Image, METH_VARARGS, Method_Image_doc}, - {"Exit", (PyCFunction)Method_Exit, METH_NOARGS, Method_Exit_doc}, - {"Redraw", (PyCFunction)Method_Redraw, METH_VARARGS, Method_Redraw_doc}, - {"Draw", (PyCFunction)Method_Draw, METH_NOARGS, Method_Draw_doc}, - {"Register", (PyCFunction)Method_Register, METH_VARARGS, Method_Register_doc}, - {"PushButton", (PyCFunction)Method_Button, METH_VARARGS, Method_Button_doc}, - {"BeginAlign", (PyCFunction)Method_BeginAlign, METH_VARARGS, Method_BeginAlign_doc}, - {"EndAlign", (PyCFunction)Method_EndAlign, METH_VARARGS, Method_EndAlign_doc}, - {NULL, NULL, 0, NULL} -}; - -PyTypeObject Button_Type = { - PyObject_HEAD_INIT( NULL ) 0, /*ob_size */ - "Button", /*tp_name */ - sizeof( Button ), /*tp_basicsize */ - 0, /*tp_itemsize */ - ( destructor ) Button_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) Button_getattr, /*tp_getattr */ - ( setattrfunc ) Button_setattr, /*tp_setattr */ - NULL, /*tp_cmp */ - ( reprfunc ) Button_repr, /*tp_repr */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - NULL, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - NULL, /* hashfunc tp_hash; */ - NULL, /* ternaryfunc tp_call; */ - NULL, /* reprfunc tp_str; */ - NULL, /* getattrofunc tp_getattro; */ - NULL, /* setattrofunc tp_setattro; */ - - /* Functions to access object as input/output buffer */ - NULL, /* PyBufferProcs *tp_as_buffer; */ - - /*** Flags to define presence of optional/expanded features ***/ - Py_TPFLAGS_DEFAULT, /* long tp_flags; */ - - NULL, /* char *tp_doc; Documentation string */ - /*** Assigned meaning in release 2.0 ***/ - /* call function for all accessible objects */ - NULL, /* traverseproc tp_traverse; */ - - /* delete references to contained objects */ - NULL, /* inquiry tp_clear; */ - - /*** Assigned meaning in release 2.1 ***/ - /*** rich comparisons ***/ - (richcmpfunc)Button_richcmpr, /* richcmpfunc tp_richcompare; */ - - /*** weak reference enabler ***/ - 0, /* long tp_weaklistoffset; */ - - /*** Added in release 2.2 ***/ - /* Iterators */ - NULL, /* getiterfunc tp_iter; */ - NULL, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - NULL, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - NULL, /* initproc tp_init; */ - NULL, /* allocfunc tp_alloc; */ - NULL, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - NULL, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - NULL, /* inquiry tp_is_gc; */ - NULL, /* PyObject *tp_bases; */ - /* method resolution order */ - NULL, /* PyObject *tp_mro; */ - NULL, /* PyObject *tp_cache; */ - NULL, /* PyObject *tp_subclasses; */ - NULL, /* PyObject *tp_weaklist; */ - NULL -}; - -static void Button_dealloc( PyObject * self ) -{ - Button *but = ( Button * ) self; - - if( but->type == BSTRING_TYPE ) { - if( but->val.asstr ) - MEM_freeN( but->val.asstr ); - } - - PyObject_DEL( self ); -} - -static PyObject *Button_getattr( PyObject * self, char *name ) -{ - Button *but = ( Button * ) self; - - if( strcmp( name, "val" ) == 0 ) { - if( but->type == BINT_TYPE ) - return PyInt_FromLong( but->val.asint ); - else if( but->type == BFLOAT_TYPE ) - return PyFloat_FromDouble( but->val.asfloat ); - else if( but->type == BSTRING_TYPE ) - return PyString_FromString( but->val.asstr ); - else if( but->type == BVECTOR_TYPE ) - return Py_BuildValue( "fff", but->val.asvec[0], but->val.asvec[1], but->val.asvec[2] ); - } - - PyErr_SetString( PyExc_AttributeError, name ); - return NULL; -} - -static int Button_setattr( PyObject * self, char *name, PyObject * v ) -{ - Button *but = ( Button * ) self; - - if( strcmp( name, "val" ) == 0 ) { - if( but->type == BINT_TYPE && PyNumber_Check(v) ) { - PyObject *pyVal = PyNumber_Int( v ); - if (pyVal) { - but->val.asint = (int)PyInt_AS_LONG( pyVal ); - Py_DECREF(pyVal); - return 0; - } - } - else if( but->type == BFLOAT_TYPE && PyNumber_Check(v) ) { - PyObject *pyVal = PyNumber_Float( v ); - if (pyVal) { - but->val.asfloat = (float)PyFloat_AS_DOUBLE( pyVal ); - Py_DECREF(pyVal); - return 0; - } - } - else if( but->type == BVECTOR_TYPE ) { - if ( PyArg_ParseTuple( v, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) ) - return 0; - } - else if( but->type == BSTRING_TYPE && PyString_Check(v) ) { - char *newstr; - unsigned int newlen; - - PyString_AsStringAndSize( v, &newstr, (int *)&newlen ); - - if (newlen+1> UI_MAX_DRAW_STR) - return EXPP_ReturnIntError( PyExc_ValueError, "Error: button string length exceeded max limit (399 chars)."); - - /* if the length of the new string is the same as */ - /* the old one, just copy, else delete and realloc. */ - if( but->slen == newlen ) { - BLI_strncpy( but->val.asstr, newstr, - but->slen + 1 ); - - return 0; - - } else { - MEM_freeN( but->val.asstr ); - but->slen = newlen; - but->val.asstr = - MEM_mallocN( but->slen + 1, - "button setattr" ); - BLI_strncpy( but->val.asstr, newstr, - but->slen + 1 ); - - return 0; - } - } - } else { - /* - * Accessing the wrong attribute. - */ - return EXPP_ReturnIntError( PyExc_AttributeError, name ); - } - - /* - * Correct attribute but value is incompatible with current button value. - */ - return EXPP_ReturnIntError( PyExc_ValueError, "value incompatible with current button type" ); -} - -static PyObject *Button_repr( PyObject * self ) -{ - return PyObject_Repr( Button_getattr( self, "val" ) ); -} - -static PyObject *Button_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type) -{ - PyObject *ret, *valA=NULL, *valB=NULL; - if (ButtonObject_Check(objectA)) - objectA = valA = Button_getattr( objectA, "val" ); - if (ButtonObject_Check(objectB)) - objectB = valB = Button_getattr( objectB, "val" ); - ret = PyObject_RichCompare(objectA, objectB, comparison_type); - Py_XDECREF(valA); /* Button_getattr created with 1 ref, we dont care about them now */ - Py_XDECREF(valB); - return ret; -} - - -static Button *newbutton( void ) -{ - Button *but = NULL; - - but = ( Button * ) PyObject_NEW( Button, &Button_Type ); - but->tooltip[0] = 0; /*NULL-terminate tooltip string*/ - but->tooltip[255] = 0; /*necassary to insure we always have a NULL-terminated string, as - according to the docs strncpy doesn't do this for us.*/ - return but; -} - -/* GUI interface routines */ - -static void exit_pydraw( SpaceScript * sc, short err ) -{ - Script *script = NULL; - - if( !sc || !sc->script ) - return; - - script = sc->script; - - if( err ) { - PyErr_Print( ); - script->flags = 0; /* mark script struct for deletion */ - error( "Python script error: check console" ); - scrarea_queue_redraw( sc->area ); - } - - BPy_Set_DrawButtonsList(sc->but_refs); - BPy_Free_DrawButtonsList(); /*clear all temp button references*/ - sc->but_refs = NULL; - - Py_XDECREF( ( PyObject * ) script->py_draw ); - Py_XDECREF( ( PyObject * ) script->py_event ); - Py_XDECREF( ( PyObject * ) script->py_button ); - - script->py_draw = script->py_event = script->py_button = NULL; -} - -static void exec_callback( SpaceScript * sc, PyObject * callback, - PyObject * args ) -{ - PyObject *result = PyObject_CallObject( callback, args ); - - if( result == NULL && sc->script ) { /* errors in the script */ - - if( sc->script->lastspace == SPACE_TEXT ) { /*if it can be an ALT+P script */ - Text *text = G.main->text.first; - - while( text ) { /* find it and free its compiled code */ - - if( !strcmp - ( text->id.name + 2, - sc->script->id.name + 2 ) ) { - BPY_free_compiled_text( text ); - break; - } - - text = text->id.next; - } - } - exit_pydraw( sc, 1 ); - } - - Py_XDECREF( result ); - Py_DECREF( args ); -} - -/* BPY_spacescript_do_pywin_draw, the static spacescript_do_pywin_buttons and - * BPY_spacescript_do_pywin_event are the three functions responsible for - * calling the draw, buttons and event callbacks registered with Draw.Register - * (see Method_Register below). They are called (only the two BPY_ ones) - * from blender/src/drawscript.c */ - -void BPY_spacescript_do_pywin_draw( SpaceScript * sc ) -{ - uiBlock *block; - char butblock[20]; - Script *script = sc->script; - - sprintf( butblock, "win %d", curarea->win ); - block = uiNewBlock( &curarea->uiblocks, butblock, UI_EMBOSSX, - UI_HELV, curarea->win ); - - if( script->py_draw ) { - if (sc->but_refs) { - BPy_Set_DrawButtonsList(sc->but_refs); - BPy_Free_DrawButtonsList(); /*clear all temp button references*/ - } - sc->but_refs = PyList_New(0); - BPy_Set_DrawButtonsList(sc->but_refs); - - glPushAttrib( GL_ALL_ATTRIB_BITS ); - exec_callback( sc, script->py_draw, Py_BuildValue( "()" ) ); - glPopAttrib( ); - } else { - glClearColor( 0.4375, 0.4375, 0.4375, 0.0 ); - glClear( GL_COLOR_BUFFER_BIT ); - } - - uiDrawBlock( block ); - - curarea->win_swap = WIN_BACK_OK; -} - -static void spacescript_do_pywin_buttons( SpaceScript * sc, - unsigned short event ) -{ - if( sc->script->py_button ) - exec_callback( sc, sc->script->py_button, - Py_BuildValue( "(i)", event ) ); -} - -void BPY_spacescript_do_pywin_event( SpaceScript * sc, unsigned short event, - short val, char ascii ) -{ - if( event == QKEY && G.qual & ( LR_ALTKEY | LR_CTRLKEY ) ) { - /* finish script: user pressed ALT+Q or CONTROL+Q */ - Script *script = sc->script; - - exit_pydraw( sc, 0 ); - - script->flags &= ~SCRIPT_GUI; /* we're done with this script */ - - return; - } - - if (val) { - - if (uiDoBlocks( &curarea->uiblocks, event, 1 ) != UI_NOTHING) event = 0; - - if (event == UI_BUT_EVENT) { - /* check that event is in free range for script button events; - * read the comment before check_button_event() below to understand */ - if (val >= EXPP_BUTTON_EVENTS_OFFSET && val < 0x4000) - spacescript_do_pywin_buttons(sc, val - EXPP_BUTTON_EVENTS_OFFSET); - return; - } - } - - /* We use the "event" main module var, used by scriptlinks, to pass the ascii - * value to event callbacks (gui/event/button callbacks are not allowed - * inside scriptlinks, so this is ok) */ - if( sc->script->py_event ) { - int pass_ascii = 0; - if (ascii > 31 && ascii != 127) { - pass_ascii = 1; - EXPP_dict_set_item_str(g_blenderdict, "event", - PyInt_FromLong((long)ascii)); - } - exec_callback( sc, sc->script->py_event, - Py_BuildValue( "(ii)", event, val ) ); - if (pass_ascii) - EXPP_dict_set_item_str(g_blenderdict, "event", - PyString_FromString("")); - } -} - -static void exec_but_callback(void *pyobj, void *data) -{ - PyObject *result; - PyObject *pyvalue = NULL; - uiBut *but = (uiBut *)data; - PyObject *arg; - PyObject *callback = (PyObject *)pyobj; - - double value = ui_get_but_val(but); - - if (callback==NULL || callback == Py_None) - return; - - /* Button types support - case MENU: - case TEX: - case TOG: - case NUMSLI: - case NUM: - case COL: - case BUT_NORMAL: - case BUT */ - switch (but->type) { - case TEX: - /*printf("TEX\n");*/ - pyvalue = PyString_FromString( (char *)but->poin ); - break; - case NUM: - case NUMSLI: - case TOG: - case MENU: - if (but->pointype==FLO) { - /*printf("FLO\n");*/ - pyvalue = PyFloat_FromDouble( (float)value ); - } else if (but->pointype==INT) { - /*printf("INT\n");*/ - pyvalue = PyInt_FromLong( (int)value ); - } else if (but->pointype==SHO) { - /*printf("SHO\n");*/ - pyvalue = PyInt_FromLong( (short)value ); - } - break; - case COL: - case BUT_NORMAL: - { - float vec[3]; - VECCOPY(vec, (float *)but->poin); - pyvalue = Py_BuildValue("(fff)", vec[0], vec[1], vec[2]); - break; - } - case BUT: - pyvalue = Py_None; - Py_INCREF(pyvalue); - break; - default: - pyvalue = Py_None; - Py_INCREF(pyvalue); - printf("Error, no button type matched."); - } - - arg = PyTuple_New( 2 ); - if (uiblock==NULL) - PyTuple_SetItem( arg, 0, PyInt_FromLong(but->retval - EXPP_BUTTON_EVENTS_OFFSET) ); - else - PyTuple_SetItem( arg, 0, PyInt_FromLong(but->retval) ); - - PyTuple_SetItem( arg, 1, pyvalue ); - - result = PyObject_CallObject( callback, arg ); - Py_DECREF(arg); - - if (!result) { - Py_DECREF(pyvalue); - PyErr_Print( ); - error( "Python script error: check console" ); - } - Py_XDECREF( result ); -} - -/*note that this function populates the drawbutton ref lists.*/ -static void set_pycallback(uiBut *ubut, PyObject *callback, Button *but) -{ - PyObject *tuple; - if (!callback || !PyCallable_Check(callback)) { - if (M_Button_List && but) { - PyList_Append(M_Button_List, (PyObject*)but); - } - return; - } - - if (M_Button_List) { - if (but) tuple = PyTuple_New(2); - else tuple = PyTuple_New(1); - - /*the tuple API mandates this*/ - Py_XINCREF(callback); - Py_XINCREF(but); /*this checks for NULL*/ - - PyTuple_SET_ITEM(tuple, 0, callback); - if (but) PyTuple_SET_ITEM(tuple, 1, (PyObject*)but); - - PyList_Append(M_Button_List, tuple); - Py_DECREF(tuple); /*we have to do this to aovid double references.*/ - - uiButSetFunc(ubut, exec_but_callback, callback, ubut); - } -} - -void BPy_Set_DrawButtonsList(void *list) -{ - M_Button_List = list; -} - -/*this MUST be called after doing UI stuff.*/ -void BPy_Free_DrawButtonsList(void) -{ - /*Clear the list.*/ - if (M_Button_List) { - PyList_SetSlice(M_Button_List, 0, PyList_Size(M_Button_List), NULL); - Py_DECREF(M_Button_List); - M_Button_List = NULL; - } -} - -static PyObject *Method_Exit( PyObject * self ) -{ - SpaceScript *sc; - Script *script; - - /* if users call Draw.Exit when we are already out of the SPACE_SCRIPT, we - * simply return, for compatibility */ - if( curarea->spacetype == SPACE_SCRIPT ) - sc = curarea->spacedata.first; - else - Py_RETURN_NONE; - - exit_pydraw( sc, 0 ); - - script = sc->script; - - /* remove our lock to the current namespace */ - script->flags &= ~SCRIPT_GUI; - - Py_RETURN_NONE; -} - -/* Method_Register (Draw.Register) registers callbacks for drawing, events - * and gui button events, so a script can continue executing after the - * interpreter reached its end and returned control to Blender. Everytime - * the SPACE_SCRIPT window with this script is redrawn, the registered - * callbacks are executed. */ -static PyObject *Method_Register( PyObject * self, PyObject * args ) -{ - PyObject *newdrawc = NULL, *neweventc = NULL, *newbuttonc = NULL; - SpaceScript *sc; - Script *script; - int startspace = 0; - - if( !PyArg_ParseTuple - ( args, "O|OO", &newdrawc, &neweventc, &newbuttonc ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or three PyObjects" ); - - if( !PyCallable_Check( newdrawc ) ) - newdrawc = NULL; - if( !PyCallable_Check( neweventc ) ) - neweventc = NULL; - if( !PyCallable_Check( newbuttonc ) ) - newbuttonc = NULL; - - if( !( newdrawc || neweventc || newbuttonc ) ) - Py_RETURN_NONE; - - startspace = curarea->spacetype; - - /* first make sure the current area is of type SPACE_SCRIPT */ - if( startspace != SPACE_SCRIPT ) - newspace( curarea, SPACE_SCRIPT ); - - sc = curarea->spacedata.first; - - /* There are two kinds of scripts: - * a) those that simply run, finish and return control to Blender; - * b) those that do like 'a)' above but leave callbacks for drawing, - * events and button events, with this Method_Register (Draw.Register - * in Python). These callbacks are called by scriptspaces (Scripts windows). - * - * We need to flag scripts that leave callbacks so their namespaces are - * not deleted when they 'finish' execution, because the callbacks will - * still need the namespace. - */ - - /* Let's see if this is a new script */ - script = G.main->script.first; - while (script) { - if (script->flags & SCRIPT_RUNNING) break; - script = script->id.next; - } - - if( !script ) { - /* not new, it's a left callback calling Register again */ - script = sc->script; - if( !script ) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Draw.Register can't be used inside script links" ); - } - } - else sc->script = script; - - /* Now we have the right script and can set a lock so its namespace can't be - * deleted for as long as we need it */ - script->flags |= SCRIPT_GUI; - - /* save the last space so we can go back to it upon finishing */ - if( !script->lastspace ) - script->lastspace = startspace; - - /* clean the old callbacks */ - exit_pydraw( sc, 0 ); - - /* prepare the new ones and insert them */ - Py_XINCREF( newdrawc ); - Py_XINCREF( neweventc ); - Py_XINCREF( newbuttonc ); - - script->py_draw = newdrawc; - script->py_event = neweventc; - script->py_button = newbuttonc; - - scrarea_queue_redraw( sc->area ); - - Py_RETURN_NONE; -} - -static PyObject *Method_Redraw( PyObject * self, PyObject * args ) -{ - int after = 0; - - if( !PyArg_ParseTuple( args, "|i", &after ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (or nothing)" ); - - if( after ) - addafterqueue( curarea->win, REDRAW, 1 ); - else - scrarea_queue_winredraw( curarea ); - - Py_RETURN_NONE; -} - -static PyObject *Method_Draw( PyObject * self ) -{ - /*@ If forced drawing is disable queue a redraw event instead */ - if( EXPP_disable_force_draw ) { - scrarea_queue_winredraw( curarea ); - Py_RETURN_NONE; - } - - scrarea_do_windraw( curarea ); - - screen_swapbuffers( ); - - Py_RETURN_NONE; -} - -static PyObject *Method_Create( PyObject * self, PyObject * args ) -{ - Button *but = NULL; - PyObject *val; - char *newstr; - - but = newbutton(); - /* If this function dosnt sucseed this will need to be deallocated, - * make sure the type is NOT BSTRING_TYPE before deallocing -1 is ok. - * so we dont dealloc with an uninitialized value wich would be bad! */ - if ( PyArg_ParseTuple( args, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) ) { - but->type = BVECTOR_TYPE; - - } else if ( PyArg_ParseTuple( args, "O!", &PyFloat_Type, &val ) ) { - but->val.asfloat = (float)PyFloat_AS_DOUBLE(val); - but->type = BFLOAT_TYPE; - - } else if ( PyArg_ParseTuple( args, "O!", &PyInt_Type, &val ) ) { - but->val.asint = (int)PyInt_AS_LONG(val); - but->type = BINT_TYPE; - - } else if ( PyArg_ParseTuple( args, "s#", &newstr, &but->slen ) ) { - if (but->slen + 1 > UI_MAX_DRAW_STR) { - but->type = -1; - Py_DECREF((PyObject *)but); /* will remove */ - but = NULL; - PyErr_SetString( PyExc_TypeError, "string is longer then 399 chars"); - } else { - but->type = BSTRING_TYPE; - but->val.asstr = MEM_mallocN( but->slen + 1, "button string" ); - BLI_strncpy( but->val.asstr, newstr, but->slen+1 ); - } - - } else { - but->type = -1; - Py_DECREF((PyObject *)but); /* will remove */ - but = NULL; - PyErr_SetString( PyExc_TypeError, "expected string, float, int or 3-float tuple argument" ); - } - - if (but != NULL) { - PyErr_Clear(); - } - - return (PyObject*) but; -} - - -static PyObject *Method_UIBlock( PyObject * self, PyObject * args ) -{ - PyObject *val = NULL; - PyObject *result = NULL; - ListBase listb= {NULL, NULL}; - - if ( !PyArg_ParseTuple( args, "O", &val ) || !PyCallable_Check( val ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected 1 python function and 2 ints" ); - - if (uiblock) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot run more then 1 UIBlock at a time" ); - - BPy_Set_DrawButtonsList(PyList_New(0)); - - mywinset(G.curscreen->mainwin); - uiblock= uiNewBlock(&listb, "numbuts", UI_EMBOSS, UI_HELV, G.curscreen->mainwin); - - uiBlockSetFlag(uiblock, UI_BLOCK_LOOP|UI_BLOCK_REDRAW); - result = PyObject_CallObject( val, Py_BuildValue( "()" ) ); - - if (!result) { - PyErr_Print( ); - error( "Python script error: check console" ); - } else { - /* copied from do_clever_numbuts in toolbox.c */ - - /* Clear all events so tooltips work, this is not ideal and - only needed because calls from the menu still have some events - left over when do_clever_numbuts is called. - Calls from keyshortcuts do not have this problem.*/ - ScrArea *sa; - BWinEvent temp_bevt; - for (sa= G.curscreen->areabase.first; sa; sa= sa->next) { - if(sa->win) { - while( bwin_qread( sa->win, &temp_bevt ) ) {} - } - if(sa->headwin) { - while( bwin_qread( sa->headwin, &temp_bevt ) ) {} - } - } - /* Done clearing events */ - - uiBoundsBlock(uiblock, 5); - uiDoBlocks(&listb, 0, 1); - } - uiFreeBlocks(&listb); - uiblock = NULL; - BPy_Free_DrawButtonsList(); /*clear all temp button references*/ - - Py_XDECREF( result ); - Py_RETURN_NONE; -} - -void Set_uiBlock(uiBlock *block) -{ - uiblock = block; -} - -static uiBlock *Get_uiBlock( void ) -{ - char butblock[32]; - /* Global, used now for UIBlock */ - if (uiblock) { - return uiblock; - } - /* Local */ - sprintf( butblock, "win %d", curarea->win ); - - return uiGetBlock( butblock, curarea ); -} - - -/* We restrict the acceptable event numbers to a proper "free" range - * according to other spaces in Blender. - * winqread***space() (space events callbacks) use short for events - * (called 'val' there) and we also translate by EXPP_BUTTON_EVENTS_OFFSET - * to get rid of unwanted events (check BPY_do_pywin_events above for - * explanation). This function takes care of that and proper checking: */ -static int check_button_event(int *event) { - if ((*event < EXPP_BUTTON_EVENTS_MIN) || - (*event > EXPP_BUTTON_EVENTS_MAX)) { - return -1; - } - if (uiblock==NULL) /* For UIBlock we need non offset UI elements */ - *event += EXPP_BUTTON_EVENTS_OFFSET; - return 0; -} - -static PyObject *Method_BeginAlign( PyObject * self, PyObject * args ) -{ - uiBlock *block = Get_uiBlock( ); - - if (block) - uiBlockBeginAlign(block); - - Py_RETURN_NONE; -} - -static PyObject *Method_EndAlign( PyObject * self, PyObject * args ) -{ - uiBlock *block = Get_uiBlock( ); - - if (block) - uiBlockEndAlign(block); - - Py_RETURN_NONE; -} - -static PyObject *Method_Button( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiii|sO", &name, &event, - &x, &y, &w, &h, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefBut( block, BUT, event, name, (short)x, (short)y, (short)w, (short)h, 0, 0, 0, 0, 0, tip ); - set_pycallback(ubut, callback, NULL); - } - Py_RETURN_NONE; -} - -static PyObject *Method_Menu( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event, def; - int x, y, w, h; - Button *but; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiii|sO", &name, &event, - &x, &y, &w, &h, &def, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, six ints and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - but->type = BINT_TYPE; - but->val.asint = def; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefButI( block, MENU, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asint, 0, 0, 0, 0, but->tooltip ); - set_pycallback(ubut, callback, but); - } - return ( PyObject * ) but; -} - -static PyObject *Method_Toggle( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h, def; - Button *but; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiii|sO", &name, &event, - &x, &y, &w, &h, &def, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, six ints and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - but->type = BINT_TYPE; - but->val.asint = def; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefButI( block, TOG, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asint, 0, 0, 0, 0, but->tooltip ); - set_pycallback(ubut, callback, but); - } - return ( PyObject * ) but; -} - -/*@DO NOT TOUCH THIS FUNCTION ! - Redrawing a slider inside its own callback routine is actually forbidden - with the current toolkit architecture (button routines are not reentrant). - But it works anyway. - XXX This is condemned to be dinosource in future - it's a hack. - */ - -static void py_slider_update( void *butv, void *data2_unused ) -{ - uiBut *but = butv; - PyObject *ref = Py_BuildValue( "(i)", SPACE_VIEW3D ); - PyObject *ret = NULL; - - EXPP_disable_force_draw = 1; - /*@ Disable forced drawing, otherwise the button object which - * is still being used might be deleted */ - - curarea->win_swap = WIN_BACK_OK; - /* removed global uiFrontBuf (contact ton when this goes wrong here) */ - - disable_where_script( 1 ); - - spacescript_do_pywin_buttons( curarea->spacedata.first, - (unsigned short)uiButGetRetVal( but ) - EXPP_BUTTON_EVENTS_OFFSET ); - - /* XXX useless right now, investigate better before a bcon 5 */ - ret = M_Window_Redraw( 0, ref ); - - Py_XDECREF(ref); - Py_XDECREF(ret); - - disable_where_script( 0 ); - - EXPP_disable_force_draw = 0; -} - -static PyObject *Method_Slider( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h, realtime = 1; - Button *but; - PyObject *mino, *maxo, *inio; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiiOOO|isO", &name, &event, - &x, &y, &w, &h, &inio, &mino, &maxo, &realtime, - &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints, three PyObjects\n\ - and optionally int, string and callback arguments" ); - - if(realtime && uiblock) - realtime = 0; /* realtime dosnt work with UIBlock */ - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - - if( PyFloat_Check( inio ) ) { - float ini, min, max; - - ini = (float)PyFloat_AsDouble( inio ); - min = (float)PyFloat_AsDouble( mino ); - max = (float)PyFloat_AsDouble( maxo ); - - but->type = BFLOAT_TYPE; - but->val.asfloat = ini; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButF( block, NUMSLI, event, name, (short)x, (short)y, (short)w, - (short)h, &but->val.asfloat, min, max, 0, 0, - but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - else - set_pycallback(ubut, callback, but); - } - } else { - int ini, min, max; - - ini = PyInt_AsLong( inio ); - min = PyInt_AsLong( mino ); - max = PyInt_AsLong( maxo ); - - but->type = BINT_TYPE; - but->val.asint = ini; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButI( block, NUMSLI, event, name, (short)x, (short)y, (short)w, - (short)h, &but->val.asint, (float)min, (float)max, 0, 0, - but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - else - set_pycallback(ubut, callback, but); - } - } - return ( PyObject * ) but; -} - -static PyObject *Method_Scrollbar( PyObject * self, PyObject * args ) -{ - char *tip = NULL; - uiBlock *block; - int event; - int x, y, w, h, realtime = 1; - Button *but; - PyObject *mino, *maxo, *inio; - float ini, min, max; - uiBut *ubut; - - if( !PyArg_ParseTuple( args, "iiiiiOOO|isO", &event, &x, &y, &w, &h, - &inio, &mino, &maxo, &realtime, &tip ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected five ints, three PyObjects and optionally\n\ -another int and string as arguments" ); - - if( !PyNumber_Check( inio ) || !PyNumber_Check( inio ) - || !PyNumber_Check( inio ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected numbers for initial, min, and max" ); - - if (check_button_event(&event) == -1) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "button event argument must be in the range [0, 16382]"); - - but = newbutton( ); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - if( PyFloat_Check( inio ) ) - but->type = BFLOAT_TYPE; - else - but->type = BINT_TYPE; - - ini = (float)PyFloat_AsDouble( inio ); - min = (float)PyFloat_AsDouble( mino ); - max = (float)PyFloat_AsDouble( maxo ); - - block = Get_uiBlock( ); - - if( block ) { - if( but->type == BFLOAT_TYPE ) { - but->val.asfloat = ini; - ubut = uiDefButF( block, SCROLL, event, "", (short)x, (short)y, (short)w, (short)h, - &but->val.asfloat, min, max, 0, 0, but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - } else { - but->val.asint = (int)ini; - ubut = uiDefButI( block, SCROLL, event, "", (short)x, (short)y, (short)w, (short)h, - &but->val.asint, min, max, 0, 0, but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - } - } - return ( PyObject * ) but; -} - -static PyObject *Method_ColorPicker( PyObject * self, PyObject * args ) -{ - char USAGE_ERROR[] = "expected a 3-float tuple of values between 0 and 1"; - Button *but; - PyObject *inio; - uiBlock *block; - char *tip = NULL; - float col[3]; - int event; - short x, y, w, h; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "ihhhhO!|sO", &event, - &x, &y, &w, &h, &PyTuple_Type, &inio, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected five ints, one tuple and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - if ( !PyArg_ParseTuple( inio, "fff", col, col+1, col+2 ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - if ( col[0] < 0 || col[0] > 1 - || col[1] < 0 || col[1] > 1 - || col[2] < 0 || col[2] > 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - if ( EXPP_check_sequence_consistency( inio, &PyFloat_Type ) != 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - but = newbutton(); - - but->type = BVECTOR_TYPE; - but->val.asvec[0] = col[0]; - but->val.asvec[1] = col[1]; - but->val.asvec[2] = col[2]; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButF( block, COL, event, "", x, y, w, h, but->val.asvec, 0, 0, 0, 0, but->tooltip); - set_pycallback(ubut, callback, but); - } - - return ( PyObject * ) but; -} - - - -static PyObject *Method_Normal( PyObject * self, PyObject * args ) -{ - char USAGE_ERROR[] = "expected a 3-float tuple of values between -1 and 1"; - Button *but; - PyObject *inio; - uiBlock *block; - char *tip = NULL; - float nor[3]; - int event; - short x, y, w, h; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "ihhhhO!|sO", &event, - &x, &y, &w, &h, &PyTuple_Type, &inio, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected five ints, one tuple and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - if ( !PyArg_ParseTuple( inio, "fff", nor, nor+1, nor+2 ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - if ( EXPP_check_sequence_consistency( inio, &PyFloat_Type ) != 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - but = newbutton(); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - but->type = BVECTOR_TYPE; - but->val.asvec[0] = nor[0]; - but->val.asvec[1] = nor[1]; - but->val.asvec[2] = nor[2]; - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButF( block, BUT_NORMAL, event, "", x, y, w, h, but->val.asvec, 0.0f, 1.0f, 0, 0, but->tooltip); - set_pycallback(ubut, callback, but); - } - - return ( PyObject * ) but; -} - -static PyObject *Method_Number( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h; - Button *but; - PyObject *mino, *maxo, *inio; - PyObject *callback=NULL; - uiBut *ubut= NULL; - - if( !PyArg_ParseTuple( args, "siiiiiOOO|sO", &name, &event, - &x, &y, &w, &h, &inio, &mino, &maxo, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints, three PyObjects and\n\ - optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - block = Get_uiBlock( ); - - if( PyFloat_Check( inio ) ) { - float ini, min, max, range, precission=0; - - ini = (float)PyFloat_AsDouble( inio ); - min = (float)PyFloat_AsDouble( mino ); - max = (float)PyFloat_AsDouble( maxo ); - - range= (float)fabs(max-min); /* Click step will be a 10th of the range. */ - if (!range) range= 1.0f; /* avoid any odd errors */ - - /* set the precission to display*/ - if (range>=1000.0f) precission=1.0f; - else if (range>=100.0f) precission=2.0f; - else if (range>=10.0f) precission=3.0f; - else precission=4.0f; - - but->type = BFLOAT_TYPE; - but->val.asfloat = ini; - - - if( block ) - ubut= uiDefButF( block, NUM, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asfloat, min, max, 10*range, precission, but->tooltip ); - } else { - int ini, min, max; - - ini = PyInt_AsLong( inio ); - min = PyInt_AsLong( mino ); - max = PyInt_AsLong( maxo ); - - but->type = BINT_TYPE; - but->val.asint = ini; - - if( block ) - ubut= uiDefButI( block, NUM, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asint, (float)min, (float)max, 0, 0, but->tooltip ); - } - - if (ubut) set_pycallback(ubut, callback, but); - - return ( PyObject * ) but; -} - -static PyObject *Method_String( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *info_arg = NULL, *tip = NULL, *newstr = NULL; - char *info_str = NULL, *info_str0 = " "; - int event; - int x, y, w, h, len, real_len = 0; - Button *but; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiisi|sO", &info_arg, &event, - &x, &y, &w, &h, &newstr, &len, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints, a string, an int and\n\ - optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - if (len > (UI_MAX_DRAW_STR - 1)) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "The maximum length of a string is 399, your value is too high."); - - real_len = strlen(newstr); - if (real_len > len) real_len = len; - - but = newbutton( ); - but->type = BSTRING_TYPE; - but->slen = len; - but->val.asstr = MEM_mallocN( len + 1, "pybutton str" ); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - BLI_strncpy( but->val.asstr, newstr, len + 1); /* adds '\0' */ - but->val.asstr[real_len] = '\0'; - - if (info_arg[0] == '\0') info_str = info_str0; - else info_str = info_arg; - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefBut( block, TEX, event, info_str, (short)x, (short)y, (short)w, (short)h, - but->val.asstr, 0, (float)len, 0, 0, but->tooltip ); - set_pycallback(ubut, callback, but); - } - return ( PyObject * ) but; -} - -static PyObject *Method_GetStringWidth( PyObject * self, PyObject * args ) -{ - char *text; - char *font_str = "normal"; - struct BMF_Font *font; - PyObject *width; - - if( !PyArg_ParseTuple( args, "s|s", &text, &font_str ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two string arguments" ); - - if( !strcmp( font_str, "normal" ) ) - font = ( &G )->font; - else if( !strcmp( font_str, "large" ) ) - font = BMF_GetFont(BMF_kScreen15); - else if( !strcmp( font_str, "small" ) ) - font = ( &G )->fonts; - else if( !strcmp( font_str, "tiny" ) ) - font = ( &G )->fontss; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "\"font\" must be: 'large', 'normal' (default), 'small' or 'tiny'." ); - - width = PyInt_FromLong( BMF_GetStringWidth( font, text ) ); - - if( !width ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyInt" ); - - return width; -} - -static PyObject *Method_Text( PyObject * self, PyObject * args ) -{ - char *text; - char *font_str = NULL; - struct BMF_Font *font; - - if( !PyArg_ParseTuple( args, "s|s", &text, &font_str ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two string arguments" ); - - if( !font_str ) - font = ( &G )->font; - else if( !strcmp( font_str, "large" ) ) - font = BMF_GetFont(BMF_kScreen15); - else if( !strcmp( font_str, "normal" ) ) - font = ( &G )->font; - else if( !strcmp( font_str, "small" ) ) - font = ( &G )->fonts; - else if( !strcmp( font_str, "tiny" ) ) - font = ( &G )->fontss; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "\"font\" must be: 'normal' (default), 'large', 'small' or 'tiny'." ); - - BMF_DrawString( font, text ); - - return PyInt_FromLong( BMF_GetStringWidth( font, text ) ); -} - -static PyObject *Method_Label( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *text; - int x, y, w, h; - - if( !PyArg_ParseTuple( args, "siiii", &text, &x, &y, &w, &h ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string and four ints" ); - - block = Get_uiBlock( ); - uiDefBut(block, LABEL, 0, text, x, y, w, h, 0, 0, 0, 0, 0, ""); - - Py_RETURN_NONE; -} - - -static PyObject *Method_PupMenu( PyObject * self, PyObject * args ) -{ - char *text; - int maxrow = -1; - PyObject *ret; - - if( !PyArg_ParseTuple( args, "s|i", &text, &maxrow ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string and optionally an int as arguments" ); - - if( maxrow >= 0 ) - ret = PyInt_FromLong( pupmenu_col( text, maxrow ) ); - else - ret = PyInt_FromLong( pupmenu( text ) ); - - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyInt" ); -} - -static PyObject *Method_PupIntInput( PyObject * self, PyObject * args ) -{ - char *text = NULL; - int min = 0, max = 1; - short var = 0; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple( args, "s|hii", &text, &var, &min, &max ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1 string and 3 int arguments" ); - - if( button( &var, (short)min, (short)max, text ) == 0 ) { - Py_INCREF( Py_None ); - return Py_None; - } - ret = PyInt_FromLong( var ); - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyInt" ); -} - -static PyObject *Method_PupFloatInput( PyObject * self, PyObject * args ) -{ - char *text = NULL; - float min = 0, max = 1, var = 0, a1 = 10, a2 = 2; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple - ( args, "s|fffff", &text, &var, &min, &max, &a1, &a2 ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1 string and 5 float arguments" ); - - if( fbutton( &var, min, max, a1, a2, text ) == 0 ) { - Py_INCREF( Py_None ); - return Py_None; - } - ret = PyFloat_FromDouble( var ); - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyFloat" ); -} - -static PyObject *Method_PupStrInput( PyObject * self, PyObject * args ) -{ - char *text = NULL, *textMsg = NULL; - char tmp[101]; - char max = 20; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple( args, "ss|b", &textMsg, &text, &max ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 strings and 1 int" ); - - if( ( max <= 0 ) || ( max > 100 ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "max string length value must be in the range [1, 100]." ); - - /* copying the text string handles both cases: - * max < strlen(text) (by truncating) and - * max > strlen(text) (by expanding to strlen(tmp)) */ - BLI_strncpy( tmp, text, max + 1 ); - - if( sbutton( tmp, 0, max, textMsg ) == 0 ) { - Py_INCREF( Py_None ); - return Py_None; - } - - ret = PyString_FromString( tmp ); - - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyString" ); -} - -static PyObject *Method_PupBlock( PyObject * self, PyObject * args ) -{ - PyObject *pyList, *pyItem; - float min, max; - int len, i; - char *title; - - if (!PyArg_ParseTuple( args, "sO", &title, &pyList ) || !PySequence_Check( pyList )) - return EXPP_ReturnPyObjError( PyExc_TypeError, "expected a string and a sequence" ); - - - len = PySequence_Length(pyList); - - if (len == 0) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string and a non-empty sequence." ); - - if (len > 120) /* LIMIT DEFINED IN toolbox.c */ - return EXPP_ReturnPyObjError( PyExc_ValueError, "sequence cannot have more than 120 elements" ); - - for ( i=0 ; i<len ; i++ ) { - PyObject *pyMin = NULL, *pyMax = NULL; - PyObject *f1, *f2; - Button *but = NULL; - int tlen; - char *text, *tip = NULL; - - pyItem = PySequence_GetItem( pyList, i ); - if (!pyItem) - return NULL; - - if (PyString_Check( pyItem )) { - tlen = -2; /* single string for label, giving it a special len for later */ - } - else if (PyTuple_Check( pyItem )) { - /* tuple for other button, get the length for later */ - tlen = PyTuple_Size( pyItem ); - } - else { - /* Neither a string or a tuple, error */ - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string or a tuple containing 2 to 5 values." ); - } - - switch (tlen) { - case -2: /* LABEL */ - text = PyString_AsString( pyItem ); - add_numbut(i, LABEL, text, 0, 0, NULL, NULL); - break; - case 2: /* TOGGLE (no tooltip) */ - case 3: /* TOGGLE */ - if (!PyArg_ParseTuple( pyItem, "sO!|s", &text, &Button_Type, &but, &tip )) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a tuple containing a string, a Button object and optionally a string for toggles" ); - } - - if (but->type != BINT_TYPE) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "Button object for toggles should hold an integer" ); - } - - add_numbut(i, TOG|INT, text, 0, 0, &but->val.asint, tip); - break; - case 4: /* TEX and NUM (no tooltip) */ - case 5: /* TEX and NUM */ - if (!PyArg_ParseTuple( pyItem, "sO!OO|s", &text, &Button_Type, &but, &pyMin, &pyMax, &tip )) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a tuple containing a string, a Button object, two numerical values and optionally a string for Text and Num buttons" ); - } - - f1 = PyNumber_Float(pyMin); - f2 = PyNumber_Float(pyMax); - - if (!f1 || !f2) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a tuple containing a string, a Button object, two numerical values and optionally a string for Text and Num buttons" ); - } - - min = (float)PyFloat_AS_DOUBLE(f1); - max = (float)PyFloat_AS_DOUBLE(f2); - Py_DECREF( f1 ); - Py_DECREF( f2 ); - - switch ( but->type ) { - case BINT_TYPE: - add_numbut(i, NUM|INT, text, min, max, &but->val.asint, tip); - break; - case BFLOAT_TYPE: - add_numbut(i, NUM|FLO, text, min, max, &but->val.asfloat, tip); - break; - case BSTRING_TYPE: - if (max+1>UI_MAX_DRAW_STR) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "length of a string buttons must be less then 400" ); - } - max = (float)floor(max); - - if (max > but->slen) { - int old_len = but->slen; - char *old_str = but->val.asstr; - but->slen = (int)max; - but->val.asstr = MEM_callocN( but->slen + 1, "button pupblock"); - BLI_strncpy( but->val.asstr, old_str, old_len + 1 ); - MEM_freeN(old_str); - } - - add_numbut(i, TEX, text, 0.0f, max, but->val.asstr, tip); - } - - break; - default: - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string or a tuple containing 2 to 5 values." ); - } - Py_DECREF( pyItem ); - } - - if (do_clever_numbuts(title, len, REDRAW)) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - - -/***************************************************************************** - * Function: Method_Image * - * Python equivalent: Blender.Draw.Image * - * * - * @author Jonathan Merritt <j.merritt@pgrad.unimelb.edu.au> * - ****************************************************************************/ -static PyObject *Method_Image( PyObject * self, PyObject * args ) -{ - PyObject *pyObjImage; - BPy_Image *py_img; - Image *image; - ImBuf *ibuf; - float originX, originY; - float zoomX = 1.0, zoomY = 1.0; - int clipX = 0, clipY = 0, clipW = -1, clipH = -1; - /*GLfloat scissorBox[4];*/ - - /* parse the arguments passed-in from Python */ - if( !PyArg_ParseTuple( args, "Off|ffiiii", &pyObjImage, - &originX, &originY, &zoomX, &zoomY, - &clipX, &clipY, &clipW, &clipH ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a Blender.Image and 2 floats, and " \ - "optionally 2 floats and 4 ints as arguments" ); - /* check that the first PyObject is actually a Blender.Image */ - if( !BPy_Image_Check( pyObjImage ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a Blender.Image and 2 floats, and " \ - "optionally 2 floats and 4 ints as arguments" ); - /* check that the zoom factors are valid */ - if( ( zoomX <= 0.0 ) || ( zoomY <= 0.0 ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "invalid zoom factors - they must be >= 0.0" ); - - /* fetch a C Image pointer from the passed-in Python object */ - py_img = ( BPy_Image * ) pyObjImage; - image = py_img->image; - ibuf = BKE_image_get_ibuf( image, NULL ); - - if( !ibuf ) /* if failed to load the image */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - if( !ibuf->rect ) /* no float yet */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Image has no byte rect" ); - - /* Update the time tag of the image */ - tag_image_time(image); - - /* set up a valid clipping rectangle. if no clip rectangle was - * given, this results in inclusion of the entire image. otherwise, - * the clipping is just checked against the bounds of the image. - * if clipW or clipH are less than zero then they include as much of - * the image as they can. */ - clipX = EXPP_ClampInt( clipX, 0, ibuf->x ); - clipY = EXPP_ClampInt( clipY, 0, ibuf->y ); - if( ( clipW < 0 ) || ( clipW > ( ibuf->x - clipW ) ) ) - clipW = ibuf->x - clipX; - if( ( clipH < 0 ) || ( clipH > ( ibuf->y - clipH ) ) ) - clipH = ibuf->y - clipY; - - /* -- we are "Go" to Draw! -- */ - - /* set the raster position. - * - * If the raster position is negative, then using glRasterPos2i() - * directly would cause it to be clipped. Instead, we first establish - * a valid raster position within the clipping rectangle of the - * window and then use glBitmap() with a NULL image pointer to offset - * it to the true position we require. To pick an initial valid - * raster position within the viewport, we query the clipping rectangle - * and use its lower-left pixel. - * - * This particular technique is documented in the glRasterPos() man - * page, although I haven't seen it used elsewhere in Blender. - */ - - /* update (W): to fix a bug where images wouldn't get drawn if the bottom - * left corner of the Scripts win were above a given height or to the right - * of a given width, the code below is being commented out. It should not - * be needed anyway, because spaces in Blender are projected to lie inside - * their areas, see src/drawscript.c for example. Note: the - * glaRasterPosSafe2i function in src/glutil.c does use the commented out - * technique, but with 0,0 instead of scissorBox. This function can be - * a little optimized, based on glaDrawPixelsSafe in that same fine, but - * we're too close to release 2.37 right now. */ - /* - glGetFloatv( GL_SCISSOR_BOX, scissorBox ); - glRasterPos2i( scissorBox[0], scissorBox[1] ); - glBitmap( 0, 0, 0.0, 0.0, - originX-scissorBox[0], originY-scissorBox[1], NULL ); - */ - - /* update (cont.): using these two lines instead: - * (based on glaRasterPosSafe2i, but Ken Hughes deserves credit - * for suggesting this exact fix in the bug tracker) */ - glRasterPos2i(0, 0); - glBitmap( 0, 0, 0.0, 0.0, originX, originY, NULL ); - - /* set the zoom */ - glPixelZoom( zoomX, zoomY ); - - /* set the width of the image (ROW_LENGTH), and the offset to the - * clip origin within the image in x (SKIP_PIXELS) and - * y (SKIP_ROWS) */ - glPixelStorei( GL_UNPACK_ROW_LENGTH, ibuf->x ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, clipX ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, clipY ); - - /* draw the image */ - glDrawPixels( clipW, clipH, GL_RGBA, GL_UNSIGNED_BYTE, - ibuf->rect ); - - /* restore the defaults for some parameters (we could also use a - * glPushClientAttrib() and glPopClientAttrib() pair). */ - glPixelZoom( 1.0, 1.0 ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); - - Py_INCREF( Py_None ); - return Py_None; - -} - -PyObject *Draw_Init( void ) -{ - PyObject *submodule, *dict; - - if( PyType_Ready( &Button_Type) < 0) - Py_RETURN_NONE; - - submodule = Py_InitModule3( "Blender.Draw", Draw_methods, Draw_doc ); - - dict = PyModule_GetDict( submodule ); - -#define EXPP_ADDCONST(x) \ - EXPP_dict_set_item_str(dict, #x, PyInt_FromLong(x)) - - /* So, for example: - * EXPP_ADDCONST(LEFTMOUSE) becomes - * EXPP_dict_set_item_str(dict, "LEFTMOUSE", PyInt_FromLong(LEFTMOUSE)) - */ - - EXPP_ADDCONST( LEFTMOUSE ); - EXPP_ADDCONST( MIDDLEMOUSE ); - EXPP_ADDCONST( RIGHTMOUSE ); - EXPP_ADDCONST( WHEELUPMOUSE ); - EXPP_ADDCONST( WHEELDOWNMOUSE ); - EXPP_ADDCONST( MOUSEX ); - EXPP_ADDCONST( MOUSEY ); - EXPP_ADDCONST( TIMER0 ); - EXPP_ADDCONST( TIMER1 ); - EXPP_ADDCONST( TIMER2 ); - EXPP_ADDCONST( TIMER3 ); - EXPP_ADDCONST( KEYBD ); - EXPP_ADDCONST( RAWKEYBD ); - EXPP_ADDCONST( REDRAW ); - EXPP_ADDCONST( INPUTCHANGE ); - EXPP_ADDCONST( QFULL ); - EXPP_ADDCONST( WINFREEZE ); - EXPP_ADDCONST( WINTHAW ); - EXPP_ADDCONST( WINCLOSE ); - EXPP_ADDCONST( WINQUIT ); -#ifndef IRISGL - EXPP_ADDCONST( Q_FIRSTTIME ); -#endif - EXPP_ADDCONST( AKEY ); - EXPP_ADDCONST( BKEY ); - EXPP_ADDCONST( CKEY ); - EXPP_ADDCONST( DKEY ); - EXPP_ADDCONST( EKEY ); - EXPP_ADDCONST( FKEY ); - EXPP_ADDCONST( GKEY ); - EXPP_ADDCONST( HKEY ); - EXPP_ADDCONST( IKEY ); - EXPP_ADDCONST( JKEY ); - EXPP_ADDCONST( KKEY ); - EXPP_ADDCONST( LKEY ); - EXPP_ADDCONST( MKEY ); - EXPP_ADDCONST( NKEY ); - EXPP_ADDCONST( OKEY ); - EXPP_ADDCONST( PKEY ); - EXPP_ADDCONST( QKEY ); - EXPP_ADDCONST( RKEY ); - EXPP_ADDCONST( SKEY ); - EXPP_ADDCONST( TKEY ); - EXPP_ADDCONST( UKEY ); - EXPP_ADDCONST( VKEY ); - EXPP_ADDCONST( WKEY ); - EXPP_ADDCONST( XKEY ); - EXPP_ADDCONST( YKEY ); - EXPP_ADDCONST( ZKEY ); - EXPP_ADDCONST( ZEROKEY ); - EXPP_ADDCONST( ONEKEY ); - EXPP_ADDCONST( TWOKEY ); - EXPP_ADDCONST( THREEKEY ); - EXPP_ADDCONST( FOURKEY ); - EXPP_ADDCONST( FIVEKEY ); - EXPP_ADDCONST( SIXKEY ); - EXPP_ADDCONST( SEVENKEY ); - EXPP_ADDCONST( EIGHTKEY ); - EXPP_ADDCONST( NINEKEY ); - EXPP_ADDCONST( CAPSLOCKKEY ); - EXPP_ADDCONST( LEFTCTRLKEY ); - EXPP_ADDCONST( LEFTALTKEY ); - EXPP_ADDCONST( RIGHTALTKEY ); - EXPP_ADDCONST( RIGHTCTRLKEY ); - EXPP_ADDCONST( RIGHTSHIFTKEY ); - EXPP_ADDCONST( LEFTSHIFTKEY ); - EXPP_ADDCONST( ESCKEY ); - EXPP_ADDCONST( TABKEY ); - EXPP_ADDCONST( RETKEY ); - EXPP_ADDCONST( SPACEKEY ); - EXPP_ADDCONST( LINEFEEDKEY ); - EXPP_ADDCONST( BACKSPACEKEY ); - EXPP_ADDCONST( DELKEY ); - EXPP_ADDCONST( SEMICOLONKEY ); - EXPP_ADDCONST( PERIODKEY ); - EXPP_ADDCONST( COMMAKEY ); - EXPP_ADDCONST( QUOTEKEY ); - EXPP_ADDCONST( ACCENTGRAVEKEY ); - EXPP_ADDCONST( MINUSKEY ); - EXPP_ADDCONST( SLASHKEY ); - EXPP_ADDCONST( BACKSLASHKEY ); - EXPP_ADDCONST( EQUALKEY ); - EXPP_ADDCONST( LEFTBRACKETKEY ); - EXPP_ADDCONST( RIGHTBRACKETKEY ); - EXPP_ADDCONST( LEFTARROWKEY ); - EXPP_ADDCONST( DOWNARROWKEY ); - EXPP_ADDCONST( RIGHTARROWKEY ); - EXPP_ADDCONST( UPARROWKEY ); - EXPP_ADDCONST( PAD2 ); - EXPP_ADDCONST( PAD4 ); - EXPP_ADDCONST( PAD6 ); - EXPP_ADDCONST( PAD8 ); - EXPP_ADDCONST( PAD1 ); - EXPP_ADDCONST( PAD3 ); - EXPP_ADDCONST( PAD5 ); - EXPP_ADDCONST( PAD7 ); - EXPP_ADDCONST( PAD9 ); - EXPP_ADDCONST( PADPERIOD ); - EXPP_ADDCONST( PADSLASHKEY ); - EXPP_ADDCONST( PADASTERKEY ); - EXPP_ADDCONST( PAD0 ); - EXPP_ADDCONST( PADMINUS ); - EXPP_ADDCONST( PADENTER ); - EXPP_ADDCONST( PADPLUSKEY ); - EXPP_ADDCONST( F1KEY ); - EXPP_ADDCONST( F2KEY ); - EXPP_ADDCONST( F3KEY ); - EXPP_ADDCONST( F4KEY ); - EXPP_ADDCONST( F5KEY ); - EXPP_ADDCONST( F6KEY ); - EXPP_ADDCONST( F7KEY ); - EXPP_ADDCONST( F8KEY ); - EXPP_ADDCONST( F9KEY ); - EXPP_ADDCONST( F10KEY ); - EXPP_ADDCONST( F11KEY ); - EXPP_ADDCONST( F12KEY ); - EXPP_ADDCONST( PAUSEKEY ); - EXPP_ADDCONST( INSERTKEY ); - EXPP_ADDCONST( HOMEKEY ); - EXPP_ADDCONST( PAGEUPKEY ); - EXPP_ADDCONST( PAGEDOWNKEY ); - EXPP_ADDCONST( ENDKEY ); - - return submodule; -} |