Network Working Group J. Michener Request for Comments: 493 MAC NIC: 15358 I. Cotton References: 282, 258 MITRE Obsoletes: 292 K. Kelley U. of Ill. D. Liddle Owens Ill. E. Meyer MAC
GRAFİK PROTOKOLÜ
Giriş
Bu belge, Kasım 1971’in sonlarında Stanford Artificial Intelligence Laboratory’de yapılan ikinci Network Graphics Group toplantısında ifade edilen görüşleri ve alınan kararları yansıtmaktadır. ARPA ağı içinde grafik verilerinin iletilmesi için önerilen bir Network Standard Graphics Protocol’ün bir bölümünü açıklamaktadır. Bu belgede kapsanan protokolün belirli yönleri, grafik bilgisi kaynağından (örneğin, "Serving Host" üzerindeki bir uygulama programı) grafik konsoluna çıktı almak üzere bir görüntüleme paketine ("Using Host" üzerinde) gönderilen grafik bilgisinin biçimi ve içeriğiyle ilgilidir. Bu, 8 bitlik baytlardan oluşan bir dizi şeklini alacak ve grafik çıktı bayt akışı olarak adlandırılacaktır.
Bu belgenin, ağ üzerinden tartışma ve deneyler için bir temel oluşturması amaçlanmaktadır. Bu belge, grafik girdisinin (Using Host’tan Serving Host’a gönderilen veriler) biçimini veya içeriğini kapsamaz ve ana bilgisayarlar arasındaki bağlantının nasıl kurulduğunu da ele almaz. İlki için bir öneri, bu komite tarafından ileride geliştirilecektir; ikincisi ise Bağlantı Komitesi’nin (Network Graphics Group’un) görevidir.
Bu RFC, protokolde mevcut olan komutları, bunların alıcı (Using Host) uçta yapacağı etki açısından tanımlar. Açıkça, Serving Host’ta uygulamaların grafik verilerini iletmek için kullanacağı bir alt yordam paketinin arzu edilir olduğu söylenebilir, ancak bu konuda bu RFC yorum yapmayı amaçlamamaktadır.
Okuyucu, bu protokolde Using Host’un grafik çıktı bayt akışındaki mantıksal hataları Serving Host’a bildirmesine olanak tanıyan herhangi bir mekanizma belirtilmediğini fark edebilir. Böyle bir mekanizmanın grafik girdi bayt akışıyla bütünleştirilmesi gerekirdi; çünkü bu, bağımsız ana bilgisayarların eşzamanlılığıyla ilgili sorunların çoğunu içerir.
Arka Plan
Okuyucu, ağ grafikleriyle ilgili bu tartışmanın çevresindeki çerçeveyi edinmek için muhtemelen Mike Padlipsky tarafından yazılan RFC 282: "Graphics Meeting Report" belgesini incelemelidir. Ayrıca Donald Huff tarafından yazılan RFC 285: "Network Graphics" belgesinde tanımlanan modele dikkat etmek de yararlı olabilir.
Seviyeler ve Bunlara İlişkin Temel Kurallar
Grafik protokolü içindeki işlevler, kısmen bu işlevlerin uygulanmasının ne kadar zor olduğuna bağlı olarak bir dizi seviyeye ayrılacaktır. Seviye N işlevlerini uyguladığını iddia eden herhangi bir ana bilgisayarın, tüm daha düşük seviyeleri de uygulaması amaçlanmaktadır. Böylece, sahaların seviyeleri artımlı olarak uygulaması öngörülmektedir. Uygulamalar, giderek daha fazla işlev içerecek şekilde sürekli bir süreç olarak geliştirilecektir ve her uygulamanın, grafik alışverişi talep eden uzak bir sitedeki grafik protokolüne kendi seviyesini tanımlayabilmesi amaçlanmaktadır. Bunun yan sonucu olarak, her site programcıları grafik protokolüne ayırma konusunda, diğer çalışmalara kıyasla kendi önceliklerini belirleyebilecektir.
Ayrıca, seviye N’in uygulanmasının seviye N+1 hakkında hiçbir bilgi gerektirmemesi niyet edilmektedir. Böylece bir site, daha üst seviyelerde yapılacak değişikliklerin uygulanmış olan seviyeyi etkilemeyeceğine dair (makul ölçüde) sağlam bir bilgiyle bir seviyeyi uygulayabilir. Zamanla Network Graphics Group tarafından daha önce kesinleştirilmiş bir seviyenin yeniden tanımlanmasına karar verilebilir. Bunun gerçekleşmesi amaçlanmamaktadır; ancak önerilen Grafik Protokolü’nün deneysel olduğu ve değişiklik gerektirebileceği kabul edilmelidir.
Bir başka temel kural: Belirli bir seviye K’da geçerli olan bir komut ve veri akışı, seviye K veya daha üstündeki herhangi bir yorumlayıcıda "özdeş" sonuçlar üretmelidir. Bununla kastedilen, komutlar ve veriler yalnızca kesin olarak tanımlanmış işlemlerden yararlandığı sürece, benzer resimlerin ortaya çıkmasıdır. Protokolün şu anda kesin olarak tanımlanmamış yönleri arasında karakter boyutu, karakterin ışın demetine göre konumu, metin çıktısındaki kontrol karakterlerinin terminali nasıl etkilediği ve ışın demeti mantıksal ekran sınırının dışına taşındığında ya da bu sınırın dışında bir çizgi çizildiğinde ne olduğu yer alır. Bu kural, yukarıya dönük uyumluluğu zorunlu kılar; böylece düşük numaralı bir seviyenin özelliklerini kullanarak yazılmış bir uygulama, daha yüksek seviyeleri uygulamış sitelerde de çalışmaya devam eder. Buna ek olarak, aşağıdaki ayrıntılı işlem açıklamalarında açıkça "belirtilmemiş bırakılan" bu protokol yönlerinin tümü, gerçek bir uygulamanın herhangi bir açık tanımında açıkça belirtilmelidir.
Şimdi tüm seviyelerde ortak olacak çerçeveyi açıklıyoruz.
Temel Veri Biçimleri
Network Standard Graphics Protocol’deki bilgiler, 8 bitlik baytlardan oluşan bir dizi olarak ifade edilecektir. Bir komut, bir komut baytından ve ardından sıfır veya daha fazla argümandan oluşacaktır. Aynı komut baytı her zaman aynı biçimde ve aynı sayıda argüman alacaktır. Her argümanın uzunluğu, argümana bağlı olarak sabit veya değişken olabilir.
Basit bir argüman türü, 8 bitlik bir tamsayı olan bir değerdir. Bir başka argüman türü ise bir sayım değeri ve ardından (sayım) adet 8 bitlik bayttan oluşan bir dizedir. Sayım değeri 0 ile 127 arasındaysa, tek bir bayt olarak gönderilir. Sayım değeri 128 ile 215 − 1 arasındaysa ( üst alma anlamına gelir), ilk baytın en yüksek anlamlı biti bire ayarlanmış olacak şekilde iki bayt olarak gönderilir. İlk bayt sayının yedi yüksek anlamlı bitini, ikinci bayt ise sekiz düşük anlamlı bitini içerir. Bir dize, bir komutun uzunluğu değişebilen tek argüman türüdür. Örneğin, bir komut isteğe bağlı argümanlara sahip olduğunda, bunlar bir dizenin içinde temsil edilecektir.
Koordinat verileri, ikinci Network Graphics Group toplantısında önemli ölçüde tartışma doğurmuştur. İki boyutlu bir Mantıksal Koordinat Sistemi’nin gerekli olduğuna karar verilmiş ve grafik komut bayt akışını yorumlayan her yorumlayıcının bu koordinat sistemini fiziksel aygıt koordinatlarına eşlemekten sorumlu olacağı belirlenmiştir. Mantıksal koordinat sistemindeki verilerin ikinin tümleyeni gösteriminde olmasına, kesirli olmasına, ekranın her bir kenarının birim uzunluğa sahip olmasına ve orijinin çıktı aygıtında ekranın merkezine karşılık gelmesine karar verilmiştir. Çıktı aygıtının ekranının düşey (yatay) kenarları, X (Y) = −1/2 veya X = +1/2 − e doğrularına karşılık gelir; burada e, kesirli verinin hassasiyeti tarafından belirlenen küçük bir pozitif sayıdır. Özellikle (−1/2, −1/2), (−1/2, 1/2 − e), (1/2 − e, −1/2) ve (1/2 − e, 1/2 − e) noktaları, mantıksal ekranın köşelerinde görülebilir noktalar olacaktır. (Kare olmayan bir görüntüleme yüzeyi durumunda, uygulayıcı kendi kararını verebilir.) Böylece Mantıksal Koordinat Sistemi’nin, koordinatları −1/2 ile +1/2’den biraz daha küçük bir değere kadar uzanan noktalar içerdiğini söyleyeceğiz.
Koordinat verisi alan komutlar çeşitli kiplerde kullanılabilir olacaktır. Mutlak kipte, bir konum Mantıksal Koordinat Sistemi’ndeki koordinatları verilerek belirtilir. Göreli kipte ise, konumun koordinatları ile mevcut konumun koordinatları arasındaki fark belirtilmelidir. Dolayısıyla, mutlak kipteki bir işlem için argüman olan bir koordinat verisi −1/2 ile +1/2 − e aralığında olmalı, göreli kipteki bir işlem için olan ise −1 + e ile +1 − e aralığında olmalıdır.
İkinci Graphics Group Toplantısı’nda, ileride çok büyük bir koordinat uzayına (her bir kesirli koordinatta çok sayıda bit hassasiyeti) izin verilmesi yönünde ilgi ifade edilmiştir. Bunun, her bir koordinat verisinin 8 bitlik baytlar cinsinden uzunluğunun (bir kip olarak) ayarlanmasına izin verilerek yapılması planlanmaktadır. Toplantıda, şimdilik koordinat başına iki baytın yeterli olacağına karar verilmiştir. Böylece yukarıdaki tartışmada e, 2**(−15) değeridir (işaretli 15 bitlik kesirli bir koordinatın en düşük anlamlı bitindeki bir).
Metin verileri, çıktı aygıtında görüntülenmek üzere çeşitli komutların bir argümanı olarak iletilecektir. Karakterleri temsil etmek için Network ASCII kullanılacaktır. Protokolün en düşük seviyelerinde yalnızca tek bir karakter boyutu mevcut olacaktır — görüntüleme aygıtında "normal" olan boyut. Aygıtın "normal" bir boyutu yoksa, satır başına 72 karakter arzu edilir. Daha yüksek seviyelerde her bir karakterin boyutu ayrı ayrı belirtilebilir.
Ayrıca, en düşük seviyelerde kontrol karakterleri aygıta iletilecek ve aygıt elinden gelenin en iyisini yapacaktır. Ancak grafik toplantısının ortak görüşü, makul ölçüde düşük (ancak sıfır olmayan) bir seviyede, satır başı, satır besleme ve geri silme karakterlerinin doğru şeyi yapacak şekilde yorumlanması gerektiği yönündedir.
Resim Alt Yordamları ve İlgili Konular
İkinci Network Graphics Group toplantısında, uygulanma zorluğu bakımından aralarındaki temel fark olan iki tür resim alt yordamının arzu edilir olduğuna karar verilmiştir. Toplantıda, daha basit olan türe subpicture, daha karmaşık olana ise subroutine adı verilmiştir. Bu yazar, bu terimlerin ikisini ayırt etmeyi kolaylaştıracak yeterli anlamsal içeriğe sahip olmadığına inanmakta ve bunun yerine simple subpicture ve full subpicture terimlerinin standartlaştırılmasını önermektedir.
Basit bir alt resme geçirilebilecek tek parametre mevcut ışın demeti konumudur. Başka bir deyişle, böyle bir alt resim bir resimde birden fazla kez çağrılırsa, çeşitli çağrılar arasındaki görünüm farkı yalnızca çağrı anındaki ışın demeti konumundan kaynaklanan bir öteleme olacaktır. Buna karşılık tam alt resimler, ölçekleme, döndürme, yansıtma ya da aklımıza gelebilecek başka etkiler doğurabilecek parametreler alır.
Bir alt resim tanımının yalnızca bir kez (her ağ bağlantısı için) iletilmesinin yeterli olacağı ve bir "new picture" işlemiyle silinmeyeceği planlanmaktadır. Böylece değişen bir resim, statik ve değişen bilgiler temelinde birkaç parçaya bölünebilir; resmi yeniden çizmek için yalnızca değişen parçaların tanımlarının iletilmesi gerekir.
Geleneksel olarak, yalnızca başlangıçtaki ışın demeti konumuna bağlı olan resim alt yordamları, göreli veri kipindeki çizim işlemleriyle sınırlandırılmıştır. Alt resimlerin büyük olasılıkla statik resim bilgisini korumak için kullanılacağı göz önüne alındığında, basit alt resimlerde mutlak veri kipi işlemlerine izin verilmesi arzu edilir.
Bundan sonra doğal olarak şu soru ortaya çıkar — hem konum hem de ölçek parametreleri alan bir tam alt resimde mutlak veri ne anlama gelir? Bu durumda mutlak veri gerçekten mutlak mıdır? Bu yazar, yanıtın şu şekilde olduğuna inanmaktadır: Tam alt resim aslında başlı başına bir resimdir; dolayısıyla kendi mantıksal koordinat sistemine sahiptir ve mutlak verisi gerçekte bu koordinat sistemi içindedir. Böylece bir tam alt resmin "kaydırılması ve ölçeklenmesi", gerçekte "alt resmi kendi koordinat sistemi içinde ölçeklemek ve sonucu bir bütün olarak kaydırmak" anlamına gelir.
Özetle, basit ve tam alt resimler arasındaki temel farklardan biri, tam bir alt resmin kendi mantıksal koordinat sistemine sahip olması, basit bir alt resmin ise onu çağıranın mantıksal koordinat sistemini kullanmasıdır. Bu ayrım, tam alt resimlerin basit alt resimlere göre neden daha zor uygulandığının sebebidir.
Toplantıda tartışılan bir başka nokta, bir alt resmin verileri ekranda mutlak konumlarda, yani ana (resim) programında mutlak olarak görüntüleyebileceği özel bir veri kipiydi. Bunu sağlamak için toplantı, üç işlem için özel veri kipleri önermiştir: ışın demetini görünmez biçimde hareket ettirme, çizgi çizme ve nokta görüntüleme. Bu veri kiplerinin amacı, bu kip belirli bir şekilde temizlenene kadar, mevcut alt resim iç içe geçme seviyesine bağlı tüm döndürme, ölçekleme ve kırpma işlevlerini baypas etmektir. Aynı etki, iki komutla daha doğrudan ve daha verimli biçimde uygulanabilir: biri mevcut alt resim için mantıksal koordinat sistemini kaydetmek, diğeri ise yeniden tesis etmek için. (Ayrıca, elbette "kaydet" işlemi başlangıçtaki, en üst seviye mantıksal koordinat sistemini tesis edecektir.)
Basit Alt Resim Çağrıları
Çağrılacak alt resmin <identifier>’ına ek olarak, bir basit alt resim çağrısı iki isteğe bağlı parametre belirtebilir; ilki bu belirli alt resim çağrısının (aşağıda açıklanan anlamda) "adı" olan bir <identifier>, ikincisi ise alt resim çağrılmadan önce görünmez biçimde hareket edilecek olan, çağıran sayfa üzerindeki mutlak bir konumdur.
(İleride) izleyicinin, önünde görüntülenen bilgiyi "seçerek" etkileşime girmesine izin verildiğinde, eğer bu bilgi bir alt resmin parçasıysa, alt resim çağrısının "adı" serving host’a bildirilen "grafik girdisinin" bir parçası olacaktır. İzleyici tarafından seçilen bilgi, birkaç seviye alt resim çağrısı içinde yer alıyorsa, her bir çağrının adları, iç içe geçmelerini gösteren bir biçimde rapor edilecektir. (Yalnızca alt resmin adının tek başına yeterli olmadığına dikkat edilmelidir; çünkü bir alt resim birden fazla konumda görüntülenebilir ve uygulama bireysel çağrılar arasında ayrım yapmak isteyebilir.)
Tanımlayıcı belirtilmemişse, varsayılan olarak boş dize kabul edilir. Konum (görünmez hareket için) belirtilmemişse, mevcut ışın demeti konumu kullanılır.
Bu iki parametreden hangilerinin mevcut olduğu, parametrelerden önce gelen bir kod baytındaki iki bit ile kodlanır. Her iki parametre de mevcutsa, her zaman aynı sıradadırlar; bu sıra ve kod baytında iki parametreye atanan bitler, Simple Instance komutunun ayrıntılı açıklamasında (ve Ek 1’deki BNF’de) belirtilmiştir.
Kod baytından bile önce ve çağrılan alt resmin adını hemen izleyerek, instance komutunun geri kalanındaki verilerin bir sayımı yer alır. Bu, herhangi bir Simple Instance işleminin toplam uzunluğunu belirlemek için kod baytının çözülmesinin gerekli olmamasını sağlamak amacıyla eklenmiştir.
Pencereleme: Kırpma, Karartma veya (?)
Koordinat sistemleri ve alt resimler konusundayken, bir resmin sanal ekranın kenarının ötesinde görüntülenme olasılığı bulunduğunda, kimin (bağlantının hangi ucunun) ne yapmaktan sorumlu olduğu konusuna da değinmek yararlı olabilir. Grafik toplantısında varılan ortak görüş, grafik protokolünü yorumlayan tarafın (yani kullanan uç) bir resmin ekranın kenarının ötesinde bilgi görüntülemesi durumunda (örneğin göreli hareketler ve çizimler yoluyla) makul bir şey yapmakla sorumlu tutulmayacağı yönündeydi.
Ancak yorumlayıcı, uygun aralıkta bir sonraki mutlak veriye doğru biçimde tepki vermelidir. Mevcut grafik sistemlerinde bu duruma yönelik çeşitli çözümler şunları içerir:
- bir çizgiyi, uygun olan kısmı gösterilecek şekilde kırpmak,
- herhangi bir bölümü görünmez ise çizginin tamamını boşlamak ya da
- geçerli konum yazmacının yüksek anlamlı bitlerini atmak; böylece hiçbir görünmez konum temsil edilemez ("wraparound").
En üst düzeydeki kenar etkilerine ilişkin sorunlara ek olarak, (tam) alt resimler ile ilgili sorunlar da ortaya çıkar. Bir alt resim çağrısının parçası olarak, bir alt resmin dikdörtgen bir bölümünün seçilip gösterilebilmesi kullanışlıdır. (Bkz: Newman, Display procedures, Communications of the ACM, Cilt 14, Sayı 10, Ekim 1971, s. 651–660).
Bu yeteneğin isteğe bağlı yapılması yönündeki toplantı uzlaşmasına uygun olarak, bu yazar yalnızca bu bilgiyi kodlamaya yönelik bir yöntemi protokole dahil etmeyi ummaktadır; zira kendi sitesi (a) bu türden bir pencereleme işleminin bir kısmını ele alabilmektedir ve (b) bu işlevi yerine getirecek bir hizmet olanağı sağlamayı ummaktadır.
Ek 2, döndürmeler söz konusu olmadığı sürece, birkaç düzeydeki bölümlerin tek bir dikdörtgen testte nasıl birleştirileceğini açıklar. Ayrıca döndürmeler ve bölümlendirme ile ilgili sorunları da ana hatlarıyla belirtir.
Tam Alt Resim Çağrıları
Artık, elbette gerekli olan çağrılan alt resmin adına ek olarak, bir tam alt resim çağrısının parçası olarak nelerin belirtilebileceğini ele alabilecek durumdayız.
Aşağıda açıklanan verilerin tümü isteğe bağlı olacaktır: tek bir kod baytı tüm bu verilerden önce gelecektir; parametrelerden birinin varlığı ya da yokluğu, kod baytındaki bir bitin bir veya sıfır olmasıyla belirtilecektir. Parametreler, mevcut olduklarında, her zaman aynı sırada görünecektir. Bu sıra, Tam Örnek komutunun ayrıntılı açıklamasında (ve Ek 1’deki BNF’de) verilmiştir.
Ayrıca, kod baytından bile önce, kod baytı dahil olmak üzere izleyen baytların toplam uzunluğunu belirlemek için bir <count> bulunacaktır.
Parametrelerden biri, bu alt resme yapılan bu özel çağrıyı, alt resme yapılan diğer tüm çağrılardan ayırt etmek için kullanılabilecek bir <identifier>dır. Bu parametre, Basit Alt Resim Çağrıları başlığı altında zaten açıklanmıştır.
Belirtilebilecek parametrelerden biri bir ötelemedir: bu, alt resmin görüntüsünün merkezinin (çağıran sayfa üzerinde) mutlak koordinatları verilerek belirtilecektir; varsayılan olarak çağrı anındaki geçerli ışın konumu kullanılacaktır.
Bir döndürme, 0 ile .1111111111111111 (ikili) aralığında, dahil olmak üzere, 16 bitlik bir kesir verilerek belirtilebilir; bu kesir, tam bir dairenin (2π) döndürmenin hangi bölümüne karşılık geldiğini temsil eder. Varsayılan döndürme açısı değeri sıfır olacaktır.
(Aslında, döndürme gösterim şeması, −1/2 ile +1/2’den biraz daha küçük arasındaki ikiye tümleyenli bir kesir olarak düşünüldüğünde de aynı şekilde çalışır. Yani, sinüs ve kosinüsün periyodik doğası nedeniyle aynı bit yapılandırmaları aynı döndürmeyi kodlar. Örneğin, ikili sıfır her zaman 0π’yi temsil eder; 010000…0 her iki şemada da π/2’yi gösterir; 100…00 bir şemada 1/2’yi, diğerinde −1/2’yi gösterir; bunlar sırasıyla +π ve −π döndürmelerine karşılık gelir, yani özdeş döndürmelerdir.)
Tam bir alt resim çağrısının parçası olarak ayrıca, çağrılan resmin çağıran resim üzerinde görüntülenecek dikdörtgen bir bölümü de belirtilebilir (kırpma ile ilgili tartışma için önceki bölüme bakınız). Bu dikdörtgen, merkezi ve toplam boyutunun x ve y yönlerindeki yarısı ile tanımlanır. Yani dikdörtgen, x koordinatı merkezinkinden belirtilen x boyutundan daha fazla sapmayan ve y koordinatı benzer bir koşulu sağlayan tüm noktalardan oluşur.
Bu değerler için varsayılan ayar, merkezi orijine yerleştirir ve hem x yarı genişliği hem de y yarı genişliği için +1/2 değerini verir. Böylece varsayılan, çağrılan sayfanın mantıksal koordinat sisteminin tamamını kapsar (ve ayrıca koordinatlarından biri +1/2 olan bazı noktaları da kapsar; bunlar, sıkı anlamda, koordinat sisteminin “dışında” yer alır; bu tutarsızlığın nasıl çözüleceği belirtilmemiştir).
Son olarak, görüntünün belirlenmesinde uygulanacak ölçekleme belirtilmelidir; bu, birçok yolla yapılabilir. Yollardan biri, alt resme uygulanacak tekdüze bir büyütme oranı belirtmektir. Geniş bir aralıkta büyütmelerin elde edilebilmesi için, yazarın görüşüne göre bir tür bilimsel gösterim (yani kayan nokta) kullanılması gerekecektir. Halihazırda bir ağ standardı kayan nokta gösterimi varsa (yazarın bildiği kadarıyla yoktur), bu kullanılmalıdır. Aksi halde, bu gösterimin 8 bitlik (ikiye tümleyenli) bir üs ve ardından 16 bitlik (ikiye tümleyenli) bir kesir kısmından oluşması önerilmektedir.
Ölçeklemenin bir başka biçimi, döndürme yapılmadan önce alt resme uygulanacak şekilde x ve y yönlerinde ayrı büyütmeler belirtmektir. Üçüncü bir yol ise, çağıran resmin koordinat sisteminde, alt resmin görüntüsüyle doldurulacak dikdörtgen bir alan belirtmektir. Görüntünün merkezi zaten (öteleme ile) belirtildiğinden, bu görüntü bilgisi yalnızca yarı kenar boyutu verilerinden oluşur.
Üç ölçekleme yönteminden hiçbiri seçilmezse (ve bir afin dönüşüm (aşağıya bakınız) açıkça verilmezse), birim değerinde tekdüze bir büyütme (yani ölçekleme yok) kullanılır. Üç ölçekleme biçiminin birbirleriyle çelişme eğiliminde olduğu ve herhangi bir çağrıda bunlardan yalnızca birinin kullanılması gerektiği unutulmamalıdır. Bu alanlarda kendi içinde çelişkili bilgi verilirse ne olacağı belirtilmemiştir.
Ek 2, alt resmin koordinat sisteminin çağıran resmin koordinat sistemine dönüştürülmesinde yer alan matematiği sunar. Orada, tüm bireysel işlemlerin (ölçekleme, döndürme ve öteleme) tek bir afin dönüşüm olarak (6 değerden oluşan) temsil edilebileceği gösterilmektedir.
Sunucu programın bu dönüşümü doğrudan belirtmesine izin vermek hoş olabilir. Buna göre, tam bir alt resim çağrısının olası parametrelerinden biri, yukarıda büyütme altında tanımlanan biçimde, bir afin dönüşüm olarak yorumlanacak altı kayan nokta sayısından oluşacaktır. Nitekim, afin dönüşüm aşağıdaki biçime sahipse:
[ x' y' ] = [ x y ] * [ L11 L12 ] + [ T1 T2 ]
[ L21 L22 ]
bu durumda değerler (keyfi olarak) aşağıdaki (sütunsal) sırada gönderilecektir:
- L11
- L21
- L12
- L22
- T1
- T2
Bu afin dönüşüm terslenebilir olmalıdır; yani L11·L22 − L21·L12 sıfır olmamalıdır.
Görünüm Alanı (Viewporting)
Toplantıda tartışılan ve karara bağlanması için protokol komitesine havale edilen bir başka konu da, “üst düzey” resmin sanal ekranın belirli bir dikdörtgeni içine yerleştirilebilmesi yeteneğiydi. Varsayılan dikdörtgen tam ekran olabilir. Alternatif olarak, varsayılanın izleyici tarafından (Kullanan Ana Makinedeki grafik sistemiyle etkileşim yoluyla) belirtilmesine bırakılması da mümkündür.
Genel olarak, görünüm alanı kullanımı, birden fazla “üst düzey” resmin aynı anda görüntülenmesine olanak tanır. Aynı ekranda birkaç farklı resmi görme isteği, birden çok kullanıcının birlikte çalıştığı durumlarda ve bir kullanıcının (ayrı sunucu ana makinelerdeki) bir uygulama grubuyla etkileşimde bulunduğu durumlarda ortaya çıkar.
Bu yazar, bu özellik için gerekli koordinat dönüşümlerinin, döndürmeler söz konusu olmadığından, “tam alt resimler”dekine göre daha basit olduğunu ve uygulamada aynı mekanizmanın bir parçası olacağını savunmaktadır. Özellikle, tam alt resim çağrılarının neden olduğu düzeylere yalnızca bir başka afin dönüşüm (Ek 2’ye bakınız) eklenecektir. Gereken tek şey, görünüm alanı tanımlayıcılarının ve bunlarla ilişkili dikdörtgenlerin izlenmesidir.
Çok az ek çalışma gerektirdiğinden, bu özelliğin protokolün daha üst bir düzeyinde dahil edilmesi önerilmektedir.
Komut Kodları
Grafik protokolündeki her komuta, bayt akışında bu komutu temsil edecek negatif olmayan bir değer atanacaktır. Değerlerin ve komutların ilişkilendirildiği algoritma, ortaya çıktığı üzere, son derece hassas bir konudur. “En iyi” algoritma için, her biri vurgusu farklı olan beş ya da on ayrı ölçüt vardır.
Bu Gordiyon düğümü, bu öneride, komutların yaklaşık olarak düzeye göre sıralanması ve ardından basitçe numaralandırılmasıyla kesilecektir. Ayrıca, aynı düzeyde birkaç yakından ilişkili komut bulunuyorsa, anlam farklılıklarını bit yapılandırmaları cinsinden kodlamak için bir miktar çaba gösterilecektir.
Daha sonraki bir değerlendirme sıralamanın değiştirilmesini gerektirse bile, bu komitenin görüşü, numaralandırmanın değiştirilmemesi gerektiği yönündedir. Ancak bu konu kesin olarak karara bağlanana kadar, herhangi bir uygulamanın komut kodlarının yeniden atanması olasılığını hesaba katması şiddetle tavsiye edilir.
Seviye 0 Protokolü İçin Özel Öneri
Seviye 0’ın çok basit tutulması önerilmektedir. Böylece uygulama hızlı bir şekilde gerçekleştirilebilir ve protokolle deneyler başlatılabilir. Bir diğer neden de, en az güçlü ana makinenin ve hatta programlanabilir terminallerin bile bunu uygulayabilmesinin sağlanmasıdır.
Buna uygun olarak, yalnızca çıktısı tamamen geçerli komuta ve komutun başlangıcındaki geçerli “ışın konumu”na bağlı olan komutların dahil edilmesi yönünde bir “kural” konmuştur. Başka bir deyişle, seviye 0 yorumlayıcısının “kipler” ya da yığıtlar için dahili depolamaya sahip olması gerekmez. Bu kısıtlamayla, seviye 0 için çok basit bir uygulamanın mümkün olması umulmaktadır.
Özellikle, belki de sonunda seviye 0 kodunu kişinin kendi özel terminal koduna dönüştüren bir donanım çevirici geliştirilebilir.
Seviye 0 için işlem kodu atamasında, 4, 2 ve 1 bitlerinin taşıma, çizgi ve nokta komutları için özel anlamları olduğunu unutmayın. Özellikle, 1 biti mutlak ve göreli veri kipini kodlar, 4 biti herhangi bir görünür çıktı olup olmadığını kodlar ve 2 biti görünür çıktının bir çizgi mi yoksa bir nokta mı olduğunu belirler.
Seviye 0: Komut Özeti
Aşağıda seviye sıfırdaki komutların (ve sözdizimlerinin) bir listesi verilmiştir. Bu komutların ayrıntılı açıklamaları bir sonraki bölümde yer almaktadır. Protokolle ilgili komutlar Bağlantı Komitesi tarafından eklenebilir. (Şu anda 128 ile 255 aralığında işlem kodları talep etmektedirler.)
Yukarıda Temel Veri Biçimleri bölümünde açıklandığı gibi, <x coordinate>, <y coordinate>, <x delta> ve <y delta> ikişer baytlık koordinat değerleridir; <string>, bir <count> ve ardından <count> kadar bayttan oluşur ve <value> sekiz bitlik bir sayıdır.
| Ondalık | Sekizlik | İkili | Biçim |
|---|---|---|---|
| 0 | 0 | 00000000 | Null |
| 1 | 1 | 00000001 | Ekranı sil ve ışını sıfırla |
| 2 | 2 | 00000010 | Mutlak Taşı <x coordinate> <y coordinate> |
| 3 | 3 | 00000011 | Göreli Taşı <x delta> <y delta> |
| 4 | 4 | 00000100 | Mutlak Çiz <x coordinate> <y coordinate> |
| 5 | 5 | 00000101 | Göreli Çiz <x delta> <y delta> |
| 6 | 6 | 00000110 | Mutlak Nokta <x coordinate> <y coordinate> |
| 7 | 7 | 00000111 | Göreli Nokta <x delta> <y delta> |
| 8 | 10 | 00001000 | Metin <string> |
| 9 | 11 | 00001001 | MetinR <string> |
| 10 | 12 | 00001010 | Resmin Sonu |
| 11 | 13 | 00001011 | Kaçış <value> <string> |
Seviye 0: Komut Açıklamaları
Seviye 0 Komutları
0. Boş Deyim ("NULL")
Bu deyimin argümanı yoktur — ve herhangi bir etkisi de yoktur.
1. Ekranı sil ve ışını orijine sıfırla ("ERASE")
Bu komut, yeni bir resmin çizilmek üzere olduğunu belirtir. Her zaman (sonunda) bunu izleyen bir Resmin Sonu komutuyla eşleştirilmelidir.
2. Işını görünmez biçimde mutlak konuma taşı ("MOVEA") <x coordinate> <y coordinate>
Hiçbir şey çizilmez; ışın belirtilen mutlak x, y konumuna yerleştirilir.
3. Işını görünmez biçimde göreli miktarda taşı ("MOVER") <x coordinate> <y coordinate>
Hiçbir şey çizilmez; ışın x ve y yönlerinde belirtilen miktarda kaydırılır.
4. Mutlak konuma çizgi çiz ("DRAWA") <x coordinate> <y coordinate>
Geçerli ışın konumundan belirtilen mutlak x, y konumuna bir çizgi çizilir.
5. Göreli konuma çizgi çiz ("DRAWR") <x delta> <y delta>
Geçerli ışın konumundan, delta x ve delta y kadar ötede bulunan konuma bir çizgi çizilir.
6. Mutlak konumda bir nokta göster ("DOTA") <x coordinate> <y coordinate>
Işın görünmez biçimde mutlak x, y konumuna taşınır ve orada bir nokta gösterilir.
7. Göreli konumda bir nokta göster ("DOTR") <x delta> <y delta>
Işın x ve y yönlerinde belirtilen miktarda görünmez biçimde taşınır ve orada bir nokta gösterilir.
8. Metin göster ("TEXT") <string>
Geçerli ışın konumunda, işletilen aygıt için normal boyutta bazı karakterler gösterilir. <string>, bir <count> ve ardından sayım kadar karakterden oluşur. Eğer bir “normal boyut” yoksa, satır başına yetmiş iki karakter gösterilecek şekilde bir boyut seçin.
Dizedeki karakterler ağ ASCII’si ile kodlanmıştır; 0 ile 127 (ondalık) arasındaki tüm kodlara, dahil olmak üzere, izin verilir. (Seviye sıfırda, denetim karakterlerine ne olacağı belirtilmemiştir.)
Bu komutun yürütülmesinin ardından ışının nerede olduğu, hemen ardından gelen bir Metin Göster komutunun önceki dizeye metnini eklemesi dışında, belirtilmemiştir. (TEXT komutunun kullanımı önerilmez; bunun yerine TEXTR kullanın.) İlk karakterin, başlangıçtaki ışın konumuna göre konumu belirtilmemiştir.
9. Metin göster ve ışını geri yükle ("TEXTR") <string>
Geçerli ışın konumunda, işletilen aygıt için normal boyutta bir karakter dizisi gösterilir; ardından ışın, komuttan önce bulunduğu konuma yeniden yerleştirilir. <string>, bir <count> ve ardından sayım kadar karakterden oluşur.
Eğer bir “normal boyut” yoksa, satır başına yetmiş iki karakter gösterilecek şekilde bir boyut seçin. Dizedeki karakterler ağ ASCII’si ile kodlanmıştır; 0 ile 127 (ondalık) arasındaki tüm kodlara, dahil olmak üzere, izin verilir. (Seviye sıfırda, denetim karakterlerine ne olacağı belirtilmemiştir.) İlk karakterin, başlangıçtaki ışın konumuna göre konumu belirtilmemiştir.
10. Resmin sonu ("ENDPIC")
Bu komut, yeni bir resmin sonunu belirtir. Öncesinde gelen bir ERASE komutuyla eşleştirilmelidir.
11. Aygıta özgü ayrıntılara kaçış ("ESCDEV") <value> <string>
Eğer <value>, işletilen aygıta Protokol Komitesi tarafından atanmış kod ise, <string> içindeki (bayt sayısını belirten bir <count> ile başlayan) sekiz bitlik baytları incelemeden aygıta iletin. Aksi halde bu komutu yok sayın.
Aygıt 8 bitlik bilgiyi kabul etmiyorsa, veriyi aygıta özgü bir biçimde yeniden düzenleyin; örneğin yedi bitlik bir aygıt için en anlamlı biti atmak ya da beş adet 8 bitlik baytı, yine en anlamlı bitleri atarak, tek bir 36 bitlik sözcükte toplamak gibi. Dizgedeki baytların gerçekleştirdiği işlem, yorumlayıcının muhtemelen bağımlı olabileceği aygıttaki donanımsal ışın konumu yazmaçlarını olduğu gibi bırakmalı (ya da en azından geri yüklemelidir).
Bu komut gerçekten kullanılmamalıdır; seviye 0’da, belirli uygulamaların kip ayarlaması ve diğer aygıta özgü işlemleri yapabilmesi için dahil edilmiştir. Örneğin, ARDS terminalleri isteğe bağlı olarak birbirinden bağımsız adreslenebilen birden fazla çıkış ekranına sahip olabilir. Seçim mekanizması, yalnızca belirli bir ASCII karakter dizisi terminale ulaştığında durum değiştirir. Dolayısıyla ESCDEV, izleyen komutlardan hangilerinin hangi ekran(lar)ı etkileyeceğini seçmek için kullanılır. (Geçerli durum, Using Host üzerindeki grafik paketi için görünmezdir.)
Ayrıca, başka bir terminal üreticisinin farklı bir kod dizisine yanıt veren benzer bir seçeneği olduğunu varsayalım. Bu olasılık, ESCDEV komutunun belirtilen <value> değerine bağlı olarak koşullu biçimde yok sayılmasının gerekçesidir. Belirli bir uygulamanın yalnızca ya bir ARDS’e ya da (çoklu ekran seçeneği olan) bu ikinci üreticiye çıktı vereceği biliniyorsa, uygulama her zaman iki ESCDEV komutu gönderebilir; bunlardan biri yalnızca ARDS terminalleri için geçerli olurken, diğeri yalnızca ikinci üretici için geçerli olur.
Level 1
Çizgi kipini ayarla ("LINMOD") <value>
Bu komut geçerli çizgi kipini ayarlar. Olası kipler ve her birini ayarlayan <value> değerleri şunlardır: düz (0), kesikli (1), noktalı (2) ve diğerleri (3 veya daha büyük). Yeni bir resmin başında (yani bir ERASE komutundan sonra) çizgi kipi düz olur.
Bir yerde belirli bir kip hazır olarak mevcut değilse, şunları yapabilir:
- yazılımda benzetimini yapmak,
- yerine başka birini koymak (noktalı yerine kesikli ya da tersi), veya
- tamamen yok saymak.
Sağlanan özellikler herhangi bir kamusal belgede açıkça belirtilmelidir. En azından düz ve bir başka kipin sağlanması şiddetle önerilir.
Yoğunluğu ayarla ("SETINT") <value>
Bu komut, komuttan sonra görüntülenen çizgilerin, noktaların ve karakterlerin yoğunluğunu ayarlar. <value> ondalık 128 ise normal yoğunluk ayarlanmalıdır. <value> ondalık 255 ise en parlak seçilmelidir ve 0 ise ışın kapatılmalıdır.
Ara değerler, uygulayıcının uygun gördüğü şekilde eşlenmelidir. Örneğin, en parlak normal ile aynıysa, 128 ile 255 arasındaki tüm değerler normale eşlenmelidir. Yeni bir resmin başlangıcı (ERASE komutu) ile ilk SETINT komutu arasında görüntülenen bilgiler normal yoğunlukta görünür.
Metin çıkışı ("TEXTO") <string>
Geçerli ışın konumundan başlayarak bu komut, <string>’i (ağ ASCII karakterlerinden oluşan) yazılı materyal yazılmış gibi biçimlendirerek (geçerli yoğunlukta) görüntüler. <string>, bir <count> ve ardından sayısı kadar karakterden oluşur.
Sağ kenar boşluğunu aşan metin bölünür ve bir alt satırda sol kenar boşluğundan yeniden konumlandırılır. Denetim karakterlerinden yalnızca satır başı (carriage return), satır ilerletme (line feed) ve geri silme (backspace) karakterlerinin doğru biçimde yorumlanması zorunludur.
Alt resim başlığı ("SUBHED") <identifier> <count> <header info>
Bu komut, <identifier> adlı bir alt resmin tanımını başlatır. Bu tanım, eşleşen bir SUBEND komutu ile sonlandırılır. Tanım, yeni bir tanım belirtilene ya da grafik ağ bağlantısı kesilene kadar hatırlanır. <identifier>’ın yalnızca büyük harfler ve sayılardan oluşan bir <string> olduğunu unutmayın.
Alt resim tanımları iç içe olabilir; bu, iki tanımın ayrı ayrı iletilmesine eşdeğer olacaktır. Başka bir deyişle, tüm alt resim adları globaldir ve diğer tüm alt resimler tarafından bilinir. Bir alt resim tanımı, bir resimde kullanılmadan önce alınmamışsa, tanım alınana kadar onun yerine boş alt resim görüntülenmelidir.
Bir alt resim tanımının bir resmin parçası olarak (yani ERASE ve END komut çifti içinde) iletilmesi gerekmez. Hatta tüm alt resim tanımları ana resimden önce gelebilir.
Şu anda <count> her zaman 1 olacaktır; bu, yalnızca bir baytlık <header info>’nun izlediğini belirtir. Ancak protokolün daha yüksek seviyelerinde genişleme için yer gerekebilir. <header info> içinde, bu alt resim basit bir alt resim olabiliyorsa 80-hex biti, tam bir alt resim olabiliyorsa 40-hex biti ayarlanır. (Bir alt resmin her ikisi birden olması mümkündür.)
Gelecekte <header info> içinde bulunabilecek diğer bilgiler arasında, bu alt yordam her çağrıldığında girişte belirli bir kipin ya da parametrenin geçerli değerinin kaydedilip çıkışta geri yüklenip yüklenmeyeceği yer alabilir. Bu kipler ve parametreler şunları içerir: çizgi kipi, yoğunluk, karakter boyutu ve veri uzunluğu.
Alt resim sonu ("SUBEND")
Bu komut, bir alt resmin tanımını sonlandırır. Her SUBEND, kendisinden önce gelen bir SUBHED komutuyla eşleşmelidir.
Basit örnek ("INSTS") <identifier> <simple instance tail>
Bu komut, <identifier> adlı alt resmin çağrılacağını (örnekleneceğini) belirtir. Bu seviyede, seviye 1’de, hiçbir alt resim başka bir alt resmi çağıramaz; eğer çağırırsa ne olacağı belirtilmemiştir. Ayrıca bu, basit bir alt resme çağrı olmalıdır. Dolayısıyla <identifier> tanımını başlatan SUBHED komutundaki tek baytlık <header info>’nun 80-hex biti ayarlanmış olmalıdır.
Alt resim <identifier> hiç tanımlanmamışsa, onun yerine boş alt resim görüntülenmelidir.
<simple instance tail>, izleyen bilgi miktarının sayımıyla başlar. Bu sayı sıfır olabilir. Sıfırdan büyükse, bir sonraki bayt, ardından hangi ek bilgilerin geldiğini belirlemek için yorumlanacak bir kod baytıdır.
- 80-hex biti ayarlıysa, bayt akışında sıradaki öğe bir
<identifier>’dır (AS bilgisi olarak adlandırılır). Bu<identifier>, alt resmin bu özel örneğinin adıdır. - 40-hex biti ayarlıysa, bayt akışında (varsa AS bilgisinin ardından) alt resmin merkezleneceği x, y konumu (çağıran resmin koordinat düzeninde) gelir. Bu, AT bilgisi olarak adlandırılır.
AT bilgisi belirtilmemişse, varsayılan olarak geçerli ışın konumu kullanılır. AS bilgisi belirtilmemişse, sıfır karakter içeren <string> varsayılır.
Ne 40-hex ne de 80-hex bitleri ayarlıysa, ne AT bilgisi ne de AS bilgisi mevcuttur ve kod baytı sıfır olmalıdır. (Ayrıca uzunluk sayımının da 1 olması gerekir.)
Seviye 1 için Seviye 0 Komutlarındaki Değişiklikler
- TEXT ve TEXTR — Satır başı, satır ilerletme ve geri silme karakterleri
<string>içinde göründükleri her durumda mutlaka yorumlanmalıdır. Diğer denetim karakterlerinin sonuçları belirtilmemiştir. Karakterlerin yoğunluğu SETINT komutundan etkilenir. - ERASE — Yeni bir resmin başlangıcında normal yoğunluk ve düz çizgi kipi ayarlanmış olmalıdır.
- DRAWA ve DRAWR — Çizgi kipi ve yoğunluk LINMOD ve SETINT komutlarından etkilenir.
- DOTA ve DOTR — Yoğunluk SETINT komutundan etkilenir.
Level 2
İşaretle ("MARK")
Bu komut, geçerli x, y ışın konumunun bir aşağı-yığıt (pushdown stack) üzerine kaydedilmesine neden olur. Bu aşağı-yığıt, alt resim çağrı aşağı-yığıtından ayrı olmalıdır.
İşarete git ve çıkar ("MOVEMK")
Bu komut, geçerli ışın konumunu işaret aşağı-yığıtının en üstündeki x, y konumuna eşitler. Yığıt boşsa, bunun yerine orijin kullanılır. Ardından yığıt çıkarılır (boş değilse).
İşarete çiz ve çıkar ("DRAWMK")
İşaret aşağı-yığıtı boş değilse, bu komut geçerli ışın konumundan işaret aşağı-yığıtının en üstündeki x, y konumuna (geçerli çizgi kipi ve yoğunluğunda) bir çizgi çizer ve ışın konumunu bu değere ayarlar. Ardından yığıt çıkarılır.
Yığıt boşsa, çizgi orijine çizilir ve ışın konumu da oraya ayarlanır.
Seviye 2 için Seviye 0 ve 1’deki Değişiklikler
- INSTS — Basit alt resimlerin keyfi seviyeleri desteklenmelidir. (Alt resimlerin özyinelemeli kullanımı yasaktır: özyineleme bir kez başladığında asla durdurulamaz.) Alt resim çağrıları için kullanılan aşağı-yığıt, işaret aşağı-yığıtından ayrı tutulmalıdır.
Level 3
(Belki de tüm dönel dönüşümler daha yüksek bir seviyeye, örneğin görünüm penceresi işlemlerinden daha yukarı bir seviyeye konulmalıdır.)
Tam örnek ("INSTF") <identifier> <full instance tail>
Bu komut, <identifier> adlı alt resmin, açıklayıcı bir bölümde tanımlandığı şekilde tam olarak çağrılacağını (örnekleneceğini) belirtir. Bunun bir sonucu olarak, <identifier> tanımını başlatan SUBHED komutundaki tek baytlık <header info>’nun 40-hex biti ayarlanmış olmalıdır.
<identifier> hiç tanımlanmamışsa, onun yerine boş alt resim (yani hiçbir şey) görüntülenmelidir.
<full instance tail>, INSTS komutu altında açıklanan <simple instance tail>’e benzer, ancak daha fazla bilgi içerir. Mevcut olan bilgi parçaları her zaman aşağıda açıklandıkları sırayla bayt akışında yer alır.
Tam Örnek Kuyruğu Bilgi Bitleri
| Bit (hex) | Bilgi |
|---|---|
| 80 | AS bilgisi — bu özel örneğin adı. Bir <identifier>’dan oluşur. |
| 40 | Öteleme bilgisi — alt resim görüntüsünün çağıran sayfa üzerindeki merkezi. Bir <x coordinate> ve bir <y coordinate>’dan oluşur. |
| 20 | Dönme — görüntüyü saat yönünün tersine döndürmek için 2π’nin kesirli kısmı. 16 bitlik işaretsiz bir kesirden oluşur. |
| 10 | Bölüm bilgisi — alt resmin görüntülenecek dikdörtgen kısmı. <x coordinate>, <y coordinate>, <x delta> ve <y delta>’dan oluşur. |
| 8 | Tekdüze büyütme — tüm alt resmi ölçekleme miktarı. (Sıfır olmaması gereken) bir kayan nokta sayıdan oluşur. |
Ayrı x ve y büyütme — Alt resmin x ve y eksenleri için ayrı ölçekler. (Hiçbiri sıfır olmaması gereken) iki kayan nokta sayıdan oluşur.
Görüntü Boyutu — Çağıran sayfa üzerinde görüntünün kaplayacağı dikdörtgenin büyüklüğü. (Hiçbiri sıfır olmaması gereken) bir
ve bir ’dan oluşur. Afin dönüşüm — Çağrılan koordinat sisteminden çağıran koordinat sistemine eşleme. Altı adet kayan nokta sayıdan oluşur.
Notlar
- 8, 4 ve 2 bitlerinden en fazla biri ayarlanmalıdır.
- 1 biti ayarlıysa, 2, 4, 8, 20 ve 40 bitleri ayarlanmamalıdır.
- Tam alt resim çağrısına ileride ek isteğe bağlı parametreler eklenirse, yukarıdaki tüm bilgilerin ardından başka bir kod baytı gelebilir. Bu durumda,
<full instance tail>’in<count>kısmı bu ikinci kod baytını ve ek bilgi baytlarını içerecektir.
Kaçış ve Koordinat Sistemi Komutları
Üst Seviye Koordinat Sistemine Kaçış (ESCTOP)
Ardından bir RESLEV komutu yürütülene kadar, tüm görüntüleme komutları (taşımalar, çizimler, noktalar ve metinler), onları içeren alt resim yerine üst seviye (ana) resim tarafından verilmiş gibi çalışır. Yani, en üst seviye için olan eşlemeye göre ekrana dönüştürülürler.
Bir ESCTOP komutu etkideyken yapılan alt resim çağrıları bu komuttan etkilenmez. Yani, dönüşümler komut etkide değilmiş gibi hesaplanır. Ancak hesaplanan dönüşümler yok sayılır ve RESLEV komutu ESCTOP kipini geçersiz kılana kadar, alt resim tarafından görüntülenen bilgiler yine üst seviyedeymiş gibi görünür.
Dolayısıyla, bir ESCTOP komutu etkideyken yürütülen bir alt resim çağrısı, çağrıdan hemen önce bir RESLEV yürütülmüş ve alt resmin ilk komutu olarak bir ESCTOP komutu yürütülmüş gibi davranır. Benzer değerlendirmeler alt resimlerden geri dönüş için de geçerlidir.
Geçerli Seviye Koordinat Sistemine Devam (RESLEV)
Bu komut, bir ESCTOP komutu tarafından devre dışı bırakılmışsa, yürütülmekte olan alt resme karşılık gelen mantıksal koordinat sistemini geri yükler.
Seviye 3 için Seviye 0, 1 ve 2’deki Değişiklikler
MARK — Kaydedilen ışın konumu, fiziksel koordinat sistemi değil, mantıksal koordinat sistemi cinsinden olmalıdır.
TEXTR, TEXT, TEXTO — Tam bir alt resmin, kendi başına bir resimmiş gibi, bütün olarak dönüştürülmesi gerektiğinden, özellikle karakterlerle ilgili tüm ışın hareketlerinin etkilenmesi gerektiği bu yazara öyle görünmektedir. Buna karakter boyutu, sekme, satır başı ve satır ilerletme dahildir. Özellikle satır başı, ışını sol kenar boşluğuna — yani çağrılan alt resmin mantıksal koordinat sisteminin sol kenarına — ayarlamalıdır.
Tüm bu değişikliklerin gerçekleştirilmesi çok zor olabilir ve şu aşamada ne yapılması gerektiği belirtilmeden bırakılacaktır; okuyucuların yorumları özellikle davet edilmektedir.
Level 4
(Belki de bakış noktası işlemleri seviye 3’e dahil edilebilir.)
Görünüm Penceresi Bildir (SETVW)
SETVW <viewport id> <x coordinate> <y coordinate> <x delta> <y delta>
<viewport id> ile tanımlanan görünüm penceresini, mantıksal ekranın belirtilen alanını temsil edecek şekilde ayarlar. x ve y verileri fiziksel ekran koordinatları değildir; çünkü bu, aygıta bağımlılıkları içerirdi. Bu komut, aynı görünüm penceresinin önceki tüm bildirimlerinin tamamen yerini alır.
Belirtilen görünüm penceresi içinde zaten bilgi görüntüleniyorsa, bu komut görüntülenen bilginin ekrandaki yeni konumuna taşınmasına neden olur.
Belirtilen alan grafik standart görüntü ekranının sınırlarını aşarsa ne olacağı belirtilmemiştir. Görünüm pencerelerinin ayrık olması gerekmez; iki görünüm penceresi ekranda aynı noktada görüntü bilgisi sunabilir.
<x delta> veya <y delta> negatifse, adı verilen görünüm penceresi silinir ve onun tarafından görüntülenen tüm bilgiler artık görünmez.
Üst seviye resmi etkilediği için bu komut, bir resmin parçası olarak ya da bir alt resim bildiriminde yer almamalıdır.
Alt Resmi Görünüm Penceresine Ekle (ADDSVW)
ADDSVW <identifier> <viewport id>
<identifier> adlı alt resim, belirtilen görünüm penceresinde zaten görüntülenmiyorsa orada görüntülenir. Alt resmin, tam alt resim çağrısı yoluyla çağrılabilir olması gerekir.
Görünüm penceresi bir SETVW komutuyla hiç bildirilmemişse ne olacağı belirtilmemiştir. Görünüm penceresi daha sonra bildirilirse, alt resim onun içinde görüntülenir.
Alt resim hiç bildirilmemişse, hiçbir şey görüntülenmez; daha sonra bildirilirse, yeni tanım görünüm penceresinde görüntülenir. Birden fazla alt resim aynı anda tek bir görünüm penceresinde görüntülenebilir.
Üst seviye resmi etkilediği için bu komut, bir resmin parçası olarak ya da bir alt resim bildiriminde yer almamalıdır.
Görünüm Alanını Temizle (CLVW)
CLVW <viewport id>
Belirtilen görünüm alanına ADDSVW komutu ile eklenmiş olan tüm alt resimler kaldırılır. Böylece bu görünüm alanı, insan izleyicinin gördüğü şeye hiçbir katkıda bulunmaz. Bir CLVW sonrasında, görünüm alanının kapsadığı bölge, onunla çakışan ve temizlenmemiş diğer görünüm alanları nedeniyle boş olmayabilir.
Üst seviye resmi etkilediği için, bu komut bir resmin parçası olarak ya da bir alt resim bildirimi içinde yer almamalıdır.
Seviye 4 için Seviye 0, 1, 2 ve 3’teki Değişiklikler
ERASE — Tüm görünüm alanları temizlenir (CLVW komutunda olduğu gibi), ancak bildirimleri hatırlanır.
ENDPIC — Bu komut amacının bir kısmını yitirir: artık kullanıcıya sunulacak tüm resim bilgilerinin sonunu işaretlemez, çünkü resmi düzelten veya değiştiren görünüm alanı işlemleri bunu izleyebilir. Bu işlev kısmen DELAY ve NODELAY komutları tarafından devralınır.
Seviye ?
Karakter Boyutunu Ayarla (SETCHS)
SETCHS <x delta> <y delta>
Aksi belirtilene kadar, karakterler geçerli mantıksal koordinat sisteminde her birinin uygun koordinat yönünde yaklaşık olarak
Karakterler arası ve satırlar arası boşluklar,
Karakter boyutu her zaman ERASE komutu ile normale (seviye 0 tarafından tanımlandığı şekilde) ayarlanır.
Seviye ? için Seviye 0 ve 1’deki Değişiklikler
TEXTR, TEXT, TEXTO — Karakterler geçerli karakter boyutuna göre gösterilir.
ERASE — Seviye 0 için normal karakter boyutunu oluşturmak zorundadır.
Seviye ?'
Veri Uzunluğunu Ayarla (SETDLN)
SETDLN <value>
Açıkça değiştirilene kadar, çeşitli veriler
Bir ağ bağlantısı ilk kez kurulduğunda, veri uzunluğu ikidir.
Seviye ?''
(Bu komutlar muhtemelen görünüm alanı işlemleriyle aynı seviyede, hatta daha erken bir seviyede olmalıdır.)
Kapsamlı Değişiklikler Geliyor (DELAY)
Bu isteğe bağlı komut, kapsamlı değişiklikler yapılırken ara görüntü güncellemelerini engeller. Bir NODELAY komutu bu moddan çıkar ve görüntünün hazırlanıp izleyiciye sunulmasına neden olur.
Kapsamlı Değişikliklerin Sonu (NODELAY)
Bu isteğe bağlı komut, DELAY komutunun etkisini geri alır.
Ek 1: Grafik Protokolü Bayt Akışı için BNF
Anahtar
- Terminaller olmayanlar köşeli parantezlerle (
< >) gösterilir. - Belirli sekiz bitlik değerleri temsil eden terminaller büyük harflerle yazılır.
- Diğer terminaller küçük harflerle yazılır.
empty_stringsıfır bayt anlamına gelir.
Dilbilgisi
<graphics output byte stream> ::= empty_string
| <picture> <graphics output byte stream>
| <subpicture declaration> <graphics output byte stream>
| <viewport operation> <graphics output byte stream>
| <transmission control stt> <graphics output byte stream>
<picture> ::= <new picture stt> <program stt group> <end picture stt>
<subpicture declaration> ::= <subpicture header stt>
<program stt group> <subpicture end stt>
<viewport operation> ::= <declare viewport stt>
| <add subpicture to viewport stt>
| <clear viewport stt>
<transmission control stt> ::= <set data length stt>
| <extensive changes follow stt>
| <end of extensive changes stt>
<program stt group> ::= empty_string
| <program stt> <program stt group>
<program stt> ::= <picture control stt>
| <display stt>
| <transmission control stt>
<picture control stt> ::= <escape to device stt>
| <escape to highest coordinate system stt>
| <restore coordinate system stt>
| <mark stt>
| <null stt>
| <line mode stt>
| <set intensity stt>
| <subpicture declaration>
| <simple instance stt>
| <full instance stt>
| <set character size stt>
<display stt> ::= <move absolute stt>
| <move relative stt>
| <draw absolute stt>
| <draw relative stt>
| <dot absolute stt>
| <dot relative stt>
| <move to mark and pop stt>
| <draw to mark and pop stt>
| <text and restore beam stt>
| <text stt>
| <text out stt>
<new picture stt> ::= ERASE
<end picture stt> ::= ENDPIC
<subpicture header stt> ::= SUBHED <identifier> <count> <header info>
<header info> ::= 80-hex | 40-hex | C0-hex
<subpicture end stt> ::= SUBEND
<set viewport stt> ::= SETVW <viewport id> <x coordinate>
<y coordinate> <x delta> <y delta>
<add subpicture to viewport stt> ::= ADDSVW <identifier> <viewport id>
<clear viewport stt> ::= CLVW <viewport id>
<extensive changes follow stt> ::= DELAY
<end of extensive changes stt> ::= NODELAY
<escape to device stt> ::= ESCDEV <device code> <string>
<escape to highest coordinate system stt> ::= ESCTOP
<restore coordinate system stt> ::= RESLEV
<null stt> ::= NULL
<mark stt> ::= MARK
<line mode stt> ::= LINMOD <value>
<set character size stt> ::= SETCHS <x delta> <y delta>
<set data length stt> ::= SETDLN <value>
<move absolute stt> ::= MOVEA <x coordinate> <y coordinate>
<move relative stt> ::= MOVER <x delta> <y delta>
<draw absolute stt> ::= DRAWA <x coordinate> <y coordinate>
<draw relative stt> ::= DRAWR <x delta> <y delta>
<dot absolute stt> ::= DOTA <x coordinate> <y coordinate>
<dot relative stt> ::= DOTR <x delta> <y delta>
<move to mark and pop stt> ::= MOVEMK
<draw to mark and pop stt> ::= DRAWMK
<text and restore beam stt> ::= TEXTR <string>
<text stt> ::= TEXT <string>
<text out stt> ::= TEXTO <string>
<simple instance stt> ::= INST <identifier> <simple instance tail>
<full instance stt> ::= INSTF <identifier> <full instance tail>
<simple instance tail> ::= eight_bits_of_binary_0
| <count> <tail code> <as clause> <at clause>
<tail code> ::= bit_pattern_indicating_what_clauses_follow
<full instance tail> ::= eight_bits_of_binary_0
| <count> <tail code> <as clause> <at clause>
<rotation clause> <portion clause>
<uniform magnification clause>
<separate magnification clause>
<image size clause>
<complete transformation clause>
<as clause> ::= empty_string | <identifier>
<at clause> ::= empty_string | <x coordinate> <y coordinate>
<rotation clause> ::= empty_string | <angle>
<portion clause> ::= empty_string
| <x coordinate> <y coordinate> <x delta> <y delta>
<uniform magnification clause> ::= empty_string | <floating point number>
<separate magnification clause> ::= empty_string
| <floating point number> <floating point number>
<image size clause> ::= empty_string | <x delta> <y delta>
<complete transformation clause> ::= empty_string
| six <floating point number>s
Veri Türü Tanımları
Ek 2. Alt Resimler için Matematiksel Formüller
Dönüşümler
Bu ekte, bir mantıksal koordinat sistemindeki konumlar, /_ x y_/ biçiminde iki elemanlı bir satır vektörü ile temsil edilecektir. Vektörler ve matrisler bu garip parantezlerle sınırlandırılacaktır: /_ _/. Bir koordinat sisteminden diğerine dönüşümle ilişkili tam bir alt resim çağrısındaki parametreleri temsil etmek için çeşitli semboller kullanılacaktır; bunlar aşağıda tanımlanmıştır:
Mx ve My: Herhangi bir döndürmeden önce x ve y yönlerinde uygulanacak büyütmeler. Yansıtmayı göstermek üzere negatif olabilirler.
A: 0 ile 2π’den hemen küçük bir aralıkta bir dönme açısı.
/_ |cx |cy_/: alt resmin görüntüsünün (çağıran resimdeki) merkezi.
|sx |sy: çağıran sayfadaki görüntünün x ve y yönlerindeki yarı boyutları; çağıran sayfanın koordinat sistemi cinsindendir. Yansıtmayı göstermek için negatif olabilirler.
/_ x y_/: çağrılan sayfadaki bir konum.
/_ |x |y_/: /_ x y_/’ye karşılık gelen, çağıran sayfadaki konum.
/_ Pcx Pcy_/: çağıran sayfaya eşlenecek olan çağrılan alt resmin koordinat sistemindeki bölümün merkezi. Belirtilmezse varsayılan olarak /_ 0 0_/ alınır.
Psx ve Psy: eşlenecek alt resim bölümünün x ve y yönlerindeki yarı boyutları. Belirtilmezse her ikisi de varsayılan olarak +1/2’dir.
(Bir uniform büyütme belirtilirse, Mx ve My buna eşitlenir ve aşağıda belirtilmişler gibi devam edilir.)
Büyütme Belirtilmiş Dönüşümler
Büyütmeler belirtilmişse, aşağıdaki ilişki geçerlidir:
/_ |x |y_/ = (/_ x y_/ − /_ Pcx Pcy_/) *
/ Mx/Psx 0 \
\ 0 My/Psy /
*
/ cosA sinA \
\ -sinA cosA /
*
/ 1/2 0 \
\ 0 1/2 /
- /_ |cx |cy_/
Ya da başka bir deyişle:
1)
/_ |x |y_/ = /_ x − Pcx y − Pcy_/ *
/ Mx cosA / 2Psx Mx sinA / 2Psx \
\ −My sinA / 2Psy My cosA / 2Psy /
- /_ |cx |cy_/
(1/2 çarpanı gereklidir; çünkü örneğin (x − Pcx) / Psx, bölüm içindeki x değerleri için −1 ile +1 arasında değişirken (yani |x − Pcx| < |Psx|), çağıran alt resmin koordinat sistemindeki görüntü yalnızca −1/2 ile +1/2 arasında değişmelidir.)
Görüntü Boyutu Belirtilmiş Dönüşümler
Büyütme yerine görüntü boyutu belirtilirse, aşağıdakini elde ederiz:
/_ |x |y_/ = (/_ x y_/ − /_ Pcx Pcy_/) *
/ 1/Psx 0 \
\ 0 1/Psy /
*
/ cosA sinA \
\ −sinA cosA /
*
/ |sx 0 \
\ 0 |sy /
- /_ |cx |cy_/
Ya da başka bir deyişle:
2)
/_ |x |y_/ = /_ x − Pcx y − Pcy_/ *
/ |sx cosA / Psx |sy sinA / Psx \
\ −|sx sinA / Psy |sy cosA / Psy /
- /_ |cx |cy_/
Genişletilmiş Biçimler
- ve 2) denklemlerindeki parantez içi nicelikler açıldığında şunları elde ederiz:
3a)
/_ |x |y_/ = /_ x y_/ *
/ Mx cosA / 2Psx Mx sinA / 2Psx \
\ −My sinA / 2Psy My cosA / 2Psy /
- /_ |cx − Pcx Mx cosA / 2Psx + Pcy My sinA / 2Psy |cy − Pcx Mx sinA / 2Psx − Pcy My cosA / 2Psy _/
3b)
/_ |x |y_/ = /_ x y_/ *
/ |sx cosA / Psx |sy sinA / Psx \
\ −|sx sinA / Psy |sy cosA / Psy /
- /_ |cx − Pcx |sx cosA / Psx + Pcy |sx sinA / Psy |cy − Pcy |sy sinA / Psx − Pcy |sy cosA / Psy _/
Özel Durumlar
Eğer A = 0 ise (döndürme yoksa), şunları elde ederiz:
4a)
/_ |x |y_/ = /_ x y_/ *
/ Mx / 2Psx 0 \
\ 0 My / 2Psy /
- /_ |cx − Pcx Mx / 2Psx |cy − Pcy My / 2Psy _/
4b)
/_ |x |y_/ = /_ x y_/ *
/ |sx / Psx 0 \
\ 0 |sy / Psy /
- /_ |cx − Pcx |sx / Psx |cy − Pcy |sy / Psy _/
Eğer bölümleme yapılmazsa (Pcx = Pcy = 0, Psx = Psy = 1/2):
5a)
/_ |x |y_/ = /_ x y_/ *
/ Mx cosA Mx sinA \
\ −My sinA My cosA /
- /_ |cx |cy_/
5b)
/_ |x |y_/ = /_ x y_/ *
/ 2|sx cosA 2|sy sinA \
\ −2|sx sinA 2|sx cosA /
- /_ |cx |cy_/
Buna ek olarak A = 0 ise, şunları elde ederiz:
6a)
/_ |x |y_/ = /_ x Mx + |cx y My + |cy _/
6b)
/_ |x |y_/ = /_ x * 2|sx + |cx y * 2|sy + |cy _/
Afin Dönüşümler
Elbette, tüm durumlarda /_ x y_/’den /_ |x |y_/’ye dönüşüm şu biçimde yazılabilir:
/_ |x |y_/ = /_ x y_/ * /_ 2’ye 2 matris / + / öteleme _/
Genel olarak, doğrusal bir dönüşüm ile bir ötelemeyi birleştiren dönüşüme afin dönüşüm denir.
İç İçe Seviyelerle Dönüşümler
İki afin dönüşümün bileşimi yine bir afin dönüşümdür. Nitekim, eğer:
/_ |x |y_/ = /_ x y_/ * /_ Mat1 / + / Tran1 _/
ve
/_ |x' |y'_ / = /_ |x |y_/ * (/_ Mat1 / * / Mat2 /) + (/ Tran2 / + / Tran1 / * / Mat2 _/)
ise, iç içe tam alt resim çağrıları varsa, herhangi bir seviyedeki verinin yalnızca bir kez dönüştürülmesi yeterlidir; bu da her iç içe geçme seviyesindeki tek-adımlı dönüşümlerin birleşimi olan dönüşümdür.
Her tam alt resim çağrıldığında (geçerli dönüşüm aşağı itildikten sonra), mevcut büyük birleşimi, bu özel alt resim çağrısı için olan afin dönüşümle birleştirerek yeni bir “büyük birleşim” afin dönüşümü hesaplanmalıdır.
İç İçe Seviyelerde Bölümler
Döndürme yoksa ya da yalnızca π/2’nin tam katları kadar döndürmeler varsa, çoklu bölüm seviyelerini uygulamak kolaydır. Sonraki iki paragraftaki tartışmada, π/2’nin tam katları dışındaki döndürmelerin bulunmadığını varsayalım.
Bir “büyük birleşim” afin dönüşümün izlenebildiği gibi, bölümlerin de büyük bir birleşimi izlenebilir. Her seviyede şu şekilde ilerlenebilir: geçerli büyük bölümün bir kopyası kaydedilir ve tek-seviyeli afin dönüşümün (alt resim çağrısında belirtilen) tersi kullanılarak, çağrılan sayfanın hangi dikdörtgeninin, çağıran sayfadaki geçerli büyük bölüme karşılık geldiği belirlenir.
Bu dikdörtgen ile alt resim çağrısında belirtilen (ya da varsayılan) dikdörtgen arasında çeşitli ilişkiler olabilir. Ayrık olabilirler (bu durumda bu alt resmin hiç çağrılmasına gerek yoktur); eşit olabilirler (kolay bir durum); biri diğerini kapsayabilir ya da kısmen çakışabilirler. Herhangi bir kesişim varsa, bu bir dikdörtgen olacaktır ve bu dikdörtgen yeni büyük birleşim bölümü haline gelir.
π/2’nin tam katları dışındaki döndürmelerdeki sorun, dikdörtgenin ters görüntüsünün artık standart yönelimde (dikey ve yatay kenarlar) olmamasıdır. Bu da, alt resim çağrısında belirtilen bölümle kesişiminin (boş değilse) 3, 4, 5, 6, 7 veya 8 kenara sahip olabileceği anlamına gelir. Daha derin seviyeler, döndürmeler de içeriyorsa daha da karmaşık hale gelebilir. Böyle bir durumla çalışmakta (bazıları için) kavramsal bir zorluk olmayabilir; ancak basit yatay ve dikey kenar durumuna kıyasla çok daha fazla hesaplama gerektirir.
Bu protokol, π/2’nin tam katları dışındaki döndürmelerin bölümlerle birlikte kullanıldığı durumda herhangi bir öneri sunmaz. Daha basit durumda, iç içe bölümlerin yukarıda açıklanan şekilde ele alınmasını önermektedir.
Bu RFC, çevrimiçi RFC arşivlerine kaydedilmek üzere Helene Morin tarafından, Via Genie, 12/1999 tarihinde makine tarafından okunabilir biçime dönüştürüldü.