//-------------------------------------------------------------------- static ScriptLang _(string fullname, string shortname) { // if (s_registeredScriptTags.ContainsKey(shortname)) { if (shortname == "kana") { //*** //Hiragana and Katakana //both have same short name "kana" return(new ScriptLang(fullname, shortname, s_registerNames[shortname])); } else { //errors throw new System.NotSupportedException(); } } else { int internalName = s_registerNames.Count; s_registerNames[shortname] = internalName; var scriptLang = new ScriptLang(fullname, shortname, internalName); s_registeredScriptTags.Add(shortname, scriptLang); return(scriptLang); } }
static void CollectScriptTable(ScriptList scList, Dictionary <string, ScriptLang> output) { if (scList == null) { return; } // foreach (var kv in scList) { ScriptTable scTable = kv.Value; //default and others { ScriptTable.LangSysTable langSys = scTable.defaultLang; ScriptLang sclang = new ScriptLang(scTable.ScriptTagName, langSys.LangSysTagIdenString); string key = sclang.ToString(); if (!output.ContainsKey(key)) { output.Add(key, sclang); } } // if (scTable.langSysTables != null && scTable.langSysTables.Length > 0) { foreach (ScriptTable.LangSysTable langSys in scTable.langSysTables) { var pair = new ScriptLang(scTable.ScriptTagName, langSys.LangSysTagIdenString); string key = pair.ToString(); if (!output.ContainsKey(key)) { output.Add(key, pair); } } } } }
static bool TryGetScriptLangFromCurrentThreadCultureInfo(out Typography.OpenFont.ScriptLang scLang) { var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture; if (Typography.TextBreak.IcuData.TryGetFullLanguageNameFromLangCode( currentCulture.TwoLetterISOLanguageName, currentCulture.ThreeLetterISOLanguageName, out string langFullName)) { Typography.OpenFont.ScriptLangInfo scLang1 = Typography.OpenFont.ScriptLangs.GetRegisteredScriptLangFromLanguageName(langFullName); if (scLang1 == null) { //not found -> use default latin //use default lang #if DEBUG System.Diagnostics.Debug.WriteLine(langFullName + " :use latin"); #endif scLang = s_latin; return(true); } else { scLang = new ScriptLang(scLang1.shortname);// scLang1.GetScriptLang(); return(true); } } else { scLang = default; } return(false); }
static ScriptLang _(string fullname, string shortname, params UnicodeLangBits[] langBits) { if (s_registeredScriptTags.ContainsKey(shortname)) { if (shortname == "kana") { //*** //Hiragana and Katakana //both have same short name "kana" return(new ScriptLang(fullname, shortname, s_registerNames[shortname])); } else { //errors throw new System.NotSupportedException(); } } else { int internalName = s_registerNames.Count; s_registerNames[shortname] = internalName; var scriptLang = new ScriptLang(fullname, shortname, internalName); s_registeredScriptTags.Add(shortname, scriptLang); // s_registerScriptFromFullNames[fullname] = scriptLang; //also register unicode langs with the script lang for (int i = langBits.Length - 1; i >= 0; --i) { UnicodeRangeInfo unicodeRange = langBits[i].ToUnicodeRangeInfo(); if (!s_unicodeLangToScriptLang.ContainsKey(unicodeRange.StartAt)) { s_unicodeLangToScriptLang.Add(unicodeRange.StartAt, new UnicodeRangeMapWithScriptLang(langBits[i], scriptLang)); } else { } } if (langBits.Length > 0) { s_registeredScriptTagsToUnicodeLangBits.Add(shortname, langBits); } return(scriptLang); } }
public VxsTextPrinter(CanvasPainter canvasPainter) { this.canvasPainter = canvasPainter; RequestFont font = canvasPainter.CurrentFont; Typography.OpenFont.ScriptLang scLang = Typography.OpenFont.ScriptLangs.GetRegisteredScriptLang(font.ScriptCode.shortname); #if DEBUG if (scLang == null) { throw new NotSupportedException("unknown script lang"); } #endif vxsTextPrinter.ScriptLang = scLang; //1. resolve actual font file vxsTextPrinter.FontFile = "d:\\WImageTest\\tahoma.ttf"; }
public OpenFontTextService(Typography.OpenFont.ScriptLang scLang = null) { _system_id = PixelFarm.Drawing.Internal.RequestFontCacheAccess.GetNewCacheSystemId(); //set up typography text service _txtServices = new TextServices(); //default, user can set this later _txtServices.InstalledFontCollection = InstalledTypefaceCollection.GetSharedTypefaceCollection(collection => { collection.SetFontNameDuplicatedHandler((f0, f1) => FontNameDuplicatedDecision.Skip); collection.LoadSystemFonts(); //load system fonts }); //create typography service //you can implement this service on your own //just see the code inside the service //script lang has a potentail effect on how the layout engine instance work. // //so try to set default script lang to the layout engine instance //from current system default value... //user can set this to other choices... //eg. directly specific the script lang //set script-lang if (scLang == null) { //use default scLang = DefaultScriptLang; } // if not default then try guess if (scLang == null && !TryGetScriptLangFromCurrentThreadCultureInfo(out scLang)) { //TODO: handle error here } _txtServices.SetDefaultScriptLang(scLang); _txtServices.CurrentScriptLang = scLang; // ... or specific the scriptlang manully, eg. ... //_shapingServices.SetDefaultScriptLang(scLang); //_shapingServices.SetCurrentScriptLang(scLang); //--------------- }
static bool TrySettingScriptLangFromCurrentThreadCultureInfo(TextServices textservice) { //accessory... var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture; Typography.OpenFont.ScriptLang scLang = null; string langFullName; if (Typography.TextBreak.IcuData.TryGetFullLanguageNameFromLangCode( currentCulture.TwoLetterISOLanguageName, currentCulture.ThreeLetterISOLanguageName, out langFullName)) { scLang = Typography.OpenFont.ScriptLangs.GetRegisteredScriptLangFromLanguageName(langFullName); textservice.SetDefaultScriptLang(scLang); textservice.CurrentScriptLang = scLang; return(true); } return(false); }
public bool TrySettingScriptLangFromCurrentThreadCultureInfo() { //accessory... var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture; Typography.OpenFont.ScriptLang scLang = null; string langFullName; if (IcuData.TryGetFullLanguageNameFromLangCode( currentCulture.TwoLetterISOLanguageName, currentCulture.ThreeLetterISOLanguageName, out langFullName)) { scLang = Typography.OpenFont.ScriptLangs.GetRegisteredScriptLangFromLanguageName(langFullName); SetDefaultScriptLang(scLang); CurrentScriptLang = scLang; return(true); } throw new System.NotSupportedException(); return(false); }
public static bool TryGetScriptLang(char c, out ScriptLang scLang) { foreach (var kp in s_unicodeLangToScriptLang) { if (kp.Key > c) { scLang = null; return(false); } else { if (kp.Value.IsInRange(c)) { //found scLang = kp.Value.scLang; return(true); } } } scLang = null; return(false); }
//-------------------------------------------------------------------- static ScriptLang _(string fullname, string shortname) { var scriptLang = new ScriptLang(fullname, shortname); // if (registeredScriptTags.ContainsKey(shortname)) { if (shortname == "kana") { //*** //Hiragana and Katakana //both have same short name "kana" } else { //errors } } else { registeredScriptTags.Add(shortname, scriptLang); } return(scriptLang); }
public UnicodeRangeMapWithScriptLang(UnicodeLangBits unicodeRangeBits, ScriptLang scLang) { this.scLang = scLang; this.unicodeRangeBits = unicodeRangeBits; }
public void SetInfo(Typography.OpenFont.ScriptLang scriptLang, UnicodeLangBits langBits) { _scriptLang = scriptLang; _langBits = langBits; this.label1.Text = _scriptLang.fullname + "," + _scriptLang.shortname + "," + langBits.ToString(); }
public static void CollectAllAssociateGlyphIndex(this Typeface typeface, List <ushort> outputGlyphIndexList, ScriptLang scLang, UnicodeLangBits[] selectedRangs = null) { //----------- //general glyph index in the unicode range //if user dose not specific the unicode lanf bit ranges //the we try to select it ourself. if (ScriptLangs.TryGetUnicodeLangBitsArray(scLang.GetScriptTagString(), out UnicodeLangBits[] unicodeLangBitsRanges))
public Form1() { InitializeComponent(); _devGdiTextPrinter = new DevGdiTextPrinter(); this.sampleTextBox1.Visible = false; _openFontStore = new OpenFontStore(); //default //set script lang, //test with Thai for 'complex script' _current_script = Typography.OpenFont.ScriptLangs.Latin; _devGdiTextPrinter.ScriptLang = _current_script; _devGdiTextPrinter.PositionTechnique = PositionTechnique.OpenFont; this.Load += new EventHandler(Form1_Load); this.txtGridSize.KeyDown += TxtGridSize_KeyDown; //---------- txtInputChar.TextChanged += (s, e) => UpdateRenderOutput(); //---------- cmbRenderChoices.Items.Add(RenderChoice.RenderWithTextPrinterAndMiniAgg); cmbRenderChoices.Items.Add(RenderChoice.RenderWithMiniAgg_SingleGlyph); cmbRenderChoices.Items.Add(RenderChoice.RenderWithGdiPlusPath); cmbRenderChoices.Items.Add(RenderChoice.RenderWithMsdfGen); cmbRenderChoices.SelectedIndex = 0; cmbRenderChoices.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //---------- cmbPositionTech.Items.Add(PositionTechnique.OpenFont); cmbPositionTech.Items.Add(PositionTechnique.Kerning); cmbPositionTech.Items.Add(PositionTechnique.None); cmbPositionTech.SelectedIndex = 0; cmbPositionTech.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //---------- lstHintList.Items.Add(HintTechnique.None); lstHintList.Items.Add(HintTechnique.TrueTypeInstruction); lstHintList.Items.Add(HintTechnique.TrueTypeInstruction_VerticalOnly); lstHintList.Items.Add(HintTechnique.CustomAutoFit); lstHintList.SelectedIndex = 0; lstHintList.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //edge offset lstEdgeOffset.Items.Add(0f); lstEdgeOffset.Items.Add(-10f); lstEdgeOffset.Items.Add(-8f); lstEdgeOffset.Items.Add(-6f); lstEdgeOffset.Items.Add(-4f); lstEdgeOffset.Items.Add(4f); lstEdgeOffset.Items.Add(6f); lstEdgeOffset.Items.Add(8f); lstEdgeOffset.Items.Add(10f); lstEdgeOffset.SelectedIndex = 0; lstEdgeOffset.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //share text printer to our sample textbox //but you can create another text printer that specific to text textbox control Graphics gx = this.sampleTextBox1.CreateGraphics(); _controllerForGdi.BindHostGraphics(gx); _controllerForGdi.TextPrinter = _devGdiTextPrinter; //---------- _controllerForPixelFarm.BindHostGraphics(gx); _controllerForPixelFarm.TextPrinter = _devVxsTextPrinter; //---------- this.sampleTextBox1.SetController(_controllerForPixelFarm); button1.Click += (s, e) => UpdateRenderOutput(); chkShowGrid.CheckedChanged += (s, e) => UpdateRenderOutput(); chkShowTess.CheckedChanged += (s, e) => UpdateRenderOutput(); chkXGridFitting.CheckedChanged += (s, e) => UpdateRenderOutput(); chkYGridFitting.CheckedChanged += (s, e) => UpdateRenderOutput(); chkFillBackground.CheckedChanged += (s, e) => UpdateRenderOutput(); chkLcdTechnique.CheckedChanged += (s, e) => UpdateRenderOutput(); chkGsubEnableLigature.CheckedChanged += (s, e) => UpdateRenderOutput(); //---------- chkShowTess.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawCentroidBone.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawGlyphBone.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDynamicOutline.CheckedChanged += (s, e) => UpdateRenderOutput(); chkSetPrinterLayoutForLcdSubPix.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawTriangles.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawRegenerateOutline.CheckedChanged += (s, e) => UpdateRenderOutput(); chkBorder.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawLineHubConn.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawPerpendicularLine.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawGlyphPoint.CheckedChanged += (s, e) => UpdateRenderOutput(); chkTestGridFit.CheckedChanged += (s, e) => UpdateRenderOutput(); chkUseHorizontalFitAlign.CheckedChanged += (s, e) => UpdateRenderOutput(); chkWriteFitOutputToConsole.CheckedChanged += (s, e) => UpdateRenderOutput(); //---------- //1. create font collection installedFontCollection = new InstalledFontCollection(); //2. set some essential handler installedFontCollection.SetFontNameDuplicatedHandler((f1, f2) => FontNameDuplicatedDecision.Skip); foreach (string file in Directory.GetFiles(Path.Combine("..", "..", "..", "TestFonts"), "*.ttf")) { //eg. this is our custom font folder installedFontCollection.AddFont(new FontFileStreamProvider(file)); } //3. //installedFontCollection.LoadSystemFonts(); //---------- //show result InstalledFont selectedFF = null; int selected_index = 0; int ffcount = 0; bool found = false; string defaultFont = "Tahoma"; //string defaultFont = "Alef"; //test hebrew //string defaultFont = "Century"; foreach (InstalledFont ff in installedFontCollection.GetInstalledFontIter()) { if (!found && ff.FontName == defaultFont) { selectedFF = ff; selected_index = ffcount; _selectedInstallFont = ff; found = true; } lstFontList.Items.Add(ff); ffcount++; } //set default font for current text printer // _typefaceStore = new TypefaceStore(); _typefaceStore.FontCollection = installedFontCollection; if (selected_index < 0) { selected_index = 0; } lstFontList.SelectedIndex = selected_index; lstFontList.SelectedIndexChanged += (s, e) => { InstalledFont ff = lstFontList.SelectedItem as InstalledFont; if (ff != null) { _selectedInstallFont = ff; selectedTextPrinter.Typeface = _typefaceStore.GetTypeface(ff); //sample text box UpdateRenderOutput(); } }; //---------- lstFontSizes.Items.AddRange( new object[] { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72, 240, 280, 300, 360, 400, 420, 460, 620, 720, 860, 920, 1024 }); lstFontSizes.SelectedIndexChanged += (s, e) => { //new font size _fontSizeInPts = (int)lstFontSizes.SelectedItem; UpdateRenderOutput(); }; //---------------- //string inputstr = "ก้า"; //string inputstr = "น้ำน้ำ"; //string inputstr = "example"; //string inputstr = "lllll"; //string inputstr = "e"; //string inputstr = "T"; //string inputstr = "u"; //string inputstr = "t"; //string inputstr = "2"; //string inputstr = "3"; //string inputstr = "o"; //string inputstr = "l"; //string inputstr = "k"; //string inputstr = "8"; //string inputstr = "#"; //string inputstr = "a"; //string inputstr = "e"; //string inputstr = "l"; //string inputstr = "t"; //string inputstr = "i"; string inputstr = "ma"; //string inputstr = "po"; //string inputstr = "Å"; //string inputstr = "fi"; //string inputstr = "ก่นกิ่น"; //string inputstr = "ญญู"; //string inputstr = "ป่า"; //for gpos test //string inputstr = "快速上手"; //string inputstr = "啊"; //---------------- this.txtInputChar.Text = inputstr; this.chkFillBackground.Checked = true; _readyToRender = true; }