summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mac/Modules/qd/Qdmodule.c28
-rw-r--r--Mac/Modules/qd/qdsupport.py26
2 files changed, 46 insertions, 8 deletions
diff --git a/Mac/Modules/qd/Qdmodule.c b/Mac/Modules/qd/Qdmodule.c
index 7c9d49b..34476d4 100644
--- a/Mac/Modules/qd/Qdmodule.c
+++ b/Mac/Modules/qd/Qdmodule.c
@@ -11,7 +11,7 @@
#include <QuickDraw.h>
#if !ACCESSOR_CALLS_ARE_FUNCTIONS
-#define GetPortBitMapForCopyBits(port) (((GrafPort)(port))->portBits)
+#define GetPortBitMapForCopyBits(port) ((const struct BitMap *)&((GrafPort *)(port))->portBits)
#define GetPortPixMap(port) (((CGrafPtr)(port))->portPixMap)
#define GetPortBounds(port, bounds) (*(bounds) = (port)->portRect, (bounds))
#define GetPortForeColor(port, color) (*(color) = (port)->rgbFgColor, (color))
@@ -79,6 +79,8 @@
#define QDIsPortBuffered(port) 0
#endif /* !TARGET_API_MAC_CARBON */
+staticforward PyObject *BMObj_NewCopied(BitMapPtr);
+
/*
** Parse/generate RGB records
*/
@@ -115,8 +117,6 @@ PyObject *QdFI_New(itself)
itself->widMax, itself->leading);
}
-
-
static PyObject *Qd_Error;
/* ---------------------- Object type GrafPort ---------------------- */
@@ -584,7 +584,7 @@ static PyObject *QDGA_getattr(self, name)
if ( strcmp(name, "screenBits") == 0 ) {
BitMap rv;
GetQDGlobalsScreenBits(&rv);
- return BMObj_New(&rv);
+ return BMObj_NewCopied(&rv);
}
if ( strcmp(name, "thePort") == 0 )
return GrafObj_New(GetQDGlobalsThePort());
@@ -4521,7 +4521,7 @@ static PyObject *Qd_GetQDGlobalsScreenBits(_self, _args)
return NULL;
GetQDGlobalsScreenBits(&screenBits);
_res = Py_BuildValue("O&",
- BMObj_New, &screenBits);
+ BMObj_NewCopied, &screenBits);
return _res;
}
@@ -6162,6 +6162,24 @@ static PyMethodDef Qd_methods[] = {
+/* Like BMObj_New, but the original bitmap data structure is copied (and
+** released when the object is released)
+*/
+PyObject *BMObj_NewCopied(itself)
+ BitMapPtr itself;
+{
+ BitMapObject *it;
+ BitMapPtr itself_copy;
+
+ if ((itself_copy=(BitMapPtr)malloc(sizeof(BitMap))) == NULL)
+ return PyErr_NoMemory();
+ *itself_copy = *itself;
+ it = (BitMapObject *)BMObj_New(itself_copy);
+ it->referred_bitmap = itself_copy;
+ return (PyObject *)it;
+}
+
+
void initQd()
{
diff --git a/Mac/Modules/qd/qdsupport.py b/Mac/Modules/qd/qdsupport.py
index b255110..f57cf17 100644
--- a/Mac/Modules/qd/qdsupport.py
+++ b/Mac/Modules/qd/qdsupport.py
@@ -46,7 +46,7 @@ CGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj")
GrafPtr = OpaqueByValueType("GrafPtr", "GrafObj")
BitMap_ptr = OpaqueByValueType("BitMapPtr", "BMObj")
const_BitMap_ptr = OpaqueByValueType("const BitMap *", "BMObj")
-BitMap = OpaqueType("BitMap", "BMObj")
+BitMap = OpaqueType("BitMap", "BMObj_NewCopied", "BUG")
RGBColor = OpaqueType('RGBColor', 'QdRGB')
RGBColor_ptr = RGBColor
FontInfo = OpaqueType('FontInfo', 'QdFI')
@@ -64,7 +64,7 @@ includestuff = includestuff + """
#include <%s>""" % MACHEADERFILE + """
#if !ACCESSOR_CALLS_ARE_FUNCTIONS
-#define GetPortBitMapForCopyBits(port) (((GrafPort)(port))->portBits)
+#define GetPortBitMapForCopyBits(port) ((const struct BitMap *)&((GrafPort *)(port))->portBits)
#define GetPortPixMap(port) (((CGrafPtr)(port))->portPixMap)
#define GetPortBounds(port, bounds) (*(bounds) = (port)->portRect, (bounds))
#define GetPortForeColor(port, color) (*(color) = (port)->rgbFgColor, (color))
@@ -132,6 +132,8 @@ includestuff = includestuff + """
#define QDIsPortBuffered(port) 0
#endif /* !TARGET_API_MAC_CARBON */
+staticforward PyObject *BMObj_NewCopied(BitMapPtr);
+
/*
** Parse/generate RGB records
*/
@@ -167,7 +169,25 @@ PyObject *QdFI_New(itself)
return Py_BuildValue("hhhh", itself->ascent, itself->descent,
itself->widMax, itself->leading);
}
+"""
+finalstuff = finalstuff + """
+/* Like BMObj_New, but the original bitmap data structure is copied (and
+** released when the object is released)
+*/
+PyObject *BMObj_NewCopied(itself)
+ BitMapPtr itself;
+{
+ BitMapObject *it;
+ BitMapPtr itself_copy;
+
+ if ((itself_copy=(BitMapPtr)malloc(sizeof(BitMap))) == NULL)
+ return PyErr_NoMemory();
+ *itself_copy = *itself;
+ it = (BitMapObject *)BMObj_New(itself_copy);
+ it->referred_bitmap = itself_copy;
+ return (PyObject *)it;
+}
"""
@@ -458,7 +478,7 @@ class QDGlobalsAccessObjectDefinition(ObjectDefinition):
if ( strcmp(name, "screenBits") == 0 ) {
BitMap rv;
GetQDGlobalsScreenBits(&rv);
- return BMObj_New(&rv);
+ return BMObj_NewCopied(&rv);
}
if ( strcmp(name, "thePort") == 0 )
return GrafObj_New(GetQDGlobalsThePort());