Tek bir font dosyası ile farklı büyüklükte yazı basmak mümkünmüdür?

Başlatan Mucit23, 13 Temmuz 2013, 00:38:26

Mucit23

Arkadaslar Merhaba

Farklı büyüklükte font dosyaları islemcimin hafızasını cok götürüyor. Kullanacağım fontlar hep tek tipte oluyor. Bu is içinde birden fazla font dosyası tanımlayıp işlemcinin hafızasını doldurmak istemiyorum.

Font buyutmeyi amaçlıyorum.  Yazılımda tek bir font dosyasi tanımlayarak (örn: 8x5 boyutunda) ekrana farklı büyüklükteki yazıları basmak ne derece mümkün olur. Bu konuda oneride bulunursanız sevinirim.

serdararikan

Bence buyuk font dosyasini hafizaya gomup bu fonttan pixel bazinda islemlerle daha kucuk fontlar elde edilebilir

t2

8x5 = 40 noktacık var. Bunu işlemci ile yorumlarsak 16x10 şeklinde bir karakter yazılabilir.  kartakter, 4 kat büyümüş olur.

benzer şekilde eni dar yüksekliği fazla olan karakterler elde edilebilir. Bu yorumu yapacak fonksiyon tanımlamanız gerekir.

papsukkal


hasankara

hadi büyülttük diyelim kaliteli görüntü için köşe yumuşatma yapabilir mi bu fonksiyonumuz?

serdararikan


hasankara

biraz kafa yorunca aklıma bir kaç şey geldi ancak işlemciyi biraz yoracak gibi duruyor. diyelim ki 8 bitlik char değişkeninden 5 tanesi ile (yani8x5) bir karakter tanımlıyoruz. bunu önce (satirxsütun)8x10 yapması kolay. her bir değişken değerinden bir tane daha klonlatıp geçici 10 hücreli diziye atarız. sonra düşeyde büyültmek için, her bir sütun için birer tane daha yedek hücre belirleriz. dolu olan hücredeki bilgiyi ilk 4 biti olduğu gibi bırakıp son 4 biti ise yedek hücrenin ilk 4 üne yollarız. daha sonra her hücrede ortak olarak 4.biti 7ve8. bite eşitle, 3. biti 5ve6.bite eşitle, 2. biti 3ve4. bite eşitle, 1. biti de 2. bite eşitle. böylece 16x10 luk büyümüş olur.

köşe yumuşatma konusunda biraz daha yüzeysel bir şeyler söyleyebilirim. yeni bir veri klonlatırken klonlanan veri ile bir önceki veri arasında bir türetme söz konusu olacak. örnek olarak 4. ve 5. sütunu ele alalım. ilk aşamada, 5. sütunu ->10. sütuna, 4. sütunu -> 8. sütuna kopyalamıştık. 9. veriyi oluştururken 8.ve10. arasında bir işlem yaptırmamız gerekli ancak nasıl bir işlem olacağı konusunda net bir fikrim yok. örnek olarak 8."00011111" <-> 10."11111000" => 9."01111100" çıkışını alabilmemiz gerekli.

bu işlemleri daha performanslı yaptırabileceğin algoritmalar edinebilirsin. bu sadece bir ön fikir olabilir.

z

Kafa yormadim ama kullanacagin en buyuk fonttan daha kucuk fontlari olusturmak mumkun gibi. Tersi durumda olusturulacak font kalite kaybina ugrar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

@Mucit23 bu iş statik bir font verisi ile olmaz. Olursada MCU hafızasında saklanmaz. MCU hafızasında sadece sistem fontuna yer vardır. Onun dışındaki tüm fontları ya SD karttan veya benzeri bir hafızadan yükleyeceksin. Ya da vektörel işlemler ile font raster edeceksin ki bu algoritmalarda her MCU' ya uymaz. CCS deki font büyütme tekniği basitçe pixel ekleme ile yapılıyor. Bu tekniğinde kenarları "jagged" yani tırtıklı olur. Eğer yüksek renkli TFT kullanacaksan "supersampling" kullanabilirsin.   Bunun dışında daha gelişmiş algoritmalar da mevcut. Aşağıda bu algoritmaların çıktısına örnek verdim bir incele;

önce

sonra


Başka bir örnek. :)


Diğer bir örnek;


Şu wiki sayfalarına da da bir göz gezdir;
https://en.wikipedia.org/wiki/Image_scaling
https://en.wikipedia.org/wiki/Supersampling
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mucit23

Hocam oncellikle şunu söyleyeyim p10 panellerle uğraşıyorum.  Su an da ekranının boyutu tek bir panel olmakla birlikte 16x32 pixel. Yani pek yuksek çözünürlük yok. Dolayısıyla bu boyutlarda yumuşatma vs gibi algoritmalar pek çalışmaz gibi görünüyor.

Bana okadar fazla çeşitlilik te font dosyası şimdilik lazım degil. Yani aklimdaki en küçük font 8x5 en yüksek ise 24x16   olarak düşünüyorum.  Arada iki boyut daha olsa yeter.

Panelin kullanımı ile ilgili sıkıntım kalmadı. Hazırladığım kütüphane de pixel circle ve line gibi fonksiyonlarım çalışıyor.  Birtek text basma fonksiyonum kaldı.

Text i de pixel pixel ekrana basacağım.

Sizce istedigim boyutlarda sabit font dosyaları mı ekliyeyim yoksa font büyütme uzerinde ugrasayımmı? Çözünürlük düşük bu yuzden soruyorum.

hasankara

font büyültme küçültme köşe yumuşatma gibi fonksiyonları kullanırsanız alandan tasarruf edersiniz ama bu sefer hız olumsuz etkilenecek. diğer türlüsünde yani her font u ekleyim derseniz alan yetersiz gelmeye başlayabilir. sd kart gibi bir çözüm ile aslında hafıza olayını hiç önemsenmeyecek kadar geri planda bırakabilirsiniz. tabi registerden alacağın font bilgisi kadar hızlı erişemeyebilirsin. hangi denetleyici ile uğraşıyorsunuz?

aslında bir kaç font eklemek hafızayı bu denli işgal etmemeli diye düşünüyorum. birde font bilgilerini, ram e mi atıyorsunuz yoksa flash e mi ? mesela stm32f407 ile birlikte 1mb flash ve 192 kb ram e sahip oluyorsunuz. arkadaş için lcd uygulamasında içerisine 8-9 resim atıp slayt yaptırmıştık. olmadı bu şekilde uygulamanızı başka platformlara taşımak sizi, hem zaman konusunda hemde performans konusunda rahatlatabilir.

Mucit23

Yok hocam bu iş benim aklıma yatmadı. Yani şuandaki donanımım bu iş için uygun değil. P10 Panel zaten hız gerektiren bir işlemci istiyor. Şuanda 18F4620 ve 40Mhz de çalışıyorum. En iyisi kaç tane font lazımsa onu hafızaya gömmek. Zaten 64kb hafızam var. Çok çok 4kb fonta gider. 

hasankara

bu arada bilmeyenlerde faydalansın diye bir hatırlatma yapabiliriz; const ön ekiyle sabit verileri flash içerisine atıp değişken gibi okuyabiliriz. örnek olarak
const unsigned char sabit[]={65,0b01000001,0x41,'A'}; 

i=sabit[1];

şeklinde program hafızasına sabit 65 verilerini gömmüş oluruz. program işletilirken "i" değişkenine 65 verisini yükletmiş oluruz.

sabit[1]=65;

diye bir kod yazdığımızda derleyici hata verecektir. çünkü program hafızasına ancak programlama esnasında veri yazabiliyoruz. bu kod ile program yürütülürken veri yüklemek istemiş oluyoruz.

bendeki hex dosyasında 06_07_08_09 uncu adreslere 0x3441 yani ascii olarak 4A verisini derleme esnasında yükletti bu örnek için. burada da program hafızasına, kullanmak üzere veri gömmüş olduğumuzu görüyoruz.

RaMu

Alıntı yapılan: hasankara - 13 Temmuz 2013, 15:45:18

sabit[1]=65;
diye bir kod yazdığımızda derleyici hata verecektir. çünkü program hafızasına ancak programlama esnasında veri yazabiliyoruz. bu kod ile program yürütülürken veri yüklemek istemiş oluyoruz.


Program hafızasına program işletilirkende veri yazılabilir,
tabiki md. destekliyorsa, çoğu md. destekler 16f877 bile destekliyor.
hangi derleyicide nasıl yapılır net bilmiyorum,
ccs c de read-write program memory komutları mevcut,
asm dede md. datasheetini açıp gerekli işlemler görülebilir.

program hafızasına runtime veri yazılabildiğinin en bariz örneği
bootloader lardır.

constant tanımlaması aslında, misal program için kalibrasyon ayarları
tutmak üzere denetleyicinin program hafızasına data kaydetmek
gibi işler için kullanılıyor genelde.

Bilmiyorum bundan mı bahsediyordun ama,
yanlış anlamadıysam durum böyle.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hasankara

bootloaderi gözden kaçırmışım "program hafızasına ancak programlama esnasında veri yazabiliyoruz" biraz genel bir deyim oldu ve ucu bootloader e kadar gidince yanlış bir deyim oldu.

ben verdiğim örnekteki gibi kullanımın olamayacağından bahsetmek istemiştim. dediğiniz gibi
Alıntı Yapprogram hafızasına data kaydetmek gibi işler için kullanılıyor genelde.
amacı ile program hafızasından yararlanabildiğimizi ancak bir değişkene veri yazar gibi, içerisine veri yazamayacağımızı belirtmek istemiştim.

peki bunun üzerine şöyle bir sorum olsa;

sabit[] i nasıl tanımlamalıyız ki, sabit[1]=65; dediğimizde program hafızasındaki bir bölgeye 65 verisini yükletmeliyiz? yükletebilirmiyiz? ya da assamblyde ya da herhangi bir dilde, program yürütülürken program hafızasını bu şekilde kullanabilirmiyiz?

hi-tech in verdiği hata ise şöyle olmakta; "68.12 attempt to modify object qualified const". ancak böyle bir kullanım yapabiliyorsak da öğrenmek isterim açıkçası. altaş yayınlarından ccs pic16f877 kitabını baştan aşağı okumuştum böyle bir şeyle karşılaşmamıştım, ya da bir şekilde gözden kaçırmışım. sizlerinde fikirlerini merakla bekliyor olacağım.