Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 3894 of file freetype.c.
Referenced by GetCharWidth32A(), GetCharWidth32W(), GetCharWidthA(), GetCharWidthFloatA(), GetCharWidthFloatW(), GetCharWidthI(), and GetCharWidthW().
{ NTSTATUS Status = STATUS_SUCCESS; LPINT SafeBuff; PFLOAT SafeBuffF = NULL; PDC dc; PDC_ATTR pdcattr; PTEXTOBJ TextObj; PFONTGDI FontGDI; FT_Face face; FT_CharMap charmap, found = NULL; UINT i, glyph_index, BufferSize; HFONT hFont = 0; if (pwc) { _SEH2_TRY { ProbeForRead(pwc, sizeof(PWSTR), 1); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { Status = _SEH2_GetExceptionCode(); } _SEH2_END; } if (!NT_SUCCESS(Status)) { EngSetLastError(Status); return FALSE; } BufferSize = Count * sizeof(INT); // Same size! SafeBuff = ExAllocatePoolWithTag(PagedPool, BufferSize, GDITAG_TEXT); if (!fl) SafeBuffF = (PFLOAT) SafeBuff; if (SafeBuff == NULL) { EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } dc = DC_LockDc(hDC); if (dc == NULL) { ExFreePool(SafeBuff); EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } pdcattr = dc->pdcattr; hFont = pdcattr->hlfntNew; TextObj = RealizeFontInit(hFont); DC_UnlockDc(dc); if (TextObj == NULL) { ExFreePool(SafeBuff); EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } FontGDI = ObjToGDI(TextObj->Font, FONT); face = FontGDI->face; if (face->charmap == NULL) { for (i = 0; i < face->num_charmaps; i++) { charmap = face->charmaps[i]; if (charmap->encoding != 0) { found = charmap; break; } } if (!found) { DPRINT1("WARNING: Could not find desired charmap!\n"); ExFreePool(SafeBuff); EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } IntLockFreeType; FT_Set_Charmap(face, found); IntUnLockFreeType; } IntLockFreeType; FT_Set_Pixel_Sizes(face, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME: Should set character height if neg */ (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); for (i = FirstChar; i < FirstChar+Count; i++) { if (pwc) { if (fl & GCW_INDICES) glyph_index = pwc[i - FirstChar]; else glyph_index = FT_Get_Char_Index(face, pwc[i - FirstChar]); } else { if (fl & GCW_INDICES) glyph_index = i; else glyph_index = FT_Get_Char_Index(face, i); } FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (!fl) SafeBuffF[i - FirstChar] = (FLOAT) ((face->glyph->advance.x + 32) >> 6); else SafeBuff[i - FirstChar] = (face->glyph->advance.x + 32) >> 6; } IntUnLockFreeType; TEXTOBJ_UnlockText(TextObj); MmCopyToCaller(Buffer, SafeBuff, BufferSize); ExFreePool(SafeBuff); return TRUE; }