← rfc/
╔══════════════════════════════════════════════════════════════════════════╗
RFC 746 · graphics

SUPDUP Grafik Uzantısı

Yazar
Richard Stallman (MIT-AI)
Kurum
Tarih
17 Mart 1978
Durum
Network Working Group Yorum Talebi
Kanal
graphics/

SUPDUP Grafik Uzantısı

Network Working Group
Request for Comments: 746
Yazar: Richard Stallman (MIT-AI)
Tarih: 17 Mart 1978
NIC: 43976


SUPDUP Grafik Uzantısı

... SUPDUP’u, terminal ekranında yalnızca metnin değil aynı zamanda çizimlerin de görüntülenmesine izin verecek şekilde genişletir. Sürekli olarak, Crispin tarafından RFC 734 "SUPDUP Protocol" içinde açıklanan SUPDUP protokolünün belgelerine atıfta bulunuyoruz.

Bu uzantı hiçbir zaman uygulanmadığından, muhtemelen bazı sorunlar içermektedir. Öneriler istemek ve birinin bunu çalışır hale getirmeyi denemesini teşvik etmek amacıyla yayımlanmaktadır.

Başlıca kazanımlar şunlardır:

Ağ grafikleriyle ilgilenenlerin, temel amacı aynı olan fakat varsayımları oldukça farklı olan Multics Graphics System hakkında okumaları önerilir (her ne kadar bu önerideki bazı özelliklere esin kaynağı olmuş olsa da).


SUPDUP Başlangıç Görüşmesi

Yeni bir isteğe bağlı değişken olan SMARTS değişkeni tanımlanır. Bu değişken, SUPDUP kullanıcı sürecinin SUPDUP sunucu sürecine gönderdiği diğer değişkenleri takip etmelidir. Bu değişkenin sol yarı sözcüğündeki bit ve alanlara %TQ ile başlayan adlar verilir. Sağ yarıdaki bit ve alanlara ise %TR ile başlayan adlar verilir. SMARTS değişkeninin tamamı grafik protokolü ile ilgili değildir, ancak büyük kısmı ilgilidir. Terminal grafik çıktısını destekliyorsa %TQGRF biti 1 olmalıdır.


Grafik Protokolünü Başlatma

Grafik modu, çıktı akışında yer alan bir %TDGRF (sekizlik 231) kodu ile başlatılır. Ardından gelen 0–177 aralığındaki karakterler grafik protokolüne göre yorumlanır. 200 veya daha büyük herhangi bir karakter (bir %TD kodu) grafik modundan çıkar ve ardından normal anlamına göre yorumlanır. Böylece sunucu terminalin grafik modunda olduğunu unutsa bile, terminal uzun süre karışık bir durumda kalmaz.

Grafik moduna girildiğinde, çıktı akışı her biri kendi argümanlarıyla takip edilen bir dizi grafik protokol komutu içermelidir. Komut olarak sıfır kullanılması hiçbir işlem yapmayan bir komuttur. Grafik modundan bilinçli şekilde çıkmak için en iyi yöntem %TDNOP kullanmaktır.


Koordinatlar

Grafik modu, grafik modunda kalındığı sürece bir grafik komutundan diğerine hatırlanan bir imleç konumu kullanır. Grafik modu imleci, normal yazı çıktısında kullanılan imleçle aynı değildir: grafik protokol komutları normal yazı çıktısı imlecini etkilemez ve normal yazı çıktısı da grafik modu imlecini etkilemez.

Ayrıca grafik imlecinin konumu karakterler yerine noktalar (dots) cinsinden ölçülür. Bu iki birim (nokta ve karakter) arasındaki ilişki, terminalin SMARTS değişkenindeki %TQHGT ve %TQWID alanlarında tutulur; bu alanlar bir karakterin kapladığı kutunun nokta cinsinden yüksekliğini ve genişliğini içerir.

Ekranın herhangi bir yöndeki boyutu, karakter kutusunun uzunluğunun ekranda o yönde bulunan karakter sayısıyla çarpılması olarak varsayılır. Eğer ekran gerçekte bundan daha büyükse, fazlalık kısım görünür alanın parçası olabilir veya olmayabilir; program bunun varlığını bilmez.

İmleç konumunun her koordinatı 14 bitlik işaretli bir sayıdır ve sıfır noktası ekranın merkezindedir (ekran boyutu nokta cinsinden çift sayıysa, görünür negatif noktalar iki'nin tümleyeni biçimine uygun olarak pozitiflerden bir birim daha uzağa uzanır). Koordinatların aşırı büyük değerleri ekran dışında kalır ancak yine de anlamlıdır.

Alternatif bir mod da tanımlanmıştır; bazı terminaller bunu destekleyebilir ve bu modda sanal koordinatlar kullanılır. Belirtilen koordinatlar yine 14 bitlik işaretli sayılardır, ancak terminal üzerindeki fiziksel noktalar yerine +4000 sekizlik değeri ekranın üstünü veya sağ kenarını, -4000 sekizlik değeri ise ekranın altını veya sol kenarını temsil eder. Terminal, bu sanal koordinatları ekran noktalarına ölçeklemekten sorumludur.

Tüm terminallerin bu yeteneğe sahip olması gerekmez; SMARTS değişkenindeki %TQVIR biti bu özelliğin var olduğunu gösterir. Sanal koordinatları kullanmak için sunucu bir %GOVIR göndermelidir; tekrar fiziksel koordinatlara dönmek için %GOPHY gönderilmelidir. Terminal her durumda anahtarın durumunu hatırlamaya çalışmak zorunda olsa da, bu komutlar belirli aralıklarla —örneğin grafik moduna girildiğinde— tekrarlanmalıdır. Bu tekrar, bazı çıktılar kaybolduğunda sınırsız bir karışıklığın oluşmasını önler.

Sanal koordinatlar kare temeline dayanır. Terminaldeki görünür alan kare değilse, standart sanal aralık ekranın merkezini çevreleyen bir kareye karşılık gelmeli ve görünür alanın geri kalanı normalde görünür aralığın biraz ötesindeki sanal koordinatlara karşılık gelmelidir.

Grafik protokol komutları iki tür imleç konumu argümanı alır: mutlak ve göreli.

Adres argümanı alan komutların genellikle her adres türü için birer biçimi vardır.

X koordinatı veya kayması Y’den önce gelir. Her iki adres türü de, eğer sonraki adres göreli ise kullanılacak olan çalışır durumdaki imleç konumunu ayarlar.

Nesnelerin bazı kısımlarının ekran dışına çıkması tamamen geçerlidir. Bunun nasıl ele alındığı çok önemli değildir; yeter ki felaket olmasın, imleç konumunun hesaplanmasını bozmasın ve imleç tekrar ekran içine geldiğinde daha sonra çizilecek nesnelerin hatalı çizilmesine neden olmasın.

Ekrandaki belirli bir noktanın mutlak mı yoksa göreli adresle mi belirtildiği önemli değildir. Çizildikleri sıra da önemli değildir. Her nesne diğerlerinden bağımsızdır ve onu oluşturan komutun belirttiği konumda bulunur.

Göreli adresler veri sıkıştırma amacıyla sağlanmıştır; programların mutlak ve göreli adresler arasında dönüşüm yapmasını önlemek için değildir. Ayrıca bir nesne taşındığında veya silindiğinde birkaç nesnenin birlikte yer değiştirmesine neden olmak için de tasarlanmamıştır. Terminallerin, çizildikten sonra nesneler arasındaki herhangi bir ilişkiyi hatırlaması beklenmez.

Grafik moduna girildiğinde imleç konumu son çıkıştan kalan değeri korusa da, kaybolan çıktının etkilerini sınırlamak için uzun bir aktarım başlamadan önce %GOMVA komutuyla yeniden başlatılması akıllıca olacaktır.


Komutlar

Bir nesne çizmeye yönelik komutların her zaman aynı nesneyi silen karşılıkları vardır.

%TOERS biti ayarlı olan herhangi bir terminalin grafik nesnelerini silebildiği varsayılır.

Nesne çizmeye yönelik komutlar 100 ile 137 arasında yer alırken, silmeye yönelik komutlar paralel bir dizide 140 ile 177 arasındadır. Diğer işlemler 100’ün altındaki komut kodlarını kullanır. Komut kodundaki 20 biti, argüman olarak hangi tür adreslerin kullanıldığını gösterir:

Grafik komutlarının adları %GO ile başlar.

Karakter Çıktısı

Grafikler çoğu zaman karakterler kullanır. %GODCH komutunu, sıfır ile sonlandırılan bir karakter dizisi takip eder. Karakterler tek konumlu yazdırma karakterleri olmalıdır.

Çoğu terminalde bu, ASCII grafik karakterleriyle sınırlıdır. TTYOPT değişkeninde %TOSAI ayarlı olan terminaller tüm 0–177 karakterlerine izin verir.

Karakterler mevcut grafik imleç konumunda çıktılanır (ilk karakterin dikdörtgeninin sol alt köşesi oraya yerleştirilir). Karakterler çizildikçe imleç hareket eder.

%GOECH komutu %GODCH ile benzerdir ancak belirtilen karakterleri siler.

Bir bit matrisi terminalinde karakter konumlarından oluşan bir satırı metni tekrar belirtmeden temizlemek için dikdörtgen komutu kullanılabilir.

Örnek

%TDRST      ; Tüm grafik modlarını sıfırla
%TDGRF      ; Grafik moduna gir
%GOCLR      ; Ekranı temizle
%GOMVA xx yy; İmleci ayarla
%GODLA xx yy; Buradan bir çizgi çiz
<< her çizgi için son iki komutu tekrarla >>
%TDNOP      ; Grafik modundan çık

Grafik Girişi

SMARTS değişkeninin sağ yarısındaki %TRGIN biti, terminalin istek üzerine imleç konumu biçiminde grafik girişi sağlayabildiğini gösterir.

Bir %GOGIN komutu göndermek terminalden imleç konumunu okumasını ister. Bu komutun ardından, yanıta eklenecek ve yanıtın istekle ilişkilendirilmesini sağlayacak bir argüman karakter gelmelidir.

Yanıt biçimi:

Top-Y normalde giriş olarak anlamlı olmadığından, %GOGIN yanıtları klavye girişinden güvenilir biçimde ayırt edilebilir.

İstenmeden gönderilen grafik girişleri Top-Y yerine Top-X kullanılarak gönderilmelidir; böylece program bunları ayırt edebilir. Yanıt kodu yerine terminal, giriş aygıtında birden fazla düğme varsa kullanıcı tarafından basılan düğmelerin bir kodlamasını göndermelidir.


Kümeler

Terminaller "nesne kümesi" kavramını tanımlayabilir. En fazla 200 farklı küme bulunabilir ve her biri keyfi sayıda nesne içerebilir.

Herhangi bir anda bir küme seçilmiş durumdadır:

Seçili olmayan bir kümedeki nesneler o kümeye geçmeden silinemez.

Bir küme silinmeden geçici olarak görünmez yapılabilir ve daha sonra anında yeniden görünür hale getirilebilir. Tüm kümeler ayrıca taşınabilir.

Her kümenin merkez olarak tanımlanan bir noktası vardır. Kümedeki tüm nesneler bu merkeze göre hatırlanır. Merkezin taşınması kümedeki tüm nesneleri aynı anda taşır. Bu nedenle bir kümeyi kullanmadan önce program merkezini mutlak bir konuma taşımalıdır.

Bir küme merkezinin taşınması nesnelerin ekran dışına çıkmasına neden olabilir. Bu kabul edilebilir bir durumdur; yeter ki konumları unutulmasın ve hareket tersine çevrildiğinde doğru şekilde geri gelsinler.

Kümeler bit matrisi terminallerinde kolay uygulanamaz, bu nedenle bu terminaller küme işlemlerini yok saymalıdır (belki yanıp sönme ile ilgili sınırlı bir yorum dışında). SMARTS değişkenindeki %TQSET biti, terminalin birden fazla küme uyguladığını gösterir.

Birden fazla küme destekleyen terminallerde %GOCLR komutu:

Aynı durum %TDCLR SUPDUP komutu için de geçerlidir. Bu nedenle ekranı temizleyerek başlayan herhangi bir programın tüm kümelerin durumlarını ayrıca başlatmasına gerek kalmaz.

SUPDUP Grafik Uzantısı

Yanıp Sönme

Bazı terminaller ekrandaki nesneleri yanıp söndürme yeteneğine sahiptir. %GOBNK komutu mevcut kümenin yanıp sönmesini sağlar. Kümedeki tüm nesneler hemen yanıp sönmeye başlar ve yeni nesneler de yanıp söner. %GOVIS veya %GOINV, %GOBNK etkisini iptal ederek kümedeki nesneleri kalıcı olarak görünür ya da görünmez yapar. %TQBNK, terminalin ekranda yanıp sönmeyi desteklediğini gösterir.

Ancak bir sorun vardır: bazı akıllı bit matrisi terminalleri, nesneler çizilmeden önce önceden bildirilmeleri koşuluyla birkaç nesneyi yanıp söner biçimde uygulayabilir. Ancak %GOBNK komutunun keyfi kullanımını destekleyemezler.

Bu sorunun çözümü, %GOBNK kullanımına ilişkin bir kuraldır. Küme işlemleri için basitleştirilmiş tanımlarla birlikte, bu kural yanıp sönmeyi destekleyen herhangi bir terminalde güvenilir şekilde çalışan komutlar vermeyi mümkün kılar.

%TQBNK ayarlı fakat %TQSET ayarlı olmayan bir terminalde %GOBNK, bundan sonra çizilen nesnelerin yanıp söner biçimde çizilmesine neden olacak şekilde tanımlanır. %GOSET bunu iptal eder ve ardından gelen nesneler yanıp sönmeden çizilir. Bu durum %GOSET argümanından bağımsızdır.

Böylece bir programın %TQBNK özelliğine sahip tüm terminallerde —kümeleri gerçekten desteklesin ya da desteklemesin— çalışabilmesinin yolu şudur: yanıp sönen bir resim yazmak için normal kümeniz dışında bir küme seçin (küme 1 uygun olacaktır), %GOBNK komutunu verin, resmi çıktılayın ve tekrar küme 0’ı seçin. Siz küme 0’da çizimler yaparken resim yanıp sönecektir. Daha fazla yanıp sönen nesne çizmek için tekrar küme 1’i seçmeli ve yeniden %GOBNK yapmalısınız. Yalnızca küme 1’i yeniden seçmek yeterli olmayacaktır; çünkü kümeleri gerçekten desteklemeyen terminaller yanıp sönen nesnelerin "küme 1’de" olduğunu ve "küme 0’da" olmadığını hatırlamaz.

Yanıp sönen bir nesnenin silinmesi, yanıp sönmeyi uygulayan herhangi bir terminalde onun kaybolmasına neden olmalıdır. Bit matrisi terminallerinde yanıp sönme MUTLAKA XOR işlemi kullanılarak yapılmalıdır; böylece yanıp sönmeyen arka plan bozulmaz.

Kümeleri desteklemeyen fakat yanıp sönmeyi destekleyen bir terminalde %GOCLS, tüm yanıp sönen nesneleri silmelidir. Böylece tüm yanıp sönen nesneleri silme kuralı şu olur: küme 1’i seç, %GOCLS yap ve tekrar küme 0’ı seç. Bu tüm terminallerde istenen etkiyi sağlar. %GOCLS için yapılan bu tanım küme desteklemeyen terminallerde sorun çıkarmaz; çünkü %GOCLS zaten onlar için başka türlü anlamlı olmayacaktır.

Yanıp sönen nesnelerin yanıp sönmesini durdurup görünür kalmalarını sağlamak, kümeleri destekleyen bir terminalde %GOVIS kullanılarak mümkündür. Ancak genel olarak bunu yapmanın tek yolu, onları silip kalıcı olarak yeniden çizmektir.


Dikdörtgenler ve XOR

Bit matris terminalleri, görüntü listesi terminallerinin kopyalayamayacağı kendi işlemlerine sahiptir. Her şeyden önce XOR kipine sahiptirler; bu kipte çizilen nesneler, üst üste geldiklerinde mevcut nesneleri iptal eder. Bu kipte bir nesneyi çizmek ile onu silmek aynı işlemdir. Tüm %GOD.. komutları, karşılık gelen %GOE.. komutlarıyla AYNI ŞEKİLDE davranır.

XOR kipine %GOXOR ile girilir ve %GOIOR ile çıkılır. Görüntü listesi terminalleri her iki komutu da yok sayacaktır. Bu nedenle program, XOR kipinde bile çizme komutlarını silme komutlarından ayırmaya devam etmelidir. %TQXOR, XOR kipini gerçekleştiren bir terminali gösterir. XOR kipi ayarlandığında, grafik kipinden çıkılıp yeniden girilse bile ayarlı kalır. Ancak çıktı kaybolma ihtimaline karşı zaman zaman yeniden belirtilmesi akıllıca olur.

Bit matris terminalleri ayrıca dolu dikdörtgenler de çizebilir. Böylece %GODRR, %GODRA, %GOERR ve %GOERA komutlarını uygulayabilirler. Bir dikdörtgen, mevcut imleç konumu köşelerden biri kabul edilerek ve karşı köşenin adresi verilerek tanımlanır. Bu, göreli bir adresle ya da mutlak bir adresle yapılabilir. %TQREC biti, terminalin dikdörtgen komutlarını uyguladığını gösterir.

Elbette yeterince gelişmiş bir bit matris terminali, bit matrisiyle birlikte gereksiz görünen görüntü listelerini hatırlayarak ve bir %GOMSR veya %GOVIS yapıldığında matrisi güncellemek için bunları kullanarak bir görüntü listesi terminalinin tüm özelliklerini sağlayabilir. Ancak çoğu bit matris terminalinin bu kadar ileri gitmesi beklenmez.


Birden Fazla Sürecin Birbirine Müdahale Etmeden Tek Bir Terminalde Nasıl Çizim Yapabileceği

Girdi akışı durumu bilgisini, bir komutun içeriğinde bulunanlar dışında herhangi bir komutun davranışını etkileyebilecek her türlü bilgi olarak tanımlarsak, birden fazla sürecin her birinin kendi girdi akışı durum değişkenleri kümesine sahip olması gerekir.

Bu, %GOPSH komutunun sağlanmasıyla gerçekleştirilir. %GOPSH komutu, grafik kipinden çıkıldığında geri yüklenmek üzere bu tür tüm girdi akışı bilgilerini kaydeder. Süreçler kesintiye uğramadan karakter blokları göndermeyi düzenleyebiliyorsa, her bloğa bir %GOPSH ile başlayıp ardından girdi akışı durum bilgilerini istedikleri gibi başlatan komutları verebilirler. Her grafik çıktı bloğu, terminali diğer tüm süreçler için "normal" durumunda bırakan bir %TDNOP ile sonlandırılmalıdır; bu aynı zamanda %GOPSH komutunun yığına eklediği bilgiyi de geri çıkarır.

Girdi akışı durum bilgisi şunlardan oluşur:

Girdi akışı durumunun her birimi, bu bilginin varlığını bilmeyen programlar için bir varsayılan değere sahiptir. Bunun istisnası imleç konumudur; çünkü tüm programlar onun var olduğunu bilmek zorundadır. Bir %TDINI veya %TDRST komutu tüm değişkenleri varsayılan değerlerine ayarlamalıdır.

Mevcut kümenin durumu (görünür olup olmadığı ve merkezinin nerede olduğu) girdi akışı durum bilgisinin bir parçası değildir; çünkü öyle olsaydı bunun ne anlama geldiğini söylemek zor olurdu. Ayrıca mevcut küme numarası girdi akışı durum bilgisinin bir parçasıdır, bu nedenle farklı süreçler farklı kümeleri kullanabilir. Kümelerin süreçlere tahsisi sunucu ana bilgisayarın kendi işidir.


Ekranın Yalnızca Bir Bölümünü Kullanma

Bazen ekranın bir bölümünü resim, bir bölümünü de metin için kullanmak istenir. Bu durumda metni silmeden resmi temizlemek istenebilir. Görüntü listesi terminallerinde %GOCLR bunu yapmalıdır.

Ancak bit matris terminallerinde %GOCLR, hangi bitlerin grafikler tarafından, hangilerinin metin gösterimi tarafından ayarlandığını ayırt edemez. Bu nedenle %GOLMT komutu sağlanmıştır. Bu komut iki imleç konumunu argüman olarak alır ve bir dikdörtgen belirtir. Grafiklerin bu dikdörtgenle sınırlı olacağını bildirir; böylece %GOCLR ekranın yalnızca o bölümünü temizlemelidir.

Grafik çıktısını metin çıktısından ayrı olarak hatırlayabilen ve ilkini seçici biçimde temizleyebilen bir terminalde %GOLMT komutunun bir şey yapması gerekmez; yine de bu tür terminallerde bile işlenmesi arzu edilen bir özellik olurdu.

%GOLMT, ekranı kendi aralarında paylaşan birkaç süreçten birinin bit matris terminalinde yalnızca kendi çizdiği resmi temizleyebilmesini sağlamak için kullanılabilir. Hem %GOLMT hem de farklı kümeler kullanılarak neredeyse her terminalle başarılı biçimde çalışmak mümkündür; çünkü bit matris terminalleri %GOLMT komutunu uygular ve görüntü listesi terminalleri neredeyse her zaman kümeleri uygular.

%TDCLR komutu, %GOLMT komutunu yok sayarak grafik çıktısı dahil tüm ekranı temizlemelidir.


Hatalar

Genel olarak grafik komutlarındaki hatalar yok sayılmalıdır.

Çıktı ve girdi akışları özellikle düzenlenmedikçe senkronize olmadığından, bir hatayı onu üreten programın tam olarak hangi komutun geçersiz olduğunu belirleyebileceği kadar iyi raporlamanın basit bir yolu yoktur. Bu yüzden denememek daha iyidir.

Herhangi bir tek komutun hatası olmayan, örneğin görüntü listeleri için belleğin tükenmesi gibi hatalar da mümkün olduğunca yok sayılmalıdır. Bu, izlenemeyen komutların tamamen görmezden gelinmesi anlamına GELMEZ; mümkün olduğu ölçüde uygulanmaları anlamına gelir: imlecin taşınması, kümelerin seçilmesi vb. komutlarda belirtildiği gibi yapılmalı, böylece yürütülebilecek sonraki komutlar amaçlandığı gibi yürütülür.


Genişletmeler

Bu protokol, bir resim çizme aygıtının sahip olabileceği düşünülebilecek her özelliği ele alan komutları tanımlamaya çalışmaz. Ek özellikler, ihtiyaç duyulana ve doğru şekilde nasıl yapılacağı iyi anlaşılana kadar bekletilmelidir.


Grafik Komutlarının Dosyalarda Saklanması

Bu kesinlikle yapılabilir. Grafik komutları yalnızca ASCII 0–177 karakterlerinden oluştuğundan, ASCII metin tutabilen herhangi bir dosya bir resmi çizmek için gerekli komutları da tutabilir.

Ancak bu düşündüğünüzden daha az kullanışlıdır. Bir resmi herhangi bir gevşek anlamda düzenleyen bir programın, gösterilen nesneler arasındaki ilişkileri belirleyen ve program komutlarının yorumlanmasını kontrol eden kendi iç verileri olacaktır. Bu verilerin tamamı, resmi görüntülemek için kullanılan SUPDUP grafik komutlarında kaybolacaktır.

Bu nedenle böyle her programın, programın iç veri yapısına uygun biçimde resimleri dosyalarda saklamak için kendi biçimine sahip olması gerekir. Bir dosyaya gerçek grafik komutlarının dahil edilmesi yalnızca dosyanın tek amacının görüntülenmek olduğu durumlarda yararlı olacaktır.


Komut Kodlaması

Not: Bu komutların değerleri 8 bitlik sekizlik (oktal) baytlar olarak gösterilir. Komutların argümanları küçük harfle ve köşeli ayraç içinde verilmiştir.

Çizim Komutları

Silme Komutları

Çeşitli Komutlar


SMARTS Değişkeninde Grafiklerle İlgili Bitler

Not: Bu bitlerin değerleri, PDP-10 geleneğine uygun olarak sol ve sağ 18 bitlik yarım sözcük iki virgülle ayrılmış şekilde gösterilen sekizlik 36 bitlik sözcükler olarak verilmiştir.