/**************************************************************************** * PSDRV_SelectDownloadFont * * Set up physDev->font for a downloadable font * */ BOOL PSDRV_SelectDownloadFont(PSDRV_PDEVICE *physDev) { char *ps_name; LPOUTLINETEXTMETRICA potm; DWORD len = GetOutlineTextMetricsA(physDev->hdc, 0, NULL); if(!len) return FALSE; potm = HeapAlloc(GetProcessHeap(), 0, len); GetOutlineTextMetricsA(physDev->hdc, len, potm); get_download_name(physDev, potm, &ps_name); physDev->font.fontloc = Download; physDev->font.fontinfo.Download = is_font_downloaded(physDev, ps_name); physDev->font.size = abs(PSDRV_YWStoDS(physDev, /* ppem */ potm->otmTextMetrics.tmAscent + potm->otmTextMetrics.tmDescent - potm->otmTextMetrics.tmInternalLeading)); physDev->font.underlineThickness = potm->otmsUnderscoreSize; physDev->font.underlinePosition = potm->otmsUnderscorePosition; physDev->font.strikeoutThickness = potm->otmsStrikeoutSize; physDev->font.strikeoutPosition = potm->otmsStrikeoutPosition; HeapFree(GetProcessHeap(), 0, ps_name); HeapFree(GetProcessHeap(), 0, potm); return TRUE; }
static OUTLINETEXTMETRICA *getOutlineTextMetric(HDC hdc) { int size; size = GetOutlineTextMetricsA(hdc, 0, 0); OUTLINETEXTMETRICA *otm = (OUTLINETEXTMETRICA *)malloc(size); GetOutlineTextMetricsA(hdc, size, otm); return otm; }
/**************************************************************************** * PSDRV_WriteSetDownloadFont * * Write setfont for download font. * */ BOOL PSDRV_WriteSetDownloadFont(PSDRV_PDEVICE *physDev) { char *ps_name; LPOUTLINETEXTMETRICA potm; DWORD len = GetOutlineTextMetricsA(physDev->hdc, 0, NULL); DOWNLOAD *pdl; assert(physDev->font.fontloc == Download); potm = HeapAlloc(GetProcessHeap(), 0, len); GetOutlineTextMetricsA(physDev->hdc, len, potm); get_download_name(physDev, potm, &ps_name); if(physDev->font.fontinfo.Download == NULL) { RECT bbox; UINT emsize; if (!get_bbox(physDev, &bbox, &emsize)) { HeapFree(GetProcessHeap(), 0, potm); return FALSE; } if(!is_room_for_font(physDev)) PSDRV_EmptyDownloadList(physDev, TRUE); pdl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pdl)); pdl->ps_name = HeapAlloc(GetProcessHeap(), 0, strlen(ps_name)+1); strcpy(pdl->ps_name, ps_name); pdl->next = NULL; if(physDev->pi->ppd->TTRasterizer == RO_Type42) { pdl->typeinfo.Type42 = T42_download_header(physDev, ps_name, &bbox, emsize); pdl->type = Type42; } if(pdl->typeinfo.Type42 == NULL) { pdl->typeinfo.Type1 = T1_download_header(physDev, ps_name, &bbox, emsize); pdl->type = Type1; } pdl->next = physDev->downloaded_fonts; physDev->downloaded_fonts = pdl; physDev->font.fontinfo.Download = pdl; if(pdl->type == Type42) { char g_name[MAX_G_NAME + 1]; get_glyph_name(physDev->hdc, 0, g_name); T42_download_glyph(physDev, pdl, 0, g_name); } } PSDRV_WriteSetFont(physDev, ps_name, physDev->font.size, physDev->font.escapement); HeapFree(GetProcessHeap(), 0, ps_name); HeapFree(GetProcessHeap(), 0, potm); return TRUE; }
LONG WINAPI TTIsEmbeddingEnabled(HDC hDC, BOOL *enabled) { OUTLINETEXTMETRICA *otm; LONG ret; UINT len; TRACE("(%p %p)\n", hDC, enabled); if (!hDC) return E_HDCINVALID; len = GetOutlineTextMetricsA(hDC, 0, NULL); if (!len) return E_ERRORACCESSINGFACENAME; otm = HeapAlloc(GetProcessHeap(), 0, len); if (!otm) return E_NOFREEMEMORY; GetOutlineTextMetricsA(hDC, len, otm); ret = TTIsEmbeddingEnabledForFacename(otm->otmpFaceName, enabled); HeapFree(GetProcessHeap(), 0, otm); return ret; }
static int CALLBACK enum_font_proc(ENUMLOGFONTEXA *enumlf, NEWTEXTMETRICEXA *ntm, DWORD type, LPARAM lParam) { OUTLINETEXTMETRICA otm; HDC hdc = GetDC(NULL); HFONT hfont, old_font; ULONG status; LONG ret; hfont = CreateFontIndirectA(&enumlf->elfLogFont); old_font = SelectObject(hdc, hfont); otm.otmSize = sizeof(otm); if (GetOutlineTextMetricsA(hdc, otm.otmSize, &otm)) { ULONG expected = 0xffff; UINT fsType = otm.otmfsType & 0xf; ret = TTGetEmbeddingType(hdc, &status); ok(ret == E_NONE, "got %d\n", ret); if (fsType == LICENSE_INSTALLABLE) expected = EMBED_INSTALLABLE; else if (fsType & LICENSE_EDITABLE) expected = EMBED_EDITABLE; else if (fsType & LICENSE_PREVIEWPRINT) expected = EMBED_PREVIEWPRINT; else if (fsType & LICENSE_NOEMBEDDING) expected = EMBED_NOEMBEDDING; ok(expected == status, "%s: status %d, expected %d, fsType %#x\n", enumlf->elfLogFont.lfFaceName, status, expected, otm.otmfsType); } else { status = 0xdeadbeef; ret = TTGetEmbeddingType(hdc, &status); ok(ret == E_NOTATRUETYPEFONT, "%s: got %d\n", enumlf->elfLogFont.lfFaceName, ret); ok(status == 0xdeadbeef, "%s: got status %d\n", enumlf->elfLogFont.lfFaceName, status); } SelectObject(hdc, old_font); DeleteObject(hfont); ReleaseDC(NULL, hdc); return 1; }
/**************************************************************************** * PSDRV_WriteSetDownloadFont * * Write setfont for download font. * */ BOOL PSDRV_WriteSetDownloadFont(PHYSDEV dev) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); char *ps_name; LPOUTLINETEXTMETRICA potm; DWORD len = GetOutlineTextMetricsA(dev->hdc, 0, NULL); DOWNLOAD *pdl; LOGFONTW lf; UINT ppem; XFORM xform; assert(physDev->font.fontloc == Download); if (!GetObjectW( GetCurrentObject(dev->hdc, OBJ_FONT), sizeof(lf), &lf )) return FALSE; potm = HeapAlloc(GetProcessHeap(), 0, len); if (!potm) return FALSE; GetOutlineTextMetricsA(dev->hdc, len, potm); get_download_name(dev, potm, &ps_name); physDev->font.fontinfo.Download = is_font_downloaded(physDev, ps_name); ppem = calc_ppem_for_height(dev->hdc, lf.lfHeight); /* Retrieve the world -> device transform */ GetTransform(dev->hdc, 0x204, &xform); if(GetGraphicsMode(dev->hdc) == GM_COMPATIBLE) { if (xform.eM22 < 0) physDev->font.escapement = -physDev->font.escapement; xform.eM11 = xform.eM22 = fabs(xform.eM22); xform.eM21 = xform.eM12 = 0; } physDev->font.size.xx = ps_round(ppem * xform.eM11); physDev->font.size.xy = ps_round(ppem * xform.eM12); physDev->font.size.yx = -ps_round(ppem * xform.eM21); physDev->font.size.yy = -ps_round(ppem * xform.eM22); physDev->font.underlineThickness = potm->otmsUnderscoreSize; physDev->font.underlinePosition = potm->otmsUnderscorePosition; physDev->font.strikeoutThickness = potm->otmsStrikeoutSize; physDev->font.strikeoutPosition = potm->otmsStrikeoutPosition; if(physDev->font.fontinfo.Download == NULL) { RECT bbox; UINT emsize; if (!get_bbox(dev->hdc, &bbox, &emsize)) { HeapFree(GetProcessHeap(), 0, potm); return FALSE; } if(!is_room_for_font(physDev)) PSDRV_EmptyDownloadList(dev, TRUE); pdl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pdl)); pdl->ps_name = HeapAlloc(GetProcessHeap(), 0, strlen(ps_name)+1); strcpy(pdl->ps_name, ps_name); pdl->next = NULL; if(physDev->pi->ppd->TTRasterizer == RO_Type42) { pdl->typeinfo.Type42 = T42_download_header(dev, ps_name, &bbox, emsize); pdl->type = Type42; } if(pdl->typeinfo.Type42 == NULL) { pdl->typeinfo.Type1 = T1_download_header(dev, ps_name, &bbox, emsize); pdl->type = Type1; } pdl->next = physDev->downloaded_fonts; physDev->downloaded_fonts = pdl; physDev->font.fontinfo.Download = pdl; if(pdl->type == Type42) { char g_name[MAX_G_NAME + 1]; get_glyph_name(dev->hdc, 0, g_name); T42_download_glyph(dev, pdl, 0, g_name); } } PSDRV_WriteSetFont(dev, ps_name, physDev->font.size, physDev->font.escapement); HeapFree(GetProcessHeap(), 0, ps_name); HeapFree(GetProcessHeap(), 0, potm); return TRUE; }