Home  Contents

Pango

فى هذه الجزئية سنتحدث عن Pango

Pango is a free and open source computing library for rendering internationalized texts in high quality. Different font backends can be used, allowing cross-platform support. (wikipedia)

Pango provides advanced font and text handling that is used for Gdk and Gtk.

Simple example

فى المثال التالى نعرض كيفية تغيير الخط الخاص بال label

center.cs
 
using Gtk;
using System;
 
class SharpApp : Window {
 
    private Label label;

    public SharpApp() : base("Pango")
    {
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        string text = @"Excess of joy is harder to bear than any amount of sorrow.
The more one judges, the less one loves.
There is no such thing as a great talent without great will power. ";
       
        label = new Label(text);

        Pango.FontDescription fontdesc = Pango.FontDescription.FromString("Purisa 10");
        label.ModifyFont(fontdesc);

        Fixed fix = new Fixed();

        fix.Put(label, 5, 5);
        Add(fix);
        ShowAll();
    }


    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

فى الكود بالأعلى، لدينا label به 3 اقتباسات.. ونريد تغيير الخط الى Pursia 10

 string text = @"Excess of joy is harder to bear than any amount of sorrow.
...

النص الظاهر على ال label

 Pango.FontDescription fontdesc = Pango.FontDescription.FromString("Purisa 10");

الصف FontDescription يستخدم لتحديد سمات الخط المطلوب، والطرية FromString تنشئ لنا كائنا -خط- من تمثيل نصى -كتابة السمات بصورة نصية-



 label.ModifyFont(fontdesc);

نقوم بتغيير الخط
Quotations

Figure: Quotations



System fonts

فى المثال التالى سنعرض كافة خطوط النظام فى شجرة

systemfonts.cs
 
using System;
using Pango;
using Gtk;


public class SharpApp : Window
{
    ListStore store;
    FontFamily[] fam;

    public SharpApp() : base("System fonts")
    {
        BorderWidth = 8;

        SetDefaultSize(350, 250);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };


        ScrolledWindow sw = new ScrolledWindow();
        sw.ShadowType = ShadowType.EtchedIn;
        sw.SetPolicy(PolicyType.Automatic, PolicyType.Automatic);

        Context context = this.CreatePangoContext();
        fam = context.Families;

        store = CreateModel();

        TreeView treeView = new TreeView(store);
        treeView.RulesHint = true;
        sw.Add(treeView);

        CreateColumn(treeView);

        Add(sw);
        ShowAll();
    }

    void CreateColumn(TreeView treeView)
    {
        CellRendererText rendererText = new CellRendererText();
        TreeViewColumn column = new TreeViewColumn("FontName",
            rendererText, "text", Column.FontName);
        column.SortColumnId = (int) Column.FontName;
        treeView.AppendColumn(column);
    }


    ListStore CreateModel()
    {
        ListStore store = new ListStore( typeof(string) );

        foreach (FontFamily ff in fam) {
            store.AppendValues(ff.Name);
        }

        return store;
    }

    enum Column
    {
        FontName
    }

  
    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

هذا المثال يعرض كل الخطوط المتاحة

 Context context = this.CreatePangoContext();

هذا الكود ينشئ متغير سياق Context، يشمل المعلومات العامة حول عملية ال rendering



 fam = context.Families;

من متغير السياق نحصل على كل عائلات الخطوط المتاحة

 foreach (FontFamily ff in fam) {
     store.AppendValues(ff.Name);
 }

نحصل على اسماء كل عائلة -تمثل فى كائن من الصف FontFamily- ونخزنها فى مخزن البيانات


System fonts

Figure: System fonts



Unicode

Pango معتادة للعمل مع ال unicode

icon.cs
 
using Gtk;
using System;
 
class SharpApp : Window {


    public SharpApp() : base("Unicode")
    {
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        string text = @"Фёдор Михайлович Достоевский родился 30 октября (11 ноября)
1821 года в Москве.Был вторым из 7 детей. Отец, Михаил Андреевич, работал в 
госпитале для бедных. Мать, Мария Фёдоровна (в девичестве Нечаева),
происходила из купеческого рода.";
       
        Label label = new Label(text);

        Pango.FontDescription fontdesc = Pango.FontDescription.FromString("Purisa 10");
        label.ModifyFont(fontdesc);

        Fixed fix = new Fixed();

        fix.Put(label, 5, 5);
        Add(fix);
        ShowAll();
    }


    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

نعرض بعض النص المكتوب ب azbuka

 string text = @"Фёдор Михайлович Достоевский родился 30 октября ...

نستطيع استخدامه مباشرة

 Label label = new Label(text);

عادة نستخدمه فى ال label


Unicode

Figure: Unicode



Coloured text

فى المثال الأخير.. سنستكشف Pango اكثر.. سنرسم نص ملون وفى المنتصف لمساحة رسم DrawingArea



pango.cs

using System;
using Gtk;
using Pango;


public class SharpApp : Window
{

    public SharpApp () : base ("Australia")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };

        Gdk.Color white = new Gdk.Color(255, 255, 255);

        DrawingArea drawingArea = new DrawingArea();
        drawingArea.ModifyBg(StateType.Normal, white);
        drawingArea.ExposeEvent += OnExposeEvent;

        Add(drawingArea);

        ShowAll();
    }

    void OnExposeEvent (object sender, ExposeEventArgs a)
    {
        DrawingArea drawingArea = sender as DrawingArea;

        int width = drawingArea.Allocation.Width;

        Gdk.PangoRenderer renderer = Gdk.PangoRenderer.GetDefault(drawingArea.Screen);
        renderer.Drawable = drawingArea.GdkWindow;
        renderer.Gc = drawingArea.Style.BlackGC;
        
        Context context = drawingArea.CreatePangoContext();
        Pango.Layout layout = new Pango.Layout(context);
        
        layout.Width = Pango.Units.FromPixels(width);
        layout.SetText("Australia");
        
        FontDescription desc = FontDescription.FromString("Serif Bold 20");
        layout.FontDescription = desc;

        renderer.SetOverrideColor(RenderPart.Foreground, new Gdk.Color(200, 30, 30));
        layout.Alignment = Pango.Alignment.Center;
        renderer.DrawLayout(layout, 0, 0);
        
        renderer.SetOverrideColor(RenderPart.Foreground, Gdk.Color.Zero);
        renderer.Drawable = null;
        renderer.Gc = null;
    }
    
    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

نرسم كلمة Australia افقيا وفى المنتصف وباللون الأحمر الغامق.

 Gdk.PangoRenderer renderer = Gdk.PangoRenderer.GetDefault(drawingArea.Screen);
 renderer.Drawable = drawingArea.GdkWindow;
 renderer.Gc = drawingArea.Style.BlackGC;

نستدعى ال renderer الإفتراضى للشاشة ونجهزه للرسم

 Context context = drawingArea.CreatePangoContext();
 Pango.Layout layout = new Pango.Layout(context);

ننشئ مخطط من Pango.Layout ، وهو دريفر عالى المستوى لوضع قطع من النصوص

 layout.Width = Pango.Units.FromPixels(width);

نحدد عرض المخططات

layout.SetText("Australia");

نحدد النص

 FontDescription desc = FontDescription.FromString("Serif Bold 20");
 layout.FontDescription = desc;

نحدد الخط للمخطط

 renderer.SetOverrideColor(RenderPart.Foreground, new Gdk.Color(200, 30, 30));
 layout.Alignment = Pango.Alignment.Center;

نحدد اللون والإزاحة

 renderer.DrawLayout(layout, 0, 0);

نرسم المخطط

 renderer.SetOverrideColor(RenderPart.Foreground, Gdk.Color.Zero);
 renderer.Drawable = null;
 renderer.Gc = null;

نقوم بتنظيف الموارد


Australia

Figure: Australia



فى هذه الجزئية تعاملنا مع مكتبة Pango



Home ‡ Contents ‡ Top of Page