/**************************************************************************** * 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; }
/************************************************************************ * PSDRV_EndPage */ INT PSDRV_EndPage( PSDRV_PDEVICE *physDev ) { if(physDev->job.OutOfPage) { FIXME("Already ended a page?\n"); return 1; } if(!PSDRV_WriteEndPage( physDev )) return 0; PSDRV_EmptyDownloadList(physDev, FALSE); physDev->job.OutOfPage = TRUE; return 1; }
/************************************************************************ * PSDRV_EndPage */ INT PSDRV_EndPage( PHYSDEV dev ) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); if(physDev->job.OutOfPage) { FIXME("Already ended a page?\n"); return 1; } if(!PSDRV_WriteEndPage( dev )) return 0; PSDRV_EmptyDownloadList(dev, FALSE); physDev->job.OutOfPage = TRUE; 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; }