LinuxFocus Kasım 1998: Kolay Grafik: Yeni Başlayanlara SVGAlib Yolgöstereni Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Jay Link
Yazar hakkında: Jay Link 20'li yaşlarda ve Springfield, Illinois'de yaşıyor. Linux'dan başka dağcılık ve uçmak ilgisini çekiyor. Kendisi hem çabucak geçen boş zamanlarında InterLink BBS'i (tasarımsız ve kâr amacı gütmeyen Internet sağlayıcısı) yönetiyor hem de kira ödemek için çok çeşitli tuhaf işlerde çalışıyor.

Yazara yazın

Kolay Grafik: Yeni Başlayanlara SVGAlib Yolgöstereni

Çeviri: Ceyhun Elmas

[Ilustration]

Sisteminiz için kullanımı kolay grafik paketleri mi arıyorsunuz? Eğer öyleyse daha fazla kendinizi yormayın. SVGAlib ile grafik uygulamaları oluşturmanın kolay yollarını öğrenebilir ve X Pencere Sistem'inin beğenmediğiniz kesimlerini değiştirebilirsiniz. Eğer C ile programlama konusunda az da olsa bilginiz varsa SVGAlib'i kullanabilirsiniz.


Worst viewed with Internet Explorer (try Netscape 4.5 it is better)

SVGAlib nedir?

SVGAlib, Linux için düşük düzeyde grafik kitaplığıdır ve de grafiklere destek sağlayamadığı bir durumda C programlama dili ile düzeyi artırılabilir.

Ama C ile yazılmış çok grafik programı bulunmaktadır!

Evet, ama onların tümü dış kitaplık bağlı durumdadır. C kendisini size yalnızca yazı olarak verebilir. Çünkü burada tüm grafik fonksiyonları sisteme bağımlıdır ve taşınabilir değildir. Ne yazık ki bir işletim sistemi için kodlanmış grafik yordamlar, yeniden yazılmadıkça başka işletim sistemleri altında çalışmayacaktır. Örneğin başlangıçta DOS ya da Windows için yazılan grafikler Linux altında kullanılamıyor.

Linux altındaki C'de grafik kodlamak için Linux'a özgü dış fonksiyonlar kümesini kullanma zorunluluğu vardır. SVGAlib böyle bir kümedir.

Basit olarak SVGAlib C programları tarafından çağrılan bir ikilitaban (binary) C kitaplığıdır

SVGAlib X Pencere Sistemi'nden nasıl farklıdır?

X Pencere Sistemi (XFree86) gerçekten bir sunucudur .Bu sunucu X'e gereksinim duyan her uygulamadan önce devreye girmiş olmalıdır. Ayrıca, X sunucusu sistemde işler yoğunlaştığında devreye girecek ve sizin sanal konsoldan (Alt 1-6) kullanımınıza engel olacaktır.

Öte yandan SVGAlib böyle bir hazırlık gerektirmez. SVGAlib'i, X Windows'ta yaptığınız gibi "çalıştırmazsınız". Basit olarak, SVGAlib, /lib ve /usr/lib içindeki diğer kitaplıklar gibi, C programları tarafından çağrılan bir ikilitaban (binary) C kitaplığıdır. SVGAlib uygun biçimde yüklendiği takdirde ortalama bir kullanıcı, SVGAlib'in varlığını fark edememelidir. Sonuç olarak SVGAlib, sizin sanal konsollarınızı etkilemeyecek ve de çoklu uygulamalarınızı çalıştırabilmenin özgürlüğünü yaşıyacaksınız. Bir konsolda normal yazı biçimindeki işleminizi yaparken bir diğerinde grafikle ilgili işlemlerinizi yürütebileceksiniz.

Eksiklikleri

X Windows uygulamaları, SVGAlib için olanlardan daha fazla sayıdadır. Çünkü X Window Sistem genel olarak UNIX ortamlarının tüm|ne özgüdür (Birçok UNIX'de koşturulabilir). Oysa, SVGAlib'i yalnızca Linux kullanabilir. Üstelik zayıf yazılan SVGAlib uygulamarı konsolunuzu kilitleyebilir ve bilgisayarınızı yeniden başlatmak durumunda kalabilirsiniz. Sonuç olarak, SVGAlib grafikleri kullanmakta olan iki ekran arasında, birinden diğerine çabucak geçilmemelidir, aksi halde ekran bozunmasıyla karşılaşıp yeniden başlatmak zorunda kalınabilir.

Bununla birlikte, SVGAlib'in bir güvenlik göze alımı (security risk) olduğu söylenir. SVGAlib uygulamaları "setuid root" türünde bir hakka sahip olmalıdır, bu haktan çalıştırmanın hemen ardından vazgeçilir. İlgilenmek için bir gereksinim de yoktur.

Özetleyecek olursam, daha önce sözünü ettiğim sorunlara rağmen SVGAlib'in hızı ve kullanım kolaylığı bir çok durumda SVGAlib'i çekici yapmaktadır. Özellikle ekranınızda çabucak ve kolaylıkla şekiller çizmek istiyorsanız.

Örnekler

SVGAlib'i kullanmak üzere C programınızda ona gönderimde bulunmalısınız. Basitçe, #include <vga.h>. Burada basit bir SVGAlib programı var: Yöreyeçek
#include  <stdio.h>
#include  <vga.h>

int main(void) {
   vga_init();
   vga_setmode(5);
   vga_setcolor(4);
   vga_drawpixel(10,10);

   sleep(5);
   vga_setmode(0);
   exit(0);
}
gradient

Burada ekranınızda yalnızca kırmızı bir görüntü birimi (pixel) boyanacak. 5 saniye sonra konsolunuz yazı kipine (mode) geçecek ve programdan çıkacak.

vga_init() şeklindeki ilk ifademize dikkat edin. Bu root konumundan çıkıp SVGAlib kitaplığını başlatır. İkinci satır, vga_setmode(5), ekranı 320x200x256'ya karşılık gelen 5 kipine ayarlar. Başka bir deyişle bu kip ekranınızın 320 görüntübirimi (pixel) genişliğinin, 200 görüntübirimi uzunluğunun ve 256 renk desteğinin sözkonusu olduğu duruma karşılık gelmektedir. Aynı işlevi vga_setmode(G320x200x256) şeklinde yazarak da yaptırabilirsiniz. Her iki deyim de kabul görecektir. Bir sonraki buyruğumuz, vga_setcolor(4), o andaki rengi kırmızı yapmaya yarar. Burada 0'dan 255'e kadar renk seçimi yapabiliriz. Daha fazla renk varolan diğer buyruklarla sağlanabilir fakat bu örnek için basit renkleri alıyoruz. Sonuç olarak 10, 10 koordinatlı görüntübirimimizi boyamış oluyoruz. Bu, ekranımızın sol tarafından sağına doğru ve aşağıya doğru 11 boşluk verdiğimiz anlamına geliyor. Koordinat takımı 0'dan başladığından, 10'a değil 11'e karşılık geldiğine dikkat edelim. 0, 0 koordinatı sol üst köşeye karşılık geliyor. vga_setmode(0), ekranı yazı kipine geri döndürüyor. vga_setmode(text) deyimi vga_setmode(0) deyimine eşdeğerdir. Bunu programın sonunda yapmak her zaman iyidir. Aksi takdirde, kullanıcılarınızın yaşamnı gügleştirirsiniz.

Bu kodları derlemek için alışılmış gcc derleyicisini kullanın. Bu arada -lvga buyruğuyla SVGAlib'e bağlantı yapmak zorundasınız. Son olarak en iyi düzeyde optimizasyon için -o3 kullanmanızı öneririm. Dolayısıyla buyruğumuz şöyle olacaktır:

gcc -O3 -o sample sample.c -lvga

Daha sonra, root hesabı olmayanlara kullandırtabilmek amacıyla,

chmod u+s
yazılmalıdır.

Çalıştırmak için, yalnızca

sample     <veya ne ad verdiyseniz>
yazılmalıdır

SVGAlib buyruklarının tam bir kümesi SVGAlib elyordam sayfalarında kaynakyazılandırılmıştır (documented). Burada bunları tümüne girmek yerine SVGAlib fonksiyonlarının daha hızlı bir kümesini kullanan ikinci bir örnek program yazacağız:vgagl.

"man vgagl"yazın. vgagl'nin "SVGAlib üzerine kurulmuş paketemicibellek-düzeyli (framebuffer-level) hızlü bir grafik kitaplığı" olduğunu göreceksiniz. Temelde size, tek bir deyimle şekil çizme yeteneği olanlar gibi ileri grafik fonksiyonları verecektir.

Aşağıda vgagl kullanan bir program verilmektedir. O, bazı kurulum programlarınca kullanılan gittikçe kararan mavi ekran görüntülemelidir. Onunla ekranın üst kısmındaki açık maviden ekranın altına doğru kararan mavi şeklinde bir görüntü oluşturulmaktadır. Burada ilk programımızdan farklı olarak görünmeyen bir "sanal" ekranda çizim yapılıyor. Bütün çizgiler çizildiğinde görünen "fiziksel" ekrana resmin bitmiş halinin kopyası düşürülüyor. Bu yöntem, ekrandaki kirpışmaları (screen flicker) yok edecek ve uygulamanızın daha profesyonelce görünmesine neden olacaktır. Sanal ekranın, görüntünün yerleştirileceği yere konulmadanm önce birleştirildiği bir yer, arka sahne, olarak düşünülmesi gerçekten güzel.

Derleme için;

gcc -O3 -o gradient gradient.c -lvgagl -lvga
yazmanızı öneririm.

Burada -lvgal 'nin -lvga'dan önce çağrıldığına dikkat edin. chmod u+s buyruk dizisini anımsadınız mı?

İşte kodlar: Yöreyeçek

#include <stdio.h>  
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>

GraphicsContext *physicalscreen;
GraphicsContext *virtualscreen;

int main(void) {
   int i,  j,  b,  y,  c;

   vga_init();
   vga_setmode(5);
   gl_setcontextvga(5);
   gl_setcontextvgavirtual(5);
   physicalscreen = gl_allocatecontext();
   gl_getcontext(physicalscreen);
   virtualscreen = gl_allocatecontext();
   gl_getcontext(virtualscreen);

   y = 0;
   c = 0;
   gl_setpalettecolor(c, 0, 0, 0);
   c++;
   for (i = 0; i < 64; i++) {
      b = 63 - i;
      gl_setpalettecolor(c, 0, 0, b);
      for (j = 0; j < 3; j++) {
         gl_hline(0, y, 319, c);
         y++;
      }
      c++;
   }
   gl_copyscreen(physicalscreen);

   getchar();
   gl_clearscreen(0);
   vga_setmode(0);
   exit(0);
}
	  

#include <vgagl.h> yazmaya gereksiniminiz olduğuna dikkat edin.

Kodlarımızı başlatmaya aşağıdaki grafik içerik ayarlamalarıyla başlıyoruz:

GraphicsContext *physicalscreen
GraphicsContext *virtualscreen

Daha sonra değişkenlerimizin belirtimini yapıyor ve vga_setmode() ile ekran kipimizi ayarlıyoruz. Daha önce kullandığımız gibi mod 5 (G320x200x256) kullanıyoruz.

Görünen "fiziksel" ekranla görünmeyen "sanal" ekranın her ikisini de başlatmamız gerekir. Daha sonra içerikleri değişkenlerimize yerleştirerek saklıyoruz:

gl_setcontextvga(5)
gl_setcontextvgavirtual(5)
physicalscreen = gl_allocatecontext()
gl_getcontext(physicalscreen)
virtualscreen = gl_allocatecontext()
gl_getcontext(virtualscreen)

Burada sanal ekranla çalışıcağımızı duyuruyoruz:

gl_setcontext(virtualscreen).

gl_setpalettecolor() bize mavinin 64 değişik tonunu verir. Ton başına 3, toplam 192 çizgi çizeceğiz. Kalan 8 çizgi siyah olacak böylelikle de görünmeyecekler.

Bitirdiğimizde sanal ekranımızdan (o andaki ekranımız) fiziksel ekrana gl_copyscreen(physicalscreen) ile kopyalayacağız.

Bu kez kullanıcı resmi ne kadar süre için görünür kılacağına karar verecek. getchar() kullanıcının gireceği değeri bekler. Klavyeden bir tuşa basıldığında (hangisi olduğu önemli değil) gl_clearscreen(0) ile ekranı temizler ve vga_setmode(0) ile yazıya döneriz.

SVGAlib fonksiyonlarının tümünü "man svgalib" ve "man vgagl" yazarak görebilirsiniz. Ondan sonra her bir fonksiyonun kendi elyordam sayfasına geçebilirsiniz. Bu konuyu okuduktan sonra gerçekten kolaylıkla yeni buyrukları programlarınıza ekleyebilirsiniz. Zaten, SVGAlib ile birlikte gelen birçok öğretici program var bulunmaktadır.

Elinizdekinin yetersiz olması durumunda sürümü yenilemek için SVGAlib'in son sürümünü sunsite.unc.edu sanalyöresinde pub/Linux/libs/graphics dizininde veya tsx-11.mit.edu sanalyöresinde pub/linux/sources/libs dizininde bulabilirsiniz. Bu yazıyı yazdığımda varolan sürümü 1.3.0 idi.

Son olarak, Slackware dağıtımı iyi olmakla bilikte, SVGAlib'i yanlış dizine yükleme eğiliminde. Yeni SVGAlib dağıtımını Sunsite veya MIT'den çekip yükleyerek bu durumdan kurtulabilirsiniz.


Yazının dergiye gelen aslı İngilizce'dir.


Bu görsel sanalyörenin bakımını Miguel Angel Sepulveda yapmaktadır.
© Jay Link 1998
LinuxFocus 1998