This makes things look much cleaner too...

Reviewed-by: Jeremy Huddleston <[email protected]>

On Oct 1, 2011, at 11:08 PM, Jamey Sharp wrote:

> This replaces AllocatePixmap, which was previously called by the screen
> hooks.
> 
> Commit by Jamey Sharp and Josh Triplett.
> 
> Signed-off-by: Jamey Sharp <[email protected]>
> Signed-off-by: Josh Triplett <[email protected]>
> ---
> Xext/shm.c                             |    5 +--
> composite/compalloc.c                  |    4 +-
> dbe/midbe.c                            |   18 ++++-----
> dix/dispatch.c                         |    6 +---
> dix/gc.c                               |    7 +---
> dix/glyphcurs.c                        |    4 +--
> dix/pixmap.c                           |   47 ++++++++++++++----------
> dix/window.c                           |    3 +-
> doc/Xserver-spec.xml                   |   31 +++++-----------
> exa/exa_classic.c                      |   24 +++++++------
> exa/exa_driver.c                       |   26 +++++++------
> exa/exa_glyphs.c                       |   12 ++-----
> exa/exa_mixed.c                        |   22 ++++++-----
> exa/exa_offscreen.c                    |    2 +-
> exa/exa_priv.h                         |   15 +++-----
> exa/exa_render.c                       |    3 +-
> fb/fb.h                                |   10 ++---
> fb/fb24_32.c                           |    2 +-
> fb/fboverlay.c                         |    2 +-
> fb/fbpixmap.c                          |   63 +++++++++-----------------------
> glx/glxcmds.c                          |    3 +-
> hw/dmx/dmxpixmap.c                     |   31 +++-------------
> hw/dmx/dmxpixmap.h                     |    4 +--
> hw/xfree86/common/xf86DGA.c            |    2 +-
> hw/xfree86/common/xf86VGAarbiter.c     |   11 +++---
> hw/xfree86/common/xf86VGAarbiterPriv.h |    3 +-
> hw/xfree86/xaa/xaaInit.c               |   35 +++++++++---------
> hw/xnest/Pixmap.c                      |   34 ++++-------------
> hw/xnest/XNPixmap.h                    |    3 +-
> hw/xwin/win.h                          |    5 +--
> hw/xwin/winpixmap.c                    |   51 +++++++-------------------
> include/pixmap.h                       |    7 +++-
> include/scrnintstr.h                   |    8 +---
> mi/miarc.c                             |    5 +--
> mi/mibitblt.c                          |    8 ++---
> mi/midispcur.c                         |   12 +++---
> mi/miglblt.c                           |    4 +--
> mi/miscrinit.c                         |    2 +-
> miext/rootless/rootlessScreen.c        |    2 +-
> miext/shadow/shadow.c                  |    2 +-
> render/glyph.c                         |    4 +--
> render/mirect.c                        |    3 +-
> render/render.c                        |    7 +---
> 43 files changed, 210 insertions(+), 342 deletions(-)
> 
> diff --git a/Xext/shm.c b/Xext/shm.c
> index 5acc4e3..ee67f1b 100644
> --- a/Xext/shm.c
> +++ b/Xext/shm.c
> @@ -491,8 +491,7 @@ doShmPutImage(DrawablePtr dst, GCPtr pGC,
>       if (!putGC)
>           return;
> 
> -     pPixmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth,
> -                                             CREATE_PIXMAP_USAGE_SCRATCH);
> +     pPixmap = CreatePixmap(dst->pScreen, sw, sh, depth, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>       if (!pPixmap) {
>           FreeScratchGC(putGC);
>           return;
> @@ -1010,7 +1009,7 @@ fbShmCreatePixmap (ScreenPtr pScreen,
> {
>     PixmapPtr pPixmap;
> 
> -    pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
> +    pPixmap = CreatePixmap(pScreen, 0, 0, pScreen->rootDepth, 0);
>     if (!pPixmap)
>       return NullPixmap;
> 
> diff --git a/composite/compalloc.c b/composite/compalloc.c
> index 58f31c0..c6892af 100644
> --- a/composite/compalloc.c
> +++ b/composite/compalloc.c
> @@ -565,8 +565,8 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h)
>     WindowPtr     pParent = pWin->parent;
>     PixmapPtr     pPixmap;
> 
> -    pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, pWin->drawable.depth,
> -                                     CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
> +    pPixmap = CreatePixmap(pScreen, w, h, pWin->drawable.depth,
> +                        CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
> 
>     if (!pPixmap)
>       return 0;
> diff --git a/dbe/midbe.c b/dbe/midbe.c
> index 5cbf376..8bd555e 100644
> --- a/dbe/midbe.c
> +++ b/dbe/midbe.c
> @@ -171,18 +171,18 @@ miDbeAllocBackBufferName(WindowPtr pWin, XID bufId, int 
> swapAction)
> 
>         /* Get a front pixmap. */
>         if (!(pDbeWindowPrivPriv->pFrontBuffer =
> -            (*pScreen->CreatePixmap)(pScreen, pDbeWindowPriv->width,
> -                                     pDbeWindowPriv->height,
> -                                     pWin->drawable.depth, 0)))
> +            CreatePixmap(pScreen, pDbeWindowPriv->width,
> +                         pDbeWindowPriv->height,
> +                         pWin->drawable.depth, 0)))
>         {
>             return BadAlloc;
>         }
> 
>         /* Get a back pixmap. */
>         if (!(pDbeWindowPrivPriv->pBackBuffer =
> -            (*pScreen->CreatePixmap)(pScreen, pDbeWindowPriv->width,
> -                                     pDbeWindowPriv->height,
> -                                     pWin->drawable.depth, 0)))
> +            CreatePixmap(pScreen, pDbeWindowPriv->width,
> +                         pDbeWindowPriv->height,
> +                         pWin->drawable.depth, 0)))
>         {
>             FreePixmap(pDbeWindowPrivPriv->pFrontBuffer);
>             return BadAlloc;
> @@ -635,11 +635,9 @@ miDbePositionWindow(WindowPtr pWin, int x, int y)
>     }
> 
>     /* Create DBE buffer pixmaps equal to size of resized window. */
> -    pFrontBuffer = (*pScreen->CreatePixmap)(pScreen, width, height,
> -                                         pWin->drawable.depth, 0);
> +    pFrontBuffer = CreatePixmap(pScreen, width, height, 
> pWin->drawable.depth, 0);
> 
> -    pBackBuffer = (*pScreen->CreatePixmap)(pScreen, width, height,
> -                                        pWin->drawable.depth, 0);
> +    pBackBuffer = CreatePixmap(pScreen, width, height, pWin->drawable.depth, 
> 0);
> 
>     if (!pFrontBuffer || !pBackBuffer)
>     {
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 9cca8d9..202650f 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -1403,12 +1403,9 @@ ProcCreatePixmap(ClientPtr client)
>         return BadValue;
>     }
> CreatePmap:
> -    pMap = (PixmapPtr)(*pDraw->pScreen->CreatePixmap)
> -             (pDraw->pScreen, stuff->width,
> -              stuff->height, stuff->depth, 0);
> +    pMap = CreatePixmap(pDraw->pScreen, stuff->width, stuff->height, 
> stuff->depth, 0);
>     if (pMap)
>     {
> -     pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
>       pMap->drawable.id = stuff->pid;
>       /* security creation/labeling check */
>       rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
> @@ -3842,7 +3839,6 @@ AddScreen(
>       return -1;
>     }
>     pScreen->myNum = i;
> -    pScreen->totalPixmapSize = 0;    /* computed in 
> CreateScratchPixmapForScreen */
>     pScreen->ClipNotify = 0;  /* for R4 ddx compatibility */
>     pScreen->CreateScreenResources = 0;
> 
> diff --git a/dix/gc.c b/dix/gc.c
> index 9a39f57..75a4aa4 100644
> --- a/dix/gc.c
> +++ b/dix/gc.c
> @@ -575,9 +575,7 @@ CreateDefaultTile (GCPtr pGC)
>     w = 1;
>     h = 1;
>     (*pGC->pScreen->QueryBestSize)(TileShape, &w, &h, pGC->pScreen);
> -    pTile = (PixmapPtr)
> -         (*pGC->pScreen->CreatePixmap)(pGC->pScreen,
> -                                       w, h, pGC->depth, 0);
> +    pTile = CreatePixmap(pGC->pScreen, w, h, pGC->depth, 0);
>     pgcScratch = GetScratchGC(pGC->depth, pGC->pScreen);
>     if (!pTile || !pgcScratch)
>     {
> @@ -915,8 +913,7 @@ CreateDefaultStipple(int screenNum)
>     w = 16;
>     h = 16;
>     (* pScreen->QueryBestSize)(StippleShape, &w, &h, pScreen);
> -    if (!(pScreen->PixmapPerDepth[0] =
> -                     (*pScreen->CreatePixmap)(pScreen, w, h, 1, 0)))
> +    if (!(pScreen->PixmapPerDepth[0] = CreatePixmap(pScreen, w, h, 1, 0)))
>       return FALSE;
>     /* fill stipple with 1 */
>     tmpval[0].val = GXcopy;
> diff --git a/dix/glyphcurs.c b/dix/glyphcurs.c
> index 1d7de27..27c4986 100644
> --- a/dix/glyphcurs.c
> +++ b/dix/glyphcurs.c
> @@ -95,9 +95,7 @@ ServerBitsFromGlyph(FontPtr pfont, unsigned ch, 
> CursorMetricPtr cm, unsigned cha
>     if (!pbits)
>       return BadAlloc;
> 
> -    ppix = (PixmapPtr)(*pScreen->CreatePixmap)(pScreen, cm->width,
> -                                            cm->height, 1,
> -                                            CREATE_PIXMAP_USAGE_SCRATCH);
> +    ppix = CreatePixmap(pScreen, cm->width, cm->height, 1, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>     pGC = GetScratchGC(1, pScreen);
>     if (!ppix || !pGC)
>     {
> diff --git a/dix/pixmap.c b/dix/pixmap.c
> index a0f7a39..232188c 100644
> --- a/dix/pixmap.c
> +++ b/dix/pixmap.c
> @@ -59,7 +59,7 @@ GetScratchPixmapHeader(ScreenPtr pScreen, int width, int 
> height, int depth,
>       pScreen->pScratchPixmap = NULL;
>     else
>       /* width and height of 0 means don't allocate any pixmap data */
> -     pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0);
> +     pPixmap = CreatePixmap(pScreen, 0, 0, depth, 0);
> 
>     if (pPixmap) {
>       if ((*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
> @@ -91,11 +91,6 @@ FreeScratchPixmapHeader(PixmapPtr pPixmap)
> Bool
> CreateScratchPixmapsForScreen(int scrnum)
> {
> -    unsigned int     pixmap_size;
> -
> -    pixmap_size = sizeof(PixmapRec) + dixPrivatesSize(PRIVATE_PIXMAP);
> -    screenInfo.screens[scrnum]->totalPixmapSize = BitmapBytePad(pixmap_size 
> * 8);
> -
>     /* let it be created on first use */
>     screenInfo.screens[scrnum]->pScratchPixmap = NULL;
>     return TRUE;
> @@ -111,21 +106,34 @@ FreeScratchPixmapsForScreen(int scrnum)
> 
> /* callable by ddx */
> PixmapPtr
> -AllocatePixmap(ScreenPtr pScreen, int pixDataSize)
> +CreatePixmap(ScreenPtr pScreen, int width, int height, int depth, unsigned 
> usage_hint)
> {
> -    PixmapPtr pPixmap;
> -
> -    assert(pScreen->totalPixmapSize > 0);
> -
> -    if (pScreen->totalPixmapSize > ((size_t)-1) - pixDataSize)
> -     return NullPixmap;
> -    
> -    pPixmap = malloc(pScreen->totalPixmapSize + pixDataSize);
> +    PixmapPtr pPixmap = dixAllocateObjectWithPrivates(PixmapRec, 
> PRIVATE_PIXMAP);
>     if (!pPixmap)
> -     return NullPixmap;
> +        return NullPixmap;
> +    pPixmap->drawable.type = DRAWABLE_PIXMAP;
> +    pPixmap->drawable.class = 0;
> +    pPixmap->drawable.pScreen = pScreen;
> +    pPixmap->drawable.depth = depth;
> +    pPixmap->drawable.id = 0;
> +    pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
> +    pPixmap->drawable.x = 0;
> +    pPixmap->drawable.y = 0;
> +    pPixmap->drawable.width = width;
> +    pPixmap->drawable.height = height;
> +    pPixmap->refcnt = 1;
> +    pPixmap->usage_hint = usage_hint;
> +
> +#ifdef COMPOSITE
> +    pPixmap->screen_x = 0;
> +    pPixmap->screen_y = 0;
> +#endif
> +
> +    if ((*pScreen->CreatePixmap) (pPixmap))
> +        return pPixmap;
> 
> -    dixInitPrivates(pPixmap, pPixmap + 1, PRIVATE_PIXMAP);
> -    return pPixmap;
> +    dixFreeObjectWithPrivates(pPixmap, PRIVATE_PIXMAP);
> +    return NullPixmap;
> }
> 
> /* callable by ddx */
> @@ -135,6 +143,5 @@ FreePixmap(PixmapPtr pPixmap)
>     if(--pPixmap->refcnt)
>       return;
>     (*pPixmap->drawable.pScreen->DestroyPixmap) (pPixmap);
> -    dixFiniPrivates(pPixmap, PRIVATE_PIXMAP);
> -    free(pPixmap);
> +    dixFreeObjectWithPrivates(pPixmap, PRIVATE_PIXMAP);
> }
> diff --git a/dix/window.c b/dix/window.c
> index 42cfef7..4d12834 100644
> --- a/dix/window.c
> +++ b/dix/window.c
> @@ -410,8 +410,7 @@ MakeRootTile(WindowPtr pWin)
>     unsigned char *from, *to;
>     int i, j;
> 
> -    pWin->background.pixmap = (*pScreen->CreatePixmap)(pScreen, 4, 4,
> -                                                 pScreen->rootDepth, 0);
> +    pWin->background.pixmap = CreatePixmap(pScreen, 4, 4, 
> pScreen->rootDepth, 0);
> 
>     pWin->backgroundState = BackgroundPixmap;
>     pGC = GetScratchGC(pScreen->rootDepth, pScreen);
> diff --git a/doc/Xserver-spec.xml b/doc/Xserver-spec.xml
> index 4bcca7a..a609ec8 100644
> --- a/doc/Xserver-spec.xml
> +++ b/doc/Xserver-spec.xml
> @@ -326,13 +326,6 @@ These procedures are set either directly or indirectly 
> by DDX procedures.
> Most of
> the procedures described in the remainder of this
> document are accessed through one of these structs.
> -For example, the procedure to create a pixmap
> -is attached to a ScreenRec and might be called by using the expression
> -</para>
> -<para>
> -<blockquote>
> -<programlisting>(* pScreen->CreatePixmap)(pScreen, width, height, 
> depth).</programlisting>
> -</blockquote>
> </para>
> <para>
> All procedure pointers must be set to some routine unless noted otherwise;
> @@ -3071,20 +3064,16 @@ A bitmap is a pixmap that is one bit deep.</para>
> <para>
> <blockquote><programlisting>
> 
> -     PixmapPtr pScreen->CreatePixmap(pScreen, width, height, depth)
> -             ScreenPtr pScreen;
> -             int width, height, depth;
> -
> -</programlisting></blockquote>
> -This ScreenRec procedure must create a pixmap of the size
> -requested.
> -It must allocate a PixmapRec and fill in all of the fields.
> -The reference count field must be set to 1.
> -If width or height are zero, no space should be allocated
> -for the pixmap data, and if the implementation is using the
> -devPrivate field as a pointer to the pixmap data, it should be
> -set to NULL.
> -If successful, it returns a pointer to the new pixmap; if not, it returns 
> NULL.
> +     Bool pScreen->CreatePixmap(pPixmap)
> +             PixmapPtr pPixmap;
> +
> +</programlisting></blockquote>
> +This ScreenRec procedure must initialize a pixmap.
> +It must initialize the bitsPerPixel field based on the depth field.
> +If either width or height is zero, no space should be allocated for the 
> pixmap
> +data; in this case, if the implementation is using the devPrivate field as a
> +pointer to the pixmap data, it should leave that pointer NULL.
> +If successful, it returns TRUE; if not, it returns FALSE.
> See Xserver/fb/fbpixmap.c for the sample server implementation.</para>
> <para>
> <blockquote><programlisting>
> diff --git a/exa/exa_classic.c b/exa/exa_classic.c
> index ce37c98..a40f3aa 100644
> --- a/exa/exa_classic.c
> +++ b/exa/exa_classic.c
> @@ -52,25 +52,27 @@ ExaGetPixmapAddress(PixmapPtr p)
>  * ModifyPixmapHeader() would break migration.  These types of pixmaps are 
> used
>  * for scratch pixmaps, or to represent the visible screen.
>  */
> -PixmapPtr
> -exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
> -             unsigned usage_hint)
> +Bool
> +exaCreatePixmap_classic(PixmapPtr pPixmap)
> {
> -    PixmapPtr pPixmap;
>     ExaPixmapPrivPtr  pExaPixmap;
>     BoxRec box;
>     int bpp;
> +    int w = pPixmap->drawable.width;
> +    int h = pPixmap->drawable.height;
> +    ScreenPtr pScreen = pPixmap->drawable.pScreen;
> +    Bool ret;
>     ExaScreenPriv(pScreen);
> 
>     if (w > 32767 || h > 32767)
> -     return NullPixmap;
> +     return FALSE;
> 
>     swap(pExaScr, pScreen, CreatePixmap);
> -    pPixmap = pScreen->CreatePixmap (pScreen, w, h, depth, usage_hint);
> +    ret = pScreen->CreatePixmap (pPixmap);
>     swap(pExaScr, pScreen, CreatePixmap);
> 
> -    if (!pPixmap)
> -        return NULL;
> +    if (!ret)
> +        return FALSE;
> 
>     pExaPixmap = ExaGetPixmapPriv(pPixmap);
>     pExaPixmap->driverPriv = NULL;
> @@ -100,7 +102,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, 
> int depth,
>       swap(pExaScr, pScreen, DestroyPixmap);
>       FreePixmap(pPixmap);
>       swap(pExaScr, pScreen, DestroyPixmap);
> -     return NULL;
> +     return FALSE;
>     }
> 
>     /* Set up damage tracking */
> @@ -112,7 +114,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, 
> int depth,
>       swap(pExaScr, pScreen, DestroyPixmap);
>       FreePixmap(pPixmap);
>       swap(pExaScr, pScreen, DestroyPixmap);
> -     return NULL;
> +     return FALSE;
>     }
> 
>     DamageRegister (&pPixmap->drawable, pExaPixmap->pDamage);
> @@ -141,7 +143,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, 
> int depth,
>     if (pExaScr->fallback_counter)
>       exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
> 
> -    return pPixmap;
> +    return TRUE;
> }
> 
> Bool
> diff --git a/exa/exa_driver.c b/exa/exa_driver.c
> index e79875d..5b74d73 100644
> --- a/exa/exa_driver.c
> +++ b/exa/exa_driver.c
> @@ -46,25 +46,27 @@ ExaGetPixmapAddress(PixmapPtr p)
>  *
>  * Pixmaps are always marked as pinned, because exa has no control over them.
>  */
> -PixmapPtr
> -exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
> -             unsigned usage_hint)
> +Bool
> +exaCreatePixmap_driver(PixmapPtr pPixmap)
> {
> -    PixmapPtr pPixmap;
>     ExaPixmapPrivPtr  pExaPixmap;
>     int bpp;
> +    int w = pPixmap->drawable.width;
> +    int h = pPixmap->drawable.height;
> +    ScreenPtr pScreen = pPixmap->drawable.pScreen;
> +    Bool ret;
>     size_t paddedWidth, datasize;
>     ExaScreenPriv(pScreen);
> 
>     if (w > 32767 || h > 32767)
> -     return NullPixmap;
> +     return FALSE;
> 
>     swap(pExaScr, pScreen, CreatePixmap);
> -    pPixmap = pScreen->CreatePixmap(pScreen, 0, 0, depth, usage_hint);
> +    ret = pScreen->CreatePixmap(pPixmap);
>     swap(pExaScr, pScreen, CreatePixmap);
> 
> -    if (!pPixmap)
> -        return NULL;
> +    if (!ret)
> +        return FALSE;
> 
>     pExaPixmap = ExaGetPixmapPriv(pPixmap);
>     pExaPixmap->driverPriv = NULL;
> @@ -78,13 +80,13 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, 
> int depth,
> 
>     if (pExaScr->info->CreatePixmap2) {
>       int new_pitch = 0;
> -     pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, 
> depth, usage_hint, bpp, &new_pitch);
> +     pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, 
> pPixmap->drawable.depth, pPixmap->usage_hint, bpp, &new_pitch);
>       paddedWidth = pExaPixmap->fb_pitch = new_pitch;
>     }
>     else {
>       paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits);
>       if (paddedWidth / 4 > 32767 || h > 32767)
> -         return NullPixmap;
> +         return FALSE;
> 
>       exaSetFbPitch(pExaScr, pExaPixmap, w, h, bpp);
> 
> @@ -98,7 +100,7 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, 
> int depth,
>       swap(pExaScr, pScreen, DestroyPixmap);
>       FreePixmap(pPixmap);
>       swap(pExaScr, pScreen, DestroyPixmap);
> -     return NULL;
> +     return FALSE;
>     }
> 
>     /* Allow ModifyPixmapHeader to set sys_ptr appropriately. */
> @@ -121,7 +123,7 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, 
> int depth,
>     if (pExaScr->fallback_counter)
>       exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
> 
> -    return pPixmap;
> +    return TRUE;
> }
> 
> Bool
> diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
> index a4d3dcc..c0917ea 100644
> --- a/exa/exa_glyphs.c
> +++ b/exa/exa_glyphs.c
> @@ -183,9 +183,7 @@ exaRealizeGlyphCaches(ScreenPtr    pScreen,
>     }
> 
>     /* Now allocate the pixmap and picture */
> -    pPixmap = (*pScreen->CreatePixmap) (pScreen,
> -                                     CACHE_PICTURE_WIDTH,
> -                                     height, depth, 0);
> +    pPixmap = CreatePixmap(pScreen, CACHE_PICTURE_WIDTH, height, depth, 0);
>     if (!pPixmap)
>       return FALSE;
> 
> @@ -734,9 +732,7 @@ exaGlyphs (CARD8   op,
>               maskFormat = a8Format;
>       }
> 
> -     pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
> -                                             maskFormat->depth,
> -                                             CREATE_PIXMAP_USAGE_SCRATCH);
> +     pMaskPixmap = CreatePixmap(pScreen, width, height, maskFormat->depth, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>       if (!pMaskPixmap)
>           return;
>       component_alpha = NeedsComponent(maskFormat->format);
> @@ -763,9 +759,7 @@ exaGlyphs (CARD8   op,
>           if (argbFormat)
>               maskFormat = argbFormat;
>           
> -         pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
> -                                                 maskFormat->depth,
> -                                                 
> CREATE_PIXMAP_USAGE_SCRATCH);
> +         pMaskPixmap = CreatePixmap(pScreen, width, height, 
> maskFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH);
>           if (!pMaskPixmap)
>               return;
> 
> diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
> index e853ac9..2e6eea2 100644
> --- a/exa/exa_mixed.c
> +++ b/exa/exa_mixed.c
> @@ -45,25 +45,27 @@ ExaGetPixmapAddress(PixmapPtr p)
> /**
>  * exaCreatePixmap() creates a new pixmap.
>  */
> -PixmapPtr
> -exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
> -             unsigned usage_hint)
> +Bool
> +exaCreatePixmap_mixed(PixmapPtr pPixmap)
> {
> -    PixmapPtr pPixmap;
>     ExaPixmapPrivPtr  pExaPixmap;
>     int bpp;
> +    int w = pPixmap->drawable.width;
> +    int h = pPixmap->drawable.height;
> +    ScreenPtr pScreen = pPixmap->drawable.pScreen;
> +    Bool ret;
>     size_t paddedWidth;
>     ExaScreenPriv(pScreen);
> 
>     if (w > 32767 || h > 32767)
> -     return NullPixmap;
> +     return FALSE;
> 
>     swap(pExaScr, pScreen, CreatePixmap);
> -    pPixmap = pScreen->CreatePixmap(pScreen, 0, 0, depth, usage_hint);
> +    ret = pScreen->CreatePixmap(pPixmap);
>     swap(pExaScr, pScreen, CreatePixmap);
> 
> -    if (!pPixmap)
> -        return NULL;
> +    if (!ret)
> +        return FALSE;
> 
>     pExaPixmap = ExaGetPixmapPriv(pPixmap);
>     pExaPixmap->driverPriv = NULL;
> @@ -72,7 +74,7 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int 
> depth,
> 
>     paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits);
>     if (paddedWidth / 4 > 32767 || h > 32767)
> -        return NullPixmap;
> +        return FALSE;
> 
>     /* We will allocate the system pixmap later if needed. */
>     pPixmap->devPrivate.ptr = NULL;
> @@ -117,7 +119,7 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, 
> int depth,
>     if (pExaScr->fallback_counter)
>       exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
> 
> -    return pPixmap;
> +    return TRUE;
> }
> 
> Bool
> diff --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c
> index a65eca1..52763bb 100644
> --- a/exa/exa_offscreen.c
> +++ b/exa/exa_offscreen.c
> @@ -493,7 +493,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen)
>     PixmapPtr pDstPix;
>     ExaPixmapPrivPtr pExaDstPix;
> 
> -    pDstPix = (*pScreen->CreatePixmap) (pScreen, 0, 0, 0, 0);
> +    pDstPix = CreatePixmap(pScreen, 0, 0, 0, 0);
> 
>     if (!pDstPix)
>       return NULL;
> diff --git a/exa/exa_priv.h b/exa/exa_priv.h
> index 38ac4aa..216748e 100644
> --- a/exa/exa_priv.h
> +++ b/exa/exa_priv.h
> @@ -585,9 +585,8 @@ exaPixmapIsPinned (PixmapPtr pPix);
> extern const GCFuncs exaGCFuncs;
> 
> /* exa_classic.c */
> -PixmapPtr
> -exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
> -             unsigned usage_hint);
> +Bool
> +exaCreatePixmap_classic(PixmapPtr pPixmap);
> 
> Bool
> exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int 
> depth,
> @@ -600,9 +599,8 @@ Bool
> exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap);
> 
> /* exa_driver.c */
> -PixmapPtr
> -exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
> -             unsigned usage_hint);
> +Bool
> +exaCreatePixmap_driver(PixmapPtr pPixmap);
> 
> Bool
> exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int 
> depth,
> @@ -615,9 +613,8 @@ Bool
> exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap);
> 
> /* exa_mixed.c */
> -PixmapPtr
> -exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
> -             unsigned usage_hint);
> +Bool
> +exaCreatePixmap_mixed(PixmapPtr pPixmap);
> 
> Bool
> exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int 
> depth,
> diff --git a/exa/exa_render.c b/exa/exa_render.c
> index 6251362..4964901 100644
> --- a/exa/exa_render.c
> +++ b/exa/exa_render.c
> @@ -1105,8 +1105,7 @@ exaCreateAlphaPicture (ScreenPtr     pScreen,
>           return 0;
>     }
> 
> -    pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
> -                                     pPictFormat->depth, 0);
> +    pPixmap = CreatePixmap(pScreen, width, height, pPictFormat->depth, 0);
>     if (!pPixmap)
>       return 0;
>     pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
> diff --git a/fb/fb.h b/fb/fb.h
> index 35fdb65..32da5ff 100644
> --- a/fb/fb.h
> +++ b/fb/fb.h
> @@ -1595,13 +1595,11 @@ fbPictureInit (ScreenPtr pScreen,
>  * fbpixmap.c
>  */
> 
> -extern _X_EXPORT PixmapPtr
> -fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int 
> bpp,
> -                unsigned usage_hint);
> +extern _X_EXPORT Bool
> +fbCreatePixmapBpp (PixmapPtr pPixmap, int bpp);
> 
> -extern _X_EXPORT PixmapPtr
> -fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
> -             unsigned usage_hint);
> +extern _X_EXPORT Bool
> +fbCreatePixmap (PixmapPtr pPixmap);
> 
> extern _X_EXPORT void
> fbDestroyPixmap (PixmapPtr pPixmap);
> diff --git a/fb/fb24_32.c b/fb/fb24_32.c
> index 033fa46..979a3df 100644
> --- a/fb/fb24_32.c
> +++ b/fb/fb24_32.c
> @@ -543,7 +543,7 @@ fb24_32ReformatTile(PixmapPtr pOldTile, int bitsPerPixel)
>     _X_UNUSED int   oldXoff, oldYoff;
>     _X_UNUSED int   newXoff, newYoff;
> 
> -    pNewTile = pScreen->CreatePixmap(pScreen, pOldTile->drawable.width,
> +    pNewTile = CreatePixmap(pScreen, pOldTile->drawable.width,
>                                    pOldTile->drawable.height,
>                                    pOldTile->drawable.depth,
>                                    pOldTile->usage_hint);
> diff --git a/fb/fboverlay.c b/fb/fboverlay.c
> index 38c38f8..746edf4 100644
> --- a/fb/fboverlay.c
> +++ b/fb/fboverlay.c
> @@ -134,7 +134,7 @@ fbOverlayCreateScreenResources(ScreenPtr pScreen)
>       pbits = pScrPriv->layer[i].u.init.pbits;
>       width = pScrPriv->layer[i].u.init.width;
>       depth = pScrPriv->layer[i].u.init.depth;
> -     pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0);
> +     pPixmap = CreatePixmap(pScreen, 0, 0, depth, 0);
>       if (!pPixmap)
>           return FALSE;
>       if (!(*pScreen->ModifyPixmapHeader)(pPixmap, pScreen->width,
> diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c
> index 4045ee0..f135109 100644
> --- a/fb/fbpixmap.c
> +++ b/fb/fbpixmap.c
> @@ -28,75 +28,46 @@
> 
> #include "fb.h"
> 
> -PixmapPtr
> -fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int 
> bpp,
> -                unsigned usage_hint)
> +Bool
> +fbCreatePixmapBpp (PixmapPtr pPixmap, int bpp)
> {
> -    PixmapPtr        pPixmap;
>     size_t    datasize;
>     size_t    paddedWidth;
> -    int              adjust;
> -    int              base;
> 
> -    paddedWidth = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
> -    if (paddedWidth / 4 > 32767 || height > 32767)
> -     return NullPixmap;
> -    datasize = height * paddedWidth;
> -    base = pScreen->totalPixmapSize;
> -    adjust = 0;
> -    if (base & 7)
> -     adjust = 8 - (base & 7);
> -    datasize += adjust;
> +    paddedWidth = ((pPixmap->drawable.width * bpp + FB_MASK) >> FB_SHIFT) * 
> sizeof (FbBits);
> +    if (paddedWidth / 4 > 32767 || pPixmap->drawable.height > 32767)
> +     return FALSE;
> +    datasize = pPixmap->drawable.height * paddedWidth;
> #ifdef FB_DEBUG
>     datasize += 2 * paddedWidth;
> #endif
> -    pPixmap = AllocatePixmap(pScreen, datasize);
> -    if (!pPixmap)
> -     return NullPixmap;
> -    pPixmap->drawable.type = DRAWABLE_PIXMAP;
> -    pPixmap->drawable.class = 0;
> -    pPixmap->drawable.pScreen = pScreen;
> -    pPixmap->drawable.depth = depth;
>     pPixmap->drawable.bitsPerPixel = bpp;
> -    pPixmap->drawable.id = 0;
> -    pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
> -    pPixmap->drawable.x = 0;
> -    pPixmap->drawable.y = 0;
> -    pPixmap->drawable.width = width;
> -    pPixmap->drawable.height = height;
>     pPixmap->devKind = paddedWidth;
> -    pPixmap->refcnt = 1;
> -    pPixmap->devPrivate.ptr = (pointer) ((char *)pPixmap + base + adjust);
> +    pPixmap->devPrivate.ptr = malloc(datasize);
> +    if (!pPixmap->devPrivate.ptr)
> +        return FALSE;
> 
> #ifdef FB_DEBUG
>     pPixmap->devPrivate.ptr = (void *) ((char *) pPixmap->devPrivate.ptr + 
> paddedWidth);
>     fbInitializeDrawable (&pPixmap->drawable);
> #endif
> 
> -#ifdef COMPOSITE
> -    pPixmap->screen_x = 0;
> -    pPixmap->screen_y = 0;
> -#endif
> -
> -    pPixmap->usage_hint = usage_hint;
> -
> -    return pPixmap;
> +    return TRUE;
> }
> 
> -PixmapPtr
> -fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
> -             unsigned usage_hint)
> +Bool
> +fbCreatePixmap (PixmapPtr pPixmap)
> {
> -    int      bpp;
> -    bpp = BitsPerPixel (depth);
> -    if (bpp == 32 && depth <= 24)
> -     bpp = fbGetScreenPrivate(pScreen)->pix32bpp;
> -    return fbCreatePixmapBpp (pScreen, width, height, depth, bpp, 
> usage_hint);
> +    int bpp = BitsPerPixel (pPixmap->drawable.depth);
> +    if (bpp == 32 && pPixmap->drawable.depth <= 24)
> +     bpp = fbGetScreenPrivate(pPixmap->drawable.pScreen)->pix32bpp;
> +    return fbCreatePixmapBpp (pPixmap, bpp);
> }
> 
> void
> fbDestroyPixmap (PixmapPtr pPixmap)
> {
> +    free(pPixmap->devPrivate.ptr);
> }
> 
> #define ADDRECT(reg,r,fr,rx1,ry1,rx2,ry2)                     \
> diff --git a/glx/glxcmds.c b/glx/glxcmds.c
> index d5b764f..483d571 100644
> --- a/glx/glxcmds.c
> +++ b/glx/glxcmds.c
> @@ -1334,8 +1334,7 @@ DoCreatePbuffer(ClientPtr client, int screenNum, XID 
> fbconfigId,
>       return err;
> 
>     __glXenterServer(GL_FALSE);
> -    pPixmap = (*pGlxScreen->pScreen->CreatePixmap) (pGlxScreen->pScreen,
> -                                                 width, height, 
> config->rgbBits, 0);
> +    pPixmap = CreatePixmap(pGlxScreen->pScreen, width, height, 
> config->rgbBits, 0);
>     __glXleaveServer(GL_FALSE);
> 
>     /* Assign the pixmap the same id as the pbuffer and add it as a
> diff --git a/hw/dmx/dmxpixmap.c b/hw/dmx/dmxpixmap.c
> index 19f3ac7..b585365 100644
> --- a/hw/dmx/dmxpixmap.c
> +++ b/hw/dmx/dmxpixmap.c
> @@ -79,13 +79,10 @@ void dmxBECreatePixmap(PixmapPtr pPixmap)
>     }
> }
> 
> -/** Create a pixmap for \a pScreen with the specified \a width, \a
> - *  height, and \a depth. */
> -PixmapPtr dmxCreatePixmap(ScreenPtr pScreen, int width, int height, int 
> depth,
> -                       unsigned usage_hint)
> +Bool dmxCreatePixmap(PixmapPtr pPixmap)
> {
> +    ScreenPtr      pScreen = pPixmap->drawable.pScreen;
>     DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
> -    PixmapPtr      pPixmap;
>     int            bpp;
>     dmxPixPrivPtr  pPixPriv;
> 
> @@ -96,27 +93,11 @@ PixmapPtr dmxCreatePixmap(ScreenPtr pScreen, int width, 
> int height, int depth,
> #endif
> 
>     /* Create pixmap on back-end server */
> -    if (depth == 24) bpp = 32;
> -    else             bpp = depth;
> -
> -    pPixmap = AllocatePixmap(pScreen, 0);
> -    if (!pPixmap)
> -     return NullPixmap;
> +    bpp = pPixmap->drawable.depth;
> +    if (bpp == 24) bpp = 32;
> 
> -    pPixmap->drawable.type = DRAWABLE_PIXMAP;
> -    pPixmap->drawable.class = 0;
> -    pPixmap->drawable.pScreen = pScreen;
> -    pPixmap->drawable.depth = depth;
>     pPixmap->drawable.bitsPerPixel = bpp;
> -    pPixmap->drawable.id = 0;
> -    pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
> -    pPixmap->drawable.x = 0;
> -    pPixmap->drawable.y = 0;
> -    pPixmap->drawable.width = width;
> -    pPixmap->drawable.height = height;
> -    pPixmap->devKind = PixmapBytePad(width, bpp);
> -    pPixmap->refcnt = 1;
> -    pPixmap->usage_hint = usage_hint;
> +    pPixmap->devKind = PixmapBytePad(pPixmap->drawable.width, bpp);
> 
>     pPixPriv = DMX_GET_PIXMAP_PRIV(pPixmap);
>     pPixPriv->pixmap = (Pixmap)0;
> @@ -131,7 +112,7 @@ PixmapPtr dmxCreatePixmap(ScreenPtr pScreen, int width, 
> int height, int depth,
>     DMX_WRAP(CreatePixmap, dmxCreatePixmap, dmxScreen, pScreen);
> #endif
> 
> -    return pPixmap;
> +    return TRUE;
> }
> 
> /** Destroy the pixmap on the back-end server. */
> diff --git a/hw/dmx/dmxpixmap.h b/hw/dmx/dmxpixmap.h
> index 0bb19c3..b1e883f 100644
> --- a/hw/dmx/dmxpixmap.h
> +++ b/hw/dmx/dmxpixmap.h
> @@ -48,9 +48,7 @@ typedef struct _dmxPixPriv {
> 
> extern Bool      dmxInitPixmap(ScreenPtr pScreen);
> 
> -extern PixmapPtr dmxCreatePixmap(ScreenPtr pScreen,
> -                              int width, int height, int depth,
> -                              unsigned usage_hint);
> +extern Bool      dmxCreatePixmap(PixmapPtr pPixmap);
> extern void      dmxDestroyPixmap(PixmapPtr pPixmap);
> extern RegionPtr dmxBitmapToRegion(PixmapPtr pPixmap);
> 
> diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
> index 067902b..189ef65 100644
> --- a/hw/xfree86/common/xf86DGA.c
> +++ b/hw/xfree86/common/xf86DGA.c
> @@ -431,7 +431,7 @@ xf86SetDGAMode(
>    } 
> 
>    if(pMode->flags & DGA_PIXMAP_AVAILABLE) {
> -     if((pPix = (*pScreen->CreatePixmap)(pScreen, 0, 0, pMode->depth, 0))) {
> +     if((pPix = CreatePixmap(pScreen, 0, 0, pMode->depth, 0))) {
>           (*pScreen->ModifyPixmapHeader)(pPix, 
>                       pMode->pixmapWidth, pMode->pixmapHeight,
>                       pMode->depth, pMode->bitsPerPixel, 
> diff --git a/hw/xfree86/common/xf86VGAarbiter.c 
> b/hw/xfree86/common/xf86VGAarbiter.c
> index 658cf4e..b12192c 100644
> --- a/hw/xfree86/common/xf86VGAarbiter.c
> +++ b/hw/xfree86/common/xf86VGAarbiter.c
> @@ -367,18 +367,19 @@ VGAarbiterClearToBackground (
>     SCREEN_EPILOG (ClearToBackground, VGAarbiterClearToBackground);
> }
> 
> -static PixmapPtr
> -VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned 
> usage_hint)
> +static Bool
> +VGAarbiterCreatePixmap(PixmapPtr pPixmap)
> {
> -    PixmapPtr pPix;
> +    ScreenPtr pScreen = pPixmap->drawable.pScreen;
> +    Bool ret;
> 
>     SCREEN_PROLOG ( CreatePixmap);
>     VGAGet(pScreen);
> -    pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
> +    ret = (*pScreen->CreatePixmap) (pPixmap);
>     VGAPut();
>     SCREEN_EPILOG (CreatePixmap, VGAarbiterCreatePixmap);
> 
> -    return pPix;
> +    return ret;
> }
> 
> static Bool
> diff --git a/hw/xfree86/common/xf86VGAarbiterPriv.h 
> b/hw/xfree86/common/xf86VGAarbiterPriv.h
> index 2db2045..86ca210 100644
> --- a/hw/xfree86/common/xf86VGAarbiterPriv.h
> +++ b/hw/xfree86/common/xf86VGAarbiterPriv.h
> @@ -154,8 +154,7 @@ static void VGAarbiterCopyWindow(WindowPtr pWin, 
> DDXPointRec ptOldOrg,
>     RegionPtr prgnSrc);
> static void VGAarbiterClearToBackground (WindowPtr pWin, int x, int y, int w,
>     int h, Bool generateExposures);
> -static PixmapPtr VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h,
> -    int depth, unsigned int usage_hint);
> +static Bool VGAarbiterCreatePixmap(PixmapPtr pPixmap);
> static Bool  VGAarbiterCreateGC(GCPtr pGC);
> static Bool VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank);
> static void VGAarbiterStoreColors (ColormapPtr pmap, int ndef, xColorItem
> diff --git a/hw/xfree86/xaa/xaaInit.c b/hw/xfree86/xaa/xaaInit.c
> index e889468..5770a81 100644
> --- a/hw/xfree86/xaa/xaaInit.c
> +++ b/hw/xfree86/xaa/xaaInit.c
> @@ -33,8 +33,7 @@ static void XAAGetImage(DrawablePtr pDrawable, int sx, int 
> sy, int w, int h,
>                       char *pdstLine);
> static void XAAGetSpans(DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
>                       int *pwidth, int nspans, char *pdstStart);
> -static PixmapPtr XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
> -                              unsigned usage_hint);
> +static Bool XAACreatePixmap(PixmapPtr pPixmap);
> static void XAADestroyPixmap(PixmapPtr pPixmap);
> static Bool XAAEnterVT (int index, int flags);
> static void XAALeaveVT (int index, int flags);
> @@ -299,8 +298,7 @@ XAAPixmapBPP (ScreenPtr pScreen, int depth)
>     DestroyPixmapProcPtr    destroyPixmap;
> 
>     XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
> -    pPix = (*pScreen->CreatePixmap) (pScreen, 1, 1, depth,
> -                                  CREATE_PIXMAP_USAGE_SCRATCH);
> +    pPix = CreatePixmap(pScreen, 1, 1, depth, CREATE_PIXMAP_USAGE_SCRATCH);
>     XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
>     if (!pPix)
>       return 0;
> @@ -330,24 +328,27 @@ XAAInitializeOffscreenDepths (ScreenPtr pScreen)
>     }
> }
> 
> -static PixmapPtr 
> -XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned 
> usage_hint)
> +static Bool
> +XAACreatePixmap(PixmapPtr pPix)
> {
> +    ScreenPtr pScreen = pPix->drawable.pScreen;
>     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
>     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
>     XAAPixmapPtr pPriv;
> -    PixmapPtr pPix = NULL;
> +    Bool ret;
> +    int w = pPix->drawable.width;
> +    int h = pPix->drawable.height;
>     int size = w * h;
> 
>     if (w > 32767 || h > 32767)
> -     return NullPixmap;
> +     return FALSE;
> 
>     if (!infoRec->offscreenDepthsInitialized)
>       XAAInitializeOffscreenDepths (pScreen);
> 
>     if(pScrn->vtSema &&
> -     (usage_hint != CREATE_PIXMAP_USAGE_GLYPH_PICTURE) &&
> -     (infoRec->offscreenDepths & (1 << (depth - 1))) &&
> +     (pPix->usage_hint != CREATE_PIXMAP_USAGE_GLYPH_PICTURE) &&
> +     (infoRec->offscreenDepths & (1 << (pPix->drawable.depth - 1))) &&
>       (size >= MIN_OFFPIX_SIZE) && !SwitchedOut &&
>       (!infoRec->maxOffPixWidth || (w <= infoRec->maxOffPixWidth)) &&
>       (!infoRec->maxOffPixHeight || (h <= infoRec->maxOffPixHeight)) )
> @@ -379,10 +380,10 @@ XAACreatePixmap(ScreenPtr pScreen, int w, int h, int 
> depth, unsigned usage_hint)
>       }
> 
>       XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
> -     pPix = (*pScreen->CreatePixmap) (pScreen, 0, 0, depth, usage_hint);
> +     ret = (*pScreen->CreatePixmap) (pPix);
>       XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
> 
> -     if (!pPix) {
> +     if (!ret) {
>           free(pLink);
>             xf86FreeOffscreenArea(area);
>           goto BAILOUT;
> @@ -393,8 +394,6 @@ XAACreatePixmap(ScreenPtr pScreen, int w, int h, int 
> depth, unsigned usage_hint)
>       pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
>       pPix->drawable.x = area->box.x1;
>       pPix->drawable.y = area->box.y1;
> -     pPix->drawable.width = w;
> -     pPix->drawable.height = h;
>       pPix->drawable.bitsPerPixel = pScrn->bitsPerPixel;
>       pPix->devKind = pScreenPix->devKind;
>       pPix->devPrivate.ptr = pScreenPix->devPrivate.ptr;
> @@ -407,14 +406,14 @@ XAACreatePixmap(ScreenPtr pScreen, int w, int h, int 
> depth, unsigned usage_hint)
>       pLink->next = infoRec->OffscreenPixmaps;
>       pLink->pPix = pPix;
>       infoRec->OffscreenPixmaps = pLink;
> -     return pPix;
> +     return TRUE;
>     }
> BAILOUT:
>     XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
> -    pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
> +    ret = (*pScreen->CreatePixmap) (pPix);
>     XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
> 
> -    if(pPix) {
> +    if(ret) {
>        pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
>        pPriv->flags = 0;
>        pPriv->offscreenArea = NULL;
> @@ -423,7 +422,7 @@ BAILOUT:
>           pPriv->flags |= SHARED_PIXMAP;
>     }
> 
> -    return pPix;
> +    return ret;
> }
> 
> static void
> diff --git a/hw/xnest/Pixmap.c b/hw/xnest/Pixmap.c
> index 735f754..164a475 100644
> --- a/hw/xnest/Pixmap.c
> +++ b/hw/xnest/Pixmap.c
> @@ -34,38 +34,20 @@ is" without express or implied warranty.
> 
> DevPrivateKeyRec xnestPixmapPrivateKeyRec;
> 
> -PixmapPtr
> -xnestCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
> -               unsigned usage_hint)
> +Bool
> +xnestCreatePixmap(PixmapPtr pPixmap)
> {
> -  PixmapPtr pPixmap;
> -
> -  pPixmap = AllocatePixmap(pScreen, 0);
> -  if (!pPixmap)
> -    return NullPixmap;
> -  pPixmap->drawable.type = DRAWABLE_PIXMAP;
> -  pPixmap->drawable.class = 0;
> -  pPixmap->drawable.depth = depth;
> -  pPixmap->drawable.bitsPerPixel = depth;
> -  pPixmap->drawable.id = 0;
> -  pPixmap->drawable.x = 0;
> -  pPixmap->drawable.y = 0;
> -  pPixmap->drawable.width = width;
> -  pPixmap->drawable.height = height;
> -  pPixmap->drawable.pScreen = pScreen;
> -  pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
> -  pPixmap->refcnt = 1;
> -  pPixmap->devKind = PixmapBytePad(width, depth);
> -  pPixmap->usage_hint = usage_hint;
> -  if (width && height)
> +  pPixmap->drawable.bitsPerPixel = pPixmap->drawable.depth;
> +  pPixmap->devKind = PixmapBytePad(pPixmap->drawable.width, 
> pPixmap->drawable.depth);
> +  if (pPixmap->drawable.width && pPixmap->drawable.height)
>       xnestPixmapPriv(pPixmap)->pixmap = 
>         XCreatePixmap(xnestDisplay, 
> -                     xnestDefaultWindows[pScreen->myNum],
> -                     width, height, depth);
> +                     xnestDefaultWindows[pPixmap->drawable.pScreen->myNum],
> +                     pPixmap->drawable.width, pPixmap->drawable.height, 
> pPixmap->drawable.depth);
>   else
>       xnestPixmapPriv(pPixmap)->pixmap = 0;
> 
> -  return pPixmap;
> +  return TRUE;
> }
> 
> void
> diff --git a/hw/xnest/XNPixmap.h b/hw/xnest/XNPixmap.h
> index 5816cef..189ce28 100644
> --- a/hw/xnest/XNPixmap.h
> +++ b/hw/xnest/XNPixmap.h
> @@ -29,8 +29,7 @@ typedef struct {
> 
> #define xnestSharePixmap(pPixmap) ((pPixmap)->refcnt++)
> 
> -PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height,
> -                         int depth, unsigned usage_hint);
> +Bool xnestCreatePixmap(PixmapPtr pPixmap);
> void xnestDestroyPixmap(PixmapPtr pPixmap);
> RegionPtr xnestPixmapToRegion(PixmapPtr pPixmap);
> 
> diff --git a/hw/xwin/win.h b/hw/xwin/win.h
> index 9bee9b6..453cf7b 100644
> --- a/hw/xwin/win.h
> +++ b/hw/xwin/win.h
> @@ -1066,9 +1066,8 @@ winSetEngineFunctionsPrimaryDD (ScreenPtr pScreen);
>  * winpixmap.c
>  */
> 
> -PixmapPtr
> -winCreatePixmapNativeGDI (ScreenPtr pScreen, int width, int height, int 
> depth,
> -                       unsigned usage_hint);
> +Bool
> +winCreatePixmapNativeGDI (PixmapPtr pPixmap);
> 
> Bool
> winDestroyPixmapNativeGDI (PixmapPtr pPixmap);
> diff --git a/hw/xwin/winpixmap.c b/hw/xwin/winpixmap.c
> index 8bd8e34..c323182 100644
> --- a/hw/xwin/winpixmap.c
> +++ b/hw/xwin/winpixmap.c
> @@ -54,73 +54,48 @@ winCopyRotatePixmapNativeGDI (PixmapPtr psrcPix, 
> PixmapPtr *ppdstPix,
> 
> /* See Porting Layer Definition - p. 34 */
> /* See mfb/mfbpixmap.c - mfbCreatePixmap() */
> -PixmapPtr
> -winCreatePixmapNativeGDI (ScreenPtr pScreen,
> -                       int iWidth, int iHeight,
> -                       int iDepth, unsigned usage_hint)
> +Bool
> +winCreatePixmapNativeGDI (PixmapPtr pPixmap)
> {
>   winPrivPixmapPtr    pPixmapPriv = NULL;
> -  PixmapPtr          pPixmap = NULL;
> -
> -  /* Allocate pixmap memory */
> -  pPixmap = AllocatePixmap (pScreen, 0);
> -  if (!pPixmap)
> -    {
> -      ErrorF ("winCreatePixmapNativeGDI () - Couldn't allocate a pixmap\n");
> -      return NullPixmap;
> -    }
> 
> #if CYGDEBUG
>   winDebug ("winCreatePixmap () - w %d h %d d %d uh %d bw %d\n",
> -       iWidth, iHeight, iDepth, usage_hint,
> -       PixmapBytePad (iWidth, iDepth));
> +       pPixmap->drawable.width, pPixmap->drawable.height, 
> pPixmap->drawable.depth, pPixmap->drawable.usage_hint,
> +       PixmapBytePad (pPixmap->drawable.width, pPixmap->drawable.depth));
> #endif
> 
>   /* Setup pixmap values */
> -  pPixmap->drawable.type = DRAWABLE_PIXMAP;
> -  pPixmap->drawable.class = 0;
> -  pPixmap->drawable.pScreen = pScreen;
> -  pPixmap->drawable.depth = iDepth;
> -  pPixmap->drawable.bitsPerPixel = BitsPerPixel (iDepth);
> -  pPixmap->drawable.id = 0;
> -  pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
> -  pPixmap->drawable.x = 0;
> -  pPixmap->drawable.y = 0;
> -  pPixmap->drawable.width = iWidth;
> -  pPixmap->drawable.height = iHeight;
> -  pPixmap->devKind = 0;
> -  pPixmap->refcnt = 1;
> -  pPixmap->devPrivate.ptr = NULL;
> -  pPixmap->usage_hint = usage_hint;
> -
> -  /* Pixmap privates are allocated by AllocatePixmap */
> +  pPixmap->drawable.bitsPerPixel = BitsPerPixel (pPixmap->drawable.depth);
> +
> +  /* Pixmap privates are already allocated */
>   pPixmapPriv = winGetPixmapPriv (pPixmap);
> 
>   /* Initialize pixmap privates */
>   pPixmapPriv->hBitmap = NULL;
>   pPixmapPriv->hdcSelected = NULL;
>   pPixmapPriv->pbBits = NULL;
> -  pPixmapPriv->dwScanlineBytes = PixmapBytePad (iWidth, iDepth);
> +  pPixmapPriv->dwScanlineBytes = PixmapBytePad (pPixmap->drawable.width, 
> pPixmap->drawable.depth);
> 
>   /* Check for zero width or height pixmaps */
> -  if (iWidth == 0 || iHeight == 0)
> +  if (pPixmap->drawable.width == 0 || pPixmap->drawable.height == 0)
>     {
>       /* Don't allocate a real pixmap, just set fields and return */
> -      return pPixmap;
> +      return TRUE;
>     }
> 
>   /* Create a DIB for the pixmap */
> -  pPixmapPriv->hBitmap = winCreateDIBNativeGDI (iWidth, iHeight, iDepth,
> +  pPixmapPriv->hBitmap = winCreateDIBNativeGDI (pPixmap->drawable.width, 
> pPixmap->drawable.height, pPixmap->drawable.depth,
>                                               &pPixmapPriv->pbBits,
>                                               (BITMAPINFO **) 
> &pPixmapPriv->pbmih);
> 
> #if CYGDEBUG
>   winDebug ("winCreatePixmap () - Created a pixmap %08x, %dx%dx%d, for " \
>         "screen: %08x\n",
> -       pPixmapPriv->hBitmap, iWidth, iHeight, iDepth, pScreen);
> +       pPixmapPriv->hBitmap, pPixmap->drawable.width, 
> pPixmap->drawable.height, pPixmap->drawable.depth, pPixmap->drawable.pScreen);
> #endif
> 
> -  return pPixmap;
> +  return TRUE;
> }
> 
> 
> diff --git a/include/pixmap.h b/include/pixmap.h
> index 014a111..41ebc46 100644
> --- a/include/pixmap.h
> +++ b/include/pixmap.h
> @@ -109,9 +109,12 @@ extern _X_EXPORT Bool CreateScratchPixmapsForScreen(
> extern _X_EXPORT void FreeScratchPixmapsForScreen(
>     int /*scrnum*/);
> 
> -extern _X_EXPORT PixmapPtr AllocatePixmap(
> +extern _X_EXPORT PixmapPtr CreatePixmap(
>     ScreenPtr /*pScreen*/,
> -    int /*pixDataSize*/);
> +    int /*width*/,
> +    int /*height*/,
> +    int /*depth*/,
> +    unsigned /*usage_hint*/);
> 
> extern _X_EXPORT void FreePixmap(
>     PixmapPtr /*pPixmap*/);
> diff --git a/include/scrnintstr.h b/include/scrnintstr.h
> index 927ed04..8542bdc 100644
> --- a/include/scrnintstr.h
> +++ b/include/scrnintstr.h
> @@ -203,12 +203,8 @@ typedef    void (* ClipNotifyProcPtr)(
> /* pixmap will contain a glyph */
> #define CREATE_PIXMAP_USAGE_GLYPH_PICTURE               3
> 
> -typedef    PixmapPtr (* CreatePixmapProcPtr)(
> -     ScreenPtr /*pScreen*/,
> -     int /*width*/,
> -     int /*height*/,
> -     int /*depth*/,
> -     unsigned /*usage_hint*/);
> +typedef    Bool (* CreatePixmapProcPtr)(
> +     PixmapPtr /*pPixmap*/);
> 
> typedef    void (* DestroyPixmapProcPtr)(
>       PixmapPtr /*pPixmap*/);
> diff --git a/mi/miarc.c b/mi/miarc.c
> index fdbf2f4..82771d5 100644
> --- a/mi/miarc.c
> +++ b/mi/miarc.c
> @@ -1050,9 +1050,8 @@ miPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc 
> *parcs)
> 
>           /* allocate a 1 bit deep pixmap of the appropriate size, and
>            * validate it */
> -         pDrawTo = (DrawablePtr)(*pDraw->pScreen->CreatePixmap)
> -                             (pDraw->pScreen, pixmapWidth, pixmapHeight, 1,
> -                              CREATE_PIXMAP_USAGE_SCRATCH);
> +         pDrawTo = &CreatePixmap(pDraw->pScreen, pixmapWidth, pixmapHeight, 
> 1,
> +                                 CREATE_PIXMAP_USAGE_SCRATCH)->drawable;
>           if (!pDrawTo)
>           {
>               FreeScratchGC(pGCTo);
> diff --git a/mi/mibitblt.c b/mi/mibitblt.c
> index 0944da1..4680d70 100644
> --- a/mi/mibitblt.c
> +++ b/mi/mibitblt.c
> @@ -408,8 +408,7 @@ miOpqStipDrawable(DrawablePtr pDraw, GCPtr pGC, RegionPtr 
> prgnSrc,
>     xRectangle rect;
>     RegionPtr prgnSrcClip;
> 
> -    pPixmap = (*pDraw->pScreen->CreatePixmap)
> -                        (pDraw->pScreen, w + srcx, h, 1,
> +    pPixmap = CreatePixmap (pDraw->pScreen, w + srcx, h, 1,
>                           CREATE_PIXMAP_USAGE_SCRATCH);
>     if (!pPixmap)
>       return;
> @@ -654,9 +653,8 @@ miGetImage( DrawablePtr pDraw, int sx, int sy, int w, int 
> h,
>           pGC = GetScratchGC(depth, pDraw->pScreen);
>           if (!pGC)
>               return;
> -            pPixmap = (*pDraw->pScreen->CreatePixmap)
> -                            (pDraw->pScreen, w, 1, depth,
> -                             CREATE_PIXMAP_USAGE_SCRATCH);
> +         pPixmap = CreatePixmap(pDraw->pScreen, w, 1, depth,
> +                                CREATE_PIXMAP_USAGE_SCRATCH);
>           if (!pPixmap)
>           {
>               FreeScratchGC(pGC);
> diff --git a/mi/midispcur.c b/mi/midispcur.c
> index a2c5162..19b15fe 100644
> --- a/mi/midispcur.c
> +++ b/mi/midispcur.c
> @@ -210,9 +210,9 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
>       
>       pPriv->sourceBits = 0;
>       pPriv->maskBits = 0;
> -     pPixmap = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width,
> -                                         pCursor->bits->height, 32,
> -                                         CREATE_PIXMAP_USAGE_SCRATCH);
> +     pPixmap = CreatePixmap(pScreen, pCursor->bits->width,
> +                                     pCursor->bits->height, 32,
> +                                     CREATE_PIXMAP_USAGE_SCRATCH);
>       if (!pPixmap)
>       {
>           free((pointer) pPriv);
> @@ -244,13 +244,13 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
>     }
>     pPriv->pPicture = 0;
> #endif
> -    pPriv->sourceBits = (*pScreen->CreatePixmap) (pScreen, 
> pCursor->bits->width, pCursor->bits->height, 1, 0);
> +    pPriv->sourceBits = CreatePixmap(pScreen, pCursor->bits->width, 
> pCursor->bits->height, 1, 0);
>     if (!pPriv->sourceBits)
>     {
>       free((pointer) pPriv);
>       return NULL;
>     }
> -    pPriv->maskBits =  (*pScreen->CreatePixmap) (pScreen, 
> pCursor->bits->width, pCursor->bits->height, 1, 0);
> +    pPriv->maskBits = CreatePixmap(pScreen, pCursor->bits->width, 
> pCursor->bits->height, 1, 0);
>     if (!pPriv->maskBits)
>     {
>       FreePixmap(pPriv->sourceBits);
> @@ -456,7 +456,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
>       if (pSave)
>           FreePixmap(pSave);
>       pBuffer->pSave = pSave =
> -             (*pScreen->CreatePixmap) (pScreen, w, h, pScreen->rootDepth, 0);
> +             CreatePixmap(pScreen, w, h, pScreen->rootDepth, 0);
>       if (!pSave)
>           return FALSE;
>     }
> diff --git a/mi/miglblt.c b/mi/miglblt.c
> index dcf08da..41c5355 100644
> --- a/mi/miglblt.c
> +++ b/mi/miglblt.c
> @@ -121,9 +121,7 @@ miPolyGlyphBlt(
>     height = FONTMAXBOUNDS(pfont,ascent) +
>            FONTMAXBOUNDS(pfont,descent);
> 
> -    pPixmap = (*pDrawable->pScreen->CreatePixmap)(pDrawable->pScreen,
> -                                               width, height, 1,
> -                                               CREATE_PIXMAP_USAGE_SCRATCH);
> +    pPixmap = CreatePixmap(pDrawable->pScreen, width, height, 1, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>     if (!pPixmap)
>       return;
> 
> diff --git a/mi/miscrinit.c b/mi/miscrinit.c
> index 7562cd2..7421e1b 100644
> --- a/mi/miscrinit.c
> +++ b/mi/miscrinit.c
> @@ -151,7 +151,7 @@ miCreateScreenResources(ScreenPtr pScreen)
>       /* create a pixmap with no data, then redirect it to point to
>        * the screen
>        */
> -     pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 
> 0);
> +     pPixmap = CreatePixmap(pScreen, 0, 0, pScreen->rootDepth, 0);
>       if (!pPixmap)
>           return FALSE;
> 
> diff --git a/miext/rootless/rootlessScreen.c b/miext/rootless/rootlessScreen.c
> index 0801e72..974e752 100644
> --- a/miext/rootless/rootlessScreen.c
> +++ b/miext/rootless/rootlessScreen.c
> @@ -85,7 +85,7 @@ RootlessUpdateScreenPixmap(ScreenPtr pScreen)
> 
>     pPix = (*pScreen->GetScreenPixmap)(pScreen);
>     if (pPix == NULL) {
> -        pPix = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 
> 0);
> +        pPix = CreatePixmap(pScreen, 0, 0, pScreen->rootDepth, 0);
>         (*pScreen->SetScreenPixmap)(pPix);
>     }
> 
> diff --git a/miext/shadow/shadow.c b/miext/shadow/shadow.c
> index 3230fa4..5dbdd86 100644
> --- a/miext/shadow/shadow.c
> +++ b/miext/shadow/shadow.c
> @@ -236,7 +236,7 @@ shadowInit(ScreenPtr pScreen, ShadowUpdateProc update, 
> ShadowWindowProc window)
> {
>     PixmapPtr pPixmap;
> 
> -    pPixmap = pScreen->CreatePixmap(pScreen, pScreen->width, pScreen->height,
> +    pPixmap = CreatePixmap(pScreen, pScreen->width, pScreen->height,
>                                   pScreen->rootDepth, 0);
>     if (!pPixmap)
>       return FALSE;
> diff --git a/render/glyph.c b/render/glyph.c
> index aae93d4..e9a85d1 100644
> --- a/render/glyph.c
> +++ b/render/glyph.c
> @@ -652,9 +652,7 @@ miGlyphs (CARD8           op,
>           return;
>       width = extents.x2 - extents.x1;
>       height = extents.y2 - extents.y1;
> -     pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
> -                                             maskFormat->depth,
> -                                             CREATE_PIXMAP_USAGE_SCRATCH);
> +     pMaskPixmap = CreatePixmap(pScreen, width, height, maskFormat->depth, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>       if (!pMaskPixmap)
>           return;
>       component_alpha = NeedsComponent(maskFormat->format);
> diff --git a/render/mirect.c b/render/mirect.c
> index 0ccc8e4..d2fa21a 100644
> --- a/render/mirect.c
> +++ b/render/mirect.c
> @@ -135,8 +135,7 @@ miCompositeRects (CARD8           op,
>       if (!rgbaFormat)
>           goto bail1;
>       
> -     pPixmap = (*pScreen->CreatePixmap) (pScreen, 1, 1, rgbaFormat->depth,
> -                                         CREATE_PIXMAP_USAGE_SCRATCH);
> +     pPixmap = CreatePixmap(pScreen, 1, 1, rgbaFormat->depth, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>       if (!pPixmap)
>           goto bail2;
>       
> diff --git a/render/render.c b/render/render.c
> index a46c774..376c17c 100644
> --- a/render/render.c
> +++ b/render/render.c
> @@ -1160,9 +1160,7 @@ ProcRenderAddGlyphs (ClientPtr client)
>                   goto bail;
>               }
> 
> -             pDstPix = (pScreen->CreatePixmap) (pScreen,
> -                                                width, height, depth,
> -                                                
> CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
> +             pDstPix = CreatePixmap(pScreen, width, height, depth, 
> CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
> 
>               if (!pDstPix)
>               {
> @@ -1584,8 +1582,7 @@ ProcRenderCreateCursor (ClientPtr client)
>           free(mskbits);
>           return BadImplementation;
>       }
> -     pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
> -                                         CREATE_PIXMAP_USAGE_SCRATCH);
> +     pPixmap = CreatePixmap(pScreen, width, height, 32, 
> CREATE_PIXMAP_USAGE_SCRATCH);
>       if (!pPixmap)
>       {
>           free(argbbits);
> -- 
> 1.7.5.4
> 
> _______________________________________________
> [email protected]: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 

---
Jeremy Huddleston

Rebuild Sudan
 - Board of Directors
 - http://www.rebuildsudan.org

Berkeley Foundation for Opportunities in Information Technology
 - Advisory Board
 - http://www.bfoit.org

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to