예제 #1
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Setups the font features.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        private void SetupFontFeatures()
        {
            if (m_fontName == null || m_fontName == "")
            {
                Enabled = false;
                return;
            }
            IRenderEngine renderer;

            if (FontHasGraphiteTables(m_fontName, false, false))
            {
                renderer = FwGrEngineClass.Create();
            }
            else
            {
                renderer = UniscribeEngineClass.Create();
            }
            renderer.WritingSystemFactory = m_wsf;
            HoldDummyGraphics hdg = new HoldDummyGraphics(m_fontName, false, false, CreateGraphics());

            renderer.InitRenderer(hdg.m_vwGraphics, m_fontFeatures);
            m_featureEngine = renderer as IRenderingFeatures;
            if (m_featureEngine == null)
            {
                Enabled = false;
                hdg.Close();
                return;
            }
            int cfid;

            m_featureEngine.GetFeatureIDs(0, null, out cfid);
            if (cfid == 0)
            {
                Enabled = false;
                hdg.Close();
                return;
            }
            if (cfid == 1)
            {
                // What if it's the dummy built-in graphite feature that we ignore?
                // Get the list of features (only 1).
                using (ArrayPtr idsM = MarshalEx.ArrayToNative(cfid, typeof(int)))
                {
                    m_featureEngine.GetFeatureIDs(cfid, idsM, out cfid);
                    int [] ids = (int[])MarshalEx.NativeToArray(idsM, cfid, typeof(int));
                    if (ids[0] == kGrLangFeature)
                    {
                        Enabled = false;
                        hdg.Close();
                        return;
                    }
                }
            }
            Enabled = true;
            hdg.Close();
        }
예제 #2
0
        private IRenderEngine GetUniscribeEngine(IVwGraphics vg, ILgWritingSystem ws)
        {
            IRenderEngine uniscribeEngine;

            uniscribeEngine = UniscribeEngineClass.Create();
            uniscribeEngine.InitRenderer(vg, null);
            uniscribeEngine.RenderEngineFactory  = this;
            uniscribeEngine.WritingSystemFactory = ws.WritingSystemFactory;

            return(uniscribeEngine);
        }
예제 #3
0
        /// <summary>
        /// Get the engine used to render text with the specified properties. At present only
        /// font, bold, and italic properties are significant.
        /// Font name may be '&lt;default serif&gt;' which produces a renderer suitable for the default
        /// serif font.
        /// </summary>
        /// <param name="vg"></param>
        /// <returns></returns>
        public IRenderEngine get_Renderer(IVwGraphics vg)
        {
            lock (m_syncRoot)
            {
                LgCharRenderProps          chrp     = vg.FontCharProperties;
                string                     fontName = MarshalEx.UShortToString(chrp.szFaceName);
                Tuple <string, bool, bool> key      = Tuple.Create(fontName, chrp.ttvBold == (int)FwTextToggleVal.kttvForceOn,
                                                                   chrp.ttvItalic == (int)FwTextToggleVal.kttvForceOn);
                IRenderEngine renderEngine;
                if (m_renderEngines.TryGetValue(key, out renderEngine))
                {
                    return(renderEngine);
                }
                Tuple <string, bool, bool> key2 = null;
                string realFontName;
                if (TryGetRealFontName(fontName, out realFontName))
                {
                    MarshalEx.StringToUShort(realFontName, chrp.szFaceName);
                    vg.SetupGraphics(ref chrp);
                    key2 = Tuple.Create(realFontName, key.Item2, key.Item3);
                    if (m_renderEngines.TryGetValue(key2, out renderEngine))
                    {
                        m_renderEngines[key] = renderEngine;
                        return(renderEngine);
                    }
                }
                else
                {
                    realFontName = fontName;
                }

                bool graphiteFont = false;
                if (m_isGraphiteEnabled)
                {
                    renderEngine = GraphiteEngineClass.Create();

                    string fontFeatures = null;
                    if (realFontName == DefaultFontName)
                    {
                        fontFeatures = DefaultFontFeatures;
                    }
                    renderEngine.InitRenderer(vg, fontFeatures);
                    // check if the font is a valid Graphite font
                    if (renderEngine.FontIsValid)
                    {
                        SetupRenderEngine(renderEngine);
                        graphiteFont = true;
                    }
                }

                if (!graphiteFont)
                {
                    if (!MiscUtils.IsUnix)
                    {
                        if (m_uniscribeEngine == null)
                        {
                            m_uniscribeEngine = UniscribeEngineClass.Create();
                            m_uniscribeEngine.InitRenderer(vg, null);
                            SetupRenderEngine(m_uniscribeEngine);
                        }
                        renderEngine = m_uniscribeEngine;
                    }
                    else
                    {
                        // default to the UniscribeEngine unless ROMAN environment variable is set.
                        if (Environment.GetEnvironmentVariable("ROMAN") == null)
                        {
                            renderEngine = UniscribeEngineClass.Create();
                        }
                        else
                        {
                            renderEngine = RomRenderEngineClass.Create();
                        }
                        renderEngine.InitRenderer(vg, null);
                        SetupRenderEngine(renderEngine);
                    }
                }

                m_renderEngines[key] = renderEngine;
                if (key2 != null)
                {
                    m_renderEngines[key2] = renderEngine;
                }
                return(renderEngine);
            }
        }
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Setups the font features.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        public void SetupFontFeatures()
        {
            CheckDisposed();

#if __MonoCS__
            // TODO-Linux: Neither Graphite or UniscribeEngine Avaliable
            m_featureEngine = null;
            return;
#else
            if (m_fontName == null || m_fontName == "")
            {
                Enabled          = false;
                m_isGraphiteFont = false;
                return;
            }
            IRenderEngine renderer;
            if (FontHasGraphiteTables(m_fontName, false, false))
            {
                renderer         = FwGrEngineClass.Create();
                m_isGraphiteFont = true;
            }
            else
            {
                renderer         = UniscribeEngineClass.Create();
                m_isGraphiteFont = false;
            }
            renderer.WritingSystemFactory = m_wsf;
            using (HoldDummyGraphics hdg = new HoldDummyGraphics(m_fontName, false, false, this))
            {
                renderer.InitRenderer(hdg.m_vwGraphics, m_fontFeatures);
                m_featureEngine = renderer as IRenderingFeatures;
                if (m_featureEngine == null)
                {
                    Enabled = false;
                    return;
                }
                int cfid;
                m_featureEngine.GetFeatureIDs(0, null, out cfid);
                if (cfid == 0)
                {
                    Enabled = false;
                    return;
                }
                if (cfid == 1)
                {
                    // What if it's the dummy built-in graphite feature that we ignore?
                    // Get the list of features (only 1).
                    using (ArrayPtr idsM = MarshalEx.ArrayToNative <int>(cfid))
                    {
                        m_featureEngine.GetFeatureIDs(cfid, idsM, out cfid);
                        int [] ids = MarshalEx.NativeToArray <int>(idsM, cfid);
                        if (ids[0] == kGrLangFeature)
                        {
                            Enabled = false;
                            return;
                        }
                    }
                }
                Enabled = true;
            }
#endif
        }