diff options
author | Dave Airlie <airlied@linux.ie> | 2010-11-03 19:41:56 +1000 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2010-11-03 19:41:56 +1000 |
commit | 3de5a0a0e4c35ef4ee0ea237830f2064a624271f (patch) | |
tree | 279bf62cf3be03997ae30be2b25cfdb20ed0a262 | |
parent | 316266db6c9688c7ac1e5ef5d2ede02e429ab3ca (diff) |
add picture duplicate initial hackery
-rw-r--r-- | Xext/panoramiX.c | 42 | ||||
-rw-r--r-- | render/picture.c | 16 | ||||
-rw-r--r-- | render/picture.h | 1 | ||||
-rw-r--r-- | render/render.c | 2 |
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; |