/// <summary> /// Gets the font associated w /// </summary> /// <returns> /// The font. /// </returns> /// <param name='engine'> /// Engine. /// </param> /// <param name='fontid'> /// Fontid. /// </param> /// <param name='parameters'> /// Parameters. /// </param> public object GetFont(ref int engine, ref string fontid, ref object parameters) { object f = null; int fp = engine; engine = -1; if ((!overrideFontId) && (stackparent != null)) { return(stackparent.GetFont(ref engine, ref fontid, ref parameters)); } //fp = PreferredEngine (Application.platform); try { parameters = GetFontEngineParameters(fp); if (parameters != null) { fontid = GetFontEngineFontIdD(fp); f = TTFTextInternal.TTFTextFontEngine.font_engines [fp].GetFont(parameters, fontid); } } catch { } if (f == null) { Debug.Log(System.String.Format("GetFont : Provider={0} Trying alternate engine..", fp)); for (fp = 0; fp < TTFTextInternal.TTFTextFontEngine.font_engines.Length; fp++) { try { parameters = GetFontEngineParameters(fp); if (parameters != null) { fontid = GetFontEngineFontIdD(fp); f = TTFTextInternal.TTFTextFontEngine.font_engines [fp].GetFont(parameters, fontid); if (f != null) { break; } } } catch { } } } engine = fp; return(f); }
/// <summary> /// Appends some text to the line. /// </summary> /// <param name='s'> /// text to be appended. /// </param> /// <exception cref='System.Exception'> /// Is thrown when the font may not be found, or when we /// are unable to compute the layout info /// </exception> public void AppendText(string s) { if (s.Length == 0) { return; } int l0 = linetext.Length; linetext += s; #if TTFTEXT_LITE if (tm.DemoMode) { #endif SetCharStyle(l0, l0 + s.Length, tm.currentStyleIdx); #if TTFTEXT_LITE } else { SetCharStyle(l0, l0 + s.Length, 0); } #endif // UPDATE THE METRIC INFO object f = null; object parameters = null; ; int fp = 0; float sumadvance = 0; for (int i = 0; i < l0; i++) { sumadvance += charadvances[i]; } string currentfontid = ""; //f = tm.InitTextStyle.GetFont (ref fp, ref currentfontid, ref parameters); //f = tm.CurrentTextStyle.GetFont (ref fp, ref currentfontid, ref parameters); #if !TTFTEXT_LITE f = tm.CurrentTextStyle.GetFont(ref fp, ref currentfontid, ref parameters); #else fp = 0; currentfontid = tm.CurrentTextStyle.FontId; parameters = tm.CurrentTextStyle.GetFontEngineParameters(0); if (parameters == null) { System.Type t = TTFTextInternal.TTFTextFontEngine.font_engines [0].GetType().GetNestedType("Parameters"); tm.CurrentTextStyle.SetFontEngineParameters(0, t.InvokeMember(t.Name, BindingFlags.CreateInstance, null, null, null)); parameters = tm.CurrentTextStyle.GetFontEngineParameters(0); } f = TTFTextInternal.TTFTextFontEngine.font_engines[0].GetFont(parameters, currentfontid); #endif if (f == null) { //throw new System.Exception ("Font not found :" + fp + "/" + tm.InitTextStyle.GetFontEngineFontId (fp)); throw new System.Exception("Font not found :" + fp + "/" + tm.CurrentTextStyle.GetFontEngineFontId(fp)); } for (int i = 0; i < s.Length; i++) { TTFTextStyle cttfstyle = GetCharStyle(l0 + i); if ((cttfstyle != null) && (currentfontid != cttfstyle.GetFontEngineFontIdD(fp))) { TTFTextFontEngine.font_engines [fp].DisposeFont(f); // f = cttfstyle.GetFont (ref fp, ref currentfontid, ref parameters); #if !TTFTEXT_LITE f = cttfstyle.GetFont(ref fp, ref currentfontid, ref parameters); #else fp = 0; currentfontid = cttfstyle.FontId; parameters = cttfstyle.GetFontEngineParameters(0); if (parameters == null) { System.Type t = TTFTextInternal.TTFTextFontEngine.font_engines [0].GetType().GetNestedType("Parameters"); cttfstyle.SetFontEngineParameters(0, t.InvokeMember(t.Name, BindingFlags.CreateInstance, null, null, null)); parameters = tm.CurrentTextStyle.GetFontEngineParameters(0); } f = TTFTextInternal.TTFTextFontEngine.font_engines[0].GetFont(parameters, currentfontid); #endif if (f == null) { //throw new System.Exception ("Font not found :" + fp + "/" + tm.InitTextStyle.GetFontEngineFontId (fp)); throw new System.Exception("Font not found :" + fp + "/" + tm.CurrentTextStyle.GetFontEngineFontId(fp)); } } charadvances [l0 + i] = TTFTextFontEngine.font_engines [fp].GetAdvance(parameters, f, s [i]).x *cttfstyle.Size; charheights [l0 + i] = TTFTextFontEngine.font_engines [fp].GetHeight(parameters, f); charmetadata [l0 + i] = null; if (!TTFTextFontEngine.font_engines[fp].IsBitmapFontProvider(parameters)) { TTFTextOutline o = TTFTextFontEngine.font_engines [fp].GetGlyphOutline(parameters, f, s [i]); o.Rescale(cttfstyle.Size); if (l0 + i == 0) { Xmin0 = o.Min.x; } if (l0 + i == line.Length - 1) { XmaxN = o.Max.x; } } else { //Debug.LogWarning("NYI !"); sumadvance += charadvances [l0 + i]; if (l0 + i == 0) { Xmin0 = 0; } if (l0 + i == line.Length - 1) { XmaxN = sumadvance; } } } TTFTextFontEngine.font_engines [fp].DisposeFont(f); // can happen when the first or last char is non printable, like a space for example if (float.IsNaN(XmaxN) || float.IsInfinity(XmaxN)) { XmaxN = 0; } if (float.IsNaN(Xmin0) || float.IsInfinity(Xmin0)) { Xmin0 = 0; } }