BOOL vrdpReportText(PVBOXDISPDEV pDev, VRDPCLIPRECTS *pClipRects, STROBJ *pstro, FONTOBJ *pfo, RECTL *prclOpaque, ULONG ulForeRGB, ULONG ulBackRGB) { FONTINFO fi; uint32_t cbOrderMax; VRDEORDERTEXT *pOrder; BOOL fResult; uint8_t *pu8GlyphPtr; uint8_t *pu8GlyphEnd; LOGF(("pDev %p, pClipRects %p, pstro %p, pfo %p, prclOpaque %p, ulForeRGB %x, ulBackRGB %x", pDev, pClipRects, pstro, pfo, prclOpaque, ulForeRGB, ulBackRGB)); if (pstro->ulCharInc > 0xFF) { return FALSE; } /* The driver can get vertical strings with both SO_HORIZONTAL and SO_VERTICAL bits equal to zero. */ if ( (pstro->flAccel & SO_HORIZONTAL) == 0 || (pstro->flAccel & SO_REVERSED) != 0) { /* Do not support (yet) the vertical and right to left strings. * @todo implement and test. */ return FALSE; } memset (&fi, 0, sizeof (fi)); FONTOBJ_vGetInfo (pfo, sizeof (fi), &fi); if ( fi.cjMaxGlyph1 == 0 || fi.cjMaxGlyph1 > VRDP_TEXT_MAX_GLYPH_SIZE) { /* No 1BPP bitmaps or the bitmap is larger than the cache supports. */ LOG(("fi.cjMaxGlyph1 = %x. Return FALSE", fi.cjMaxGlyph1)); return FALSE; } cbOrderMax = vrdpSizeofTextOrder(pstro->cGlyphs, fi.cjMaxGlyph1); LOG(("pstro->cGlyphs = %d, fi.cjMaxGlyph1 = 0x%x, cbOrderMax = 0x%x.", pstro->cGlyphs, fi.cjMaxGlyph1, cbOrderMax)); pOrder = (VRDEORDERTEXT *)EngAllocMem(0, cbOrderMax, MEM_ALLOC_TAG); if (!pOrder) { LOG(("pOrder = %x. Return FALSE", pOrder)); return FALSE; } pu8GlyphPtr = (uint8_t *)&pOrder[1]; /* Follows the order header. */ pu8GlyphEnd = (uint8_t *)pOrder + cbOrderMax; pOrder->xBkGround = (int16_t)pstro->rclBkGround.left; pOrder->yBkGround = (int16_t)pstro->rclBkGround.top; pOrder->wBkGround = (uint16_t)(pstro->rclBkGround.right - pstro->rclBkGround.left); pOrder->hBkGround = (uint16_t)(pstro->rclBkGround.bottom - pstro->rclBkGround.top); if (prclOpaque) { pOrder->xOpaque = (int16_t)prclOpaque->left; pOrder->yOpaque = (int16_t)prclOpaque->top; pOrder->wOpaque = (uint16_t)(prclOpaque->right - prclOpaque->left); pOrder->hOpaque = (uint16_t)(prclOpaque->bottom - prclOpaque->top); } else { pOrder->xOpaque = 0; pOrder->yOpaque = 0; pOrder->wOpaque = 0; pOrder->hOpaque = 0; } pOrder->u16MaxGlyph = (uint16_t)fi.cjMaxGlyph1; pOrder->u8Glyphs = (uint8_t)pstro->cGlyphs; pOrder->u8Flags = (uint8_t)pstro->flAccel; pOrder->u8CharInc = (uint8_t)pstro->ulCharInc; pOrder->u32FgRGB = ulForeRGB; pOrder->u32BgRGB = ulBackRGB; LOG(("pstro->pgp %p.", pstro->pgp)); /* Enumerate glyphs. */ STROBJ_vEnumStart(pstro); fResult = TRUE; for (;;) { ULONG i; ULONG cGlyphs = 0; GLYPHPOS *pGlyphPos = NULL; BOOL fMore = STROBJ_bEnum (pstro, &cGlyphs, &pGlyphPos); LOG(("cGlyphs %d.", cGlyphs)); for (i = 0; i < cGlyphs; i++) { fResult = vrdpReportGlyph(&pGlyphPos[i], &pu8GlyphPtr, pu8GlyphEnd); if (!fResult) { break; } } if (!fMore || !fResult) { break; } } LOG(("fResult %d", fResult)); if (fResult) { pOrder->cbOrder = (uint32_t)(pu8GlyphPtr - (uint8_t *)pOrder); vrdpReportOrderGeneric(pDev, pClipRects, pOrder, pOrder->cbOrder, VRDE_ORDER_TEXT); } EngFreeMem(pOrder); return fResult; }
BOOL bVerifyStrObj(STROBJ* pstro) { BOOL bMoreGlyphs; LONG cGlyph; GLYPHPOS * pgp; LONG iGlyph = 0; RECTL * prclDraw; GLYPHPOS * pgpTmp; POINTL ptlPlace; do { // Get the next batch of glyphs: if (pstro->pgp != NULL) { // There's only the one batch of glyphs, so save ourselves // a call: pgp = pstro->pgp; cGlyph = pstro->cGlyphs; bMoreGlyphs = FALSE; } else { bMoreGlyphs = STROBJ_bEnum(pstro, &cGlyph, &pgp); } prclDraw = &pstro->rclBkGround; pgpTmp = pgp; ptlPlace = pgpTmp->ptl; while (cGlyph) { if (((ptlPlace.x + pgpTmp->pgdf->pgb->ptlOrigin.x + pgpTmp->pgdf->pgb->sizlBitmap.cx) > (prclDraw->right)) || ((ptlPlace.x + pgpTmp->pgdf->pgb->ptlOrigin.x) < (prclDraw->left)) || ((ptlPlace.y + pgpTmp->pgdf->pgb->ptlOrigin.y + pgpTmp->pgdf->pgb->sizlBitmap.cy) > (prclDraw->bottom)) || ((ptlPlace.y + pgpTmp->pgdf->pgb->ptlOrigin.y) < (prclDraw->top)) ) { DISPDBG((0,"------------------------------------------------------------")); DISPDBG((0,"Glyph %d extends beyond pstro->rclBkGround", iGlyph)); DISPDBG((0,"\tpstro->rclBkGround (%d,%d,%d,%d)", pstro->rclBkGround.left, pstro->rclBkGround.top, pstro->rclBkGround.right, pstro->rclBkGround.bottom)); DISPDBG((0,"\teffective glyph rect (%d,%d,%d,%d)", (ptlPlace.x + pgpTmp->pgdf->pgb->ptlOrigin.x), (ptlPlace.y + pgpTmp->pgdf->pgb->ptlOrigin.y), (ptlPlace.x + pgpTmp->pgdf->pgb->ptlOrigin.x + pgpTmp->pgdf->pgb->sizlBitmap.cx), (ptlPlace.y + pgpTmp->pgdf->pgb->ptlOrigin.y + pgpTmp->pgdf->pgb->sizlBitmap.cy))); DISPDBG((0,"\tglyph pos (%d,%d)",ptlPlace.x,ptlPlace.y)); DISPDBG((0,"\tglyph origin (%d,%d)", pgpTmp->pgdf->pgb->ptlOrigin.x, pgpTmp->pgdf->pgb->ptlOrigin.y)); DISPDBG((0,"\tglyph sizl (%d,%d)", pgpTmp->pgdf->pgb->sizlBitmap.cx, pgpTmp->pgdf->pgb->sizlBitmap.cy)); DISPDBG((0,"------------------------------------------------------------")); RIP("time to call the font guys..."); return(FALSE); } cGlyph--; iGlyph++; pgpTmp++; if (pstro->ulCharInc == 0) { ptlPlace = pgpTmp->ptl; } else { ptlPlace.x += pstro->ulCharInc; } } } while (bMoreGlyphs); return(TRUE); }