static WinGdiFont SetFont(RequestFont font) { WinGdiFont winFont = WinGdiFontSystem.GetWinGdiFont(font); MyWin32.SelectObject(win32MemDc.DC, winFont.CachedHFont()); return(winFont); }
//============================================== public static void CalculateGlyphAdvancePos(char[] str, int startAt, int len, RequestFont font, int[] glyphXAdvances) { unsafe { if (len == 0) { return; } WinGdiFont winfont = SetFont(font); //ushort* glyhIndics = stackalloc ushort[len]; //fixed (char* s = &str[startAt]) //{ // NativeTextWin32.GetGlyphIndices( // win32MemDc.DC, // s, // len, // glyhIndics, // 0); //} byte[] encoding = s_en.GetBytes(str, startAt, len); NativeTextWin32.FontABC[] abcWidths = winfont.GetInteralABCArray(); for (int i = 0; i < len; ++i) { //ushort glyphIndex = *(glyhIndics + i); int enc_index = encoding[i]; if (enc_index == 0) { break;//? } glyphXAdvances[i] = abcWidths[enc_index].Sum; } } //unsafe //{ // SetFont(font); // NativeTextWin32.GCP_RESULTS gpcResult = new NativeTextWin32.GCP_RESULTS(); // int[] caretpos = new int[len]; // uint[] lpOrder = new uint[len]; // int[] lpDx = new int[len]; // fixed (int* lpdx_h = &lpDx[0]) // fixed (uint* lpOrder_h = &lpOrder[0]) // fixed (int* caretpos_h = &caretpos[0]) // fixed (char* str_h = &str[startAt]) // { // gpcResult.lpCaretPos = caretpos_h; // gpcResult.lpOrder = lpOrder_h; // gpcResult.lpDx = lpdx_h; // //gpcResult. // ////gpcResult.lpCaretPos = // NativeTextWin32.GetCharacterPlacement( // win32MemDc.DC, // str_h, // len, // len, ref gpcResult, 0); // } //} }
public static WinGdiFont GetWinGdiFont(RequestFont f) { if (f == null) { throw new NotSupportedException(); } if (f == latestFont) { return(latestWinFont); } WinGdiFont actualFontInside = WinGdiFont.GetCacheFontAsWinGdiFont(f); if (actualFontInside != null) { return(actualFontInside); } //----- //need to create a new one //get register font or create the new one int key = f.FontKey; WinGdiFont found; if (!registerFonts.TryGetValue(key, out found)) { //create the new one and register //create fontface FontFaceKey fontfaceKey = new FontFaceKey(key); WinGdiFontFace fontface; if (!winGdiFonFaces.TryGetValue(fontfaceKey, out fontface)) { //create new fontface = new WinGdiFontFace(f); winGdiFonFaces.Add(fontfaceKey, fontface); } found = (WinGdiFont)fontface.GetFontAtPointSize(f.SizeInPoints); registerFonts.Add(key, found);//cache here } latestFont = f; found.AssignToRequestFont(f); return(latestWinFont = found); }
/// <summary> /// measure blank line height in px /// </summary> /// <param name="font"></param> /// <returns></returns> public static int MeasureBlankLineHeight(RequestFont font) { WinGdiFont winFont = WinGdiFontSystem.GetWinGdiFont(font); return((int)winFont.RecommendedLineSpacingInPixels); }
public static WinGdiFont GetWinGdiFont(RequestFont f) { if (f == null) { throw new NotSupportedException(); } if (f == latestFont) { return latestWinFont; } WinGdiFont actualFontInside = WinGdiFont.GetCacheFontAsWinGdiFont(f); if (actualFontInside != null) { return actualFontInside; } //----- //need to create a new one //get register font or create the new one FontKey key = f.FontKey; WinGdiFont found; if (!registerFonts.TryGetValue(key, out found)) { //create the new one and register //create fontface FontFaceKey fontfaceKey = new FontFaceKey(key); WinGdiFontFace fontface; if (!winGdiFonFaces.TryGetValue(fontfaceKey, out fontface)) { //create new fontface = new WinGdiFontFace(f.Name, f.Style); winGdiFonFaces.Add(fontfaceKey, fontface); } found = (WinGdiFont)fontface.GetFontAtPointsSize(f.SizeInPoints); registerFonts.Add(key, found);//cache here } latestFont = f; found.AssignToRequestFont(f); return latestWinFont = found; }