summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@linux.ie>2010-11-03 19:41:56 +1000
committerDave Airlie <airlied@linux.ie>2010-11-03 19:41:56 +1000
commit3de5a0a0e4c35ef4ee0ea237830f2064a624271f (patch)
tree279bf62cf3be03997ae30be2b25cfdb20ed0a262
parent316266db6c9688c7ac1e5ef5d2ede02e429ab3ca (diff)
add picture duplicate initial hackery
-rw-r--r--Xext/panoramiX.c42
-rw-r--r--render/picture.c16
-rw-r--r--render/picture.h1
-rw-r--r--render/render.c2
4 files changed, 58 insertions, 3 deletions
diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
index bf652eaf2..c17bffd82 100644
--- a/Xext/panoramiX.c
+++ b/Xext/panoramiX.c
@@ -82,6 +82,8 @@ RESTYPE XRT_PIXMAP;
RESTYPE XRT_GC;
RESTYPE XRT_COLORMAP;
+extern RESTYPE XRT_PICTURE;
+
static Bool VisualsEqual(VisualPtr, ScreenPtr, VisualPtr);
XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr = &VisualsEqual;
@@ -1075,8 +1077,8 @@ static void print_xrt(pointer value, XID id, pointer cdata)
}
- // if (xrt->type == XRT_PICTURE)
- // ErrorF("pic: %p: %d %p\n", cdata, id, xrt);
+ if (xrt->type == XRT_PICTURE)
+ ErrorF("pic: %p: %d %p\n", cdata, id, xrt);
}
static void duplicate_pixmap(pointer value, XID id, pointer cdata)
@@ -1107,6 +1109,41 @@ static void duplicate_pixmap(pointer value, XID id, pointer cdata)
return;
}
+static void duplicate_picture(pointer value, XID id, pointer cdata)
+{
+ PanoramiXRes *xrt = value, *xrt_draw;
+ ClientPtr client = cdata;
+ PicturePtr pPicture, pNewPicture;
+ DrawablePtr pDrawable;
+
+ int i = 1;
+ int result;
+
+ result = dixLookupResourceByType(&pPicture, xrt->info[0].id, PictureType, client, DixReadAccess);
+ if (result != Success)
+ return;
+
+ if (xrt->info[i].id)
+ return;
+
+ xrt->info[i].id = FakeClientID(client->index);
+
+ result = dixLookupResourceByClass((pointer *)&xrt_draw, pPicture->pDrawable->id, XRC_DRAWABLE, client, DixReadAccess);
+ if (result != Success)
+ ErrorF("cannot find resource drawable %x\n", pPicture->pDrawable->id);
+ result = dixLookupDrawable(&pDrawable, xrt_draw->info[1].id, client, 0, DixReadAccess);
+
+ ErrorF("picture %x->%x %d %x\n", xrt->info[0].id, xrt->info[i].id, client->index, pPicture->pDrawable->id);
+ pNewPicture = DuplicatePicture(xrt->info[i].id, pDrawable, pPicture);
+
+ if (!AddResource(xrt->info[i].id, PictureType, (pointer)pNewPicture)) {
+ ErrorF("failed to add resource\n");
+ return;
+ }
+
+ return;
+}
+
static void duplicate_gc(pointer value, XID id, pointer cdata)
{
PanoramiXRes *xrt = value;
@@ -1289,6 +1326,7 @@ XineramaDoMigrateScreen(void)
FindClientResourcesByType(clients[i], XRT_PIXMAP, duplicate_pixmap, clients[i]);
FindClientResourcesByType(clients[i], XRT_GC, duplicate_gc, clients[i]);
FindClientResourcesByType(clients[i], XRT_COLORMAP, duplicate_cmap, clients[i]);
+ FindClientResourcesByType(clients[i], XRT_PICTURE, duplicate_picture, clients[i]);
}
return Success;
}
diff --git a/render/picture.c b/render/picture.c
index 7fda6b93a..772c2c21f 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -1815,3 +1815,19 @@ AddTraps (PicturePtr pPicture,
(*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps);
}
+PicturePtr DuplicatePicture(XID pid, DrawablePtr pDraw, PicturePtr pSrc)
+{
+ PicturePtr pPicture;
+ PrivateRec *devPrivates;
+ pPicture = dixAllocateObjectWithPrivates(PictureRec, PRIVATE_PICTURE);
+ if (!pPicture)
+ return NULL;
+
+ devPrivates = pPicture->devPrivates;
+ *pPicture = *pSrc;
+ pPicture->devPrivates = devPrivates;
+ pPicture->pNext = NULL;
+ pPicture->pDrawable = pDraw;
+
+ return pPicture;
+}
diff --git a/render/picture.h b/render/picture.h
index e5f0d78f6..2b48ad13e 100644
--- a/render/picture.h
+++ b/render/picture.h
@@ -228,4 +228,5 @@ typedef pixman_fixed_t xFixed;
(((s) >> 8) & 0xff) * 301 + \
(((s) ) & 0xff) * 58) >> 2)
+PicturePtr DuplicatePicture(XID pid, DrawablePtr pDraw, PicturePtr pSrc);
#endif /* _PICTURE_H_ */
diff --git a/render/render.c b/render/render.c
index 1e589daac..05a5a035c 100644
--- a/render/render.c
+++ b/render/render.c
@@ -2683,7 +2683,7 @@ PanoramiXRenderCreatePicture (ClientPtr client)
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
- if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
+ if(!(newPict = (PanoramiXRes *) calloc(1, sizeof(PanoramiXRes))))
return BadAlloc;
newPict->type = XRT_PICTURE;
newPict->info[0].id = stuff->pid;