Example #1
0
        //--------------------------------------------------------------------

        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);
            }
        }
Example #2
0
 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);
                 }
             }
         }
     }
 }
Example #3
0
        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);
            }
        }
Example #5
0
        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";
        }
Example #6
0
        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);
            //---------------
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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);
        }
Example #10
0
        //--------------------------------------------------------------------

        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);
        }
Example #11
0
 public UnicodeRangeMapWithScriptLang(UnicodeLangBits unicodeRangeBits, ScriptLang scLang)
 {
     this.scLang           = scLang;
     this.unicodeRangeBits = unicodeRangeBits;
 }
Example #12
0
 public void SetInfo(Typography.OpenFont.ScriptLang scriptLang, UnicodeLangBits langBits)
 {
     _scriptLang      = scriptLang;
     _langBits        = langBits;
     this.label1.Text = _scriptLang.fullname + "," + _scriptLang.shortname + "," + langBits.ToString();
 }
Example #13
0
        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))
Example #14
0
        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;
        }