GlyphPtr AllocateGlyph(xGlyphInfo * gi, int fdepth) { PictureScreenPtr ps; int size; GlyphPtr glyph; int i; int head_size; head_size = sizeof(GlyphRec) + screenInfo.numScreens * sizeof(PicturePtr); size = (head_size + dixPrivatesSize(PRIVATE_GLYPH)); glyph = (GlyphPtr) malloc(size); if (!glyph) return 0; glyph->refcnt = 0; glyph->size = size + sizeof(xGlyphInfo); glyph->info = *gi; dixInitPrivates(glyph, (char *) glyph + head_size, PRIVATE_GLYPH); for (i = 0; i < screenInfo.numScreens; i++) { GlyphPicture(glyph)[i] = NULL; ps = GetPictureScreenIfSet(screenInfo.screens[i]); if (ps) { if (!(*ps->RealizeGlyph) (screenInfo.screens[i], glyph)) goto bail; } } return glyph; bail: while (i--) { ps = GetPictureScreenIfSet(screenInfo.screens[i]); if (ps) (*ps->UnrealizeGlyph) (screenInfo.screens[i], glyph); } dixFreeObjectWithPrivates(glyph, PRIVATE_GLYPH); return 0; }
int AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar, unsigned foreRed, unsigned foreGreen, unsigned foreBlue, unsigned backRed, unsigned backGreen, unsigned backBlue, CursorPtr *ppCurs, ClientPtr client, XID cid) { FontPtr sourcefont, maskfont; unsigned char *srcbits; unsigned char *mskbits; CursorMetricRec cm; int rc; CursorBitsPtr bits; CursorPtr pCurs; GlyphSharePtr pShare; rc = dixLookupResourceByType((pointer *)&sourcefont, source, RT_FONT, client, DixUseAccess); if (rc != Success) { client->errorValue = source; return rc; } rc = dixLookupResourceByType((pointer *)&maskfont, mask, RT_FONT, client, DixUseAccess); if (rc != Success && mask != None) { client->errorValue = mask; return rc; } if (sourcefont != maskfont) pShare = (GlyphSharePtr)NULL; else { for (pShare = sharedGlyphs; pShare && ((pShare->font != sourcefont) || (pShare->sourceChar != sourceChar) || (pShare->maskChar != maskChar)); pShare = pShare->next) ; } if (pShare) { pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE, 1); if (!pCurs) return BadAlloc; dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR); bits = pShare->bits; bits->refcnt++; } else { if (!CursorMetricsFromGlyph(sourcefont, sourceChar, &cm)) { client->errorValue = sourceChar; return BadValue; } if (!maskfont) { long n; unsigned char *mskptr; n = BitmapBytePad(cm.width)*(long)cm.height; mskptr = mskbits = malloc(n); if (!mskptr) return BadAlloc; while (--n >= 0) *mskptr++ = ~0; } else { if (!CursorMetricsFromGlyph(maskfont, maskChar, &cm)) { client->errorValue = maskChar; return BadValue; } if ((rc = ServerBitsFromGlyph(maskfont, maskChar, &cm, &mskbits))) return rc; } if ((rc = ServerBitsFromGlyph(sourcefont, sourceChar, &cm, &srcbits))) { free(mskbits); return rc; } if (sourcefont != maskfont) { pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE + CURSOR_BITS_SIZE, 1); if (pCurs) bits = (CursorBitsPtr)((char *)pCurs + CURSOR_REC_SIZE); else bits = (CursorBitsPtr)NULL; } else { pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE, 1); if (pCurs) bits = (CursorBitsPtr)calloc(CURSOR_BITS_SIZE, 1); else bits = (CursorBitsPtr)NULL; } if (!bits) { free(pCurs); free(mskbits); free(srcbits); return BadAlloc; } dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR); dixInitPrivates(bits, bits + 1, PRIVATE_CURSOR_BITS); bits->source = srcbits; bits->mask = mskbits; #ifdef ARGB_CURSOR bits->argb = 0; #endif bits->width = cm.width; bits->height = cm.height; bits->xhot = cm.xhot; bits->yhot = cm.yhot; if (sourcefont != maskfont) bits->refcnt = -1; else { bits->refcnt = 1; pShare = malloc(sizeof(GlyphShare)); if (!pShare) { FreeCursorBits(bits); return BadAlloc; } pShare->font = sourcefont; sourcefont->refcnt++; pShare->sourceChar = sourceChar; pShare->maskChar = maskChar; pShare->bits = bits; pShare->next = sharedGlyphs; sharedGlyphs = pShare; } } CheckForEmptyMask(bits); pCurs->bits = bits; pCurs->refcnt = 1; #ifdef XFIXES pCurs->serialNumber = ++cursorSerial; pCurs->name = None; #endif pCurs->foreRed = foreRed; pCurs->foreGreen = foreGreen; pCurs->foreBlue = foreBlue; pCurs->backRed = backRed; pCurs->backGreen = backGreen; pCurs->backBlue = backBlue; pCurs->id = cid; /* security creation/labeling check */ rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR, pCurs, RT_NONE, NULL, DixCreateAccess); if (rc != Success) goto error; rc = RealizeCursorAllScreens(pCurs); if (rc != Success) goto error; *ppCurs = pCurs; return Success; error: FreeCursorBits(bits); dixFiniPrivates(pCurs, PRIVATE_CURSOR); free(pCurs); return rc; }
/** * does nothing about the resource table, just creates the data structure. * does not copy the src and mask bits * * \param psrcbits server-defined padding * \param pmaskbits server-defined padding * \param argb no padding */ int AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits, CARD32 *argb, CursorMetricPtr cm, unsigned foreRed, unsigned foreGreen, unsigned foreBlue, unsigned backRed, unsigned backGreen, unsigned backBlue, CursorPtr *ppCurs, ClientPtr client, XID cid) { CursorBitsPtr bits; CursorPtr pCurs; int rc; *ppCurs = NULL; pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE + CURSOR_BITS_SIZE, 1); if (!pCurs) return BadAlloc; bits = (CursorBitsPtr)((char *)pCurs + CURSOR_REC_SIZE); dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR); dixInitPrivates(bits, bits + 1, PRIVATE_CURSOR_BITS) bits->source = psrcbits; bits->mask = pmaskbits; #ifdef ARGB_CURSOR bits->argb = argb; #endif bits->width = cm->width; bits->height = cm->height; bits->xhot = cm->xhot; bits->yhot = cm->yhot; pCurs->refcnt = 1; bits->refcnt = -1; CheckForEmptyMask(bits); pCurs->bits = bits; #ifdef XFIXES pCurs->serialNumber = ++cursorSerial; pCurs->name = None; #endif pCurs->foreRed = foreRed; pCurs->foreGreen = foreGreen; pCurs->foreBlue = foreBlue; pCurs->backRed = backRed; pCurs->backGreen = backGreen; pCurs->backBlue = backBlue; pCurs->id = cid; /* security creation/labeling check */ rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR, pCurs, RT_NONE, NULL, DixCreateAccess); if (rc != Success) goto error; rc = RealizeCursorAllScreens(pCurs); if (rc != Success) goto error; *ppCurs = pCurs; return Success; error: FreeCursorBits(bits); dixFiniPrivates(pCurs, PRIVATE_CURSOR); free(pCurs); return rc; }
int AnimCursorCreate(CursorPtr *cursors, CARD32 *deltas, int ncursor, CursorPtr *ppCursor, ClientPtr client, XID cid) { CursorPtr pCursor; int rc, i; AnimCurPtr ac; for (i = 0; i < screenInfo.numScreens; i++) if (!GetAnimCurScreen(screenInfo.screens[i])) return BadImplementation; for (i = 0; i < ncursor; i++) if (IsAnimCur(cursors[i])) return BadMatch; pCursor = (CursorPtr) calloc(CURSOR_REC_SIZE + sizeof(AnimCurRec) + ncursor * sizeof(AnimCurElt), 1); if (!pCursor) return BadAlloc; dixInitPrivates(pCursor, pCursor + 1, PRIVATE_CURSOR); pCursor->bits = &animCursorBits; pCursor->refcnt = 1; pCursor->foreRed = cursors[0]->foreRed; pCursor->foreGreen = cursors[0]->foreGreen; pCursor->foreBlue = cursors[0]->foreBlue; pCursor->backRed = cursors[0]->backRed; pCursor->backGreen = cursors[0]->backGreen; pCursor->backBlue = cursors[0]->backBlue; pCursor->id = cid; /* security creation/labeling check */ rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR, pCursor, RT_NONE, NULL, DixCreateAccess); if (rc != Success) { dixFiniPrivates(pCursor, PRIVATE_CURSOR); free(pCursor); return rc; } /* * Fill in the AnimCurRec */ animCursorBits.refcnt++; ac = GetAnimCur(pCursor); ac->nelt = ncursor; ac->elts = (AnimCurElt *) (ac + 1); for (i = 0; i < ncursor; i++) { cursors[i]->refcnt++; ac->elts[i].pCursor = cursors[i]; ac->elts[i].delay = deltas[i]; } *ppCursor = pCursor; return Success; }