--UnifiedFonts.mesaUnifiedFontInterface--MichaelPlass,October21,19821:06pmDIRECTORYRope,Graphics;UnifiedFonts:CEDARDEFINITIONS=BEGINROPE:TYPE=Rope.ROPE;Context:TYPE=Graphics.Context;ThisinterfaceisdesignedtobeusedinconjunctionwithCedarGraphics,andperhapssomedayitwillbecomeintegratedwiththatpackage.FONT:TYPE=REFFontRec;AFONTdescribesafont,thatis,acollectionofrelatedgraphicalobjects.Eachobject,orcharacter,inthecollectionisreferredtobyanindexoftypeCHARACTER.Therearevariousattributesofafontthatmaybeaccessedthroughthisinterface;someofthempertaintothefontasawhole,andotherspertaintotheindividualcharacters.ThisinterfaceisdesignedtobeusedinconjunctionwithCedarGraphics,andperhapssomedayitwillbecomeintegratedwiththatpackage.Theactualgraphicalobjectscontainedinafontmayormaynotbelocallyavailable.Forhardcopyapplications,theexactgraphicaldescriptionstypicallyresideattheprintserver,andcannotbeassumedtobeavailable.Ontheotherhand,thegraphicaldescriptionsforfontstobeusedonthescreenmustbelocallyavailable.Inanycase,somesortofreasonableapproximationisattemptedforlocaluse.Afontisideallyavailableinallsizesandrotations;however,notallprintserversarecapableoflivinguptothisideal.Therefore,amechanismisprovidedforfindingoutwhattransformationsareavailable(easy)forafontonaparticular(kindof)outputdevice.TheassociationbetweenCHARACTERcodesandtheimagesisoftenjumbled,duetohistoricalreasonsandthenaturalslownessinthepropagationofstandards.Asasteptowardsuntanglingthismess,thisinterfaceprovidesawaytofindouttheXeroxCharacterCodeforacharacterinagivenfont,andviceversa.FromName:PROCEDURE[fontName:ROPE]RETURNS[FONT];Thisgetsatleastthefontmetricinformationfromacentralizeddatabase.ThefontnameisanInterpresshierarchialfontname,andencodesallofthefamily,face,anddesignsizeinformation.Thefontwillbeinasizedesignedforone-unitbaselinespacing,whichisprobablynotrightformostapplications.Name:PROCEDURE[font:FONT]RETURNS[fontName:ROPE];Thisextractsthenameofthefont.MayreturnNILifthefontisunnamed.Transformation:TYPE=RECORD[m11,m12,m21,m22:REAL];ATransformationspecifiesthematrixforthelineartransformationusedtoscale,rotate,andskewfonts.ScaleandRotateareusefulforbuildingupthemostcommontransformations.Rotate:PROCEDURE[transformation:Transformation_identity,degrees:REAL]RETURNS[Transformation];Scale:PROCEDURE[transformation:Transformation_identity,magnification:REAL]RETURNS[Transformation];identity:Transformation=[1.0,0.0,0.0,1.0];ModifyFont:PROCEDURE[font:FONT,transformation:Transformation];Thisappliesthegiventransformationtothefont,tomakeitbethedesiredsizeandorientation.Thisisequivalenttoapplyingthetransformationtothedisplaycontextbeforethecharactersaredisplayed.1pî ìïaïî •î îáî#Ûqî ìï^ˆî cî°îoî½îúî@î"Orî ìï[ûqî:ï[ûîCï[ûîGî ìïYn rîØïYnî¢ïYnîR qîXïYnrî ýïW´î ýïUúqîïUúrî ïUúîÅïUúqîcïUúîHïUúrîÐïUúî¤ïUúqîáïUúî ýïTArî®ïTAîgïTAqîïTAîêïTAsî ýïR‡î î—îîtîîèî!ùî#Ÿ î*èî-ä î7`î:î>ùîDiîEÁî ÐïPàîœ îíîéî»pî ýïNRqîÎïNRrîÌïNRî…ïNRqî#ïNRrîïNRîÜïNRqî¸ïNRî ïNRsî ýïL™î îîî”îÉîóîÅî ‰î!½ î'Ëî)oî-áî3Éî9î<—î@ÞîB— î ÐïJòîvî îÐî<î<îáî »î"¯î&gî( î*ï î5Fî9)î;}î@% îFîGÁî ÐïIJî¢îtîdî4î�î!�î$5 î*9î-£î/Fî2¨î7>î8ãî;/î>î?ºî@ïîEî ÐïG£îÕîkîî\ î” î ýïEéî î—îîtîîèî!ùî#Ÿ î*èî-ä î7`î:î>ùîDiîEÁî ÐïDBîœ îíîéî»î ýïBˆîÀîÐî¸î+î#Fî$ìî&!î(óî+ãî-œî0Œî2ðî4¿î9 î?�îB%î Ðï@á î–îâîƒî k î'¸î-î0óî2˜î4äî8/î¡î@qîC�îEtî Ðï=’îìî8îîV î ×î"µî%Nî(•î+þî.¬î0O î6õ î?òîA^î Ðï;ëîøî>î ýï:1î îQî½î î±îWîRî"wî% î+4î0ºî3î5î8cî<Éî?îCüîEŸî Ðï8ŠîÁîfîÿî" î›îÏî%Èî'4î,—î.¿î3Vî5¸î9îB�î Ðï6ãîuîaî‰î½î�îƒî· î%äî)zî+—î/Öî ýï5)îÀ îŸîºî$5î'Ôî*wî,Ãî1Aî2¬î6î;Šî>î?¼ î Ðï3‚î›î?î‹îCî ¨î"Nî$š î,î-« î4‰î6�î7Äî:ˆî?} îFBî Ðï1Úîfîÿî‰îÀîôî!¶î#[î& î(�tî*Îï1Úî+Ëï1Úî.ñî5\sî8äï1Úî9Sï1Úî; îºîA[ îáï(�î¥îwî îÛî�î¶îWî#Èî%ðî+Fî0jî5™î9|î:çî@kîBÎîFîáï&öî uî ýï$iqîzï$irîxï$iîï$iqîï$iîyï$irîáï$iîšï$iqîï$irîÿï$iî Óï$iqî%ñï$iî&Tï$irî-Sï$iî.'ï$iqî0dï$iî0Çï$isîï"¯îî9î…î)îÌî î#Çî&õî+ î..î/„î1Ñî4£î6pî ýï " qî ï "rî ï "îÃï "qîaï "rîFï "îï "qî"žï "î#ï "î&hî)Ïî-6rî0¾ï "î1’ï "qî3Øï "î4;ï "sî ýïhî  îîQî�î#î%.î'zî+S î4kî7|î9 î<ÊîAîC«î ÐïÁtîïÁî[ïÁsî>ïÁîîïÁtîáïÁîßïÁsî\ïÁî ïÁî°î!Ÿî#Çî)î*òî->î0}î5èuî ýï4qîÿï4rîüï4î¤ï4qîšï4îþï4î"» î,wî.î3hrî8Öï4î9ªï4qî;ïï4rî<×ï4î=«ï4qî1ïŒuî ýïÿqî8ïÿrî6ïÿîÝïÿqîÔïÿî7ïÿî!ô î+°î-=î2¡ rî;¹ïÿî<�ïÿqî>Òïÿrî?ºïÿî@Žïÿqî1ïXî ýïÊî‚ î>î#î î"°î%Euî ýï= qî ï=rî ï=î²ï=qî¨ï=î ï=rîsï=î ,ï=qî"ªï=î#‡ï=î-Dsîï ƒîî™îåîq î$‰î&.î(zî+¤î-Iî0öî2Mî4î6iî:ðî=‘î@5 îáï Üîñî] îÄîiî Ùî#% î,=î-âî0.î4´î9„î=’î?Þ îFMîáï 5 vî)Èïöÿ VTVm$fCurrentTransformation:PROCEDURE[font:FONT]RETURNS[transformation:Transformation]=INLINE{RETURN[font.currentTransformation]};Usefulforfindingouthowthefonthasbeentransformed.DeviceType:TYPE=ROPE;Tellswhatkindofdevicetotailortheeasytransformationsfor."Ideal"asadevicetypewillallowanytransformation.ThenameofaprintservermayfunctionasaDeviceType,whentheimplementationissmartenoughtoallowthis.EasyTransformations:PROCEDURE[font:FONT,deviceType:DeviceType,transformationProc:TransformationProc];TransformationProc:TYPE=PROCEDURE[transformation:Transformation]RETURNS[quit:BOOLEAN_FALSE];anyTransformation:Transformation=[0,0,0,0];EasyTransformationsenumeratesthetransformationsofthefontthatareeasyonthespecifieddevice.Ifanytransformationisallowed,anyTransformationwillbeincludedinthelistofeasytransformations.Thetransformationsareallexpressedrelativetothefontascurrentlymodified.SubstituteForDevice:PROCEDURE[font:FONT,deviceType:DeviceType,transformation:Transformation];Changesthefonttoonethatisavailableonthespecifieddevice.Anattemptwillbemadetomakeareasonablesubstitution.Contains:PROCEDURE[font:FONT,char:CHAR]RETURNS[BOOLEAN];TRUEiffthecharacterexistsinthefont.NSCode:PROCEDURE[font:FONT,char:CHAR]RETURNS[nsCode:INT];unassignedNSCode:INT=255;nonexistentNSCode:INT=65535;ReturnstheNetworkSystemscodeforthespecifiedcharacter;unassignedNSCodeisreturnedforcharactersthathavenosuchcodeassigned,andnonexistentNSCodeisreturnedforcharactersthatdonotexistinthefont.CharCode:PROCEDURE[font:FONT,nsCode:INT]RETURNS[char:CHAR];ReturnstheCHARACTERcodeforthespecifiedNetworkSystemscode;NULisreturnedforcharactersthatdonotexistinthefont.DrawChar:PROCEDURE[font:FONT,char:CHAR,context:Context];DisplaysasinglecharacterthroughGraphics.FontMetricsFontMetricCode:TYPE={xHeight,slant,underlineOffset,underlineThickness};GetFontMetric:PROCEDURE[font:FONT,characterMetricCode:CharacterMetricCode]RETURNS[REAL];CharacterMetricsCharacterMetricCode:TYPE={widthX,widthY,leftExtent,rightExtent,descent,ascent,centerX,centerY,superscriptX,superscriptY,subscriptX,subscriptY};GetCharacterMetric:PROCEDURE[font:FONT,characterMetricCode:CharacterMetricCode,char:CHAR]RETURNS[REAL];Kern:PROCEDURE[font:FONT,char1,char2:CHAR]RETURNS[REAL];Returnstheamounttoaddtothecharacter'swidthtokernthischaractertothesuccessorcharacter.2uî ýïb&qîÅïb&rîÃïb&îjïb&qî"aïb&î"Äïb&rî&,ïb&î&åïb&qî)cïb&rî*Jïb&î+ïb&qî0;ïb&î0Ÿïb&î:\îD{rî1ï`qîHï`rîøï`qîàï`îCï`sîï^ÁîTî|îîtîMî ™î#kî%áî) pî ýï\0 qîQï\0rîOï\0îï\0qî¦ï\0rî‹ï\0î_ï\0qîœï\0sîïZrî_î¨îÆîiîmîî"±î$ýî'÷î1“î4—î9vî;/îšîBîáïW$ î_îËîŽî"Fî#ëî'~uî ýïT’qî�ïT’rîŽïT’î5ïT’qî!,ïT’î!�ïT’rî$÷ïT’î%°ïT’qî(.ïT’î) ïT’ î0Ì î8Æî1ïRëuîïPZqîïPZrîïPZîÉïPZqîgïPZrî LïPZî óïPZqî'êïPZî(MïPZî2 rî<*ïPZî<þïPZqîBïPZîB~ïPZrîBïN³qîLïN³rîÙïN³î’ïN³qîwïN³îÚïN³îïLõîa î$î&î'òî)î+ tîïK7sîïK7î«ïK7î"î$lî.î/«î1÷î4Êî7›î9ïî<èî>ÜîA(îáïI�îÁîOîè î!î"ktî'¡ïI�î(RïI�sî3MïI�î45ïI�î5âî7²î=î>´îAîC?îDãîáïGéîÖî™î%5î'‰î)„î/Žî4Nî5òî8?î;î<ÊîB€uî ýïEWqî"ïEWrî ïEWîÇïEWqî ¾ïEWî!!ïEWrî$‰ïEWî%BïEWqî'ÀïEWî(�ïEW î0_ î8Xî1ïC°sîïAóî‹îØîªîOîÝî®î!î&¿î(²î*þî0mî5Mî7Žîï=ºrî;ï=ºîãï=ºqîÙï=ºî=ï=ºrî¤ï=ºî]ï=ºqî Ûï=ºî!¸ï=ºrî%Aï=ºî& ï=ºqî(šï=ºrî)�ï=ºî*Uï=ºqî/rï=ºrî/Õï=ºqî5vï=ºî5Ùï=ºsîï;üî~îCî�î{î =î!âî$/uî ýï9kqîñï9krîïï9kî—ï9kqî�ï9kîðï9krîXï9kîï9kqî �ï9kî!lï9krî$õï9kî%Àï9kqî(Nï9krî)5ï9kî* ï9kqî/&ï9kî/‰ï9krî4÷ï9kî5aï9kqî7ï9kî7fï9kîï7®rî�ï7®îï7®qîï7®îøï7®îï5ðrîêï5ðîTï5ðqî`ï5ðîEï5ðsîï42îîkîñî !î#<î%dî'°î- tî3ƒï42î4?ï42sî?fï42î?Éï42î@ÑîF0îáï2‹ îQî"îJî=î Zî#uî)'tî+Ëï2‹î,†ï2‹sî8ï2‹î8ï2‹î9ˆî>æîA îáï0äî³î˜îûî9îßî+uî ýï.Sqîäï.Srîâï.SîŠï.Sqî€ï.Sîãï.SrîKï.Sîï.Sqî!‚ï.Sî"_ï.Srî'Íï.Sî(7ï.Sqî)Øï.Srî*Àï.Sî+”ï.Sqî0±ï.Sî1ï.Srî4�ï.Sî5hï.Sqî7öï.Sî8Yï.Ssîï,•îwîkï,•î6ï,•sîï,•î›ï,•î î"Cî$�î)þî/„î4´î8Hî;æî=RîB°îáï*î îQî"îîkî©î!Oî#›uî ýï(\qîï(\rîï(\îµï(\qî¬ï(\îï(\rîwï(\î0ï(\qî!®ï(\î"Šï(\rî&ï(\î&Þï(\qî)lï(\î*Hï(\î/–sîï&Ÿî{î°î‰îtî#ƒtî ìï#3î 2qî ýï Sîåîî÷î#Cî&áî1 uî ýï qîïÂrîïÂî­ïÂqî¤ïÂîïÂrî!oïÂî"(ïÂqî$¦ïÂî%‚ïÂî2örî@·ïÂîA‹ïÂqî1ïrî”ïîhïqî­ïîïtî ìï®îXqî ýïÏîÔîîæî%Ùî+ î1Ê î9Uî>˜îCî1ï(îµ î  î(p î/¤ uî ýï—qîï—rîï—î½ï—qî ´ï—î!ï—rî$ï—î%8ï—qî'¶ï—î(’ï—î6îC¼rî1ïïqî‰ïïrîqïïîEïïqîbïïrîÅïïqîßïïî Bïïuî ýï ^qîáï ^rîÞï ^î†ï ^qî|ï ^îàï ^rîGï ^îï ^qî~ï ^î[ï ^î#srî'­ï ^î(xï ^qî+ï ^rî+íï ^î,Áï ^qî1Þï ^rî2Aï ^qî5[ï ^î5¾ï ^sîï ¡îîkîRî÷îŒî 1î"} î)Eî,ñî.–î1¿î4Wî:Bî;çî>3îáï ù vî)ÈïöôTVm$cLigature:PROCEDURE[font:FONT,char1,char2:CHAR]RETURNS[CHAR];ReturnsNULifthereisnoligatureforthetwocharacters.DerivedCharacterMetricsThefollowingproceduresaccesssomemetricsthatareusefulwhenthefullgeneralityoftheGetCharacterMetricprocedureisnotneeded.Accessthroughtheseprocedureswillbespeedierthanthroughthegeneralmachanism.Width:PROCEDURE[font:FONT,char:CHAR]RETURNS[REAL];Returnsthemagnitudeofthewidthvector.PosExtent:PROCEDURE[font:FONT,char:CHAR]RETURNS[REAL];Returnsthemagnitudeofthemaximumextentofthecharacterinthedirection90degreescounterclockwisetothewidthvector.ForunrotatedLatinalphabets,thisistheInterpressascentortheTEXheight.NegExtent:PROCEDURE[font:FONT,char:CHAR]RETURNS[REAL];Returnsthemagnitudeofthemaximumextentofthecharacterinthedirection90degreesclockwisetothewidthvector.ForunrotatedLatinalphabets,thisistheInterpressdescentortheTEXdepth.PressCompatibilityStuffPressFontSpecification:TYPE=RECORD[family:ROPE,face:PressFontFace,size:INTEGER,rotation:INTEGER];PressFontFace:TYPE=[0..256);GetPressFontSpecification:PROCEDURE[FONT]RETURNS[PressFontSpecification];ImplementorPrivateStuffFontRec:TYPE=PRIVATERECORD[name:ROPE,currentTransformation:Transformation,bc,ec:CHAR,nsCode:NSCodeRec,--somestuffgoeshereforWidth,PosExtent,NegExtent,Kern,andLigature.DrawCharProc:PROCEDURE[font:FONT,char:CHAR,context:Context],data:REFANY];NSCodeRec:TYPE=PRIVATERECORD[code:SEQUENCElength:NATOFCARDINAL];END.INLINEbodiesaredownheretoavoidclutteruntiltheinterfacelooksright.Contains=INLINE{RETURN[NSCode[font,char]#nonexistentNSCode]};NSCode=INLINE{RETURN[IFchar>=font.bcANDchar<=font.ecTHENfont.nsCode[char-font.bc]ELSEnonexistentNSCode]};CharCode=INLINE{RETURN[IFnsCode<255ANDNSCode[font,0C+nsCode]=nsCodeTHEN0C+nsCodeELSEFindCharCode[font,nsCode]]};3uî ýïb&qîïb&rîïb&î¬ïb&qî£ïb&îïb&rînïb&î'ïb&qî ¥ïb&î!�ïb&î%šrî)Óïb&î*žïb&qî-,ïb&rî.ïb&î.çïb&qî4ïb&rî4hïb&qî7Àïb&î8#ïb&sîï`}îî¾îîîëîÞî#Õî%ýî(Iî*Õ tî ìï]+îîmsî ýïZgîÀî” îDîRî"»î'gî*9î,�î0|î3þî6Jî8À î>ùî@�î ÐïX¿îî4î  î#î(Tî,¯î1¾î5* î;Ùî>oî@>îE_î ÐïWîàî,îí uî ýïT›qî¦ïT›rî¤ïT›îKïT›qîBïT›î¥ïT›rî ïT›îÆïT›qîDïT›î !ïT›rî#ªïT›î$uïT›qî'ïT›rî'êïT›î(¾ïT›qî-ÛïT›rî.>ïT›qî1XïT›î1»ïT›sîïRòîîkîî¤îðî#œuî ýïPuqî%ïPurî"ïPuîÊïPuqîÀïPuî$ïPurî‹ïPuîDïPuqî!ÃïPuî"ŸïPurî&(ïPuî&óïPuqî)�ïPurî*hïPuî+<ïPuqî0YïPurî0½ïPuqî3ÖïPuî49ïPusîïNËîîkîî¤îðî&Mî*mî,î.]î4Hî5îî8:î=Îî?³îáïM$î5îÚî&î Òî%©î(>î.Nî2 î8Uî:îî¦ îDëîáïK|îšîæîÎïK6îÁïK|îCuî ýïHÿqî\ïHÿrîZïHÿîïHÿqîøïHÿî[ïHÿrîÃïHÿî|ïHÿqî!úïHÿî"ÖïHÿrî&`ïHÿî'+ïHÿqî)¸ïHÿrî* ïHÿî+tïHÿqî0‘ïHÿrî0ôïHÿqî4ïHÿî4qïHÿsîïGVîîkîî¤îðî&Mî*mî,î.]î4Hî5îî8:î=Îî?³îáïE¯îßî„îÐî}î!Sî#èî)øî-² î3ÿî6˜î8î:P î@•îEMîGîáïDîÉïCÁî¼ïDî>tî ìï@¶î   îuî ýï=ñqî®ï=ñrî«ï=ñîdï=ñqîï=ñrîèï=ñî »ï=ñqî%?ï=ñîï