; ; File: TextEditPatchIIciROM.a (formerly TextEdit67cFix.a) ; ; Contains: TextEdit patches for inclusion in PatchIIciROM.a ; ; Written by: SMB Sue Bartalo ; YS Yishai Steinhart ; ; Copyright: © Apple Computer, Inc. 1990-1992 all rights reserved. ; ; This file contains the patches for TextEdit on ROM version $7C of Machine type $06 (the IIci). ; This file is included in PatchIIciROM.a. ; ; Change History (most recent first): ; ; <51> 8/11/92 SMB #1036481 : Removed font/keyboard synchronization for ; Roman-only systems. It's unnecessary and slows things down! ; <50> 7/15/92 SMB ## : Renamed DoText selectors: teMark is now teHighlight and ; teLoc is teCaret. ; <49> 7/8/92 PKE Fix up previous comment (I was too quick with the Return key). ; <48> 7/8/92 PKE #1035214 : We would like to fix DoSearch so that it always ; exits by calling FreeFmtOrderArray at exit, which will dispose ; of any fmtOrdering handle and clear ExpandMemRec.emFmtOrderHFlag ; which says that the handle is valid. This will prevent ; subsequent calls from thinking they have a valid handle before ; they actually allocate one. However, this fix is too risky; so ; instead we modify DoText to always clear the flag so that no ; routine thinks it has a valid handle when it doesn't. The more ; correct fix is in TextEdit.a. ; <47> 7/7/92 PKE #1030684 : TEGetPoint failed in unstyled multiline text if ; a R->L script was present because in this case DoMeasure ; measured from the beginning of the buffer, not the beginning of ; the current line. Fixed. ; <46> 6/23/92 SMB #1029263,: Now checking the script's 'itlb' flags to ; determine if the keyboard and font should be synchronized. ; <45> 4/27/92 DTY Get rid of hasSplineFonts conditionals. ; <44> 4/3/92 YS #1025998, in TextBox, when trying to find the right line highet ; in systems that use associated font (see <43>), saving and ; restoring of the font saves a LONG (instead of a word) creating ; the problem of loosing the port font. Another connected problem ; was the way Script Manager handeld those privete verb calls in ; the roman. This was fixed in the Script Manager. <44-YDS-4/2/92> ; <43> 2/6/92 YS #1014691, Cube-E, In the old days, the Hebrew/Arabic extention ; used to calculate the highet of a script font as Max(script font ; size, associated font size). The problem with that is that if ; you use style runs, like styled TE & WP's, you can't get the ; real size of of a script font, and you allways have the ; associated font size in it. The universal one byte init no ; longer handles it. TE will calculate it itself if it is: 1) ; unstyled text. 2) script font. 3) Has associated font (other ; then 0). In this file we do a 'come from' patch to GetFontInfo, ; one patch is from TextBox and the other is from GetSize ; <43-YDS-2/6/92> ; <42> 2/4/92 YS #1015382, Cube-E, don't redraw the whole line for a left 2 right ; system when justification is teForceLeft. <42-YDS-2/5/92> ; <41> 1/30/92 YS #1018683, Cube-E: TextBox should handle #teForceLeft correctly ; and not set it to #teJustLeft allways. Had to add a ptchTextBox ; for that. <41-YDS-1/30/92>. ; <40> 1/13/92 PKE #1019673, Bruges: Unstyled TE should not sync the keyboard at ; all for smEastEurRoman script. ; <39> 12/17/91 PKE #1017647: Fix keyboard synchronization in unstyled one-byte ; non-Roman text. For bidi scripts: don't synchronize control ; chars and L-R numbers, set keyboard to Roman for other L-R ; chars, and sync keyboard to font for R-L chars. For other ; scripts: sync keyboard to font for script letters, set keyboard ; to Roman for Roman letters, and don't sync anything else. ; <38> 12/12/91 DCL #1009157: Changed a Tst to Tst.b so as not to test the potential ; garbage in the other byte. Changed procedure noClickProc in ; TextEdit.a, StyledTextEdit.a, and TextEditPatchIIciROM.a ; <37> 11/12/91 SMB #1014705 - for CubeE and Bruges - Keyboard and font synch'ing ; isn't correct for punctuation and numbers: TE allows a Roman ; keyboard & a non-Roman font combination for ascii characters and ; european characters (or high ascii chars.) and it should also ; allow this for numbers and punctuation marks. This was reported ; against the Eastern European systems. Actually, this code will ; be optimized to only allow this unsynchronized state for 2-byte ; text. See ClickKeyboard2Font. Also fixed the synchronization of ; unstyled text cases in TEClick and TEKey. ; <36> 9/30/91 YS Used to syncronize the keyboard wrong for L->R scripts ; (unstyled) when was backspacing a selection (and not a single ; delete), d6 wasn't set up corectly. use teSelStart(a3) instead. ; (bug #1013159) <36-YDS-10/1/91> ; <35> 9/23/91 PKE For Cube-E (and Bruges): If non-Roman scripts are installed, ; TEInit should no longer set TESysJust to its idea of system ; default, since users can now set the default. Also: Define ; forLocalizability here if it is not defined in BBSStartup. ; <34> 9/13/91 YS Moved in 6.1 fixes for a Localizable 7.0.1 (forLocalizability) ; <34p> Fix the wrong placment of the caret for one blinking cycle ; when changing a language and typing a char. (bug #1006971) ; <34p-YDS-9/2/91> <34o> Fix the problem of the arrow keys not ; functioning in a L->R system, with line direction R->L (bug ; #1007934) <34o-YDS-9/2/91>. <34m> when backspacing, synch the ; keyboard to the right language even for unstyled (single byte ; only). (bug #1006972) <34m-YDS-9/2/91> <34l> Fix the Big cursor ; bug, this is NOT the old big applelink cursor bug (fix YSD ; <3.1>). In the case where the cursor is on a line start, we used ; to fall into the single caret code ; (but we didn't have any split caret !!!), so while switching ; the cursor rect's for a single caret, we used to garbage the ; selRect. so, we now test ExpandMemRec.emTwoCursorsFlag in this ; case to avoid it. (bug #1007065) <34l-YDS-9/2/91> ; <34k> Fix TEGetPoint for styled TE for R->L scripts, used to asume ; that if we are on a begining of a style run, the width is 0, and ; if we are on the end, we should TextWidth all of it, which is ; not true for R->L scripts. (bug #1007067) <34k-YDS-9/2/91> ; <34j> Added support for a single caret while handling an Arrow (left ; or right) key, for styled L->R text. have to change the Keyboard ; in a different way to support the corect display of a single ; caret. <34j-YDS-9/2/91> ; <34i> Fix DoMeasure for Right to left text in unstyled TE, in order to ; support fix for unstyled, use _Pixel2Char instead of ; MeasureIt. <34i-YDS-9/2/91> ; <34h> Fix TEGetPoint Bug for Right to left text, use DoMeasure ; instead of MeasureIt. <34h-YDS-9/2/91> ; <34g> Synch Keyboard to click even with an unstyled TE record, ; this is not only a nice thing to do, but very importent when ; handling a single cursor on a bi-direction script, if we ; would like your single-split carret to be displayed ; correctly. <34g-YDS-9/2/91> ; <34f> when click on script boundry, take care of the next cursor ; update, has to do with the split carret stuff. This was fixed ; in SetKeyboard2Font and ClickKeyboard2Font.<34f-YDS-9/2/91> ; <34e> find where the click was (to define the right script).<34e-YDS-9/2/91> ; <34d> Support for a single carret, this supports the styled ; TE part.<34d-YDS-9/2/91> ; <34c> Added support for a single carret, it will expand & shrink ; the the right part of a cursor to show only "one" cursor, ; depending on the language, so we will gwt a moving cursor ; (when switching scripts). this supports the unstyled TE part.<34c-YDS-9/2/91> ; <34b> using the byte after the TwoByteCharBuffer in teDispatchH for ; fixes <3.3> and <3.4> (lastScript), so change the place it clears ; so only a word will cleared there.<34b-YDS-9/2/91> ; <34a> Fixing Hebrew/Arabic AppleLink bug that causes a big cursor: ; the right way! this fix is in alot of places. <34a-YDS-9/2/91> ; ; ; ; <33> 4/3/91 SMB jdr,#86089: (also, pke) Fixing appl-crashing bug in ; NewRomanFindLine - should be clearing the high word of d0 before ; doing a long operation. Shows up when applications use ; TEHitTestHook and have multiple styles on a line. ; <32> 2/14/91 SMB pke,#70628: Unfortunately, forced to remove support for Forward ; Delete that was added in <19>. Conditionalizing it out so it can ; be added again later. See <32>. ; <31> 2/14/91 SMB pke,#82817: After Dark and Chooser string clipping bug - ; NewRomanFindLine's dependency on _NPixel2Char takes into account ; the caret width when determining linebreaks. This 1 pixel ; difference caused strings that were 1 pixel too long to no ; longer completely display since the linebreak occured in a ; different place. The problem was that the measurement occured on ; the character boundary (after the final character of the string) ; and the leading edge value returned was F. TextEdit deals with ; these results by backing up one character to guarantee that all ; characters completely display when drawn. In the case of calling ; _NPixel2Char this is not necessary since it will still return ; the correct results and TextEdit will behave correctly based on ; these results. So, to fix this problem we no longer subtract one ; for the caret width before calling _(N)Pixel2Char. ; <30> 2/14/91 SMB pke,#68221: Completing the fix in TextBox to turn off ; PreseveGlyph before drawing in order to draw squished characters ; when their ascent or descent is larger than the font's metrics. ; This problem in TextBox can be demonstrated when an accented ; character appears in a dialog. The previous fix in <22> had the ; comefrom patch on _DrawText instead of _MoveTo although the rest ; of the patch was based on the MoveTo call. So, the patch was ; never executed since the address never corresponded to a ; DrawText call! Brain damaged! ; <29> 2/14/91 SMB pke,#DTS FT: Quit trashing a4 across Hook calls! ; <28> 2/11/91 SMB pke,#SMB-2/9/91-1: TextEdit didn't always erase characters when ; deleting them. Another symptom of this same bug is that TextEdit ; didn't line break at a CR. The problem was that when TE looked ; ahead for blanks at the end of a line in NewRomanFindLine, it ; skipped over blanks, CRs and any other character whose value was ; <=$20. Now it checks each breaking character for a CR and once ; found, forces a line break there. ; <27> 2/11/91 SMB jdt,#TEBug.ReCaLines: KanjiTalk bug fix in ReCalLines - need to ; back up 2 bytes for correct redrawing of double-byte text. ; <26> 2/11/91 SMB pke,#OYDBB002: Fixed the MathCad (application) bug in ; NewRomanFindLines by ckecking for a dummy style run at the end ; of the StyleRun array whose startChar = endChar. ; <25> 2/11/91 SMB pke,#SMB-2/10/91-1: TextEdit should be using the low memory ; TEDoText hook rather than jumping directly to the DoText patch! ; <24> 2/2/91 PKE KIP: Fix 606 build by renaming leftSide references in P2CFrame ; to leadingEdge in code that is only used if SysVers < $700. ; <23> 2/1/91 SMB pke,#HIG-JS-048,#81519,#82169: In NewRomanFindLine: testing for ; a blank at a line break before calling TE's FindWord routine. ; Fixed problem with styles in balloons: was comparing a final ; result to the linestart in d6, but it was modified for styles, ; so needed to compare to actual value saved in lineStart(a6). ; Fixed performance problem: change in algorithm caused unstyled ; TE to call TextWidth on the entire document (pinned to each ; lineStart) when determining line breaks. Major slowdown! Are now ; calling _NPixel2Char instead of _TextWidth & _Pixel2Char in TE's ; Pixel2Char routine (TEHitTestHook). Should make TE FAST(er)! ; Renamed leftSide to leadingEdge in P2CFrame and added ; WidthRemaining member (see TextEditPriv.a). ; <22> 1/22/91 SMB (pke) Re-fixing bug #68221. The previous fix required calling ; OutlineMetrics for the whole font in order to get an ascent & ; height in TextEdit. This wasn't acceptable due to reformatting ; problems. So, the code to support OutlineMetrics has been ; removed and we are now turning off PreserveGlyph before drawing ; in order to draw squished characters when their ascent or ; descent is larger than the font's metrics. GetFontInfo will ; still be used to get ascent & height, as in the past, and we ; will be backwards compatible although not pretty. ; <21> 1/20/91 SMB (csd) Fix incorrect calling of FindWord and FindLine when ; patching in ReCalLines and NewRomanFindLine. Must use the ; low-memory vectors to access the patches. Added a line in ; ptchRecalLines that was accidentally dropped (thereby causing ; some linebreaking problems…) ; <20> 1/18/91 SMB (pke) Fixed bug # 62963 - No longer preserving a3/a4 across ; DumpBuffer routine. Saving a3 caused a dangling ptr and it's not ; necessary to save a4. Also, added a call to DumpBuffer in ; TEDispose in case an app never calls TEIdle (which empties the ; buffer). Changed _NewHandle call in GetHandle to allocate the ; handle in the System heap in order to prevent orphaning the ; handle when an application quit without emptying the text ; buffer. • Also fixed a linebreaking bug in Pixel2Char - wasn't ; calling DoubleByte with the correct offset (was using the offset ; for the line not the offset w/in the whole text buffer thus ; far.) ; <19> 1/14/91 SMB (jdt) • Added ptchReCalLines for a KT bug: Only draw line in ; ReCalLines when wordRedraw is <1. • Fixed bug # 35646 (fixed for ; SS-6.0.4 and 6.0.5 in ptch0) - up-arrow key doesn't get to ; beginning of text. Had to add patches to PtToLine, DoFind, ; PinDisplay, PinA0Rect and the routines that called them: ; Refresh, Scroll, TEScroll, TEPinScroll. TEClick, TEKey, ; TEGetOffset, DefClikProc, DoDraw and DoHilite had to be updated ; to call these patched routines rather than the ROM routines. • ; Fixed bug #66732 & #57858: if the scrap handle parameter ; (newStyles) in SetStylScrap was NIL should do nothing and exit. ; (see ptchTEDispatch) • Fixed bug #58512: Must lock null scrap ; handle in InsRsrved before calling PstStylGuts since PstStylGuts ; expects to use the handle again after moving memory. Since ; InsGuts calls InsRsrved, patched InsGuts and the two routines ; that call it, TEInsert & TEStylInsert. • Fixed bug #77962: TE ; was determining line breaks by measuring words rather than style ; runs for a Roman-only system. This was causing drawing to be ; significantly different than the measuring when FractEnable was ; on or a scaled font was used. Rewrote code (now called ; NewRomanFindLine) to do the right thing! • fjs fixed bug #70628: ; adding forwardDeleteChar support in TEKey so that this function ; key on the extended keyboard works. • Fixed bug #67699: ; StdTxMeas did not detect overflow when measuring long lines, so ; the widths returned to TE in this case were small, causing TE to ; write all the text on one line. StdTxMeas was modified to keep ; the last count and width before the overflow. This info is used ; to call _Pixel2Char to get the correct character offset for line ; breaking. • Fixed bug #66900: TextBox did not clip text ; correctly for long words due to the incorrect use of _P2C's ; LeadingEdge flag. See changes in TE's Pixel2Char and ; ptchDoSearch. • Fixed bug #68221: did not calculate the ascent & ; descent of an outline font correctly if preserveGlyph is true. ; Now calling OutlineMetrics for this. See routine ; GetOutlineMetrics; the routines needing it (TextBox & GetSize) ; require a comeFrom tail patch on GetFontInfo. • Fixed Finder ; bugs #80728 & 75607: in StdEntry, for unstyled text, save the ; grafport's font info before setting the TERec's style info into ; the grafport. ; <18> 12/15/90 SMB (gbm) Added support for another gestalt selector, gestaltTE5, ; for the new TextWidthHook. ; <17> 10/30/90 SMB (PKE) • Fix text buffering bug: must preserve register a1 ; (ExpandMem ptr) around a call to SetFont2Keyboard. Also, moved ; code that dumps the buffer in SetFont2Keyboard after determining ; that synchronizing was necessary. Then, must test for an empty ; buffer in TEBufferText after the SetFont2Keyboard call and after ; a full buffer has been dumped. Using hasBufferingFix conditional ; for these changes. • Added TextWidthHook to dispatch table and ; the internal interface which uses the hook, TETextWidthHook to ; hook out the TextWidth calls to keep our developers happi(er)!. ; Renamed nTEWidthHook to ScriptChar2Pixel. Using hasTextWidthHook ; conditional for these changes. ; <16> 9/16/90 SMB Put GestaltTEciVersion proc and installation code back in. ; <15> 9/11/90 SMB Fix teCROnly bug that crashes the system: pre-incrementing ; caused us to compare one too many in the text and then the +1 to ; point beyond the CR caused the line breaks to be one off. Moved ; InlineInput test into TESetSelect instead of ClickKeyboard, ; since never want to call KeyScript while doing inline. If in ; Inline, then not hilighting to the EOLs anymore, only to edge of ; text (see InvrtRectangle). Modified highlighting code to ; highlight the middle rectangle line by line in order to call ; highHook for Inline. Fixed Hebrew/Arabic scrolling down bug - ; caused selRect's top & bottom values to be negative which caused ; a BIG caret to be drawn. Fixed in CaretInsideRun (revisited: ; must also bra if equal). ; <14> 8/14/90 DTY Changed into a linked patch. ; <13> 6/22/90 SMB NEEDED for SS-6.0.5, SIXPACK & 7.0: fixed Arabic line end bug ; for unstyled text, where the system slowed down because was ; reading off the end of the line starts. ; <12> 6/11/90 SMB NEEDED FOR SIXPACK & 7.0: Added Inline Input bit to ; TEFeatureFlag and support for it in ClickKeyboard2Font. ; <11> 5/29/90 DDG NEEDED FOR SIXPACK: Changed all the sixpack conditionals from ; six-point-oh-seven to six-point-oh-six. ; <9> 4/27/90 SMB NEEDED for SIXPACK - Fixed old bug for old FindWord: when using an ; application's teWordBreak routine must save d1! ; <8> 4/10/90 SMB NEEDED for 6.0.x, 7.0 and SS-6.0.5: Adding Scrolling Down bug ; fix that I erroneously omitted on 1/16/90! (see comment <3> ; below) ; <7> 3/20/90 SMB NEEDED for 6.0.5 and SS-6.0.4 - Added call to SetKeyboard2Font ; in TEKey (rather than DelGuts, see 1/23/90) for Script Systems: ; whenever backspacing over a script boundary the keyscript wasn't ; updated. Bug #59422. - Fixed TEFindWord for line breaking on a ; Roman-only system to branch for 'bge' to #teFromFind instead of ; 'bgt'. (Should have been in 1/23/90??) - In TEBufferText, must ; set d0 to the current position before calling SetFont2Keyboard ; (in case of a kbd change while buffering) ; <6> 2/18/90 SMB NEEDED for 6.0.5 - DoSearch didn't work correctly when the ; TEHitTestHook had been replaced. We needed to check a ; terminating condition when hooked out: the high word of d0 was ; set T if found a char offset. ; <5> 2/13/90 SMB NEEDED for 6.0.5 - Moved conditional test in ptchDelGuts. - ; Patched TEWidthHook in GetLRPosition, PixelWidths, and GetWidth. ; Also added nTEWidthHook and OldChar2Pixel. ; - Patched TEWidthHook in GetLRPosition, PixelWidths, and GetWidth. Also ; added nTEWidthHook and OldChar2Pixel. ; <4> 1/30/90 SMB NEEDED FOR SS-6.0.4 and 6.0.5 - ; 1/30/90 smb - Fix in TEKey so that when the current position is at a line end and ; the height of the current line is > the height of the next line, the ; down arrow will put the caret on the next line. Bug #53697. ; 1/30/90 smb -Decided NOT to fix bug 35646 for the IIci - up-arrow key doesn't get ; to beginning of text - since it wasn't very important and it would ; take a lot of patches in many routines to fix it. ; 1/29/90 smb - No longer call SetFont2Keyboard for ptchDumpBuffer. ; - Added patch to DoCaret to pin the caret in view when ; blanks exceed the edge of the view rect. ; 1/26/90 smb - Before synchronizing the font to the keybd, dump the text buffer: user ; could change the keyboard in the middle of buffering. (see TEBufferText and ; SetFont2Keyboard) ; 1/25/90 smb - Call HideCaret for up & down arrows to erase the old caret before ; setting teLftCaret in TEKey. Fixes bug #52887! ; - Fixed up arrow bug, #51967, that caused the caret to move up multiple ; lines according to the size of the largest font on the current line. ; - If zero width in DoSearch, want to branch ow this one pixel difference ; causes the caret to display on the wrong line ending. Roman fix. ; Bugs #58921,59247. ; 1/24/90 smb - Found bug in DoSearch where needed to setup a2 as current line again. ; 1/23/90 - Removed all equates and records since moved them into TextEditPriv.a. ; emt - Added humane scrolling (slower) to DefClikProc (also see TEClick). ; 1/23/90 - Changed FindWord branch for linebreaking to 'bge' instead of 'bgt'. ; - Added call to SetKeyboard2Font in DelGuts for Script Systems: ; whenever backspacing over a script boundary the keyscript wasn't ; updated. Bug #59422. ; - Reorg beginning of FindWord in order to be compatible with applications ; using incorrect char breaking algorithms for Script Systems. ; <3> 1/16/90 SMB NEEDED FOR 6.0.5 - Fixed bug in TEGetPoint, added double-byte ; buffer at end of dispatch record, fixed bug in r-to-l processing ; of caret that showed up when scrolling down. ; 1/8/90 SMB NEEDED FOR 6.0.4SS & 6.0.5: bug 58823, TEGetPoint returned ; incorrect values when there's no text in the TERec. • Using ; private space in TEDispatchRec for buffering of a double-byte ; char rather than using ExpandMem as a global buffer which can ; affect any active TE record. This fixes a bug seen in KanjiTalk ; (AppleShare)when an application uses two TE records. Buffering ; in one record can be dumped into the other record due to the ; global storage space not knowing which record it applies to. ; <2> 1/4/90 PKE NEEDED FOR 6.0.5 (smb's changes from SS-6.0.4b23 to SS-6.0.4f1): ; • Set the offset parameter to non-zero for StyledLineBreak for ; unstyled text. • In ptchTESetStyle and ptchTEGetPoint must pop ; TEDispatch's return address. • Added ptchHiliteMiddle and ; patched out more of OnSameLine and MeasureWidth to use this ; patched HiliteMiddle. Have to save d2! ALSO: Changed ; conditionals from (Scripts604 | SysVers >= $700) to (Scripts604 ; | SysVers >= $605). Updated header to BBS format. ; <1> 12/18/89 CCH Adding for the first time into BBS. ; BBS versions from here up: ;___________________________________________________________________________________________________ ; EASE versions below: ; <1.3> 12/14/89 smb Added ROMEndDoSearch jmp address since I left it off and broke ; the 6.0.5 build! ; <1.2> 12/11/89 smb More Arabic fixes: horizontal cursor movement now works at line ; ends. ; • In CursorMovement and GetStyleEnd had to pin the style run to ; the line end for correct position. ; • Need to use the high caret rectangle in TEKey rather than always ; using the teSelRect! ; • Added a new keyboard/font synchronization routine to be used ; when doing a hit-down which allows a Roman keyboard with a ; non-Roman font, specifically because KanjiTalk wants to enter ; Roman text from a Japanese font. ; • Fixed potential bug in TESetStyle: must test the doFont bit in ; the mode since it's possible for the mode to be an additive ; combination of styles. ; • Use application font for SetFont2Keyboard rather than system ; font. ; • Have to use emBufferPtr for a flag to indicate when I ; unsynchronize the font & keyboard in ClickKeyboard2Font. These ; will be used to keep SetFont2Keyboard from synchronizing the ; font & keyboard when trying to paste a character in this ; unsynchronized situation. ; • Also had to add a call to ClickKeyboard2Font from TESetSelect ; in order for horizontal cursor movement to work correctly in ; this new unsynchronized situation. ; • Fixed LR highlighting bug at line ends; in InvrtRectangle. ; • Unconditionalized code in VisibleLength to fix a LR line w/ ; R justification display bug. Mark was right! ; • Set flags in caret display code to indicate when in the middle ; of a style run but on a line end (see CaretInsideRun). ; • Fixed bug in {hit-down on,cursor movement to} a script boundary ; to set the keyboard to the preceeding style run rather than the ; succeeding one. (see calls to ClickKeyboard2Font). ; • In BufferChar & DumpBuffer backed up one offset posn to get ; previous style run for SetFont2Keybaord call. ; • Fixed problem with setting the boundaries in ChkBounds. Also set ; boundary in DoDraw based on WordRedraw rather than teSysJust. ; • Corrected test of teForceLeft in iTEGetPoint. ; • Fixed bug of a large cursor (#52888) due to RomanFindLine (really ; StylMeasure & P2C) incorrectly increasing the char count due to ; an invalid leftSide flag set in TE's P2C. This caused ReCalLines ; to read beyond the end of the line heights record. Fixed by ; setting a flag which said to ignore the leftSide flag if TextWidth ; did the measuring in P2C. ; <1.1> 11/21/89 smb Bug fix in FindWord for Chinese Script System: clear ; fwLeadingEdge flag! ; • Added updating of outlined region in TEUpdate. ; • Fixed TETrimMeasure to call VisibleLength at the appropriate times ; for unstyled text: LineRect uses the line direction and ; justification to determine when to call it. ; • Adding call to GetStylesInOrder in order to call VisibleLength ; for a line's style runs. We need to traverse the style runs in ; display order but backwards! ; • Fixed buffering bug in BufferChar & TEKey; must set emBufferLen ; non-zero when buffer the 1st byte of a 2-byte character. ; • Moved secondStyleRun and firstStyleRun from SharedFrame to ; FmtOrderFrame since TextFrame needs this info for XTrimMeasure ; changes. ; • Bug fix for buffering 2 byte text on Kanji! see DumpBuffer and ; TEBufferText. ; • Removed testing of LRTextFlag since it's based on WordRedraw. ; Will tst WordRedraw instead! ; • Not removing setting of LRTextFlag in GetFormatOrdering or ; teGetFormatOrder since it won't hurt. ; • Had to clear (a2) in iTEFeatureFlag so that the return result was ; set right for an initial state of clear (vs. set). ; • Fixed ptchTrimMeasure for unstyled TE. Also added test for ; unstyled TE in ptchGetNextDisplayStyle. Moved firstStyleRun and ; secondStyleRun to "top" of FmtOrderFrame. ; • In ptchTEGetPoint changed longs back to words as they were ; originally! ; • Bug in DumpBuffer for unstyled textEdit: screwed up stack since was ; popping the stack w/o doing the push! Now doing the push as well! ; • SecondStyleRun and firstStyleRun need to be above directionParam in ; the FmtOrderFrame! ; • Added @getStyleNew code for right-to-left directional scripts in ; ptchDoSearch. ; • Added a test in ptchGetRLPosition because when processing a CR ; entered at the EOD, the current line (a2) is the next line. This ; causes TE to look beyond the end of the lineStarts array. ; <1.0> 10/12/89 smb New file containing the TextEdit patches from PatchIIciROM.a. Is ; included therein. ;____________________________________________________________________________ ; To aid the historians, here is the recent history of TextEdit from PatchIIciROM.a: ; ; <7.7> 10/12/89 smb Moved TextEdit patches to TextEditPatchIIciROM.a. Fixed bug in ; old highlighting code that I introduced accidently (changed ; move.w -> move.l). ; <7.2> 10/5/89 smb Added old highlighting code for TextEdit for HyperCard ; outlining. ; <7.0> 10/4/89 smb Fixed 6.0.4 build by moving around some of my conditionals due ; to dependencies! Fixed TEInit to set TEDoText like it used to. ; Cleaned up TEOutlineHilite. Fixed caret display for outline ; highlighting. ; <6.8> 9/29/89 smb Added patches for TextEdit for TEFeatureFlag, SetFont2Keyboard, ; and fixed CursorMovement for double-byte characters. ; <5.5> 8/30/89 smb NEEDED FOR Scripts604 and Big Bang! Bug fix in ptchTEFindWord ; (fixed word dragging bug and now uses old FindWord code when ; RecalLines calls. Also added ptchMeasureWidth to fix a ; hilighting bug at line ends when the line direction is RL on a ; system that is normally LR (ie - Roman, Kanji, etc.) ; <4.2> 8/18/89 smb NEEDED FOR 6.0.4: Another unlocked handle problem! ; AAAARRRRRGGGGHHHHHH! (See ptchOnSameLine below) ; <3.8> 8/15/89 smb NEEDED FOR 6.0.4: Fixed some problems in my patch code for the ; bad pointer bug. ; <3.4> 8/11/89 smb smb Finally rolled in patches for a bad pointer bug (#51602) and ; an up & down arrow keys bug (#51961). See comments below. ; <3.1> 8/8/89 smb NEEDED FOR 6.0.4: Reverted TEFindWord patch since the previous ; patch introduces an uglier bug that won't be fixed now. Also ; added gestalt function for TE. ; <2.8> 8/8/89 smb NEEDED FOR 604: Added more TE patches for Aurora! ; <1.8> 7/25/89 smb NEEDED FOR 6.0.4: Added TextEdit patches for Aurora. ;____________________________________________________________________________ ; To Do: ; Check insGuts: may be able to use a0 instead of a1 for _HLock. ; TEKEy: set d6 to 1,-1 and move into d3 for doublebyte call. ; Remove extraneous code from NewRomanFindLine. Marked with (XX). ; See WBOverid - could simply jump into rom again since removed ForceOldFW patch. ;____________________________________________________________________________ LOAD 'StandardEqu.d' INCLUDE 'GestaltEqu.a' INCLUDE 'SysPrivateEqu.a' INCLUDE 'LinkedPatchMacros.a' IF (&TYPE('Scripts604') = 'UNDEFINED') THEN Scripts604 EQU 0 ENDIF IF &TYPE('forLocalizability') = 'UNDEFINED' THEN ; <35> forLocalizability EQU 1 ; <35> ENDIF ; <35> IF Scripts604 | SysVers>= $605 THEN ; added Scripts604 <20July89smb> INCLUDE 'ScriptPriv.a' ; <8July89smb> ENDIF INCLUDE 'TextEditPriv.a' ; <1/9/90smb> INCLUDE 'fontPrivate.a' ; <19> ROMXDoText ROMBind (IIci,$22A70) ; called by TEInit ROMXReCalLines ROMBind (IIci,$243B8) ; called by TEInit ROMDefWordBrk ROMBind (IIci,$240B4) ; called by TEInit EndTEInit ROMBind (IIci,$2200C) ; called by TEInit ROMForceOldFW ROMBind (IIci,$24062) ; called by ptchTEFindWord ROMWBOverid ROMBind (IIci,$24066) ; called by ptchTEFindWord ROMTESMgrFWord ROMBind (IIci,$23F5C) ; called by ptchTEFindWord ROM@GetSelWrap ROMBind (IIci,$23F82) ; called by ptchTEFindWord EndDelGuts ROMBind (IIci,$23D0A) ; called by DelGuts (TEDelete) ROMStdEntry ROMBind (IIci,$23B1A) ; called by DelGuts (TEDelete) ROMHideCaret ROMBind (IIci,$246B4) ; called by DelGuts (TEDelete) ROMSelSort ROMBind (IIci,$23C08) ; called by DelGuts (TEDelete) ROMGetCurStyle ROMBind (IIci,$2534A) ; called by DelGuts (TEDelete), ptchSetFont2Keyboard ROMClearRsrved ROMBind (IIci,$223D0) ; called by DelGuts (TEDelete) ROMGetStyle ROMBind (IIci,$253BE) ; called by DelGuts (TEDelete) ROMAltSetRsrved ROMBind (IIci,$253F4) ; called by DelGuts (TEDelete) ROMDeleteStyle ROMBind (IIci,$23D8A) ; called by DelGuts (TEDelete) ROMMungeSetup ROMBind (IIci,$24A94) ; called by DelGuts (TEDelete) ROMConcatStyles ROMBind (IIci,$257F2) ; called by DelGuts (TEDelete) ROMConcatRuns ROMBind (IIci,$2584C) ; called by DelGuts (TEDelete) ROMSetStyle ROMBind (IIci,$257AE) ; called by ptchSetFont2Keyboard ROMAnyNullStyle ROMBind (IIci,$25710) ; called by ptchSetFont2Keyboard ROMSetRsrved ROMBind (IIci,$253E8) ; called by ptchSetFont2Keyboard ROM@Use4HitTest ROMBind (IIci,$238F2) ; label in ptchTEChar2Pixel ROM@UseC2P ROMBind (IIci,$23928) ; label in ptchTEChar2Pixel ROMGetDirection ROMBind (IIci,$22F50) ; called by ptchTEChar2Pixel ROM@fixStack ROMBind (IIci,$23922) ; label in ptchTEChar2Pixel ROM@RomanTrim ROMBind (IIci,$237B6) ; label in ptchTrimMeasure ROMMeasureIt ROMBind (IIci,$237D6) ; called by ptchTrimMeasure EndCursorMovement ROMBind (IIci,$24D2E) ; called by ptchCursorMovement ROMSetUpP2C ROMBind (IIci,$2413C) ; called by ptchPixel2Char ROMTEPixel2Char ROMBind (IIci,$22696) ; called by ptchPixel2Char ROMDoHilite ROMBind (IIci,$23114) ; called by ptchTEDoText ROMDoCaret ROMBind (IIci,$22A86) ; called by ptchTEDoText ROMPreamble ROMBind (IIci,$22A2C) ; called by ptchTEDoText ROMLineRect ROMBind (IIci,$236D2) ; called by ptchTEDoText ROM@BailToLeft ROMBind (IIci,$227F6) ; label in ptchDoSearch ROM@DoMeasure ROMBind (IIci,$227B0) ; label in ptchDoSearch ROM@getStyleOld ROMBind (IIci,$2277A) ; label in ptchDoSearch ROM@NoMoreStyles ROMBind (IIci,$227E4) ; label in ptchDoSearch ROMEndDoSearch ROMBind (IIci,$2275A) ; called by ptchTEDoText ROMEndTEFmtOrder ROMBind (IIci,$22FF6) ; called by ptchTEGetFormatOrder ROMDoDraw ROMBind (IIci,$2288E) ; called by ptchDoDraw ROMPinDisplay ROMBind (IIci,$23A5A) ; called by ptchDoDraw ROMPrepLine ROMBind (IIci,$22A18) ; called by ptchDoDraw ROMChkBounds ROMBind (IIci,$23638) ; called by ptchDoDraw,ptchGetStylesInOrder ROMDoErase ROMBind (IIci,$229AC) ; called by ptchDoDraw ROMTEDrawHook ROMBind (IIci,$22878) ; called by ptchDoDraw ROMPtrToLine ROMBind (IIci,$236C6) ; called by ptchDoDraw ROMNextLineRect ROMBind (IIci,$236A8) ; called by ptchDoDraw ROMFreeFmtOrderArray ROMBind (IIci,$230FE) ; called by ptchDoDraw ROMGetFormatOrdering ROMBind (IIci,$22F82) ; called by ptchCaretDisplay ROMFixFormatEnd ROMBind (IIci,$24F52) ; called by ptchCaretDisplay ROMGetLRPosition ROMBind (IIci,$22C1A) ; called by ptchCaretDisplay ROMGetRLPosition ROMBind (IIci,$22C6A) ; called by ptchCaretDisplay ROMMeasureWholeRun ROMBind (IIci,$23404) ; called by ptchCaretDisplay ROM@SetEnds ROMBind (IIci,$22BCA) ; label in ptchCaretDisplay ROM@finis ROMBind (IIci,$22BF6) ; label in ptchCaretDisplay ROM@done ROMBind (IIci,$22C12) ; label in ptchCaretDisplay ROMteGetFormatOrder ROMBind (IIci,$22FE2) ; called by ptchGetStylesInOrder EndGetStylesInOrder ROMBind (IIci,$22FDA) ; called by ptchGetStylesInOrder ROMOldStyle ROMBind (IIci,$232B2) ; called by ptchOnSameLine ROMMeasureWidth ROMBind (IIci,$2333A) ; called by ptchOnSameLine ROMHiliteMore ROMBind (IIci,$232C8) ; called by ptchOnSameLine ROM@OneStyleTest ROMBind (IIci,$23654) ; label in ptchChkBounds ROM@OneStyle ROMBind (IIci,$23674) ; label in ptchChkBounds BackToChkBounds ROMBind (IIci,$23662) ; called by ptchChkBounds BackToDoMeasure ROMBind (IIci,$239C8) ; called by ptchDoMeasure ROM@MeasureDone ROMBind (IIci,$23A4E) ; label in ptchDoMeasure ROMGetWidth ROMBind (IIci,$2382C) ; called by ptchDoMeasure ROM@PlainMeasure ROMBind (IIci,$23A40) ; label in ptchDoMeasure BackToTestRunDirection ROMBind (IIci,$24F2A) ; called by ptchTestRunDirection ROMGetLine ROMBind (IIci,$22A5A) ; called by ptchCursorMovement ROM@CursorMoveDone ROMBind (IIci,$24EDE) ; label in ptchCursorMovement ROMTestLineEnds ROMBind (IIci,$24EE6) ; called by ptchCursorMovement ROMSetRun ROMBind (IIci,$24F04) ; called by ptchCursorMovement ROM@OneCharacterTest ROMBind (IIci,$24E9C) ; label in ptchCursorMovement ROM@CSubDelta ROMBind (IIci,$24ED8) ; label in ptchCursorMovement ROM@InMiddle ROMBind (IIci,$24E3E) ; label in ptchCursorMovement ROM@TakeRightBranch ROMBind (IIci,$24E78) ; label in ptchCursorMovement ROMGetStyleEnd ROMBind (IIci,$24F40) ; called by ptchCursorMovement ROM@NewFmtIndex ROMBind (IIci,$24E36) ; label in ptchCursorMovement ROMGetNumStyles ROMBind (IIci,$25398) ; called by ptchDoMeasure ROM@RightArrow ROMBind (IIci,$24BB0) ; label in ptchTEKey ROM@LeftArrow ROMBind (IIci,$24BB8) ; label in ptchTEKey ROM@NormalChar ROMBind (IIci,$24B6C) ; label in ptchTEKey ROMbackspace ROMBind (IIci,$24C12) ; called by ptchTEKey ROMFindLineHite ROMBind (IIci,$250E0) ; called by ptchTEKey ROMDoFind ROMBind (IIci,$22668) ; called by ptchTEKey ROMleftRight ROMBind (IIci,$24BD6) ; called by ptchTEKey ROM@hiliteIt ROMBind (IIci,$2338A) ; label in ptchMeasureWidth ROM@dontQuit ROMBind (IIci,$2338E) ; label in ptchMeasureWidth ROM@inBetween ROMBind (IIci,$2339A) ; label in ptchMeasureWidth ROM@justMeasure ROMBind (IIci,$233F2) ; label in ptchMeasureWidth ROMHiLite ROMBind (IIci,$22552) ; called by ptchTEActivate ROMinTEDispatch ROMBind (IIci,$23C06) ; called by ptchTEDispatch ROMinTEGetText ROMBind (IIci,$2203C) ; called by ptchTEGetText ROMinTESetText ROMBind (IIci,$22186) ; called by ptchTESetText ROMinTECalText ROMBind (IIci,$2229E) ; called by ptchTECalText ROMinTESetSelect ROMBind (IIci,$22302) ; called by ptchTESetSelect ROMinTEClick ROMBind (IIci,$22568) ; called by ptchTEClick ROMinTECopy ROMBind (IIci,$23C1C) ; called by ptchTECopy ROMinTECut ROMBind (IIci,$23CF4) ; called by ptchTECut ROMinTEIdle ROMBind (IIci,$24770) ; called by ptchTEIdle ROMinTEPaste ROMBind (IIci,$2479A) ; called by ptchTEPaste ROMinTEInsert ROMBind (IIci,$24B18) ; called by ptchTEInsert ROMinTESetJust ROMBind (IIci,$250FC) ; called by ptchTESetJust ROMinTEScroll ROMBind (IIci,$25124) ; called by ptchTEScroll ROMinTEPinScroll ROMBind (IIci,$2517A) ; called by ptchTEPinScroll ROMinTESelView ROMBind (IIci,$25202) ; called by ptchTESelView ROMinTEAutoView ROMBind (IIci,$2528C) ; called by ptchTEAutoView ROMinTEGetOffset ROMBind (IIci,$25952) ; called by ptchTEGetOffset ROMDrawCaret ROMBind (IIci,$246A8) ; called by ptchTEKey ROMinPasteChar ROMBind (IIci,$24C02) ; called by ptchTEKey ROMStdExit ROMBind (IIci,$222A2) ; called by ptchTEKey ROMGetHandle ROMBind (IIci,$24C7E) ; called by ptchTEBufferText ROM@MoreRoom ROMBind (IIci,$24C72) ; label in ptchTEBufferText ROMPasteGuts ROMBind (IIci,$24838) ; called by ptchDumpBuffer ROMDoubleByte ROMBind (IIci,$24FD2) ; called by ptchCursorMovement ROMStdExit2 ROMBind (IIci,$222A8) ; called by ptchTEFeatureFlag ROMEpilog4 ROMBind (IIci,$222A0) ; called by ptchTEActivate/ptchTEDeactivate ROMTEFeatureFlag ROMBind (IIci,$252AC) ; called by ptchStdEntry (to patch TEDispatch) ROMAddrTable ROMBind (IIci,$21EE0) ; called by ptchStdEntry ROMGetLineHites ROMBind (IIci,$23736) ; called by ptchDoHilite ROMInvertHook ROMBind (IIci,$23AF6) ; called by ptchDoHilite ROMDrawIt ROMBind (IIci,$246C8) ; called by ptchTEActivate ROMRefresh ROMBind (IIci,$25104) ; called by ptchTEUpdate ROMEpilog8 ROMBind (IIci,$2512C) ; called by ptchTEUpdate ROM@FullStyleRun ROMBind (IIci,$2386E) ; label in ptchGetWidth ROM@UseChar2Pixel ROMBind (IIci,$2387C) ; label in ptchGetWidth ROMinTEGetPoint ROMBind (IIci,$259E6) ; called by ptchTEGetPoint ROMTEGetPoint ROMBind (IIci,$25990) ; called by ptchStdEntry ROM@HitIt ROMBind (IIci,$2280E) ; label in ptchDoSearch ROMTEHitTestHook ROMBind (IIci,$2286C) ; called by ptchDoSearch ROMinGetRLPosn ROMBind (IIci,$22CBA) ; called by ptchGetRLPosition ROM@LineEnd ROMBind (IIci,$22D26) ; label in ptchGetRLPosition ROM@InRLMiddle ROMBind (IIci,$22D2A) ; label in ptchGetRLPosition ROM@GotCursorStyle ROMBind (IIci,$22CC0) ; label in ptchGetRLPosition ROMinSetKeyboard2Font ROMBind (IIci,$250CA) ; called by ptchSetKeyboard2Font ROM@DoneInKeybd2Font ROMBind (IIci,$250DC) ; label in ptchSetKeyboard2Font ROM@KeybdOK ROMBind (IIci,$25504) ; label in ptchiTESetStyle ROM@DoEndOfLine ROMBind (IIci,$259FC) ; label in ptchiTEGetPoint ROM@DoTheJustThing ROMBind (IIci,$25A04) ; label in ptchiTEGetPoint ROMCleanUpSel ROMBind (IIci,$23BCE) ; called by ptchTESetSelect ROM@NoSynchInSetSelect ROMBind (IIci,$22334) ; label in ptchTESetSelect ROM@NoSynchInTEClick ROMBind (IIci,$225AC) ; label in ptchTEClick ROM@LROrientation ROMBind (IIci,$228B2) ; label in ptchDoDraw ROM@UseStyleStart ROMBind (IIci,$22E7E) ; label in ptchCaretInsideRun ROMbeyond@UseStyleStart ROMBind (IIci,$22E84) ; label in ptchCaretInsideRun ROMHiliteLineEnds ROMBind (IIci,$23498) ; called by ptchInvrtRectangle ROMPixelWidths ROMBind (IIci,$235BE) ; called by ptchInvrtRectangle ROMafter@HitIt ROMBind (IIci,$2281A) ; label in ptchDoSearch ROMfindDone ROMBind (IIci,$2283A) ; called by ptchDoSearch ROMTESetStyle ROMBind (IIci,$254EE) ; called by ptchTEDispatch ROMTEEOLHook ROMBind (IIci,$22850) ; called by ptchTEFindLine ROMinFindLine ROMBind (IIci,$241D0) ; called by ptchTEFindLine ROM@SetUp ROMBind (IIci,$2428C) ; label in ptchTEFindLine ROM@FindLineFinis ROMBind (IIci,$2430E) ; label in ptchTEFindLine ROMRomanFindLine ROMBind (IIci,$24316) ; called by ptchTEFindLine ROM@testEnds ROMBind (IIci,$232D6) ; label in ptchOnSameLine ROM@exit ROMBind (IIci,$233FE) ; label in ptchMeasureWidth ROM@HiliteOffsetRun ROMBind (IIci,$233E6) ; label in ptchMeasureWidth ROM@hiliteRun ROMBind (IIci,$233BA) ; label in ptchMeasureWidth ROMteHiliteText ROMBind (IIci,$234D8) ; called by ptchOnSameLine ROMGetHite ROMBind (IIci,$23776) ; called by ptchTEGetPoint ROMinTENew ROMBind (IIci,$223BC) ; label in ptchTENew ROMXEOLHook ROMBind (IIci,$2285A) ; called by ptchInstallIntDispatch ROMXDRAWHook ROMBind (IIci,$22884) ; called by ptchInstallIntDispatch ROMChar2Pixel ROMBind (IIci,$23896) ; called by ptchInstallIntDispatch ROMPixel2Char ROMBind (IIci,$22690) ; called by ptchInstallIntDispatch ROMGetSize ROMBind (IIci,$2226A) ; called by ptchTENew ROMSetDirection ROMBind (IIci,$22F16) ; called by ptchTENew ROMDefClikProc ROMBind (IIci,$252D6) ; called by ptchTENew ROMinTEStylNew ROMBind (IIci,$224D4) ; label in ptchTEStylNew ROMMyNewHandle ROMBind (IIci,$22510) ; called by ptchTEStylNew ROMGetDefStyle ROMBind (IIci,$22206) ; called by ptchTEStylNew ROMPtToLine ROMBind (IIci,$23AA8) ; called by ptchDefClikProc ROMSetKeyboard2Font ROMBind (IIci,$250B2) ; called by ptchDelGuts IF hasTextWidthHook THEN ; <17> ROM@ZeroWidth ROMBind (IIci,$22A04) ; called by ptchDoErase <17> ROM@GoErase ROMBind (IIci,$22A08) ; called by ptchDoErase <17> ENDIF ; <17> IF SysVers>= $700 THEN ; <19> ROMstage2y ROMBind (IIci,$2442E) ; called by ptchReCalLines <19> ROMstage2A ROMBind (IIci,$2443C) ; called by ptchReCalLines <19> ROMClrLineSts ROMBind (IIci,$24442) ; called by ptchReCalLines <19> ROMinPtToLine ROMBind (IIci,$23AB6) ; called by PtToLine <19> ROMinDoHilite ROMBind (IIci,$23118) ; called by ptchDoHilite <19> ROMinDoFind ROMBind (IIci,$22670) ; called by ptch{TEClick,TEKey,TEGetOffset} <19> ROMinPinDisplay ROMBind (IIci,$23A84) ; called by ptchPinDisplay <19> ROMinRefresh ROMBind (IIci,$2510C) ; called by ptchRefresh <19> ROMSetStylScrap ROMBind (IIci,$25A60) ; called by ptchTEDispatch <19> ROMTEStylInsert ROMBind (IIci,$25B20) ; called by ptchTEStylInsert <19> ROMPstStylGuts ROMBind (IIci,$248EE) ; called by ptchTEStylInsert <19> ROMRecalDraw ROMBind (IIci,$23E18) ; called by ptchTEStylInsert <19> ROMShowCaret ROMBind (IIci,$24690) ; called by ptchTEStylInsert <19> ROMAfterInsert ROMBind (IIci,$24B28) ; called by ptchTEInsert <19> ROMInsRsrved ROMBind (IIci,$24AAA) ; called by ptchInsGuts <19> ROMClickExpand ROMBind (IIci,$22544) ; called by ptchTEClick <19> AfterMoveToInTextBox ROMBind (IIci,$22116) ; used for patch to TextBox <22> ROMGo14Exit ROMBind (IIci,$2217C) ; used for patch to TextBox <22> ROMinTEDispose ROMBind (IIci,$22052) ; used for patch to TEDispose <20> ROMinGetHandle ROMBind (IIci,$24C80) ; called by ptchGetHandle <20> ROMFindWord ROMBind (IIci,$23F34) ; called by ptchReCalLines & ptchNewRomanFindLine <21> ROMFindLine ROMBind (IIci,$24144) ; called by ptchReCalLines <21> ROMDoText ROMBind (IIci,$22A6A) ; called by ptchTEKey and ptchTEClick <25> AfterHiliteText ROMBind (IIci,$23536) ; used for patch to teHiliteText <29> ENDIF ; <19> IF forLocalizability THEN ; <34-YDS-9/2/91> ROMInMeasureIt ROMBind (IIci,$237DA) ; called by DoMeasure ROMSelView ROMBind (IIci,$25208) ; called by ptchTEKey ROM@goHome ROMBind (IIci,$24792) ; called by ptchTEIdle ROMOneCursor ROMBind (IIci,$22EEA) ; called by ptchGetRLPosition ROM@RLDone ROMBind (IIci,$22D2E) ; label in GetRLPosition ROMinSetUp2Rectangles ROMBind (IIci,$22D46) ; called by ptchSetUp2Rectangles RONInTextBox ROMBind (IIci,$220C2) ; called by ptchTextBox <41-YDS-1/30/92> ROMAfterGetFInfoInTextBox ROMBind (IIci,$22104) ; Come from patch after GetFontInfo in TextBox <43-YDS-2/6/92> ROMAfterGetFInfoInGetSize ROMBind (IIci,$22272) ; Come from patch after GetFontInfo in GetSize <43-YDS-2/6/92> ENDIF ; <19> ;---------------------------------------------------------------------- ROMs IIci ;---------------------------------------------------------------------- ; PROCEDURE ptchTEFindWord ; <19July89smb> Fixed Roman FindWord hyphenation bug. Problem ; was occuring because RecalLines used the SMgr-compatible FindWord ; for determining a word boundary but when it called FindLine for ; the line break, FindLine used the oldFindLine code (RomanFindLine) ; which used the old FindWord code. The correct fix for this is ; to use the old FindWord code when the caller is RecalLines. This ; introduces an uglier bug that can't be fixed for 6.0.4 so we opted ; for the easiest fix which is to always use the old FindWord for all ; of Roman word breaking needs. ; <28Aug89smb> We now use the old FindWord code for RecalLines for ; 6.0.4 Script Systems and Big Bang since the uglier bug is now fixed. ; The bug was that the leadingEdge flag was not set correctly for word drag. ; <26Oct89smb> Bug fix for Chinese Script System: clear fwLeadingEdge flag! ; <1/17/90smb> Redone to be compatible with applications using incorrect char ; breaking algorithms for Script Systems. ; <2/28/90smb> Changed 'bgt' to 'bge' for linebreaking. ; <4/17/90smb> Fixed old bug for old FindWord: when using an ; application's teWordBreak routine must save d1! ;---------------------------------------------------------------------- ptchTEFindWord PatchProc TEFindWord fwRegs REG d3-d5/a0-a2 IF Scripts604 | SysVers>= $605 THEN ; Redone to be compatible with applications using incorrect char breaking algorithms for Script Systems ; <1/17/90smb> ; If a non-Roman system then use new FindWord code move.l ExpandMem,a0 cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; number of installed scripts bne.s UseSMgrFW ; use new FindWord ; Roman-only system ; test if line breaking calling; if so, use old FindWord. cmpi.w #teFromFind,d2 ; called by Roman FindLine or teRecal? bge WBOverid ; changed to 'bge' instead of 'bgt' <2/28/90smb> ; Otherwise, look for an overriding FindWord routine. move.l d0,-(sp) ; preserve move.l teWordBreak(a3),d0 _StripAddress ; does return in d0 move.l ExpandMem,a0 cmp.l ExpandMemRec.emCleanWordBrk(a0),d0 ; same? beq.s @NoOverride ; Branch around wordBreak cleanup stuff move.l (sp)+,d0 ; restore (and not earlier since StripAddress returns here!) bra WBOverid ; Handle via old logic if an override exists ; If we get here, there's no wordBreak override @NoOverride move.l (sp)+,d0 ; restore (and not earlier since StripAddress returns here!) UseSMgrFW with FindWordFrame link a6,#fwLink ; This version uses the Script Manager movem.l fwRegs,-(sp) ; The value of fwLeadingEdge is determined by which routine called FindWord. ; If RecalLines called (teFromRecal (16)), we want to look back to determine the word so ; leadingEdge is False, implying we hit on the trailing edge of a character. ; If ClickExpand called (teWordSelect (4) or teWordDrag (8)), leadingEdge can be taken from ; teLftClick in the teRecord. clr.w fwLeadingEdge(a6) ; initialize (for bra to @GetSelWrap) <26Oct89smb> cmpi.w #teFromRecal,d2 ; is it RecalLines calling? <28Aug89smb> beq.s @GetSelWrap ; yep. ; if ClickExpand calling, get leadingEdge from teLftClick in teRecord. Use teLftClick rather than ; teLftCaret since DoSearch sets teLftClick. <28Aug89smb> move.b teLftClick(a3),d1 ; if calling for WordDrag then simulate Kanji code. <25Aug89smb> cmpi.w #teWordDrag,d2 ; <25Aug89smb> bne.s @StuffIt ; <25Aug89smb> ; at this point a2 is still equal to the Left Anchor for teClick so compare the offset to it <25Aug89smb> cmp.w d0,a2 ; compare L. anchor to char offset <25Aug89smb> scc d1 ; set leadingEdge flag accordingly <25Aug89smb> @StuffIt ext.w d1 move.w d1,fwLeadingEdge(a6) @GetSelWrap jmpROM ROM@GetSelWrap ;;no longer used <1/17/90smb> ForceOldFW jmpROM ROMForceOldFW ELSE ; come here for 6.0.4 only! <1/17/90smb> ; Look for an overriding FindWord routine. move.l d0,-(sp) ; preserve move.l teWordBreak(a3),d0 _StripAddress move.l ExpandMem,a0 cmp.l ExpandMemRec.emCleanWordBrk(a0),d0 ; same? beq.s @NoOverride ; Branch around wordBreak cleanup stuff move.l (sp)+,d0 ; restore bra.s WBOverid ; Handle via old logic if an override exists (bra to WBOverid) ; If we get here, there's no wordBreak override @NoOverride move.l (sp)+,d0 ; restore ; If a Roman system then use old FindWord code <8Aug89smb> move.l ExpandMem,a0 ; <8Aug89smb> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; number of installed scripts <8Aug89smb> beq WBOverid ; use old FindWord <8Aug89smb> jmpROM ROMTESMgrFWord ENDIF IF SysVers < $606 THEN WBOverid jmpROM ROMWBOverid ; bra to WBOverid ELSE ; new <4/17/90smb> ; forced here from RomanFindLine; mask off flag in low bit of d2 <8June89smb> WBOverid ; here's our FindWord swap d2 ; get constant into high word move.w d0,d2 ; save position in low word move.w d0,d1 beq.s RightScan bsr.s LeftScan ; do left scan 1st ; Right scan, given a char code in D1, this returns the next word break >= D1 RightScan bclr #17,d2 ; clear bit 17 (right) RS1 cmp teLength(a3),d1 ; see if @ right edge bhs.s @0 ; assume found if at right edge move d1,a1 ; pass index bsr.s CallBreak bne.s @0 addq #1,d1 ; try next char bra.s RS1 ; @0 rts ; Given a char location in D0, this routine returns a new word break to left of D0 LeftScan bSet #17,d2 ; set bit 1 (left) LS1 subq #1,d0 ; pre decrement move d0,a1 ; pass index bsr.s CallBreak ; was it a break? bne.s @0 ; if so, skip town tst d0 ; are we done? beq.s @1 ; if so, skip town bra.s LS1 ; keep looking @0 addq #1,d0 ; try next char @1 rts export CallBreak ; <23> CallBreak movem.l d0-d1/a0-a1,-(sp) ; save regs - also save d1! <4/17/90smb> move a1,d0 ; pass index in D0 move.l teTextH(a3),a0 ; get handle move.l (a0),a0 move.l teWordBreak(a3),a1 ; get routine jsr (a1) ; call routine which sets CC's movem.l (sp)+,d0-d1/a0-a1 ; restore regs - also restore d1! <4/17/90smb> rts ENDIF ENDPROC ;---------------------------------------------------------------------- ; PROCEDURE ptchTEFindLine ; For a 7.0 (or greater) system with only the Roman script system ; installed, the ptchNewRomanFindLine routine must be used. For an ; earlier system with only the Roman script system installed, will ; use the ROM's RomanFindLine code. ; If multiple scripts are installed for an SS-604 system or a 6.0.5 ; (or greater) system, then fall into the ptchScriptFindLine code ; below. <21> ;---------------------------------------------------------------------- IF Scripts604 | SysVers>= $605 THEN ptchTEFindLine PatchProc TEFindLine FindLineRegs reg d1-d7/a0-a2 move.l ExpandMem,a0 ; <19> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; total number of installed scripts <19> IF SysVers>= $700 THEN ; <21> beq ptchNewRomanFindLine ; use new Roman FindLine <19> ELSE beqROM ROMRomanFindLine ; use ROM code <21> ENDIF ; otherwise fall into ptchScriptFindLine ;---------------------------------------------------------------------- ; PROCEDURE ptchScriptFindLine ; <16Dec89smb> ; Set the offset parameter to non-zero for StyledLineBreak for ; unstyled text. NOTE! This fix is only for UNSTYLED text. ; <9/6/90smb> Fix teCROnly bug that crashes the system: pre- ; incrementing caused us to compare one too many in the text and then ; the +1 to point beyond the CR caused the line breaks to be one off. ;---------------------------------------------------------------------- ptchScriptFindLine ; labeled for clarification although not used <21> ; left this test here rather than move to RecalLines since it would be duplicated 4x in RecalLines <12july89smb> ; If a Roman system then use old FindLine code: performance improvement <5May89smb> Movem.l FindLineRegs,-(sp) ; preserve whether use new or old FindLine with LineBreakFrame link a6,#localFrame ; initializations moveq #0,d7 ; flag multiple styles: init to single style move.w d6,lineStart(a6) move.w d6,EOLCharPosn(a6) ; start for new EOL position calculation clr.w textPtrOffset(a6) ; set up textWidth: pixel width for displaying the text moveq #0,d0 move.w teDestRect+right(a3),d0 ; right edge sub.w teDestRect+left(a3),d0 IF SysVers < $700 THEN ; <31> subq #1,d0 ; reduce for caret indent <31> ENDIF ; <31> swap d0 ; width is FIXED move.l d0,width(a6) ; textWidth ; textLength: is necessary for CR test and unstyled text moveq #0,d1 ; longize move.w teLength(a3),d1 ; doc length sub.w d6,d1 ; adjusted to lineStart position move.l d1,length(a6) ; textPtr: pointer to current lineStart position. movea.l teTextH(a3),a2 ; handle to start of text movea.l (a2),a2 ; dereference add.w d6,a2 ; begin search for CR here <17Nov88smb> ; if we are in CR only mode, just search for a CR IF SysVers < $606 THEN ; <16> addq.w #1,d1 ; incr for initial decr below in dbeq test <17Nov88smb> ENDIF tst.b teCROnly(a3) bge.s @StyleCheck ; changed from beq to bge <2May89smb> ; notice: CCs are set to not equal AT THIS POINT based on test of CROnly. bra.s @CheckLength ; zero check @CRLoop move.b (a2)+,d0 ; is it a CR? changed to byte <28Jan89smb> jsrROM ROMTEEOLHook @CheckLength dbeq d1,@CRLoop beq.s @GotCR move.w teLength(a3),d0 ; return end of text if CR not found jmpROM ROM@FindLineFinis ; <17Mar89smb> @GotCR move.w teLength(a3),d0 ; doc length <15Mar89smb> sub.l d1,d0 ; - characters left IF SysVers < $606 THEN ; <16> addq #1,d0 ; go one beyond the CR <15Mar89smb> ENDIF jmpROM ROM@FindLineFinis ; <17Mar89smb> ; End of CR check @StyleCheck IF SysVers < $606 THEN ; <16> subq.w #1,d1 ; decr from CR test above <17Nov88smb> ENDIF move.l a2,textPtr(a6) move.l a2,initlTextPtr(a6) ; test for new style edit record tst.w teSize(a3) ; check style flag bpl @noStyle ; don't set style: old-style edit record jmpROM ROMinFindLine ; jump back into styled processing @noStyle move.w #0,currStyle(a6) ; needed for a termination test ; set up textStart and textEnd for non-styled text move.l #0,start(a6) ; absolute posn from beginning of text move.l length(a6),end(a6) ; Set the offset parameter to non-zero since this is the 1st script run on the line (AND THE ONLY ONE!) <15Dec89smb>. move.l #1,offset(a6) ; necc for corrections to SMgr routine <15Dec89smb> jmpROM ROM@SetUp ; patched now, jump back in! IF SysVers>= $700 THEN ; <21> ;---------------------------------------------------------------------- ; PROCEDURE ptchNewRomanFindLine ; <1/9/91smb> Must be patched to now call NewRomanFindLine ; for a Roman-only system. Rewrote to break on style runs ; rather than word boundaries. <19> ;---------------------------------------------------------------------- ptchNewRomanFindLine Movem.l FindLineRegs,-(sp) ; preserve whether use new or old FindLine with LineBreakFrame link a6,#localFrame ; textLength: is necessary for CR test and unstyled text moveq #0,d1 ; longize move.w teLength(a3),d1 ; doc length sub.w d6,d1 ; adjusted to lineStart position move.l d1,length(a6) ; textPtr: pointer to current lineStart position. movea.l teTextH(a3),a2 ; handle to start of text movea.l (a2),a2 ; dereference add.w d6,a2 ; begin search for CR here tst.b teCROnly(a3) ; do we only want to break on CRs? bne @CROnlyMode ; yup. ; more initializations move.l a2,textPtr(a6) moveq #0,d7 ; flag multiple styles: init to single style move.w d6,lineStart(a6) move.w d6,EOLCharPosn(a6) ; start for new EOL position calculation ; set up textWidth: pixel width for displaying the text moveq #0,d4 move.w teDestRect+right(a3),d4 ; right edge sub.w teDestRect+left(a3),d4 ;; subq #1,d4 ; reduce for caret indent <31> move.l d4,width(a6) ; textWidth ; test for new style edit record tst.w teSize(a3) ; check style flag bpl @CallP2C ; old-style edit record ; test for single or multiple format runs in the text movea.l teStylesH(a3),a1 ; handle to teStyleRec movea.l (a1),a1 cmpi.w #1,nRuns(a1) beq.s @OneStyle ; bra if one style moveq #1,d7 ; flag multiple styles to process @OneStyle moveq #0,d0 move.w d6,d0 jsrROM ROMGetCurStyle ; a0: ptr to current style, d0: style index addq.w #1,d0 ; index returned is 0 based but nRuns isn't move.w d0,styleIndex(a6) ; test for last style run movea.l teStylesH(a3),a1 ; handle to teStyleRec movea.l (a1),a1 cmp.w nRuns(a1),d0 ; is styleIndex < nRuns? bcs.s @StyleLoop ; yes moveq #0,d7 ; on last style run ; only one run so set up real length of run. The last entry in the styleRun table has ; a startChar posn equal to teLength+1. Must subtract the extra 1 to get the real length ; of the run. @StyleLoop move.l a0,currStyle(a6) lea stStartSize(a0),a1 move.l a1,nextStyle(a6) jsrROM ROMSetStyle ; set grafport style from current style in a0 ; set up textStart (beginning of style run) and pin to lineStart moveq #0,d1 ; longize move.l currStyle(a6),a0 move.w startChar(a0),d1 ; get start of this format run cmp.w lineStart(a6),d1 ; must pin to this LineStart! bhs.s @GetLength ; bra if should use start of style run move.w d6,d1 ; use beginning of line @GetLength ; get the length moveq #0,d0 ; longize move.w stStartSize(a0),d0 ; end of style run sub.w d1,d0 ; minus the style start move.l d0,length(a6) ; test for one or last style to adjust length tst.w d7 bne.s @CallP2C ; multiple styles so can use next style run for length sub.l #1,length(a6) ;----------------------------------------------- @CallP2C ; call Pixel2Char move.l textPtr(a6),a0 ; textPtr move.w length+2(a6),d0 ; textLength (style run length) move.w width+2(a6),d1 ; width clr.l d2 ; no slop jsrROM ROMTEHitTestHook ; call Pixel2Char ; returns: ; d0 (low word) pixel width to character offset in block ; (high word) boolean = TRUE (0001) if offset corresponding to ; the given pixel width was found ; d1.w character offset ; d2.w flagged (0001) if hit on leading edge of char move.w d1,d3 ; save char offset until after CR test sub.w d0,d4 ; update pixel width bls @CRTest ; got a hit (width <= 0) ; if at the last style, and pixel width > 0, and the TEHitTestHook is replaced, then ; must check the high word of d0 to see if we REALLY got a hit! <2/16/90smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l HitTestHook(a0),a0 peaROM ROMPixel2Char cmpa.l (sp)+,a0 beq.s @NotAHit ; we've been hooked out so test per the old interface specs for a hit. swap d0 tst.b d0 bne.s @CRTest ;---------------------------------------------------------------------- @NotAHit ; test for CR move.l textPtr(a6),a2 move.w length+2(a6),d1 bsr TestForCR tst.b d0 ; did we find a CR? beq.s @NoCR ; no, just measure ; found a CR move.w length+2(a6),d0 ; style run length sub.l d1,d0 ; - characters left (should make this .w) <29>x add.w EOLCharPosn(a6),d0 ; new break posn bra @finis @NoCR move.l d4,width(a6) ; and save as long. add.w d3,EOLCharPosn(a6) ; update char offset tst.w d7 beq @setResult ; only one style or last style to process ; test if we just processed the second to last format run movea.l teStylesH(a3),a1 ; handle to teStyleRec movea.l (a1),a1 move.w styleIndex(a6),d0 addq.w #1,d0 ; for next style run move.w d0,styleIndex(a6) cmp.w nRuns(a1),d0 ; at last style run? bne.s @DoNextRun ; last format run: last entry of style run table is a dummy entry = teLength + 1 moveq #0,d7 ; flag no more runs after this one ; special test for case of dummy RUN of 1 char, which is 1 longer than the teLength, as found ; in KanjiTalk. Test here to save some other processing. move.l nextStyle(a6),a0 move.w stStartSize(a0),d6 sub.w startChar(a0),d6 subq.w #1,d6 ; MathCad creates a 0 length style run at the end of the StyleRun array of teLength->teLength, <26> ; instead of teLength->teLength+1, so we're testing for their bug here! <26> ble @setResult ; problem of 0 length style run in MathCad <26> ;; beq @setResult ; change branching condition <26> @DoNextRun ; use the next format to continue searching for a line break position. ; accumulate style offsets on line for line end move.l nextStyle(a6),a0 move.w startChar(a0),d6 moveq #0,d0 ; clear high word before add <33> move.w length+2(a6),d0 add.l d0,textPtr(a6) ; update textPtr to the next style run bra @StyleLoop ;---------------------------------------------------------------------- ; on the way out now… ;---------------------------------------------------------------------- @CRTest ; test for CR move.l textPtr(a6),a2 move.w d3,d1 ; offset of char hit is length to use when searching for CR bsr TestForCR tst.b d0 ; did we find a CR? bne.s @GotCR ; yes, done earlier than hit! ; no CR found, so use char offset but back up to word boundary add.w d3,EOLCharPosn(a6) ; update char offset move.w EOLCharPosn(a6),d0 ; Must test if at a blank since FindWord will backup before testing if not @ posn. 0. <23> ; the problem this introduces is that we will not use an appications hook to teWordBreak if ; there is a blank or non-graphic character in this position. tst.b d0 ; <23> beq.s @CallFW ; <23> @WrdBrkLoop move.w d0,a1 ; CallBreak wants offset here <23> import CallBreak ; <23> bsr CallBreak ; calls Roman wordbreak hooked routine <23> beq.s @CallFW ; CCs set if char<=$20 & d0 = wordstart <23> ; point past the break character and look for another break character until at EOD <23> cmp.w teLength(a3),d0 ; is this break character at the EOD <23> beq @HaveWordSt ; yes, so done <23> ; check if the break character is a CR! don't look ahead if so! <28> movea.l teTextH(a3),a2 ; handle to start of text <28> movea.l (a2),a2 ; dereference <28> move.w d0,-(sp) ; save wordStart <28> addq.w #1,(sp) ; incr beyond this break character <28> move.b 0(a2,d0.w),d0 ; fetch the char to test <28> jsrROM ROMTEEOLHook ; <28> movem.w (sp)+,d0 ; don't change CCs <28> ; now bra based on result of TEEOLHook <28> beq.s @finis ; found a CR so done <28> ; is a break char but not a CR so, try again <28> ;; addq #1,d0 ; no, so look ahead for next break character <23><28> bra.s @WrdBrkLoop ; <23> @CallFW MoveQ #teFromFind,D2 ; say findLine is calling jsrROM ROMFindWord ; EOL posn in d0 vectored so jsr to ROM addr <21> @HaveWordSt ; must pin word start to lineStart for the case that it breaks across a word cmp.w lineStart(a6),d0 ; d6 changes for styled so use actual lineStart <23> bls @setResult ; test for case of 0 returned if line has no blanks ; these two lines seem to be redundant!!! (XX) tst.w d0 ; non-zero word start is ok bne.s @finis move.w EOLCharPosn(a6),d0 ; assume P2C result is less than word end found cmp.w d1,d0 ; use smaller of two bls @finis ; use P2C result ; we should never come here! (XX) move.w d1,d0 ; use word end found bra @finis @GotCR move.w d3,d0 ; style run length sub.l d1,d0 ; - characters left (should make this .w) <29>x add.w EOLCharPosn(a6),d0 ; new break posn bra @finis ;----------------------------------------------- @CROnlyMode ; since we are in CR only mode, just search for a CR bsr TestForCR tst.b d0 ; did we find a CR? bne.s @FoundCR ; yes move.w teLength(a3),d0 ; no, return end of text bra @finis @FoundCR move.w teLength(a3),d0 ; doc length <15Mar89smb> sub.l d1,d0 ; - characters left bra @finis ; End of CR check ;----------------------------------------------- @setResult move.w EOLCharPosn(a6),d0 ; want result in d0 @finis unlk a6 movem.l (sp)+,FindLineRegs ; restore rts endWith ;---------------------------------------------------------------------- ; PROCEDURE TestForCR ; Called by NewRomanFindLine to search for a carriage return. ; Entry ; d1.w = length to search ; a2.l = text pointer ; Exit ; d0.b = TRUE (FF) if CR found ; d1.w = characters left ; Uses d0,d1 ;---------------------------------------------------------------------- TestForCR tst.w d1 ; is the initial length 0? beq.s NoCR ; notice: CCs are set to NOT EQUAL at this point. bra.s @TestLength @CRLoop move.b (a2)+,d0 ; is it a CR? changed to byte jsrROM ROMTEEOLHook @TestLength dbeq d1,@CRLoop beq.s GotCR bra NoCR ; no CR in this run, just measure NoCR sf d0 ; return F rts GotCR st d0 ; return T rts ENDIF ; IF SysVers>= $700 (ptchNewRomanFindLine) ENDPROC ; ptchTEFindLine ENDIF ; IF Scripts604 | SysVers>= $605 (ptchTEFindLine) ;---------------------------------------------------------------------- ; ptchSetFont2Keyboard ; <18July89smb> Replaced call to AltSetRsrved to SetRsrved. ; <20July89smb> Before using an existing NullStyle in SetFont2Keyboard ; must make sure the font's script is the same as the keyScript. ; Otherwise, use script's default font. ; <28Sept89smb> Complete rewrite for 6.0.4 Script Systems and 7.0! ; <7Dec89smb> If unsynched and keyScript <> Roman, then synch up. ; Use application font as default now. ;---------------------------------------------------------------------- ptchSetFont2Keyboard PROC EXPORT IF Scripts604 | SysVers>= $605 THEN IMPORT ptchDumpBuffer jsrROM ROMGetCurStyle ; if only 1 script installed none of this is necessary move.l ExpandMem,a1 ; <1Feb89smb> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1) beq @Done ; only one script => keyboard set just fine! movem.l d4/a2,-(sp) ; save ; get the keyboard script move.l a0,a2 ; save style ptr clr.l -(sp) move.w #smKeyScript,-(sp) ; verb _GetEnvirons move.l (sp)+,d4 ; actually only a word ;--------------------------------------------------------------------------------- ; If have an unsynchronized font & keyboard, and the KeyScript is not Roman, then synchronize ; the font and keyboard. <3Dec89smb> move.l ExpandMem,a0 tst.b ExpandMemRec.emUnsynchedFlag(a0) beq.s @TstNullStyle ; bra if synched up ; we are unsynchronized but are the keyScripts different? sf ExpandMemRec.emUnsynchedFlag(a0) ; assume will synch up cmp.w #smRoman,d4 ; if unsynchronized, the keyScript was Roman bne.s @TstNullStyle ; bra if want to synch up ? st ExpandMemRec.emUnsynchedFlag(a0) ; don't synch up move.w styleIndex(a2),d0 ; get index to styleRec jsrROM ROMGetStyle ; get the styleRec in a0 move.l a0,-(sp) ; temp save move.l a2,a0 ; restore current style ptr jsrROM ROMSetStyle ; set the grafport; preserves a0 move.l (sp)+,a0 ; restore styleRec move.w stFont(a0),d0 ; want current font here when branch! bra @SetFont ; bra if equ: want to stay unsynched ; the new keyScript is non-Roman and we're currently unsynchronized so synch up @TstNullStyle ;--------------------------------------------------------------------------------- IF NOT hasBufferingFix THEN ; <17> ; before synchronizing dump the text buffer: could change the keyboard in the middle of buffering <1/26/90smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFTextBuffering,d0 beq.s @noBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer ENDIF ; <17> ; if a null style exists and it's font corresponds to the keyScript, use it! jsrROM ROMAnyNullStyle ; returns a0 pointing to the null scrap record; cc's set beq.s @styleLoop ; nope lea scrpStyleTab(a0),a0 ; point to start of table ; must test if font is of the same script before using it move.l a0,-(sp) ; save scrpStyleTab sub.w #2,sp ; allocate return, 1 int move.w scrpFont(a0),-(sp) ; scrpFont _Font2Script ; get script from font move.w (sp)+,d1 ; fontScript move.l (sp)+,a0 ; restore scrpStyleTab move.w scrpFont(a0),d0 ; want current font here when branch! cmp.w d1,d4 ; is the scrpFont's script = the keyscript? beq.s @SetFont ; already rsrved but must write to grafport IF hasBufferingFix THEN ; <17> ; before synchronizing dump the text buffer: could change the keyboard in the middle of buffering <1/26/90smb> ; Dump here rather than inside the styleLoop below and after we are sure that things aren't synched.<17> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFTextBuffering,d0 beq.s @noBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer ENDIF ; <17> ; no null style exists or bad font ; d4.b = the keyScript ; a2.l = the current style ptr. ; Test if the current font is the correct script If not, use the keyScript to determine ; a font to use. Will find the font by looking back in the styleRun array until we find ; a font whose script corresponds to the keyScript. If none exist, we'll use the script ; system's default font. @styleLoop move.w styleIndex(a2),d0 ; get index to styleRec jsrROM ROMGetStyle ; get the styleRec in a0 move.l a0,-(sp) ; temp save ; set the grafport now since in the case of a selection SetRsrved does nothing (must set for BufferChar). move.l a2,a0 ; restore a0 jsrROM ROMSetStyle ; preserves a0 sub.w #2,sp ; allocate return, 1 int _FontScript ; get script from font in grafport move.w (sp)+,d1 ; fontScript move.l (sp)+,a0 ; restore styleRec move.w stFont(a0),d0 ; want current font here when branch! ; test if the keyboard script is the same as the fontScript cmp.w d1,d4 ; is the font's script = the keyscript? beq.s @SetFont ; yep, use it. cmpi.w #0,startChar(a2) ; are we at the start of the styleRun array yet? beq.s @UseKbdScript ; yes. subq #stStartSize,a2 ; no, next! bra.s @styleLoop @UseKbdScript ; no more styles to check, use script system's application font clr.l -(sp) ; allocate return move.w d4,-(sp) ; script ;; move.w #smScriptSysFond,-(sp) ; verb move.w #smScriptAppFond,-(sp) ; verb: use application font <3Dec89smb> _GetScript move.l (sp)+,d0 ; font is only a word @SetFont ; are we replacing a selection? <6Sept89smb> move.w teSelStart(a3),d1 ; get selection start cmp.w teSelEnd(a3),d1 ; same as selEnd? beq.s @notSelection ; is a selection so delete selection and then set move.l d0,d4 ; save the font move.l a4,-(sp) ; pass the handle _TEDelete move.l d4,d0 ; restore the font and set it! @notSelection ; load new font as in textStyle.tsFont ; d0 = font to use move.l ExpandMem,a0 ; textStylePtr: actually only font attribute move.w d0,ExpandMemRec.emNewFont(a0) move.l a0,a2 lea ExpandMemRec.emNewStyle(a2),a2 lea ExpandMemRec.emNewFont(a0),a0 ; redraw flag and mode already set at init time above move.l a0,2(a2) ; only stuffed the font: need address of emNewFont jsrROM ROMSetRsrved ; call this routine, which TESetStyle calls <18July89smb> movem.l (sp)+,d4/a2 ; restore @Done Rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELSE jsrROM ROMGetCurStyle ; <25June89smb> moved into here from calling routines ; if only 1 script installed none of this is necessary move.l ExpandMem,a1 ; <1Feb89smb> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1) beq @Done ; only one script => keyboard set just fine! ; get the keyboard script move.l a0,-(sp) ; save style ptr clr.l -(sp) move.w #smKeyScript,-(sp) ; verb _GetEnvirons move.l (sp)+,d0 ; actually only a byte ; set the font in the grafport move.l (sp)+,a0 ; restore a0 move.w d0,-(sp) ; save keyScript jsrROM ROMSetStyle ; preserves a0 sub.w #2,sp ; allocate return, 1 int _FontScript ; get script from font in grafport move.w (sp)+,d1 ; fontScript ; test if the keyboard script is the same as the fontScript move.w (sp)+,d0 ; get keyScript cmp.w d0,d1 beq.s @Done ; font is ok ; synch the font to the keyboard movem.w d3/d4,-(sp) ; need these babies for storage <20July89smb> move.w d0,d3 ; save keyScript to compare w/ font in nullStyle <20July89smb> clr.l -(sp) ; allocate return move.w d0,-(sp) ; script move.w #smScriptSysFond,-(sp) ; verb _GetScript move.l (sp)+,d0 ; font is only a word ; simulate a TESetStyle call to set the new font (just call SetRsrved) ; first test if a null style exists and if so, use this instead of the script system's font <12Mar89smb> jsrROM ROMAnyNullStyle ; returns a0 pointing to the null scrap record beq.s @UseScriptFont ; nope, use script's font move.w d0,d4 ; save script's font <20July89smb> Lea scrpStyleTab(a0),a0 ; point to start of table ; must test if font is of the same script before using it <20July89smb> move.l a0,-(sp) ; save scrpStyleTab <20July89smb> sub.w #2,sp ; allocate return, 1 int <20July89smb> move.w scrpFont(a0),-(sp) ; scrpFont <20July89smb> _Font2Script ; get script from font <20July89smb> move.w (sp)+,d1 ; fontScript <20July89smb> move.l (sp)+,a0 ; restore scrpStyleTab <20July89smb> cmp.w d3,d1 ; is the scrpFont the same script as the keyscript? <20July89smb> beq.s @UseNullStyle move.w d4,d0 ; diff script so use script's def font <20July89smb> bra.s @UseScriptFont @UseNullStyle move.w scrpFont(a0),d0 ; want to use the style in the null scrap record @UseScriptFont ; at this point d0 contains the new font to use. The rest of the style information (size, face, etc) ; will be taken from the scrpStyle if one exists otherwise it comes from teSelStart's style. <20July89smb> movem.w (sp)+,d3/d4 ; restore <20July89smb> ; load new font as in textStyle.tsFont move.l ExpandMem,a0 ; <1Feb89smb> textStylePtr: actually only font attribute move.w d0,ExpandMemRec.emNewFont(a0) move.l a0,a2 ; <3Feb89smb> lea ExpandMemRec.emNewStyle(a2),a2 ; changed to lea <12July89smb> lea ExpandMemRec.emNewFont(a0),a0 ; changed to lea <12July89smb> ; redraw flag and mode already set at init time above move.l a0,2(a2) ; only stuffed the font: need address of emNewFont <10Mar89smb> jsrROM ROMSetRsrved ; call this routine, which TESetStyle calls <18July89smb> @Done Rts ENDIF ENDPROC IF Scripts604 | SysVers>= $605 THEN ; new <7Dec89smb> ;---------------------------------------------------------------------- ; ptchSetKeyboard2Font ; <7Dec89smb> Added flag to clear up unsynchronized font & keybd. ;---------------------------------------------------------------------- ptchSetKeyboard2Font PROC ; if only 1 script installed none of this is necessary move.l a0,-(sp) ; save style ptr move.l ExpandMem,a1 ; <1Feb89smb> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1) beq.s @done ; only one script => keyboard set just fine! ; turn off the flag set when TE creates an unsynchronized font & keyboard situation <3Dec89smb> sf ExpandMemRec.emUnsynchedFlag(a1) ; <3Dec89smb> IF forLocalizability THEN ; <34f-YDS-9/2/91> sub.w #2,sp ; allocate return, 1 int _FontScript ; get script from font in grafport ; change the keyboard to match the current selection's script. Move.w (sp), d0 ; script param on the stack from FontScript call !!! move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 ; move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript _KeyScript ; script param on the stack from FontScript call ELSE jmpROM ROMinSetKeyboard2Font ENDIF @done jmpROM ROM@DoneInKeybd2Font ENDPROC ;---------------------------------------------------------------------- ; ClickKeyboard2Font ; <3Dec89smb> ; ; When click in Roman text (whether as an insertion point or selection), ; in a non-Roman font, set the keyboard to Roman. This is the only ; time we will allow an unsynchronized font and keyboard. Used by TEClick ; and TESetSelect since for hit-down or cursor movement. ; ; ENTRY ; The font must have been set in the grafport upon entry ; d0 = the current char offset or teSelStart ; USES ; a1,d0-d2 ; preserves a0/d3/d4 ;---------------------------------------------------------------------- ClickKeyboard2Font PROC EXPORT ; if only 1 script installed none of this is necessary movem.l a0/a2/d3/d4,-(sp) ; save style ptr move.l ExpandMem,a1 ; <1Feb89smb> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1) beq @done ; only one script => keyboard set just fine! move.w d0,d3 ; char offset to use for synching <3Dec89smb> ; get the script (the font must have been set in the grafport already) sub.w #2,sp ; allocate return, 1 int _FontScript ; get script from font in grafport ;--------------------------------------------------------------------- ; Will now allow a Roman keyboard and a non-Roman font for hit-down; KanjiTalk wants ; to be able to input Roman text from a Kanji font <3Dec89smb> ; if we're in single-byte Roman text, and the font is non-Roman then ; want keyboard to be Roman <3Dec89smb> move.l ExpandMem,a0 ; initialize to false <3Dec89smb> sf ExpandMemRec.emUnsynchedFlag(a0) ; <3Dec89smb> ; if the font script = Roman then synch keyboard to the font move.w (sp)+,d4 ; font script beq.s @UseFont ; Always synchronize the keyboard & font unless a double-byte script. <37> subq #4,sp ; <37> move.w d4,-(sp) ; <37> move.w #smScriptRedraw,-(sp) ; <37> _GetScript ; <37> move.l (sp)+,d0 ; <37> tst.b d0 ; result is a byte <37> ble @UseFont ; 0 = single byte LR script, -1 = RL script, 1 = double-byte script <37> ; If we're not in single-byte Roman text then synch keyboard to the font ; now test with charbyte to see if we're in Roman text clr.w -(sp) ; room for return move.l teTextH(a3),a2 ; get handle move.l (a2),a2 ; save text ptr to re-use <37> move.l a2,-(sp) ; pointer to start of text <37> move.w d3,-(sp) ; offset in text _CharByte tst.w (sp)+ ; high byte of character? bne.s @UseFont ; if not single byte text, synch to font script ; Is a single byte character… ; Is this Roman text? clr.w -(sp) ; room for return move.l a2,-(sp) ; pointer to start of text move.w d3,-(sp) ; offset in text _CharType move.w (sp)+,d0 ; now let's see what "type" of char we have! ; Mask off what I'm interested in: the Type ($000F) and the Direction ($2000) ; I want a char whose Direction is LR (smCharLeft, $0000) and whose Type is Roman ; which can be smCharAscii (1) or smCharEuro (7). and.w #smcTypeMask+smcRightMask,d0 ;; beq.s @Set2Roman ; smCharPunct = 0 cmp.w #smCharAscii,d0 beq.s @Set2Roman cmp.w #smCharEuro,d0 ; not really necc f. 2-byte scripts… <37> bne.s @UseFont ; otherwise, must use the font script @Set2Roman ; want the keyboard to be Roman rather than synchronized to the font script <3Dec89smb> move.w #smRoman,d4 move.l ExpandMem,a0 ; indicate that we have an anamoly now! <3Dec89smb> st ExpandMemRec.emUnsynchedFlag(a0) ; <3Dec89smb> @UseFont move.w d4,-(sp) ;--------------------------------------------------------------------- ; change the keyboard to match the current selection's script. IF forLocalizability THEN ; <34f-YDS-9/2/91> Move.w (sp), d0 ; script param on the stack from FontScript call !!! move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 ; move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript ENDIF _KeyScript ; script param on the stack from FontScript call @done movem.l (sp)+,a0/a2/d3/d4 ; restore style ptr Rts ENDPROC ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTEChar2Pixel ; <7Aug89smb> test if called for R-to-L highlighting rather ; than hit-testing. ; <9/20/90> Patch out more of C2P in order to use TextWidthHook ;---------------------------------------------------------------------- ptchTEChar2Pixel PatchProc JChar2Pixel ; see initial comments in TextEdit.a move.l d3,-(sp) tst.b TESysJust beq @UseC2P ; RL line direction movem.l d0/d2/a0/a1,-(sp) move.w d1,-(sp) tst.b teSize(a3) bpl.s @noStyle move.L teTextH(a3),a1 ; source = text move.L (a1),a1 ; dereference suba.l a1,a0 ; offset to beginning of text to be measured move.w a0,d0 ; length to beginning of style run add.w (sp),d0 ; add in length to offset move.w d0,d3 ; save jsrROM ROMGetCurStyle jsrROM ROMGetDirection ; <6June89smb> bra.s @TestDir ; <6June89smb> @noStyle ;; d3 must be an absolute position for comparing to line ends. <20June89smb> move.w d1,d3 ; offset w/in line <20June89smb> add.w (a2),d3 ; absolute position <20June89smb> ; get the script direction from the font in the grafport for unstyled text <6June89smb> jsrROM ROMGetDirection ; input is a3 - handle to teRec <11><17> ;; sub.w #6,sp ; allocate return, 1 long, 1 int <11><17> ;; _FontScript ; returns script; leave on stack as param <11><17> ;; move.w #smScriptRight,-(sp) ; pass verb <11><17> ;; _GetScript <11><17> ;; move.l (sp)+,d1 ; get byte = line direction <11><17> @TestDir cmp.b TESysJust,d1 beq.s @fixStack ; not equal=> LR script ; RL line and LR script ; compare current position to line ends move.w (sp)+,d1 movem.l (sp)+,d0/d2/a0/a1 ; test if called for R-to-L highlighting rather than hit-testing <31July89smb> move.l d2,-(sp) ; save <1Aug89smb> swap d2 ; direction in high word <31July89smb> cmp.w #smHilite,d2 ; bug fix for Arabic highlighting <31July89smb> movem.l (sp)+,d2 ; restore (w/o affecting CCs) <1Aug89smb> IF NOT hasTextWidthHook THEN ; <17> bne.s @Use4HitTest ; <31July89smb> bra.s @UseC2P ; using for hilighting! <31July89smb> @Use4HitTest jmpROM ROM@Use4HitTest ELSE ; <17> beq.s @UseC2P ; using for hilighting! <31July89smb> <17> ; use for hit testing <17> cmp.w (a2),d3 ; same as lineStart? beq.s @OnAnEnd cmp.w 2(a2),d3 ; same as lineEnd? bne.s @UseC2P @OnAnEnd ; RL line and LR script and on a lineEnd so process w/o calling C2P. swap d2 ; direction in high word cmp.w #smLeftCaret,d2 bne.s @RightCaret cmp.w (a2),d3 ; same as lineStart? beq.s @TextWidth ; yep, start bra.s @ZeroWidth ; nope, end @RightCaret cmp.w (a2),d3 ; same as lineStart? beq.s @ZeroWidth ; yep, start @TextWidth moveq #0,d1 ; wants offset here <17> import TETextWidthHook ; <17> bsr TETextWidthHook ; hook out TextWidth <17> bra.s @done @ZeroWidth moveq #0,d1 @done move.l (sp)+,d3 ; restore <4May89smb> Rts ENDIF ; <17> @fixStack jmpROM ROM@fixStack @UseC2P jmpROM ROM@UseC2P ENDPROC ;---------------------------------------------------------------------- ; PROCEDURE ptchPixel2Char ; <7Aug89smb> I need to patch a bug in the routine SetUp, a ; subroutine of StylMeasure, and only called by RomanFindLine. ; It is a caller of P2C that has no vector or trap. ; Patching out the vector jPixel2Char and not the hook, TEHitTestHook. ; This will allow developers to patch out the same vector w/o ; repercussions but if they chain in a fix before using jPixel2Char ; in the hook, then there may be a problem. ; <7Dec89smb> Added flag to indicate that the leftSide flag shouldn't ; be set if TextWidth was used to measure. Also added more patches ; to ptchSetUp to handle this new flag: don't bother looking at leftSide ; flag if TextWidth did the measuring instead of SMgr's P2C. Also added ; three other lines that weren't necessary before but cleaner to have the ; complete end of the routine here now. ; <9/20/90smb> Calling TETextWidthHook now. ;---------------------------------------------------------------------- ptchPixel2Char PatchProc JPixel2Char IF Scripts604 | SysVers>= $605 THEN with P2CFrame link a6,#locals move.l a0,textPtr(a6) ; save for result move.w d1,pixelWidth(a6) ; save for SMgr P2C (and width used for 7.0) IF SysVers>= $700 THEN ; use NPixel2Char now for a faster and more powerful hit-test routine! <23> subq #2,sp move.l a0,-(sp) ; pass text ptr to buffer and.l #$0000FFFF,d0 ; want length as a longint move.l d0,-(sp) swap d2 ; here's the slop clr.w d2 ; as a FIXED move.l d2,-(sp) move.w d1,txtWidth(a6) ; save for result swap d1 ; pass de pixel width clr.w d1 ; as a FIXED move.l d1,-(sp) pea leadingEdge(a6) ; leadingEdge is a var pea widthRemaining(a6) ; width remaining is a var & FIXED move.w #smOnlyStyleRun,-(sp) ; default style run position move.l #$00010001,d0 ; default 1/1 scaling move.l d0,-(sp) ; push numer move.l d0,-(sp) ; push denom _NPixel2Char move.w (sp)+,d1 ; returns the char offset move.w txtWidth(a6),d0 ; return initial width for a hit moveq #0,d2 ; must clear since DoSearch tests it tst.w widthRemaining(a6) ; is there a hit? (FIXED result) bmi.s @SetLEFlag ; yep sub.w widthRemaining(a6),d0 ; return actual measured width @SetLEFlag ; indicate to DoSearch that SMgr's P2C used hence leadingEdge flag is valid bset #16,d2 ; flag that P2C used move.b leadingEdge(a6),d2 ; renamed from leftSide <23> bne.s @finis ; bra if leadingEdge is T since whole character fits <20> ; decrement if LeadingEdge is F to be sure whole character will display <23> ; backup correctly for either single or double byte text movem.l d0/d2/d3/d6,-(sp) ; <23> move.l textPtr(a6),a0 ; pointer to text measured <23> move.l teTextH(a3),a1 ; <23> move.l (a1),a1 ; <23> suba.l a1,a0 ; offset of this text <23> move.w a0,-(sp) ; save for decrement <23> move.w d1,d6 ; DoubleByte wants offset here <23> add.w a0,d6 ; current position <23> move.w #-1,d3 ; incremental direction to move <23> jsrROM ROMDoubleByte ; <23> move.w d6,d1 ; new position <23> sub.w (sp)+,d1 ; restore as an offset w/in this text <23> movem.l (sp)+,d0/d2/d3/d6 ; <23> @finis unlk a6 rts ELSE ; NOT (SysVers>= $700) <23> move.w d0,textLen(a6) ; save for return test move.w d2,slop(a6) ; save for SMgr P2C IF hasTextWidthHook THEN ; <17> moveq #0,d1 ; wants offset here <17> import TETextWidthHook ; <17> bsr TETextWidthHook ; hook out TextWidth <17> ELSE ; <17> subq.l #2,sp ; room for result move.l a0,-(sp) ; ptr on stack move.w #0,-(sp) ; offset to first char move.w d0,-(sp) ; length of block _TextWidth ; how wide is it? clr.l d0 move.w (sp)+,d0 ; this wide ENDIF ; <17> moveq #0,d2 ; must clear since DoSearch tests it <26June89smb> move.w textLen(a6),d1 ; char offset := length (end posn of style run) ; catch corrected result of overflow bug in StdTxMeas <19> with splineKeyRec move.l expandMem,a0 ; get low memory expand pointer. <19> move.l ExpandMemRec.emSplineKey(a0),a0 ; get handle to splineKey globals. <19> move.l (a0), a0 ; get pointer to splineKey globals. <19> cmp.b #-1, splineKeyRec.safeCount(a0) ; check to see if count changed <19> beq.s @noOverFlow ; <19> move.w splineKeyRec.safeCount(a0),d1 ; new char offset <19> endWith move.w d1,textLen(a6) ; try this out: use the new count for P2C <19> @noOverFlow cmp.w pixelWidth(a6),d0 ; measured width <= pixelWidth input? bls.s @finis ; yes, get next style until run out of pixels <26June89smb> ; measured text > inputted pixelWidth therefore must measure with P2C to get char offset <23Sept88smb> move.w d0,txtWidth(a6) clr.w -(sp) ; room for Pixel2Char return move.l textPtr(a6),-(sp) ; pass text ptr to buffer move.w textLen(a6),-(sp) ; pass text len move.w slop(a6),-(sp) ; here's the slop move.w pixelWidth(a6),-(sp) ; pass de pixel width pea leadingEdge(a6) ; leftSide is a var (renamed from leftSide) <24> _Pixel2Char move.w (sp)+,d1 ; returns the char offset move.w txtWidth(a6),d0 ; restore measured pixelWidth bset #16,d0 ; an offset corresponds to PixelWidth ; indicate SMgr's P2C used hence leadingEdge flag is valid <7Dec89smb> moveq #0,d2 ; clear again after P2C call <7Dec89smb> bset #16,d2 ; flag that P2C used <7Dec89smb> move.b leadingEdge(a6),d2 ; renamed from leftSide <24> IF SysVers>= $700 THEN bne.s @finis ; whole character fits <19> ; decrement if LeadingEdge is F to be sure whole character will display <19> ; backup correctly for either single or double byte text (pinHead!) <19> movem.l d0/d2/d3/d6,-(sp) ; <19> move.l textPtr(a6),a0 ; <20> move.l teTextH(a3),a1 ; <20> move.l (a1),a1 ; pointer to text measured <20> suba.l a1,a0 ; offset of this text <20> move.w a0,-(sp) ; save for decrement <20> move.w d1,d6 ; DoubleByte wants offset here <20> add.w a0,d6 ; current position <20> move.w #-1,d3 ; incremental direction to move <19> jsrROM ROMDoubleByte ; <19> move.w d6,d1 ; new position <19> sub.w (sp)+,d1 ; restore as an offset w/in this text <20> movem.l (sp)+,d0/d2/d3/d6 ; <19> @finis unlk a6 rts ELSE beq.s @finis ; PixelWidth R. of char or L.of entire string ; increment to compensate for decrement if leadingEdge is true AND we are within the line boundaries add.w #1,d1 ; caller assumes R. side; incr for L.side @finis unlk a6 cmpROM ROMSetUpP2C,(sp) ; if StylMeasure called bra to ptchSetUp <7Dec89smb> beq.s ptchSetUp ; <7Dec89smb> rts ;----------------------------------------------- ptchSetUp sub.w d0,d4 ; update width swap d0 ; get flag in low byte addq.l #4,sp ; pop return address <7Dec89smb> ; if SMgr's P2C measured the text then the leadingEdge flag is valid <7Dec89smb> tst.l d2 ; flag in high word; whole reg 0 if TextWidth used <7Dec89smb> beq.s @CharOffsetOK ; TextWidth used, not SMgr's P2C <7Dec89smb> bclr #16,d2 ; clean up! <7Dec89smb> ENDIF ENDIF ; <23> endWith ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ELSE ; NOT (Scripts604 | SysVers>= $605) cmpROM ROMSetUpP2C,(sp) beq.s @DeBuggyCaller ; other caller jmpROM ROMTEPixel2Char @DeBuggyCaller ; P2C was called by SetUp in StylMeasure, which is only called by RomanFindLine jsrROM ROMTEPixel2Char sub.w d0,d4 ; update width swap d0 ; get flag in low byte ENDIF ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; RomanFindLine expects the char offset to come back as a leftSide hit. Since using SMgr P2C must ; check the leftSide flag and if it's F. incr the char count for the decr in RomanFindline. This ; forces the result to be a leftSide hit at the next character. <4Aug89smb> tst.b d2 ; rightSide of char? <4Aug89smb> bne.s @CharOffsetOK ; nope, left <4Aug89smb> addq.w #1,d1 ; force a leftSide hit <4Aug89smb> @CharOffsetOK move.w (sp)+,d2 ; restore count, another forgotten line! <7Dec89smb> Rts ENDPROC ;---------------------------------------------------------------------- ; PROCEDURE GestaltTEciVersion ; <8Aug89smb> ; The following Gestalt Function is an interface using the Gestalt ; mechanism to determine the current version of TextEdit. ; ; FUNCTION GestaltTEVersion ( gestaltSelector: OSType; ; VAR gestaltResult: Longint;): OSErr; ; ; The versions for the gestaltTextEditVersion selector are: ; gestaltUndefSelectorErr = old styled TextEdit (pre-MacIIci TE) ; All the following versions of TE are based on the SMgr-compatible version: ; gestaltTE1 (1) = MacIIci ROM/PTCH 67c ; gestaltTE2 (2) = 604 Script Systems PTCH 67c (Script bug fixes for MacIIci) ; gestaltTE3 (3) = 604 Script Systems ptch0/parallels Big Bang (for MacII, MacSE, Mac+) ; gestaltTE4 (4) = Big Bang ptch0/PTCH 67c ; gestaltTE5 (5) = TextWidthHook available in System 7 ; ; THE OBVIOUS: since this is here for the MacIIci ROM patch, we have ; hardcoded the ONLY value that is appropriate to be returned! sigh. ;_________________________________________________________________________________ GestaltTEciVersion PROC EXPORT move.l (sp)+, a0 ; return address move.l (sp)+, a1 ; address of result ; return correct version of this code <29Aug89smb> ; rearranged the order of these conditionals in case we set Scripts604 true for SysVers >= $605 <2> IF SysVers >= $700 THEN move.l #gestaltTE5, (a1) ; TextWidthHook available in System 7 <18> ELSEIF SysVers >= $605 THEN ; changed IF to ELSEIF <18> move.l #gestaltTE4, (a1) ; 6.0.5 & Big Bang ELSEIF Scripts604 THEN move.l #gestaltTE2, (a1) ; 604 Scripts ELSE move.l #gestaltTE1, (a1) ; MacIIci ROM ENDIF adda.w #4, sp ; pop the selector type move.w #noErr, (sp) ; it always works jmp (a0) ENDPROC ;---------------------------------------------------------------------- ; Created one procedure for all the routines needing changes due to the GetNextDisplayStyle ; bug! What a mess! <9Aug89smb> ;---------------------------------------------------------------------- PROC EXPORT ptchTestRunDirection EXPORT ptchTEDoText EXPORT ptchDoDraw EXPORT ptchCursorMovement EXPORT ptchFindStyleRun EXPORT ptchTEGetFormatOrder EXPORT ptchCaretDisplay EXPORT ptchGetStylesInOrder EXPORT ptchChkBounds EXPORT ptchDoMeasure EXPORT ptchOnSameLine EXPORT ptchTEKey EXPORT ptchTEInit ; <2Oct89smb> moved into this proc EXPORT ptchTEDelete EXPORT ptchTrimMeasure ; <16Nov89smb> IF Scripts604 | SysVers>= $605 THEN EXPORT ptchDumpBuffer ; <28Sept89smb> EXPORT ptchBufferChar ; <28Sept89smb> EXPORT ptchTEBufferText ; <28Sept89smb> EXPORT ptchGetStyleEnd ; <26Nov89smb> ;---------------------------------------------------------------------- ; Added all the traps that call StdEntry since there are dependencies here.<28Sept89smb> ;---------------------------------------------------------------------- EXPORT ptchTEActivate EXPORT ptchTEDeactivate EXPORT ptchTEDispatch EXPORT ptchTEGetText EXPORT ptchTESetText EXPORT ptchTECalText EXPORT ptchTESetSelect EXPORT ptchTEUpdate EXPORT ptchTEClick EXPORT ptchTECopy EXPORT ptchTECut EXPORT ptchTEIdle EXPORT ptchTEPaste EXPORT ptchTEInsert EXPORT ptchTESetJust EXPORT ptchTEScroll EXPORT ptchTEPinScroll EXPORT ptchTESelView EXPORT ptchTEAutoView EXPORT ptchTEGetOffset ;---------------------------------------------------------------------- EXPORT ptchGetWidth ; <16Nov89smb> ptchDoMeasure dependent EXPORT ptchGetRLPosition ; <20Nov89smb> ptchCaretDisplay dependent EXPORT ptchCaretInsideRun ; <7Dec89smb> EXPORT ptchDoCaret ; <1/29/90smb> calls CaretDisplay EXPORT ptchGetLRPosition ; <2/8/90smb> called by CaretDisplay ENDIF IF hasTextWidthHook THEN ; <17> EXPORT ptchDoErase ; <17> ENDIF ; <17> IF forLocalizability THEN EXPORT ptchOnLineEnd ; <34a-YDS-9/2/91> EXPORT ptchWholeDoMeasure ; <34-YDS-9/2/91> ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchGetNextDisplayStyle ; <8Aug89smb> Made a2StyleRun(a6) an offset rather than a ; pointer. The pointer's handle wasn't locked so it moves! UGH!! ; <16Nov89smb> Added code to test for unstyled teRecords since ; this looks like it should break without it! (see calls to here!) ;---------------------------------------------------------------------- ptchGetNextDisplayStyle with SharedFrame,TEFormatOrder movea.l a2StyleRun(a6),a0 ; For styled, is an offset to desired posn in style run array, otherwise is a ptr <5Aug89smb> ; Made a2StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) ; Get to posn in styleRun array via the style handle and saved offset <5Aug89smb> tst.w teSize(a3) ; <16Nov89smb> bpl.s @Unstyled ; saved as a ptr for unstyled text! <16Nov89smb> ; styled teRec move.l teStylesH(a3),a1 ; <5Aug89smb> move.l (a1),a1 ; deref <5Aug89smb> add.l a1,a0 ; add to offset to get desired posn in the array <5Aug89smb> @Unstyled move.w fmtOrderingIndex(a6),d0 ; index (0-d2) into array for next style run lsl.w #1,d0 ; index into fmtOrdering array move.l fmtOrderingPtr(a6),a1 move.w 0(a1,d0.w),d0 ; index of style run to process move.w d0,styleRunIndex(a6) lsl.w #lnStStartSize,d0 ; offset in styleRun array lea.l 0(a0,d0.w),a0 ; pointer to next style run rts endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchTEInit ; <18July89smb> replaced d1 w/ d3 for WordRedraw determination, ; and fixed loop incremental. ; <2Oct89smb> moved ptchTEInit here due to its dependency on ; ptchTEDoText, which was in a different proc. ;---------------------------------------------------------------------- ptchTEInit MoveQ #0,D0 Move D0,TEScrpLength ; save in global space _NewHandle Move.L A0,TEScrpHandle ; Save in global space Lea ptchTEDoText,a0 ; set up doText hook (added back in) <2Oct89smb> move.l a0,TEDoText ; TEDoText is a low memory global IF SysVers >= $700 THEN ; <19> import ptchReCalLines ; <19> Lea ptchReCalLines,a0 ; set up recal hook w/ patched version <19> ELSE LeaROM ROMXReCalLines,a0 ; set up recal hook ENDIF Move.L a0,TERecal LeaROM ROMDefWordBrk,a0 ; get default word break Move.L a0,TEWdBreak ; Defensive reset in case an application changed teSysJust contrary to system default. ; ; Now, we just reset it for Roman-only systems (because TE in such a system cannot currently <35> ; handle R-L direction; we will fix this eventually). For other scripts, the Text Control <35> ; Panel lets users choose the default line direction, so we don't want to override it. <35> WITH smgrRecord,scriptRecord GetSMgrCore a0 ; load SMgr globals pointer. IF 1 THEN ; <35> move.b smgrEnabled(a0),d0 ; how many scripts enabled? <35> ble.s @bail ; if 0 (or neg!), can't initialize <35> subq.b #1,d0 ; Roman-only? <35> bne.s @doneSetSysJust ; if not, don't reset <35> clr.w TESysJust ; Roman-only, force to L-R (else TE screws up) <35> @doneSetSysJust ; <35> ELSE ; (keep old code for reference for a while) <35> tst.b smgrEnabled(a0) ; script manager disabled? beq.s @bail ; yes -> bail out. move.w smgrSysScript(a0),d0 ; get system script code. lsl.w #2,d0 ; script code is long offset. move.l smgrEntry(a0,d0.w),a0 ; load system script entry. move.b scriptJust(a0),d0 ; load script just. ext.w d0 ; sign extend just. move.w d0,TESysJust ; set global just. ENDIF ; <35> endWith ; ;<2Feb89smb> ; initialize NewStyle params for SetRsrved call in SetFont2Keyboard (flag.b, textStylePtr.l, mode.w) move.l ExpandMem,a0 lea ExpandMemRec.emNewStyle(a0),a0 ; changed from add to lea <12July89smb> move.b #$FF,(a0) ; flag.b move.w #1,6(a0) ; mode.w ; Find correct WordDraw value. Used for redrawing for line calculation ; after character input. A WordDraw value of: ; 0 = redraw the char in front of the inputted char, ; 1 = redraw the word in front of the inputted char, ; FF = redraw the whole line. ; To set the correct value walk through the scripts (32 of them!), ; in 1 for each double-byte script and in FF for each right-left script. move.b #0,WordRedraw ; default case move.l d3,-(sp) ; save <18July89smb> moveq #0,d3 ; init d3; for d3 := 0 to 32 do @WordRedrawLoop clr.l -(sp) ; allocate return move.w d3,-(sp) ; script number move.w #smScriptRedraw,-(sp) ; verb _GetScript ; if disabled, will return zero. move.l (sp)+,d0 ; values are 0, 1, FF or.b d0,WordRedraw ; add it in: 1 ++ x, FF ++ x ; if all FFs, then dont need to go further-so check for negative bmi.s @WRLoopXit addq.w #1,d3 ; next script to check <18July89smb> cmpi.w #32,d3 ; beyond last script? <18July89smb> bls.s @WordRedrawLoop ; keep going until done w/ scripts @WRLoopXit move.l (sp)+,d3 ; restore <18July89smb> jmpROM EndTEInit @bail Rts ;---------------------------------------------------------------------- ; PROCEDURE ptchTEDoText ; <8Aug89smb> I need to patch bugs in DoSearch and DoDraw, ; which are hooks via TeDoText. ; <1/29/90smb> Added patch to DoCaret to pin the caret in view ; when blanks exceed the edge of the view rect. ;---------------------------------------------------------------------- ptchTEDoText with TextFrame,TEFormatOrder Link A6,#TextFrameSz ; link frame for DoText procs move.l a0,-(sp) ; save just in case <48> move.l ExpandMem,a0 ; <48> sf ExpandMemRec.emFmtOrderHFlag(a0) ; ensure that we don't think <48> ; we have a handle to a formatarray <48> move.l (sp)+,a0 ; <48> Tst D7 ; check dispatch code Beq.s ptchDoSearch Bgt @DoHilite Cmp #teDraw,D7 Beq ptchDoDraw IF Scripts604 | SysVers>= $605 THEN bra ptchDoCaret ; <1/29/90smb> @DoHilite bra ptchDoHilite ; <4Oct89smb> ELSE jmpROM ROMDoCaret ; falls into DoCaret <9Aug89smb> @DoHilite jmpROM ROMDoHilite ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchDoSearch ; <8Aug89smb> ; <19Nov89smb> Fix for RL directional text. ; <7Dec89smb> More fixes due to new P2C flag so must patch ; LR system also. ; <1/24/90smb> Need to set up a2 again w/ lineStart when ; found a character break. ; <1/25/90smb> Need to bra to @BailToLeft for zero width. ; <2/16/90smb> If at the last style, and pixel width > 0, and the ; TEHitTestHook is replaced, then must check the high word of d0 ; to see if we REALLY got a hit! ;---------------------------------------------------------------------- ptchDoSearch with TextFrame,TEFormatOrder jsrROM ROMPreamble ; get A2 from D3 Move (A2),D3 ; set left anchor <14Jan86> Move D3,D4 ; init char counter jsrROM ROMLineRect ; set rLine to A2 line Move (A2),D7 ; set left anchor sf teLftClick(A3) ; assume false for later! <4May89smb> Move.W teSelPoint+h(A3),D5 ; get h coord Sub.W teSelRect+left(A3),D5 ; subtract justification ; set d0 and teLftClick(a3) if at left of selRect <4May89smb> ble @BailToLeft ; special case on left of whole line ;;<1/25/90smb> if zero width, want to branch ow this one pixel difference causes the ;;<1/25/90smb> caret to display on the wrong line ending. (Roman fix) ;;<1/25/90smb> blt @BailToLeft ; special case on left of whole line <16Aug89smb> Move teSelRect+left(A3),teSelRect+right(A3); init right side to left Move.W #UnboundLeft,teSelRect+left(A3); bogus left Move.W 2(A2),D6 ; end of line Tst.W teSize(A3) ; check style flag Bmi.S @StyledRecord st useOldMethod(a6) MoveQ #1,D2 ; just 1 style Move.W D3,D1 ; start of line Move.W D6,D0 ; whole line IF NOT (Scripts604 | SysVers>= $605) THEN ; <7Dec89smb> jmpROM ROM@DoMeasure ELSE Bra @DoMeasure ; <7Dec89smb> ENDIF @StyledRecord sf useOldMethod(a6) ; flag for getting style runs <28Sept88smb> ; determine if display order is different from backin-store order <28Sept88smb> tst.b WordRedraw ; $FF if a R->L directional script installed bge @getStyleOld ; nope, only L->R directional text Move.W D3,D0 ; start offset Move.W D6,D1 ; end of selection bsr ptchGetStylesInOrder ; <9Aug89smb> ; tests whether any styles to process <15Nov88smb> bge.s @GetStyleHandle ; <15Nov88smb> jmpROM ROM@NoMoreStyles ; done <15Nov88smb> ;---------------------------------------------------------------------- ; added more code at @getStyleNew for right-to-left directional scripts <19Nov89smb> @getStyleNew ; get next style using the results from getFormatOrder <28Sept88smb> ;; <5Aug89smb> movea.l a2StyleRun(a6),a0 ; Made a2StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) ; Get to posn in styleRun array via the Style Handle and saved offset <5Aug89smb> move.l teStylesH(a3),a0 ; <5Aug89smb> move.l (a0),a0 ; deref <5Aug89smb> add.l a2StyleRun(a6),a0 ; add in offset to desired posn in the array <5Aug89smb> IF NOT (Scripts604 | SysVers>= $605) THEN ; needed <7Dec89smb> jmpROM ROMEndDoSearch ;;;;;;; Removed the code for a LR script system here. Not necc since using ROM code for this case. ;;@getStyleOld ;; st useOldMethod(a6) ;; Move.W D3,D0 ; get selection start!!! ;; Move.W D6,D1 ; end of line ;; Bsr GetCurStyle ; get its style <7Oct88smb> ;; Bsr GetNumStyles ; # of styles between offsets <7Oct88smb> ;; Move.W D0,D2 ; preserve # of styles ;;;;;;; Removed the code for a LR script system here. Not necc since using ROM code for this case. ELSE move.w fmtOrderingIndex(a6),d0 ; index (0-d2) into array for next style run lsl.w #1,d0 ; index into fmtOrdering array <28June89smb> lea.l fmtOrderingPtr(a6),a1 ; get ptr to array of format runs ordering <15Nov88smb> move.l (a1),a1 ; dereference for ordering <15Nov88smb> move.w 0(a1,d0.w),d0 ; index of next style run lsl.w #lnStStartSize,d0 ; offset in styleRun array from d3 style run <28June89smb> lea.l 0(a0,d0.w),a0 ; next style run addq #1,fmtOrderingIndex(a6) ; incr the style run counter subq #1,D2 ; dec the style counter bge.s @GetStyleHandle jmpROM ROM@NoMoreStyles ; done @getStyleOld st useOldMethod(a6) Move.W D3,D0 ; get selection start!!! Move.W D6,D1 ; end of line jsrROM ROMGetCurStyle ; get its style <7Oct88smb> jsrROM ROMGetNumStyles ; # of styles between offsets <7Oct88smb> Move.W D0,D2 ; preserve # of styles ENDIF @GetStyleHandle Move.L A0,A2 ; preserve ptr to current style Move.L teStylesH(A3),A0 ; handle to style info _HLock ; lock it up Move.L A2,A0 ; restore style ptr @StyleLoop Move.L A0,A2 ; save ptr to style start jsrROM ROMSetStyle ; set the style Move.W startChar(A0),D1 ; get start of style AddQ.L #stStartSize,A0 ; pt to next style run in StyleRun array Move.W startChar(A0),D0 ; want end of this style run Cmp.W D3,D1 ; compare styleStart to beginning of line Bhs.S @OnSameLine ; made this unsigned Move.W D3,D1 ; set beginning of style to beginning of line @OnSameLine Move.W D1,D7 Cmp.W D0,D6 ; compare styleEnd to end of line Bhs.S @DoMeasure ; made this unsigned Move.W D6,D0 ; set end of style to end of line @DoMeasure Move.W D2,-(SP) ; style count Sub.W D1,D0 ; length Move.L teTextH(A3),A0 ; handle to text Move.L (A0),A0 ; dereference AddA.W D1,A0 ; add offset to start of line Move.W D5,D1 ; get pixel offset MoveQ #0,D2 ; slop jsrROM ROMTEHitTestHook ; call our hook instead Add.W D0,teSelRect+right(A3) ; update selRect Add.W D1,D7 ; update char offset Sub.W D0,D5 ; update pixel offset ; find out if the pixel position was within the style run. <9Nov88smb> ble.s @HitIt ; got a hit! (D5 <= 0) ;---------------------------------------------------------------------- ; if at the last style, and pixel width > 0, and the TEHitTestHook is replaced, then ; must check the high word of d0 to see if we REALLY got a hit! <2/16/90smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l HITTESTHook(a0),a0 peaROM ROMPixel2Char cmpa.l (sp)+,a0 beq.s @NotAHit ; we've been hooked out so test per the old interface specs for a hit. swap d0 tst.b d0 bne.s @HitIt @NotAHit ;---------------------------------------------------------------------- Move.L a2,a0 ; ptr to current style moveq #0,d2 ; clear P2C flag from high word <7Dec89smb> Move.W (sp)+,d2 ; restore style count ; if no more style runs (at right of selRect), set exit info <4May89smb> bne.s @getNextStyle ; last style on line? jmpROM ROM@NoMoreStyles @getNextStyle IF NOT (Scripts604 | SysVers>= $605) THEN ; needed <7Dec89smb> ;;;;;;; Removed the code for a LR script system here. Not necc since using ROM code for this case. ;; tst.b useOldMethod(a6) ; <28Sept88smb> ;; beq @getStyleNew ; use formatOrder array ;; either unstyled or styled, LR record. ;; Addq.l #stStartSize,a0 ; get next style <7Oct88smb> ;; SubQ #1,D2 ; dec # of styles ;; Bne.S @StyleLoop ; keep looping if more NO ;;;;;;; Removed the code for a LR script system here. Not necc since using ROM code for this case. bra.s @getStyleNew ELSE tst.b useOldMethod(a6) ; <28Sept88smb> beq @getStyleNew ; use formatOrder array ; either unstyled or styled, LR record. Addq.l #stStartSize,a0 ; get next style <7Oct88smb> SubQ #1,D2 ; dec # of styles Bne.S @StyleLoop ; keep looping if more NO jmpROM ROM@NoMoreStyles ENDIF ;---------------------------------------------------------------------- @BailToLeft jmpROM ROM@BailToLeft IF NOT (Scripts604 | SysVers>= $605) THEN ; needed <7Dec89smb> @getStyleOld jmpROM ROM@getStyleOld @HitIt jmpROM ROM@HitIt ELSE @HitIt addq.l #2,sp ; remove style count from stack ; if SMgr's P2C measured the text then the leftSide flag is valid <7Dec89smb> tst.l d2 ; flag in high word; whole reg 0 if TextWidth used <7Dec89smb> beq.s findDone ; TextWidth used, not SMgr's P2C <7Dec89smb> bclr #16,d2 ; clean up! <7Dec89smb> tst.b d2 ; left or right side of char? (set in P2C) ; <7Dec89smb> flag in byte IF SysVers>= $700 THEN ; change this to correspond to P2C change <19> st teLftClick(A3) ; mark it to left bne.s findDone ; <19> movem.l d0/d2/d3/d6,-(sp) ; <19> move.w d7,d6 ; current position <19> move.w #1,d3 ; incremental direction to move <19> jsrROM ROMDoubleByte ; <19> move.w d6,d7 ; new position <19> movem.l (sp)+,d0/d2/d3/d6 ; <19> sf teLftClick(A3) ; mark it to right ELSE beq.s findDone ; bug fix <1/24/90smb> subq #1,d7 ; adjust result to left half st teLftClick(A3) ; mark it to left ENDIF ; Only want to test for a CR if the charOffset = 2(a2) and the leftSide = T. ; CR is a neutral character therefore, if it follows a style run whose direction is ; different from the line direction, it will always occur at the EOL posn, in the ; line direction. <5May89smb> ; <1/24/90smb> need to set up a2 again w/ lineStart move.w d3,d0 ; <1/24/90smb> lea teLines(a3),a2 ; <1/24/90smb> jsrROM ROMGetLine ; <1/24/90smb> ; end of fix <1/24/90smb> jmpROM ROMafter@HitIt findDone jmpROM ROMfindDone ENDIF endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchDoDraw ; <1/21/90smb> We are now patching out all of DoDraw for 7.0 ; in order to set PreserveGlyph FALSE before drawing, and then ; restoring it afterwards. ; <9/20/90smb> Calling ptchDoErase now for TETextWidthHook. ; <7Dec89smb> Must call patch to ChkBounds. ; Test WordRedraw to extend bounds of rectangle after calling ; ChkBounds. ; <8Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from DoDraw. ; GetNextDisplayStyle is only called for R-L directional ; scripts, w/ styled text. However, since DoDraw loops ; for each line, I have to patch out the whole routine ; for this situation. DoDraw is a hook via TeDoText. ;---------------------------------------------------------------------- ptchDoDraw ;----------------------------------------------- IF SysVers>= $700 THEN with TextFrame,TEFormatOrder import ptchPinDisplay ; <19> jsr ptchPinDisplay ; you guessed it: it's patched now! <19> jsrROM ROMPreamble ; set rLine to A2 line ; ** Only call LineRect at start to avoid height search ** jsrROM ROMLineRect ;----------------------------------------------- <22> ; Turn PreserveGlyph off before drawing, but save its previous setting <22> clr.w -(sp) ; boolean result <22> _GetPreserveGlyph ; <22> ; leave result on stack tst.w (sp) ; preserve or squash? (byte result but cleared word) beq.s @IsFalse ; <22> move.b #0,-(sp) ; set PreserveGlyph FALSE <22> _SetPreserveGlyph ; <22> @IsFalse ;----------------------------------------------- <22> @lineLoop jsrROM ROMPrepLine ; pin D4 at line end bls @Test4Handle ; done... bsr ptchChkBounds ; extend bounds if necessary tst.b WordRedraw ; if R-L script (-1), then erase whole line <7Dec89smb> bge.s @LROrientation ; no, left->right flow <7Dec89smb> Move.W #UnboundRight,teSelRect+right(A3) ; else, set unbound right <7Dec89smb> Move.W #UnboundLeft,teSelRect+left(A3) ; else, set unbound left @LROrientation move.W d4,d6 ; selEnd bsr ptchDoErase ; calling TETextWidthHook now move.w saveLeft(a6),-(sp) ; saved true left value ** Got rid of rTrue ** move.w teSelRect+top(a3),-(sp) ; position pen move teAscent(a3),d0 tst.w teSize(a3) ; check style flag bmi.s @styledRecord ; record has no style, so draw all at once (the old way) add d0,(sp) ; drop pen to baseline _MoveTo move.l teTextH(a3),a0 ; get text handle move.l (a0),a0 ; dereference add.l d3,a0 ; offset pointer clr.w d0 ; D0-D1 aren't a concern, since… move.w d4,d1 ; …one would expect _DrawText… sub.w d3,d1 ; …to blow them away anyways jsrROM ROMTEDrawHook ; go draw it bra @nxtLine ; NO ; record has style, so draw one style at a time @styledRecord tst.w d0 ; check default ascent bpl.s @ascentSet ; use it if set jsrROM ROMPtrToLine ; convert A2 ptr to line # ext.l d0 ; make it long just in case ** ** lsl.l #2,d0 ; mult by 4 ** ** move.l teStylesH(a3),a0 ; handle to style info move.l (a0),a0 ; deref move.l lhTab(a0),a0 ; array of max hite indeces move.l (a0),a0 ; deref move.w 2(a0,d0.L),d0 ; max ascent @ascentSet add d0,(sp) ; drop pen to baseline _MoveTo sf useOldMethod(a6) ; init flag for getting style runs <28Sept88smb> ; determine if display order is different from backin-store order <28Sept88smb> tst.b WordRedraw ; $FF if a R->L directional script installed bge.s @getStyleOld ; nope, only L->R directional text move.w d3,d0 ; start offset move.w d4,d1 ; end of selection bsr ptchGetStylesInOrder ; <9Aug89smb> ; tests whether any styles to process <15Nov88smb> bge.s @styleLoop ; <15Nov88smb> bra @nxtLine ; <15Nov88smb> @getStyleNew ; get next style using the results from getFormatOrder <28Sept88smb> bsr ptchGetNextDisplayStyle ; <8Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr the style run counter subq #1,d2 ; dec the style counter bge.s @styleLoop bra @nxtLine @getStyleOld st useOldMethod(a6) move.w d3,d0 ; start offset move.w d4,d1 ; end of selection jsrROM ROMGetCurStyle ; get its style <7Oct88smb> replaces GetFirstStyle call jsrROM ROMGetNumStyles ; # of styles between offsets <7Oct88smb> move.w d0,d2 ; save style count @styleLoop move.l a0,-(sp) ; ptr to style: preserve a4 <21Dec88smb> jsrROM ROMSetStyle ; set style move.w startChar(a0),d0 ; get start of style addq #stStartSize,a0 ; ptr to next style move.w d6,d4 ; init to end of line cmp.w startChar(a0),d6 ; compare to end of line blo.s @4 move.w startChar(a0),d4 ; set to end of style @4 move.w d2,-(sp) ; save the count move.l teTextH(A3),a0 ; get text handle move.l (a0),a0 ; dereference cmp.w d3,d0 bhs.s @5 ; made this unsigned ** ** move.w d3,d0 ; reset if needed @5 adda.w d0,a0 ; offset pointer move.l teStylesH(a3),a1 ; get style handle move.l (a1),a1 move.l a1,d1 ; <21Dec88smb> sub.l d1,2(a7) ; save as an offset <21Dec88smb> move.w d4,d1 ; amount := range - i sub.w d0,d1 ; clr.w d0 ; no offset jsrROM ROMTEDrawHook ; go draw it ; Unlock the style handle when through with pointer. move.l teStylesH(a3),a1 ; get style handle move.l (a1),a1 move.l a1,d1 ; <21Dec88smb> add.l d1,2(a7) ; restore as pointer <21Dec88smb> move.w (sp)+,d2 ; restore the count move.l (sp)+,a0 ; ptr to style <21Dec88smb> tst.b useOldMethod(a6) ; <28Sept88smb> beq.s @getStyleNew ; use formatOrder array addq.l #stStartSize,a0 ; get next style <7Oct88smb> replaces GetNextStyle call subq #1,d2 ; dec the style counter bne.s @styleLoop ; must be more than 1 line ; ** NextLineRect will not search for height from start ** @nxtLine jsrROM ROMPtrToLine ; convert A2 to line # addq #1,d0 ; next line jsrROM ROMNextLineRect ; set next line's rect move (a2),d3 ; get start bra @lineLoop ; keep going @Test4Handle ;----------------------------------------------- <22> ; Restore PreserveGlyph ; previous PreserveGlyph value still on stack _SetPreserveGlyph ; <22> ;----------------------------------------------- <22> jsrROM ROMFreeFmtOrderArray ; <18Jan89smb> doBye movem.l (sp)+,d2-d7/a2-a4 ; restore regs unlk a6 ; unlink DoText frame move.l GrafGlobals(a5),a0 ; get the port in A0 for move.l thePort(a0),a0 ; compatibility rts endWith ;----------------------------------------------- ELSE ; NOT (SysVers>= $700) IF NOT (Scripts604 | SysVers>= $605) THEN tst.b WordRedraw ; RL script system installed? bge @UseROM ; if not, use ROM code <28Sept89smb> unsigned tst.w teSize(a3) ; styled or unstyled? bpl @UseROM ; if unstyled, use ROM code <14Aug89smb> ENDIF ; we are here for styled, RL directional scripts with TextFrame,TEFormatOrder jsrROM ROMPinDisplay jsrROM ROMPreamble ; set rLine to A2 line jsrROM ROMLineRect @lineLoop jsrROM ROMPrepLine ; pin D4 at line end Bls @Test4Handle ; done... IF Scripts604 | SysVers>= $605 THEN ; <7Dec89smb> bsr ptchChkBounds ; <7Dec89smb> tst.b WordRedraw ; if R-L script (-1), then erase whole line <7Dec89smb> bge.s @LROrientation ; no, left->right flow <7Dec89smb> Move.W #UnboundRight,teSelRect+right(A3) ; else, set unbound right <7Dec89smb> ELSE jsrROM ROMChkBounds ; extend bounds if necessary Tst.W TESysJust ; reverse order? Beq.S @LROrientation ; no, left->right flow ENDIF Move.W #UnboundLeft,teSelRect+left(A3) ; else, set unbound left @LROrientation IF Scripts604 | SysVers>= $605 THEN ; <7Dec89smb> ; moved these optimizations here due to patch above <7Dec89smb> tst.b WordRedraw ; RL script system installed? bge @UseROM ; if not, use ROM code <28Sept89smb> unsigned tst.w teSize(a3) ; styled or unstyled? bpl @UseROM ; if unstyled, use ROM code <14Aug89smb> ENDIF ; <7Dec89smb> Move.W D4,D6 ; selEnd IF hasTextWidthHook THEN ; <17> bsr ptchDoErase ; calling TETextWidthHook now <17> ELSE ; <17> jsrROM ROMDoErase ; to fix italics problem** ** ENDIF ; <17> Move.W saveLeft(A6),-(SP) ; saved true left value ** Got rid of rTrue ** Move.W teSelRect+top(A3),-(SP) ; position pen Move teAscent(A3),D0 ;;;;;;; Removed the code that tests for an unstyled record here. Not necc since using ROM code for this case. Tst.W D0 ; check default ascent Bpl.S @ascentSet ; use it if set jsrROM ROMPtrToLine ; convert A2 ptr to line # Ext.L D0 ; make it long just in case ** ** LsL.L #2,D0 ; mult by 4 ** ** Move.L teStylesH(A3),A0 ; handle to style info Move.L (A0),A0 ; deref Move.L lhTab(A0),A0 ; array of max hite indeces Move.L (A0),A0 ; deref Move.W 2(A0,D0.L),D0 ; max ascent @ascentSet Add D0,(SP) ; drop pen to baseline _MoveTo ;;<14Aug89smb> sf useOldMethod(a6) ; init flag for getting style runs <28Sept88smb> ; determine if display order is different from backin-store order <28Sept88smb> ;;;;;;; Removed the code for a LR script system here. Not necc since using ROM code for this case. Move.W D3,D0 ; start offset Move.W D4,D1 ; end of selection bsr ptchGetStylesInOrder ; <9Aug89smb> ; tests whether any styles to process <15Nov88smb> bge.s @styleLoop ; <15Nov88smb> bra.s @nxtLine ; <15Nov88smb> @getStyleNew ; get next style using the results from getFormatOrder <28Sept88smb> bsr ptchGetNextDisplayStyle ; <8Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr the style run counter subq #1,D2 ; dec the style counter bcs.s @nxtLine ; fixed branching <14Aug89smb> ;; <14Aug89smb> bge.s @styleLoop ;; <14Aug89smb> bra.s @nxtLine ;;;;;;; Removed the code for a LR script system here. Not necc since using ROM code for this case. @styleLoop Move.L A0,-(sp) ; ptr to style: preserve a4 <21Dec88smb> jsrROM ROMSetStyle ; set style Move.W startChar(A0),D0 ; get start of style AddQ #stStartSize,A0 ; ptr to next style Move.W D6,D4 ; init to end of line Cmp.W startChar(A0),D6 ; compare to end of line Blo.S @4 Move.W startChar(A0),D4 ; set to end of style @4 Move.W D2,-(SP) ; save the count Move.L teTextH(A3),A0 ; get text handle Move.L (A0),A0 ; dereference Cmp.W D3,D0 Bhs.S @5 ; made this unsigned ** ** Move.W D3,D0 ; reset if needed @5 AddA.W D0,A0 ; offset pointer Move.L teStylesH(A3),A1 ; get style handle Move.L (A1),A1 move.l a1,d1 ; <21Dec88smb> Sub.L d1,2(A7) ; save as an offset <21Dec88smb> Move.W D4,D1 ; amount := range - i Sub.W D0,D1 Clr.W D0 ; no offset jsrROM ROMTEDrawHook ; go draw it ; Unlock the style handle when through with pointer. Move.L teStylesH(A3),A1 ; get style handle Move.L (A1),A1 move.l a1,d1 ; <21Dec88smb> Add.L d1,2(A7) ; restore as pointer Move.W (SP)+,D2 ; restore the count Move.L (sp)+,A0 ; ptr to style bra.s @getStyleNew ; <8Aug89smb> ;;;;;;; Removed the code that tests for an LR script system here. Not necc since using ROM code for this case. ;; tst.b useOldMethod(a6) ; <28Sept88smb> ;; beq.s @getStyleNew ; use formatOrder array ;;;;;;; Removed the code for an unstyled record here. Not necc since using ROM code for this case. @nxtLine jsrROM ROMPtrToLine ; convert A2 to line # AddQ #1,D0 ; next line jsrROM ROMNextLineRect ; set next line's rect Move (A2),D3 ; get start Bra @lineLoop ; keep going IF NOT (Scripts604 | SysVers>= $605) THEN @UseROM jmpROM ROMDoDraw ; otherwise, use ROM code! ELSE @UseROM jmpROM ROM@LROrientation ; otherwise, use ROM code now! ENDIF @Test4Handle jsrROM ROMFreeFmtOrderArray ; <18Jan89smb> doBye MoveM.L (SP)+,D2-D7/A2-A4 ; restore regs Unlk A6 ; unlink DoText frame Move.L GrafGlobals(A5),A0 ; get the port in A0 for Move.L thePort(A0),A0 ; compatibility Rts endWith ENDIF ; NOT (SysVers>= $700) IF Scripts604 | SysVers>= $605 THEN ;---------------------------------------------------------------------- ; PROCEDURE ptchDoCaret ; <1/29/90smb> Added patch to DoCaret to pin the caret in view ; when blanks exceed the edge of the view rect. See end of routine. ;---------------------------------------------------------------------- ptchDoCaret jsrROM ROMPreamble ; set rLine to A2 line tst d3 ; special case @ 1st character <03Nov85> SC beq.s @GetSelRect ; if so skip all these checks <03Nov85> SC cmp (a2),d3 ; at line start? bne.s @GetSelRect ; skip if not next-line start move teLength(a3),d0 ; are we past last char? beq.s @GetSelRect ; (and is there a last char?) cmp d0,d3 ; are we past last char? blo.s @LeftCaret ; if not, skip special case move.l teTextH(a3),a0 ; get text handle move.l (a0),a0 ; dereference move.b -1(a0,d3),d0 ; THESE TWO LINES REPLACE PREVIOUS jsrROM ROMTEEOLHook ; beq.s @GetSelRect ; skip the line bra.s @PrevLine @LeftCaret tst.b teLftCaret(a3) ; to left? bne.s @GetSelRect ; skip line pull back if so @PrevLine subq #2,a2 ; skip to previous line @GetSelRect ; determines the boundaries of the selection rectangle that contains the cursor, setting left = right jsrROM ROMLineRect ; removed from Prep ** ** tst.w teSize(a3) ; <27Oct88smb> bmi.s @GetCursors ; bra if styled text tst.b WordRedraw ; old style record, test for Roman/double-byte system bmi.s @GetCursors ; bra if RL unstyled text <22June89smb> tst.b teSysJust ; <22June89smb> beq.s @OldStyleRecord ; bra if LR text on a LR line <22June89smb> @GetCursors ; styled text OR unstyled RL text OR unstyled LR text on a RL line bsr ptchCaretDisplay ; possibly split cursors <27Oct88smb> move.w teSelRect+left(a3),d0 move.w d0,saveLeft(a6) bra.s @Fix4Cursor ; Old style edit record for Roman; process as before <27Oct88smb> @OldStyleRecord jsrROM ROMPrepLine ; get selRect from D3..D4 NO move saveLeft(a6),d0 ; get caret loc move d0,teSelRect+right(a3) ; and set in teSelRect @Fix4Cursor subq #1,d0 move d0,teSelRect+left(a3) ;----------------------------------------------------------------------------------------- ; pin caret to edge of view rect if it's displaying out of view <1/29/90smb> ; make sure it's a caret position (selStart = selEnd) move.w teSelStart(a3),d0 cmp.w teSelEnd(a3),d0 bne @Done tst.b teSysJust bne.s @RLDirection ; for a left-to-right line: ; if the viewRect.right >= the destRect.right and ; if the selRect.left >= the viewRect.right ; then selRect.right = viewRect.right ; selRect.left = viewRect.right-1. ; is the viewRect.right >= the destRect.right? move.w teViewRect+right(a3),d0 cmp.w teDestRect+right(a3),d0 blt.s @Done ; is the selRect.left >= the viewRect.right? move.w teViewRect+right(a3),d0 cmp.w teSelRect+left(a3),d0 bgt.s @Done ; pin caret to edge of view rect move.w d0,teSelRect+right(a3) subq.w #1,d0 move.w d0,teSelRect+left(a3) ; test for split carets move.l ExpandMem,a0 tst.b ExpandMemRec.emTwoCursorsFlag(a0) beq.s @Done ; test if 2nd (split) caret is out of view also:is the Left edge greater than the view rect's Right edge lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right of 2nd caret addq.w #1,d0 ; view rect still here: get back to right edge. cmp.w left(a0),d0 bgt.s @Done ; pin split caret to edge of view rect also. move.w d0,right(a0) subq.w #1,d0 move.w d0,left(a0) bra.s @Done @RLDirection ; for a right-to-left line: ; if the viewRect.left <= the destRect.left and ; if the selRect.right <= the viewRect.left ; then selRect.left = viewRect.left ; selRect.right = viewRect.left+1. ; is the viewRect.left <= the destRect.left? move.w teViewRect+left(a3),d0 cmp.w teDestRect+left(a3),d0 bgt.s @Done ; is the selRect.right <= the viewRect.left? move.w teViewRect+left(a3),d0 cmp.w teSelRect+right(a3),d0 blt.s @Done ; pin caret to edge of view rect move.w d0,teSelRect+left(a3) addq.w #1,d0 move.w d0,teSelRect+right(a3) ; test for split carets move.l ExpandMem,a0 tst.b ExpandMemRec.emTwoCursorsFlag(a0) beq.s @Done ; test if 2nd (split) caret is out of view also:is the Right edge less than the view rect's Left edge lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right of 2nd caret subq.w #1,d0 ; view rect still here: get back to left edge. cmp.w right(a0),d0 blt.s @Done ; pin split caret to edge of view rect also. move.w d0,left(a0) addq.w #1,d0 move.w d0,right(a0) @Done ; end of changes <1/29/90smb> ;----------------------------------------------------------------------------------------- bra doBye ;---------------------------------------------------------------------- ; PROCEDURE ptchDoHilite ; <4Oct89smb> HyperCard expects to outline highlight one window ; rather than the three the new highlighting code gives, so ; I'm putting back the old code for Roman systems. At this writing, ; we will still have a problem for non-Roman script systems. ; <9/6/90smb> Now patching DoHilite if Inline Input is active to ; hilite each line of the middle rectangle in order to call ; highHook. ;---------------------------------------------------------------------- ptchDoHilite ; If a Roman system then use old DoHilite code: HyperCard expects to hilite a whole region not three! <3Oct89smb> move.l ExpandMem,a0 cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; total number of installed scripts beq RomanDoHilite ; use old DoHilite ;---------------------------------------------------------------------- <16> IF hasInlineInput THEN ; <16> ; If SysVers >= 606 then test if Inline is active. If not, then use ROM code. IF SysVers < $700 THEN ; if < $700 then test for inline; otherwise, use this for >=$700 <29> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFInlineInput,d0 ; is Inline Input active? beq @UseRomHilite ; no, so use the ROM hiliting code ENDIF ; If SysVers < $700 THEN <29> ; Inline is active so, patch DoHilite so that each line of the middle rectangle is highlighted ; independently OR SysVers >= $700 so we need to use the patched version of ptchOnSameLine. <29> ; use this code for mixed directional text IF SysVers>= $700 THEN ; <19> import ptchPinDisplay ; <19> jsr ptchPinDisplay ; you guessed it: it's patched now! <19> ELSE jsrROM ROMPinDisplay ENDIF ; <19> jsrROM ROMPreamble ; set rLine to A2 line, d5 = d4 ; sets A2 to point to line containing d3 jsrROM ROMLineRect ; get top, bottom and just (from A2) move.l a4,-(sp) ; need for OnSameLine vector <26June89smb> with HiliteFrame link a6,#HiLiteSz ; LineRect needs to access doText stack frame movea.l a2,a1 ; save d3 lineStart cmp.w d3,d4 ; wrong order? beq @unLinkFrame bhi.s @Get2ndLine ; no, correct exg d3,d4 ; fix ; find out the first offset's line for Right to Left directional text move.w d3,d0 lea teLines(A3),a2 ; point to line starts jsrROM ROMGetLine ; returns ptr to line in a2 bra.s @CompareLines @Get2ndLine ; test if 2nd offset is at the end of the 1st offset's line <2Dec88smb> cmp.w 2(a2),d4 ; <2Dec88smb> beq.s @CompareLines ; <2Dec88smb> ; get the second offset's line. Already have lineStart for d3 in a1 move.w d4,d0 jsrROM ROMGetLine ; returns ptr to line in a2 @CompareLines exg a1,a2 cmpa.l a1,a2 bne.s @MultipleLines ; over multiple lines bsr ptchOnSameLine bra @unLinkFrame @MultipleLines ; [d3,d4] over multiple line ; set up for line containing d3 move.l a1,d4Line(a6) ; save lineStart for d4 for later move.l a2,d3Line(a6) move.w d4,savD4(a6) move.w 2(a2),d4 ; end of d3 line bsr ptchOnSameLine ; hilite regions on 1st line ; set up for line containing d4 move.w savD4(a6),d4 move.l d4Line(a6),a2 ; LineRect wants the current line in a2 move.w (a2),d3 ; beginning of d3 line ; ********* Be sure to notice the unusual use of link/unlk here ******* ; ********* due to multiple line highlighting! ******* move.l d3Line(a6),a1 ; temp for unlink unlk a6 ; unlink HiliteFrame for LineRect ********* move.w teSelRect+bottom(a3),-(sp) ; save for middle rectangle's top edge move.l a1,-(sp) ; save d3's line jsrROM ROMLineRect ; get top, bottom and just (from A2) bsr ptchOnSameLine ; hilite regions on last line move.l (sp)+,a1 ; d3's line ; now hilite the middle rectangle, between the lines containing the offsets. ; a1 = ptr to line containing d3 ; a2 = ptr to line containing d4 ; tests for lines inbetween 1st and last move.w 2(a1),d2 ; end of 1st line cmp.w (a2),d2 ; end of 1st rectangle = beginning of last rectangle beq.s @noMidRect ; done: no middle rectangle ;------------------------------------------- <29> IF hasInlineInput THEN ; <29> ; if inlineInput then don't want to hilite to edge of selRect, only to text boundaries <29> move.l teDispatchH(a3),a0 ; <29> move.l (a0),a0 ; <29> move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <29> btst #teFInlineInput,d0 ; is this Inline Input feature desired? <29> beq.s @HiliteMiddle ; no, so hilite middle rect as one! <29> ; inline input so measure the middle rectangle of text <29> ; a1 = ptr to line containing d3 ; a2 = ptr to line containing d4 @AnotherLine ; <29> move.w d2,d3 ; d2 contains the new d3 add.w #2,a1 ; increment to pt to line containing new d3 move.w 2(a1),d4 movem.l a1/a2,-(sp) ; save d3 & d4's line move.l a1,a2 ; LineRect wants the current line in a2 jsrROM ROMLineRect ; get top, bottom & just (from a2) bsr ptchOnSameLine ; hilite regions on this line movem.l (sp)+,a1/a2 move.w 2(a1),d2 ; end of d3's line cmp.w (a2),d2 ; end of d3's line = beginning of last line? bne.s @AnotherLine ; bra if another line to measure & hilite <29> bra.s @noMidRect ; otherwise done <29> ENDIF ; <29> ;------------------------------------------- <29> ; set up selRect(a3) <29> @HiliteMiddle ; <29> move.w teSelRect+top(a3),teSelRect+bottom(a3) ; top of last rect = bottom of middle rect move.w (sp)+,teSelRect+top(a3) ; bottom of 1st rect = top of middle rect <29> move.w #UnboundLeft,teSelRect+left(a3) ; far left <29> move.w #UnboundRight,teSelRect+right(a3) ; far right <29> move.l teHiHook(a3),D0 ; do the inversion via hook if exists <29> jsrROM ROMInvertHook ; hilite it <29> bra.s @finis ; <29> @noMidRect addq #2,a7 ; don't need saved pixelWidth for top edge bra.s @finis @unLinkFrame ; ********* Be sure to notice the unusual use of link/unlk here ******* ; ********* due to multiple line highlighting! ******* unlk a6 ; unlink HiliteFrame @finis move.l (sp)+,a4 ; restore handle <26June89smb> bra doBye endWith ENDIF ; IF hasInlineInput THEN ;---------------------------------------------------------------------- <16> @UseRomHilite ; <16> IF SysVers>= $700 THEN ; <19> import ptchPinDisplay ; <19> jsr ptchPinDisplay ; you guessed it: it's patched now! <19> jmpROM ROMinDoHilite ; ELSE jmpROM ROMDoHilite ENDIF ; <19> ;---------------------------------------------------------------------- <16> RomanDoHilite IF SysVers>= $700 THEN ; <19> import ptchPinDisplay ; <19> jsr ptchPinDisplay ; you guessed it: it's patched now! <19> ELSE jsrROM ROMPinDisplay ENDIF ; <19> jsrROM ROMPreamble ; set rLine to A2 line jsrROM ROMLineRect ; get top, bottom and just jsrROM ROMPrepLine ; pin D4 at line end bls.s @done ; done... NO ;;<7Dec89smb> jsrROM ROMChkBounds ; check far left and right bsr ptchChkBounds ; extend bounds if necessary <7Dec89smb> move.l teHiHook(A3),d0 ; do the inversion via hook if jsrROM ROMInvertHook ; there cmp.w 2(a2),d5 ; only 1 line? bls.s @done ; made this unsigned ** ** jsrROM ROMPtrToLine ; get current line # move.w d0,d1 ; save it move.w d5,d0 ; offset to look for jsrROM ROMGetLine ; get D5 line ptr jsrROM ROMPtrToLine ; convert A2 ptr to line # addq #1,d1 cmp.w d0,d1 ; get the difference beq.s @LastLine ; no lines inbetween move.w d0,-(SP) ; save line # exg d0,d1 move.w teSelRect+bottom(a3),teSelRect+top(a3) jsrROM ROMGetLineHites ; hites from 2nd to last lines add.w d0,teSelRect+bottom(a3) ; hite to last line move.w #UnboundLeft,teSelRect+left(a3) ; far left move.w #UnboundRight,teSelRect+right(a3) ; far right move.l teHiHook(A3),d0 jsrROM ROMInvertHook ; hilite it move.w (SP)+,d0 ; restore line # ; hilite last line @LastLine jsrROM ROMNextLineRect ; get rectangle for last line NO move.w (A2),D3 ; for chkBounds jsrROM ROMPrepLine ; get left and right bls.s @done ; done... ;;<7Dec89smb> jsrROM ROMChkBounds ; check far left and right bsr ptchChkBounds ; extend bounds if necessary <7Dec89smb> move.l teHiHook(A3),D0 ; do the inversion via hook if jsrROM ROMInvertHook ; there @done bra doBye ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchCursorMovement ; <7Aug89smb> Compare a byte, not a word, for the arrow key type. ; <9Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from FindStyleRun, which ; is not vectored. So, have to fix in CursorMovement and then ; jump back into FindStyleRun. ; <28Sept89smb> Fixed double-byte bugs. ; <22Nov89smb> Had to pin the style run to the line end for ; correct position. ;---------------------------------------------------------------------- ptchCursorMovement CursorMoveRegs reg d2-d5/d7/a2 with CursorFrame,TEFormatOrder link a6,#CursorFrameSz movem.l CursorMoveRegs,-(sp) ; Initializations sf FormatEndFlag(a6) ; <17Jan89smb> ; ***** cd = left? ***** cmpi.b #leftArrowChar,d1 ; left arrow? <7Aug89smb> cmp byte not word beq.s @SetLeftCD ; right arrow move.b #$FF,d0 ; cursor direction = right move.w #1,d7 ; fmt run index delta (in cursor direction [R]) move.b #1,d2 ; q: m[q] = m[1] = n = rightmost fmt index boundary moveq #0,d1 ; p: m[p] = m[0] = 0 = leftmost fmt index boundary bra.s @GetLineDir @SetLeftCD moveq #0,d0 ; cursor direction = left move.w #-1,d7 ; fmt run index delta (in cursor direction [L]) moveq #0,d2 ; q: m[q] = m[0] = 0 = leftmost fmt index boundary move.b #1,d1 ; p: m[p] = m[1] = n = rightmost fmt index boundary ; ***** cd = ld? ***** @GetLineDir ; get line direction cmp.b TESysJust,d0 beq.s @CDequalsLD ; CD <> LD: cursor direction <> line direction (left arrow, RL line dir; right arrow, LR line dir) move.w #-1,d5 ; character delta move.b #1,d3 ; start moveq #0,d4 ; end bra.s @NeedLine @CDequalsLD ; CD = LD: cursor direction = line direction (left arrow, LR line dir; right arrow, RL line dir) move.w #$1,d5 ; character delta moveq #0,d3 ; start move.b #1,d4 ; end @NeedLine ; need to test line ends so get current line containing character offset move.w d6,d0 lea teLines(a3),a2 movea.l a2,a0 jsrROM ROMGetLine ; special case! if at end of document (test if on last line) and cd <> ld don't ; want to add charDelta<17Jan89smb> move.w teNLines(a3),d0 ; number of lines lsl.w #1,d0 add.w d0,a0 ; want end of last line cmpa.l a0,a2 ; on last line? bne.s @OtherLineStuff tst.b d5 blt @done ; at EOD, done. @OtherLineStuff ; yet another special case! If at the lineStart, and cd = ld, then want to be on ; previous line. <16Jan89smb> cmp.w (a2),d6 bne.s @OnCorrectLine ; not at lineStart cmpi.w #0,d6 beq.s @OnCorrectLine ; not beginning of text tst.b d5 blt.s @OnCorrectLine ; cd <> ld subq #2,a2 ; previous line @OnCorrectLine movem.w d1/d2,-(sp) jsrROM ROMGetFormatOrdering movem.w (sp)+,d1/d2 ; restore ; ***** if c = l[s] then c = c ***** ; if s = 0, then l[s] = lineStart ; if s = 1, then l[s] = lineEnd move.b d3,d0 ; start jsrROM ROMTestLineEnds bne @done ; c = c. done ; ***** if c = l[e] then r1 = m[p] ***** ; if e = 0, then l[e] = lineStart ; if e = 1, then l[e] = lineEnd move.b d4,d0 ; end jsrROM ROMTestLineEnds beq.s @FindRun ; ***** r1 = m[p] ***** ; d1 = p as input jsrROM ROMSetRun ; returns d1.w = r1: leftmost or rightmost format ; ***** d(r1) = ld? ***** bsr ptchTestRunDirection ; d1 = r1 (format index) <9Aug89smb> bne @CSubDelta ; True: equal bra @OneCharacterTest @FindRun ; find r s.t. f[r,0] cmp.w startChar(a0),d6 beq.s @OnBoundary jsrROM ROMFixFormatEnd ; <17Jan89smb> if last format run, must decrement cmp.w d0,d6 ; <17Jan89smb> bcs @InMiddle ; <17Jan89smb> <26June89smb> made unsigned st FormatEndFlag(a6) ; <17Jan89smb> on end of style run @OnBoundary ; on boundary: test for cluster boundary <17Jan89smb> ; get this style run's script direction movem.l d1/d2,-(sp) ; save r (d1) and style jsrROM ROMGetDirection move.b d1,d0 movem.l (sp)+,d1/d2 ; <20Jan89smb> cmp.b TESysJust,d0 ; <20Jan89smb> beq @TakeRightBranch ; <20Jan89smb> move.b d0,RunDirection(a6) ; <20Jan89smb> ; get other boundary style run tst.b FormatEndFlag(a6) ; test if at start or end of style run bne.s @GetNextRun ; at end of this style run ; at start of this style run so get previous style run in backing-store order subq.l #stStartSize,a0 bra.s @GetScriptDir @GetNextRun ; get next style run in backing-store since at end of this style run addq.l #stStartSize,a0 @GetScriptDir ; get the other style run's script direction movem.l d1/d2,-(sp) ; save r (d1) and style jsrROM ROMGetDirection move.b d1,d0 movem.l (sp)+,d1/d2 ; compare script directions to see if on a cluster boundary cmp.b RunDirection(a6),d0 bne.s @ClusterBoundary ; On a style run boundary with both runs of the same script <17Jan89smb> ; ***** d(r) = ld? ***** ; d(r) <> ld so find r s.t. c = f[r,e] ; get original boundary style again <25June89smb> tst.b FormatEndFlag(a6) ; test if at start or end of style run bne.s @GetPrevRun ; at end of this style run ; at start of this style run so get previous style run in backing-store order add.l #stStartSize,a0 bra.s @TestStylEnd @GetPrevRun ; get next style run in backing-store since at end of this style run subq.l #stStartSize,a0 @TestStylEnd move.w d1,-(sp) ; save original r move.b d4,d1 ; end move.w d6,d0 ; save d6 IF Scripts604 | SysVers>= $605 THEN bsr ptchGetStyleEnd ; <26Nov89smb> ELSE jsrROM ROMGetStyleEnd ; returns style start or end in d6 ENDIF move.w (sp)+,d1 ; restore r exg d6,d0 ; want original char offset in d6 cmp.w d0,d6 ; does c = f[r,e]? beq.s @GetNewIndex ; yep bsr ptchFindStyleRun ; d1 = r s.t. c = f[r,e] <9Aug89smb> @GetNewIndex ; ***** r1 = r + fmtDelta ***** add.w d7,d1 ; format delta bra.s @NewFmtIndex ; <20Jan89smb> must check for 1 char in style run @ClusterBoundary ; find r s.t. (f[r,0]=c or f[r,1]=c) AND d(r)=ld <17Jan89smb> ; Since the character is on a cluster boundary, we want the style run with it's ; direction = the line direction (LD). ; ***** d(r) = ld? ***** bsr ptchFindStyleRun ; find other boundary run with d(r) = ld; d1 = r <9Aug89smb> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IF Scripts604 | SysVers>= $605 THEN ; continue conditionally! bra.s @TakeRightBranch ; True: d(r) = ld @InMiddle ; firmly in the middle. Test the line direction to determine the branch to take <17Jan89smb> ; ***** d(r) = ld? ***** bsr ptchTestRunDirection ; does the direction of the run = line direction? bne.s @TakeRightBranch ; True: d(r) = ld ; d(r) <> ld ; ***** c <> f[r,e] - charDelta? ***** are we one away from a style boundary? move.w d1,-(sp) move.b d4,d1 ; end move.w d6,d0 ; save d6 ;; jsrROM ROMGetStyleEnd ; returns style start or end in d6 bsr ptchGetStyleEnd ; <26Nov89smb> move.w (sp)+,d1 ; must adjust for double-byte characters <2Sept89smb> movem.l a0/d0-d3,-(sp) ; save <2Sept89smb> move.w d5,d3 ; <2Sept89smb> neg.w d3 ; <2Sept89smb> ; f[r,e] - charDelta (where the delta may be -2/2 rather than -1/1) jsrROM ROMDoubleByte ; <2Sept89smb> movem.l (sp)+,a0/d0-d3 ; <2Sept89smb> exg d6,d0 ; want original char offset in d6 cmp.w d0,d6 ;------------------------------------------------------------------------------------ ; must pin to line end to get correct offset, so to truly be done: <22Nov89smb> ; c <> l[e] - charDelta beq.s @TstFmtIndeces ; <22Nov89smb> ; if e = 0, then l[e] = lineStart ; if e = 1, then l[e] = lineEnd move.w 2(a2),d0 ; assume e=1 so use lineEnd ; <22Nov89smb> cmpi.b #0,d4 ; end ; <22Nov89smb> beq.s @IsLineStart ; <22Nov89smb> bra.s @SubDelta ; <22Nov89smb> @IsLineStart move.w (a2),d0 ; <22Nov89smb> @SubDelta sub.w d5,d0 ; - charDelta <22Nov89smb> cmp.w d6,d0 ; <22Nov89smb> bne @CAddDelta ; done ;----------------------------------------------------------------------------------- @TstFmtIndeces ; ***** r = m[q]? ***** ; in the leftmost or rightmost format? test format indeces move.w d1,d0 ; save r(n) move.b d2,d1 ; q jsrROM ROMSetRun ; returns m[q] in d1.w (0/n) cmp.w d0,d1 beq.s @CUseLineSt ; yep, r = m[q]: c = l[s] ; ***** r1 = r + fmtDelta ***** add.w d7,d0 ; format delta move.w d0,d1 ; want r1 in d1 ; ***** d(r1) = ld? ***** @NewFmtIndex bsr ptchTestRunDirection ; does the direction of the run = line direction? beq @CAddDelta ; False: d(r1) <> ld ; c = c + CharDelta ; True: d(r1) = ld ; ***** c = f[r1,e] ***** move.b d4,d1 ; end ;; jsrROM ROMGetStyleEnd ; returns new char offset in d6 bsr ptchGetStyleEnd ; <26Nov89smb> bra @done @TakeRightBranch ; (either on a boundary or firmly in the middle) AND d(r) = ld ; ***** c <> f[r,s]? ***** tst.b d3 ; start bne.s @EndOffset ; s = 1 ; c <> f[r,0]? => start offset for format run r cmp.w startChar(a0),d6 bne.s @CSubDelta bra.s @TestFmtArrayEnds @EndOffset ; c <> f[r,1]? => end offset for format run r jsrROM ROMFixFormatEnd ; <17Jan89smb> if last format run, must decrement cmp.w d0,d6 bne.s @CSubDelta @TestFmtArrayEnds ; ***** r = m[q]? ***** ; in the leftmost or rightmost format? test format indeces move.w d1,d0 ; save r(n) move.b d2,d1 ; q jsrROM ROMSetRun ; returns m[q] in d1.w (0/n) cmp.w d0,d1 beq.s @done ; yep, r = m[q]: c = c ; ***** r1 = r + fmtDelta ***** add.w d7,d0 ; format delta move.w d0,d1 ; want r1 in d1 ; ***** d(r1) = ld? ***** bsr ptchTestRunDirection ; does the direction of the run = line direction? bne.s @CSubDelta ; True: equal @OneCharacterTest ; no, style run direction <> line direction ; ***** f[r1,1] - f[r1,0] <> 1? ***** ; test if there is only one character in the run. jsrROM ROMFixFormatEnd ; <17Jan89smb> if last format run, must decrement sub.w startChar(a0),d0 cmpi.w #1,d0 bhi.s @CUseStartDelta ; c = f[r1,s] + charDelta <26June89smb> made unsigned ; ***** r1 = m[q]? ***** ; in the leftmost or rightmost format? test format indeces move.w d1,d0 ; save r(n) move.b d2,d1 ; q jsrROM ROMSetRun ; returns m[q] in d1.w (0/n) cmp.w d0,d1 beq.s @CUseStart ; terminator is direction test ; ***** r2 = r1 + fmtDelta ***** add.w d7,d0 ; format delta move.w d0,d1 ; want r1 in d1 ; ***** d(r2) = ld? ***** bsr ptchTestRunDirection ; does the direction of the run = line direction? beq.s @CUseStartDelta ; d(r2) <> ld: c = f[r1,s] + charDelta @CUseStart ; ***** c = f[r1,s] ****** move.b d3,d1 ; start ;; jsrROM ROMGetStyleEnd ; returns new char offset in d6 bsr ptchGetStyleEnd ; <26Nov89smb> bra.s @done @CUseStartDelta ;***** c = f[r1,s] + charDelta ***** move.b d3,d1 ; start ;; jsrROM ROMGetStyleEnd ; returns new char offset in d6 bsr ptchGetStyleEnd ; <26Nov89smb> bra.s @CAddDelta @CUseLineSt ; ***** c = l[s] ***** move.b d3,d1 ; start tst.b d1 bne.s @UseLineEnd ; c = l[0] = lineStart move.w (a2),d6 bra.s @done @UseLineEnd ; c = l[1] = lineEnd move.w 2(a2),d6 bra.s @done ; if double-byte character fix the offset posn.<2Sept89smb> @CSubDelta neg.w d5 ; <2Sept89smb> @CAddDelta move.w d5,d3 ; DoubleByte wants charDelta here <2Sept89smb> jsrROM ROMDoubleByte ; <2Sept89smb> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELSE ; continue here for 6.0.4 Roman System patches @TakeRightBranch jmpROM ROM@TakeRightBranch @OneCharacterTest jmpROM ROM@OneCharacterTest @CSubDelta jmpROM ROM@CSubDelta @InMiddle jmpROM ROM@InMiddle @NewFmtIndex jmpROM ROM@NewFmtIndex ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; rejoin again @done movem.l (sp)+,CursorMoveRegs unlk a6 rts endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchFindStyleRun ; <9Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from FindStyleRun, which ; is not vectored. ;---------------------------------------------------------------------- ptchFindStyleRun with CursorFrame,TEFormatOrder @RunLoop bsr ptchGetNextDisplayStyle ; <9Aug89smb> move.w fmtOrderingIndex(a6),d1 addq #1,fmtOrderingIndex(a6) ; incr the style run counter cmp.w startChar(a0),d6 bhi.s @CheckUpperBound ; in middle? <26June89smb> made unsigned beq.s @done bra.s @RunLoop @CheckUpperBound IF forLocalizability THEN ; <34o-YDS-9/2/91> jsrRom ROMFixFormatEnd ; ELSE jmpRom ROMFixFormatEnd ; <17Jan89smb> if last format run, must decrement ENDIF cmp.w d0,d6 ; <17Jan89smb> bhi.s @RunLoop ; <26June89smb> made unsigned @done rts endwith IF Scripts604 | SysVers>= $605 THEN ;---------------------------------------------------------------------- ; PROCEDURE ptchGetStyleEnd ; <26Nov89smb> ; Must pin the style run to the appropriate line ending. ;---------------------------------------------------------------------- ptchGetStyleEnd move.w d0,-(sp) ; <17Jan89smb> tst.b d1 bne.s @UseEnd ; f[r1,0] = start offset for format run at format index r1. move.w startChar(a0),d6 ; must pin style run to lineStart! <26Nov89smb> cmp.w (a2),d6 bhs.s @done ; style start on this line <26Nov89smb> move.w (a2),d6 ; use lineStart <26Nov89smb> bra.s @done @UseEnd ; f[r1,1] = end offset for format run at format index r1. jsrROM ROMFixFormatEnd ; <17Jan89smb> if last format run, must decrement move.w d0,d6 ; <17Jan89smb> ; must pin style run to line end if it breaks across the line! <26Nov89smb> cmp.w 2(a2),d6 ; <26Nov89smb> bls.s @done ; <26Nov89smb> move.w 2(a2),d6 ; <26Nov89smb> @done move.w (sp)+,d0 ; restore <17Jan89smb> rts ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTEGetFormatOrder ; <6Aug89smb> I need to patch a bug in the routine SetUp, a ; subroutine of StyleMeasure, and only called by RomanFindLine. ; It is a caller of P2C that has no vector or trap. ;---------------------------------------------------------------------- ptchTEGetFormatOrder FormatOrderRegs reg d2-d4 with SharedFrame,TEFormatOrder moveq.l #0,d2 jsrROM ROMGetCurStyle ; Made a2StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) Oh-Dopey-Me! move.l teStylesH(a3),a1 ; <5Aug89smb> move.l (a1),a1 ; deref <5Aug89smb> sub.l a1,a0 ; save posn as an offset <5Aug89smb> move.l a0,a2StyleRun(a6) ; save offset to style run of lineStart add.l a1,a0 ; restore for succeeding GetNumStyles call jmpROM ROMEndTEFmtOrder endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchCaretDisplay ; <8Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from CaretDisplay. Must ; replace this much code since the bug occurs in looping code. ; <9/20/90smb> Patched to call ptchMeasureWholeRun for ; TextWidth hook. ;---------------------------------------------------------------------- ptchCaretDisplay with SharedFrame,TEFormatOrder link a6,#SharedFrameSz move.l ExpandMem,a0 ; <1Feb89smb> initialize for only 1 cursor sf ExpandMemRec.emTwoCursorsFlag(a0) sf ExpandMemRec.emFmtOrderHFlag(a0) ; no handle allocated for styles clr.w gotOneRun(a6) ; set gotOneRun and onBoundaryFlag to F. sf scriptDirection(a6) ; initialize to LR clr.w d5 jsrROM ROMGetFormatOrdering ; <8Mar89smb> ; accumulate widths of style runs until hit one containing a cursor. @MeasureLoop bsr ptchGetNextDisplayStyle ; <8Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr for the next measurement ; does this style contain a cursor? @Check4Cursor cmp.w startChar(a0),d3 ; cursor at beginning of run? ;; bhi.s @CheckUpperBound ; <26June89smb> made unsigned <13> beq.s @CursorRun ; cursor on start boundary of it's run ;; bra @GetWidth ; cursor outside of run <13> blo @GetWidth ; <13> @CheckUpperBound jsrROM ROMFixFormatEnd ; if last format run, must decrement <17Jan89smb> cmp.w d0,d3 ; cursor at end of run? <17Jan89smb> bhi.s @GetWidth ; cursor outside of run <26June89smb> made unsigned blt.s @FoundCursor ; cursor in middle of run ; in style previous to cursor's run tst.b gotOneRun(a6) ; set up second rectangle now? bne @SetEnds ; yup, already have top and bottom st prevStyleFlag(a6) ; cursor at end of this run (previous style) bra.s @OnBoundary @CursorRun ; in cursor's run tst.b gotOneRun(a6) ; set up second rectangle now? bne @SetEnds ; yup, already have top and bottom sf prevStyleFlag(a6) ; cursor at beginnning of it's run @OnBoundary st onBoundaryFlag(a6) ; cursor on boundary of run ; cursor either in middle of the style run or on a boundary @FoundCursor tst.w teSize(a3) ; <1Dec88smb> bpl.s @DontSet jsrROM ROMSetStyle @DontSet tst.b WordRedraw ; <4Oct89smb> blt.s @ContainsRLText ; <4Oct89smb> tst.b teSysJust bne.s @ContainsRLText ; in LR text only on a LR directional line: done stepping thru style clr.l d2 ; #smLeftCaret set in low word of d2 jsrROM ROMGetLRPosition add.w d1,d5 ; add C2P width to totalWidth of line thus far (d5) add.w d5,teSelRect+left(a3) ; add width to left and right edges of selRect add.w d5,teSelRect+right(a3) bra @done @ContainsRLText move.w d2,-(sp) ; save style counter IF Scripts604 | SysVers>= $605 THEN bsr ptchGetRLPosition ; local version now <20Nov89smb> ELSE jsrROM ROMGetRLPosition ENDIF move.w (sp)+,d2 ; restore style counter tst.b doneFlag(a6) bne.s @finis tst.b lineEndFlag(a6) bne.s @GetWidth ; must measure rest of style runs on line ; added more robust tests for determining whether need to measure style run or not <8Nov88smb> tst.b scriptDirection(a6) bne.s @ChkRLMeasure ; bra if RL script direction ; in LR script direction <8Nov88smb> tst.b prevStyleFlag(a6) bne @MeasureLoop ; bra if previous LR run: already measured bra.s @GetWidth ; measure since in cursor run w/ LR direction @ChkRLMeasure ; in RL script direction <8Nov88smb> tst.b prevStyleFlag(a6) beq @MeasureLoop ; bra if in cursor run: already measured ; cursor's not in this style run, so measure it and save its width for later OR ; found cursor in it's style run but the script has LR direction so need to measure @GetWidth move.w d1,-(sp) IF hasTextWidthHook THEN ; <17> import ptchMeasureWholeRun ; <17> jsr ptchMeasureWholeRun ; <17> ELSE ; <17> jsrROM ROMMeasureWholeRun ENDIF ; <17> add.w d0,d5 move.w (sp)+,d1 tst.b WordRedraw ; <4Oct89smb> bge.s @GetNext ; <4Oct89smb> SubQ #1,D2 ; dec the style counter beq.s @finis bra @MeasureLoop @GetNext Addq.l #stStartSize,a0 ; get next style SubQ #1,D2 ; dec the style counter Bne @Check4Cursor ; must be more than 1 line bra.s @finis IF forLocalizability THEN ; Just was added for the patch, the real @SetEnds ; code is below <34d-YDS-9/2/91> ; second cursor style run. Must set up the second rectangle for the second cursor tst.b prevStyleFlag(a6) bne.s @InCursorRun ; in cursor script move.b previousScriptDir(a6),d0 bra.s @GetScriptDirection @InCursorRun move.b cursorScriptDir(a6),d0 @GetScriptDirection bne.s @RLScript ; LR Script <7Nov88smb> ; if in previous style and LR script direction then measure since at end of style run ; otherwise, width is 0 since at beginning of run so, have width to use tst.b prevStyleFlag(a6) beq.s @MeasureRun ; bra to measure if in prevStyle's run bra.s @HaveWidth @RLScript ; if in cursor style and RL script direction then measure since at beginning of style run ; otherwise, width is 0 since at end of run so, have width to use <7Nov88smb> tst.b prevStyleFlag(a6) bne.s @MeasureRun ; bra to measure if in cursor's run bra.s @HaveWidth @MeasureRun move.w d5,-(sp) ; necessary for two cursors import ptchMeasureWholeRun ; <17> jsr ptchMeasureWholeRun ; <17> add.w d0,d5 bra.s @HaveWidth @finis tst.b lineEndFlag(a6) beq.w @done move.l ExpandMem,a0 ; <34l-YDS-9/2/91 tst.b ExpandMemRec.emTwoCursorsFlag(a0) ; if we have one cursor beq.w @done ; skip all the rest @HaveWidth ; finish setup of 2nd cursor rectangle move.l ExpandMem,a0 ; <1Feb89smb> lea ExpandMemRec.emCursor2Rect(a0),a0 ; <12July89smb> changed to lea addq #2,a0 ; top edge ok add.w selRectL(a6),d5 ; add original L. edge move.w d5,(a0) ; left sub.w #1,(a0)+ ; cursor posn addq #2,a0 ; bottom edge ok move.w d5,(a0) ; right (same as left) ; YS - added to support a single carret ; at styled TE, <34d-YDS-9/2/91> clr.l -(sp) ; make space for function result move #smGenFlags,-(sp) ; put smSysScript verb to get the SMGR general flags _GetEnvirons ; now wh have the general flags Move.l (sp)+, d5 ; take return value. and.l #(1< move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 move.b lastScript(a0),d5 ; push script numberused to highligt (d5) to lastScript bra.s @2 @1 move #smKeyScript,-(sp) ; we will call _GetEnvirons to get the current active (keyboard) script. _GetEnvirons ; now we know who the active script Move.l (sp), d5 ; take return value (the script number (long !!!)), leave place for return value move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 move.b d5, lastScript(a0) ; push script numberused to highligt (d5) to lastScript @2 move.w d5, -(sp) ; push the script (word !!!) for the next call we will need move #smScriptRight,-(sp) ; is that script a right to left script ? _GetScript ; we have smScriptRightflag the stack move.l (sp)+, d0 ; do = result move.l ExpandMem,a0 ; get the scplit cursor addres into A0 lea ExpandMemRec.emCursor2Rect(a0),a0 cmp.b TESysJust, d0 beq.s @UseTop @UseBottom move.w teSelRect+top(a3),top(a0) ; strech lower cursor move.w teSelRect+top(a3),teSelRect+bottom(a3) ; make top = bottom in upper cursor bra.s @done @UseTop move.w bottom(a0),teSelRect+bottom(a3) ; strech upper cursor move.w bottom(a0),top(a0) ; make top = bottom in lower cursor ELSE @SetEnds jmpROM ROM@SetEnds @finis jmpROM ROM@finis ENDIF @done jmpROM ROM@done endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchGetStylesInOrder ; <8Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from GetStylesInOrder. ;---------------------------------------------------------------------- ptchGetStylesInOrder with SharedFrame,TEFormatOrder bsr ptchTEGetFormatOrder ; <9Aug89smb> ; get next style in a0 using the results from getFormatOrder bsr ptchGetNextDisplayStyle ; a come-from patch for ChkBounds! YUK! <9Aug89smb> IF NOT (Scripts604 | SysVers>= $605) THEN ; <7Dec89smb> cmpROM ROM@OneStyleTest,(sp) ; Return address in ChkBounds <14Aug89smb> beq.s ptchChkBounds ; <9Aug89smb> ENDIF cmpROM BackToDoMeasure,(sp) ; Return address in DoMeasure <9Aug89smb> beq.w ptchDoMeasure ;;<14Aug89smb> jmpROM EndGetStylesInOrder addq #1,fmtOrderingIndex(a6) ; incr the style run counter <14Aug89smb> subq #1,D2 ; dec the style counter <14Aug89smb> Rts ; <14Aug89smb> endWith ;---------------------------------------------------------------------- ; ptchChkBounds ; <9Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from ChkBounds. Since ; this routine is an internal routine to TE, this must be a ; come-from patch, jumped in from GetStylesInOrder. ; <7Dec89smb> Fixed problem with setting the boundaries in ChkBounds. ;---------------------------------------------------------------------- ptchChkBounds IF Scripts604 | SysVers>= $605 THEN ; <7Dec89smb> move.w (a2),d0 ; start of line move.w 2(a2),d1 ; end of line ; if block begins at start of line, make left a large negative number ; <7Dec89smb> Tried to fix boundaries for teSysJust conditions cmp.w d0,d3 bne.s @TestLineEnd tst.w teSysJust bne.s @FixRightBoundAtStart move.w #UnboundLeft,teSelRect+left(A3) ; assume LR text bra.s @TestLineEnd @FixRightBoundAtStart move.w #UnboundRight,teSelRect+right(A3) ; if block ends at end of line, make right a large positive number @TestLineEnd cmp.w d1,d4 bne.s @EdgesSet tst.w teSysJust bne.s @FixLeftBoundAtEnd move.w #UnboundRight,teSelRect+right(A3) bra.s @EdgesSet @FixLeftBoundAtEnd move.w #UnboundLeft,teSelRect+left(A3) ; assume LR text @EdgesSet Rts ELSE with TextFrame,TEFormatOrder adda.w #4, sp ; pop GetStylesInOrder's RA <9Aug89smb> ; added end of GetStylesInOrder code since not returning there <9Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr the style run counter <9Aug89smb> SubQ #1,D2 ; dec the style counter <9Aug89smb> beq.s @OneStyle Subq #1,D2 ; dec style count move.w d2,fmtOrderingIndex(a6) ; set to next-to-last style move.l a0,-(sp) ; save style ptr at start ; more than 1 style in mixed directional text, so get the first and next-to-last ; styles using the results from getFormatOrder bsr ptchGetNextDisplayStyle ; <9Aug89smb> jmpROM BackToChkBounds @OneStyle jmpROM ROM@OneStyle endWith ENDIF ;---------------------------------------------------------------------- ; ptchDoMeasure ; <9Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from DoMeasure. Since ; this routine is an internal routine to TE, this must be a ; come-from patch, jumped in from GetStylesInOrder. ; ; ; <2/Sep/91 YS> needed to call DoMesure, so had to realy patch all ; of it, since the label ptchDoMeasure is realy a patch inside DoMeasure ; and not the entry point. so the real patch for whole DoMeasure ; is ptchWholeDoMeasure <34i-YDS-9/2/91> ; ;---------------------------------------------------------------------- with TextFrame,TEFormatOrder ; <34i-YDS-9/2/91> IF forLocalizability THEN ; here we do a real patch for whole the DoMeasure ptchWholeDoMeasure ; MoveM.L D3/D5-D6,-(SP) MoveQ #0,D5 ; width accumulator Move.W (A2),D6 ; line start sf d3 ; not found yet Cmp D6,D7 ; nothing to measure? Blo MeasureDone ; made this unsigned ** ** Tst.b WordRedraw ; reverse order? if <0 then RL script present Bge PlainMeasure ; just do normal roman measure if not Tst.W teSize(A3) ; style record? Bpl LRPlainMeasure ; just do normal L->R measure if not sf useOldMethod(a6) ; flag for getting style runs <28Sept88smb> Move.W (A2),D0 ; start of line <12July8smb> moved up here Move.W 2(A2),D1 ; end of line <12July8smb> moved up here ; determine if display order is different from ; backin-store order <28Sept88smb> tst.b WordRedraw ; $FF if a R->L directional script installed blt.s RLStyledLine ; RL text in record <17July89smb> ; moved next 4 lines here to cleanup branching <17July89smb> st useOldMethod(a6) jsrROM ROMGetCurStyle ; get its style <7Oct88smb> jsrROM ROMGetNumStyles ; # of styles between offsets <7Oct88smb> bra.s MeasureLoop ; <17July89smb> RLStyledLine bsr ptchGetStylesInOrder ; initialize style run array ; tests whether any styles to process bge.s MeasureLoop bra MeasureDone ENDIF ptchDoMeasure adda.w #4, sp ; pop GetStylesInOrder's RA <9Aug89smb> ; added end of GetStylesInOrder code since not returning there <9Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr the style run counter <9Aug89smb> SubQ #1,D2 ; dec the style counter <9Aug89smb> bge.s MeasureLoop bra MeasureDone getStyleNew ; get next style using the results from getFormatOrder bsr ptchGetNextDisplayStyle ; <9Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr the style run counter SubQ #1,D2 ; dec the style counter bge.s MeasureLoop bra.w MeasureDone ; done @getStyleOld st useOldMethod(a6) jsrROM ROMGetCurStyle ; get its style jsrROM ROMGetNumStyles ; # of styles between offsets MeasureLoop ; get the style run in d6,d0 Move.W startChar(A0),D6 ; store actual start of line jsrROM ROMFixFormatEnd ; <6Mar89smb> returns end of style run in d0 ; pin d6 (start of the style run) to start of the line Cmp.W (A2),D6 ; should not be greater than Bhi.S @D6Pinned2Start ; made this unsigned ** ** Move.W (A2),D6 ; the selection start @D6Pinned2Start ; pin d0 (end of style run) to the end of the line Cmp.W 2(A2),D0 ; style start Bls.S @D0Pinned2End ; made this unsigned ** ** Move.W 2(A2),D0 ; line's end @D0Pinned2End ; now have a valid style run, limited to the line we are on ; this checks for a boundary condition, where d7 is between style runs tst.b d3 ; found already? bne.w PlainMeasure ; exit and measure the last one ; if searchpoint not in current style run, then keep measuring Cmp.W D6,D7 ; if less than selection start Blo.S @DontExit ; then searchPoint is not in this style Beq.S @CheckDirection ; check for boundary condition Cmp.W D0,D7 ; if greater than selection end Bhi.S @DontExit ; then searchPoint is not in this style Bne.S PlainMeasure ; exit & measure (firmly inbetween) ; at this point, on a boundary. Measure & Exit if style direction = TESysJust @CheckDirection jsrROM ROMGetDirection ; returns script dir in d1 cmp.b TESysJust,d1 ; TESysJust = 0, -1, so top byte set beq.s PlainMeasure ; exit & measure this last run st d3 ; found at least one style run bra.s @GetTheWidth ; already set style, so go for it. ; if searchPoint (d7) on boundary of previous style run and this style run must adjust it to ; be at the end of the style run to get the full measure of the style run. Rather than adjust ; it we force GetWidth to use TextWidth by setting tempVar to true! <27Sept88smb> @DontExit Move.W D0,-(SP) ; SetStyle destroys this ** ** jsrROM ROMSetStyle ; set the style Move.W (SP)+,D0 ; restore length to measure ** ** @GetTheWidth move.l ExpandMem,a1 ; <1Feb89smb> st ExpandMemRec.emMeasureLine(a1) ; full line flag: measure full style run <27Sept88smb> move.w d2,-(sp) ; save style count IF Scripts604 | SysVers>= $605 THEN bsr ptchGetWidth ; local version now <14Nov89smb> ELSE jsrROM ROMGetWidth ; get string width ENDIF Add.W D1,D5 ; accumulate width move.w (sp)+,d2 ; restore style count tst.b useOldMethod(a6) ; <28Sept88smb> beq.s getStyleNew ; use formatOrder array SubQ.L #stStartSize,A0 ; pt to prev style Bra.S MeasureLoop ; keep measuring IF forLocalizability THEN ; Fix to support correct mesure for unstyled L->R LRPlainMeasure ; <34i-YDS-9/2/91> MoveM.l a0-a1/d0-d2, -(sp) ; text <3.10> Move.l teTextH(A3),A0 ; get text handle Move.l (a0),a0 ; derefrence it Move.w teLength(a3), d0 cmp.w (a2),d0 ; are we at the start of the empty last line ? beq.s @1 ; yes !! move.w 2(a2), d0 ; take next line start to d0 @1 move.w d7,d1 ; offset Tst.W TESysJust ; check text direction, we want tha max rect !!! bne @3 ; push direction move.w #smRightCaret, d2 ; we allways push the oposite direction bra.w @4 ; in that way we get tha max mesurement @3 move.w #smLeftCaret, d2 ; in that way we get tha max mesurement @4 swap d2 clr.w d2 ; slop = 0 add.w d6,a0 ; point to beginning of current line <47> sub.w d6,d0 ; want length from current line start <47> sub.w d6,d1 ; want offset on current line <47> ;Need: ; textPtr in a0.l, textLen in d0.w, offset in d1.w; ; d2.l = slop (low word), hilite flag (high word) import ptchTEWidthHook jsr ptchTEWidthHook move.w d1,d5 ; mesure result in d5 MoveM.L (sp)+,a0-a1/d0-d2 ENDIF MeasureDone jmpROM ROM@MeasureDone PlainMeasure IF forLocalizability THEN ; <34k-YDS-9/2/91> tst.b WordRedraw ; have L->R script ? bge.s @1 ; no, don't allow measure of zero char ; strings , do it in the old way move.l ExpandMem,a1 ; <1Feb89smb> sf ExpandMemRec.emMeasureLine(a1) ; <27Sept88smb> jsrROM ROMInMeasureIt ; last measurement, skip first test Add.W D0,D5 ; final width jmpROM ROM@MeasureDone ENDIF @1 jmpROM ROM@PlainMeasure endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchOnSameLine ; <9Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from OnSameLine. Must ; replace this much code since the bug occurs in looping code. ;---------------------------------------------------------------------- ptchOnSameLine SameLineRegs reg d3/d4/d7/a0-a1 with SharedFrame,TEFormatOrder link a6,#SharedFrameSz movem.l SameLineRegs,-(sp) ; initialize moveq.l #0,d5 ; cleared to accumulate widths of style runs from MeasureWidth and PixelWidths moveq.l #0,d2 clr.w totalWidth(a6) clr.w hiliteInbetween(a6) ; set sameStyle and hiliteInbetween to F. sf doneFlag(a6) clr.w foundD4(a6) ; clear D3 and D4 index flag clr.l d4FmtIndex(a6) ; clear D3 and D4 holders clr.l hiliteREndFlag(a6) ; clear left and right end flags Move.w teSelRect+left(A3),selRectL(a6) ; preserve initial L. edge Move.w teSelRect+right(A3),selRectR(a6) ; preserve initial R. edge Move.w selRectL(a6),anchorL(a6) ; initialize L. anchor Move.w selRectR(a6),anchorR(a6) ; initialize R. anchor ; [d3,d4] are on the same line tst.w teSize(a3) bpl @oldStyle ; old style edit record ; get style runs for character offsets move.w d3,d0 jsrROM ROMGetCurStyle move.l a0,d3StyleRun(a6) jsrROM ROMFixFormatEnd ; get real end position of run <6Mar89smb> cmp.w d0,d4 bhi.s @GetD4Style move.l a0,d4StyleRun(a6) ; in same style run as d3 bra.s @GetDisplayOrder @GetD4Style move.w d4,d0 jsrROM ROMGetCurStyle move.l a0,d4StyleRun(a6) cmp.w startChar(a0),d4 ; is d4 the start of this run? <29June89smb> bne.s @GetDisplayOrder ; bra if not. the style is correct. <29June89smb> ; Otherwise, want the previous style run since d4 is on a boundary, and it indicates the rightmost ; end of the hilite rectangle. d4StyleRun in this case, should be a pointer to the style run which ; ends w/ d4, not begins w/ d4. GetCurStyle doesn't give us what we need, so fix it! <29June89smb> subq.l #stStartSize,d4StyleRun(a6) @GetDisplayOrder move.l teStylesH(a3),a0 ; oh dopey me! <18Aug89smb> <4.2> _HGetState ; oh dopey me! <18Aug89smb> <4.2> move.w d0,-(sp) ; oh dopey me! <18Aug89smb> <4.2> _HLock ; oh dopey me! <18Aug89smb> <4.2> move.w (a2),d0 move.w 2(a2),d1 bsr ptchTEGetFormatOrder ; <9Aug89smb> move.w (sp)+,d0 ; oh dopey me! <18Aug89smb> <4.2> move.l teStylesH(a3),a0 ; oh dopey me! <18Aug89smb> <4.2> _HSetState ; oh dopey me! <18Aug89smb> <4.2> ; get the format order indexes for the character offsets (could be the same) @Loop4Indexes bsr ptchGetNextDisplayStyle ; <9Aug89smb> addq #1,fmtOrderingIndex(a6) ; incr the format ordering array counter SubQ #1,D2 ; dec the style counter ; is this the same style run as one of the character offsets? cmpa.l d3StyleRun(a6),a0 bne.s @testD4 move.w styleRunIndex(a6),d3FmtIndex(a6) tst.b foundD4(a6) bne.s @MeasureNow ; have both offsets' indeces in the fmt array st foundD3(a6) @testD4 cmpa.l d4StyleRun(a6),a0 bne.s @Loop4Indexes move.w styleRunIndex(a6),d4FmtIndex(a6) tst.b foundD3(a6) bne.s @MeasureNow ; have both offsets' indeces in the fmt array st foundD4(a6) bra.s @Loop4Indexes ; measure by style runs and highlight where appropriate based on character offsets ; and display ordering of format runs! @MeasureNow move.w numberOfRuns(a6),d2 clr.w fmtOrderingIndex(a6) ; test if [d3,d4] in same style run move.w d3FmtIndex(a6),d0 cmp.w d4FmtIndex(a6),d0 bne.s @MeasureLoop st sameStyle(a6) @MeasureLoop Bsr ptchGetNextDisplayStyle ; <9Aug89smb> jsrROM ROMMeasureWidth ; using vector to access ptchMeasureWidth tst.b doneFlag(a6) bne.s @hiliteMore addq #1,fmtOrderingIndex(a6) ; incr the format ordering array counter tst.b WordRedraw ; <4Oct89smb> bge.s @GetNext ; <4Oct89smb> SubQ #1,D2 ; dec the style counter beq.s @hiliteMore bra.s @MeasureLoop @GetNext Addq.l #stStartSize,a0 ; get next style SubQ #1,D2 ; dec the style counter bne.s @MeasureLoop ; must be more than 1 line bra.s @hiliteMore ;---------------------------------------------------------------------- IF Scripts604 | SysVers>= $605 THEN ; <7Dec89smb> import ptchHiliteMiddle @oldStyle ; old-style record: one style for the whole record. My code is expecting a0 to contain a ptr to ; the startChar for the current style so must fake the setup. clr.l firstStyleRun(a6) clr.w secondStyleRun(a6) move.w teLength(a3),secondStyleRun(a6) lea firstStyleRun(a6),a0 jsrROM ROMteHiliteText @hiliteMore ; test if there's more to hilite: either more style runs or line ends tst.b hiliteInbetween(a6) beq.s @testEnds jsr ptchHiliteMiddle ; hilite any remaining runs inbetween offsets sf hiliteInbetween(a6) @testEnds jmpROM ROM@testEnds ;---------------------------------------------------------------------- ELSE @oldStyle jmpROM ROMOldStyle @hiliteMore jmpROM ROMHiliteMore ENDIF endWith ;---------------------------------------------------------------------- ; PROCEDURE ptchTestRunDirection ; <9Aug89smb> I need to patch a bug in the routine ; GetNextDisplayStyle, which is called from TestRunDirection. ;---------------------------------------------------------------------- ptchTestRunDirection ; ***** d(r) = ld? ***** movem.w d1/d2,-(sp) move.w d1,fmtOrderingIndex(a6) ; d1 = r bsr ptchGetNextDisplayStyle ; r is index into FmtOrderingArray jmpROM BackToTestRunDirection ;---------------------------------------------------------------------- ; PROCEDURE ptchTEKey ; <10Aug89smb> Striking an up/down arrow key after a hitdown at ; either line end caused the caret to display at the opposite end ; of the line rather than the previous line. This bug occurred ; because teKey was inappropriately setting teLftCaret to T. ; It should only be set initially if the key was not a cursor key. ; <28Sept89smb> Added text buffering. ; <16Nov89smb> Must patch to clear the emBufferLen after the paste ; rather than the emBufferPtr. ; <26Nov89smb> Need to use the high caret rectangle in TEKey rather ; than always using the teSelRect! ; <1/9/90smb> Now using TEDispatchRec for storage instead of ExpandMem. ; <1/25/90smb> Fixed up arrow bug that caused the caret to move up multiple ; lines according to the size of the largest font on the current line. ; <2/28/90smb> Added call to SetKeyboard2Font when backspacing to set the ; keyscript correctly at a script boundary. ;---------------------------------------------------------------------- ptchTEKey IF Scripts604 | SysVers>= $605 THEN ; turn off textBuffering bit before calling StdEntry since want to process below <28Sept89smb> move.l 4(sp),a1 ; teHandle (before the return address) move.l (a1),a1 ; need the ptr to the teRec move.l teDispatchH(a1),a1 move.l (a1),a1 move.l newTEFlags(a1),-(sp) move.l #0,newTEFlags(a1) bsr ptchTEKeyStdEntry ; <28Sept89smb> ; reset textBuffering bit <28Sept89smb> move.l teDispatchH(a3),a1 move.l (a1),a1 move.l (sp)+,newTEFlags(a1) _ObscureCursor ; nice knowing you cursor Move.W (A2),D1 ; store char away move.b d1,d0 ; get char for comparison MoveQ #1,D2 ; assume going down ; Cursor Key support - Added from 'Lonely Hearts' patch 14Jan86 ; left: If selStart isn't 0 it decrements it and places the caret there ; right: Increments selEnd and places caret there ; up: simulates a click one line above current selStart point ; down: simulates a click one line below current selStart point IF 0 THEN ; bye bye for now <32> IF SysVers>= $700 THEN cmp.b #forwardDeleteChar,d0 ; is this the extended keyboard function key? <19> bne.s @CursorKeys ; <19> st teLftCaret(A3) ; jam caret to left cause its nota cursor key <19> ; be sure d6 is not used in any subroutines called from here!!!! st d6 ; tell backspace that we are going forward <19> bra backspace ; do common backspace code <19> @CursorKeys ENDIF ENDIF ; <32> subi.b #downArrowChar,d0 Beq.S downArrow bhi.s normalChar ; optimize normal characters subi.b #upArrowChar-downArrowChar,d0 Beq.S upArrow subi.b #rightArrowChar-upArrowChar,d0 Beq rightArrow subi.b #leftArrowChar-rightArrowChar,d0 Beq leftArrow st teLftCaret(A3) ; jam caret to left, UNLESS a cursor key <7Aug89smb> IF 0 THEN ; bye bye for now <32> IF SysVers>= $700 THEN ; be sure d6 is not used in any subroutines called from here!!!! sf d6 ; tell backspace that we are going backward <19> ENDIF ENDIF ; bye bye for now <32> subi.b #backspaceChar-leftArrowChar,d0 Beq backSpace normalChar ; test if want text buffering <12June89smb> st teLftCaret(a3) ; jam caret to left, UNLESS a cursor key <7Aug89smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 btst #teFTextBuffering,d0 beq PasteChar ; little mod <15June89smb> bsr ptchTEBufferText bra Epilog6 upArrow ;; subtract 2 rather than 1 <1/25/90smb> MoveQ #-1,D2 ; going up MoveQ #-2,D2 ; going up downArrow move d2,-(SP) ; save D2 ; dump text buffer before processing cursor key <14Sept89smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <15Sept89smb> btst #teFTextBuffering,d0 ; <15Sept89smb> beq.s @noBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer ; Call HideCaret to fix problems with old and new teLftClick <1/25/90smb> jsrROM ROMHideCaret ; erase old caret <1/25/90smb> move teSelStart(a3),d3 ; pass selStart=selEnd move d3,d4 moveq #teCaret,d7 ; position pen to caret <03July89smb> IF SysVers < $700 THEN ; <25> bsr ptchTEDoText ; the port ret. in A0 ELSE ; <25> jsrROM ROMDoText ; use the low mem TEDoText hook!! <25> ENDIF move (sp)+,d2 ; restore D2 ;------------------------------------------------------------------------------------- ; In order to go down from a line end position to a line whose line height is less than the current ; line height, must back up one position to get the hite for the correct line (when FindLineHite ; calls GetLine and the current position is at the end of a line, it thinks it's at the ; beginning of the next line so the wrong height is returned. <1/30/90smb> movem.l a2/d3,-(sp) tst.b teLftCaret(a3) bne.s @OffsetOK move.w d3,d0 ; offset beq.s @OffsetOK lea teLines(a3),a2 jsrROM ROMGetLine ; get line that d3 is on cmp.w (a2),d3 ; cmp offset position to line start found bne.s @OffsetOK subq.w #1,d3 ; backup to get correct line in FindLineHite @OffsetOK jsrROM ROMFindLineHite ; get current line hite in d1 ** MBK 6/18/86 ** movem.l (sp)+,a2/d3 ; end of changes <1/30/90smb> ;------------------------------------------------------------------------------------- ;; <1/25/90smb> muls d1,d2 ; get delta -- a SIGNED 16-bit value<09Dec85 JTC> ; if we are going down (d2 = 1), then add linehite (d1) <1/25/90smb> ; if we are going up (d2 = -2), then subtract 2, just enough to get into the previous line's Rect <1/25/90smb> tst.w d2 ; up or down <1/25/90smb> blt.s @DeltaOk ; up = -1 <1/25/90smb> move.w d1,d2 ; move in delta <1/25/90smb> @DeltaOk ; assume whole caret or high caret in teSelRect <26Nov89smb> move.l teSelRect(a3),teSelPoint(a3) ; pass caret point ;------------------------------------------------------------------------------------- ; set teSelPoint(a3) from the high caret position! <26Nov89smb> move.l ExpandMem,a0 ; <26Nov89smb> cmpi.w #$FFFF,ExpandMemRec.emTwoCursorsFlag(a0) ; <26Nov89smb> bne.s @UseSelRect ; bra if high caret loc in teSelRect <26Nov89smb> ; use rect stored in emCursor2Rect: this is the high caret location. <26Nov89smb> lea ExpandMemRec.emCursor2Rect(a0),a0 ; <26Nov89smb> move.l (a0),teSelPoint(a3) ; pass high caret point <26Nov89smb> @UseSelRect ;------------------------------------------------------------------------------------- add d2,teSelPoint(A3) ; adjust v value IF SysVers>= $700 THEN ; <19> import ptchDoFind ; <19> jsr ptchDoFind ; you guessed it: it's patched now! <19> ELSE jsrROM ROMDoFind ; the port ret. in A0 ENDIF ; <19> move.b teLftClick(a3),teLftCaret(a3) ; <10Aug89smb> bra.w leftRight ; setselect'll force autoscroll rightArrow move teSelEnd(A3),d6 ; get start moveq #1,d3 ; if 2byte char, incr posn <27June88smb> bra.s HorizArrows ; <6Mar89smb> leftArrow move teSelStart(A3),d6 ; get start beq.s HorizArrows ; <13Mar89smb> special case at 0th position moveq #-1,d3 ; if 2byte char, decr posn <27June88smb> HorizArrows ; dump text buffer before processing cursor key <14Sept89smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <15Sept89smb> btst #teFTextBuffering,d0 ; <15Sept89smb> beq.s @noBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer tst.b WordRedraw ; <9Jan89smb> blt.s @RLText ; <22June89smb> includes RL directional text tst.b teSysJust ; <22June89smb> beq.s @LRLineDir ; <22June89smb> LR text on a LR line @RLText ; may be RL text on any directioned line OR LR text on a RL line bsr ptchCursorMovement ; <9Jan89smb> ; <34i-YDS-9/2/91>> supports the single carret corect display IF forLocalizability THEN ; when on cluster boundry, syncronize allways to the ; style with the that his just = teSysJust tst.b WordRedraw ; have L->R script ? bge.s leftRight ; no, do the old way tst.w teSize(a3) ; if unstyled ? bpl.s leftRight ; do the old way for unstyled move.w d6,d0 ; GetCurStyle needs offset in d0 jsrROM ROMGetCurStyle ; get the current style cmp.w startChar(a0),d6 ; are we on a boundry ? bne.s leftRight ; if not do it the old way move.l a0,-(sp) ; keep a0 (the style) from being trashed jsrROM ROMHideCaret ; hide caret jsrROM ROMHiLite ; unhilite Move d6,teSelEnd(A3) ; set set start Move d6,teSelStart(A3) ; set sel end move.l (sp)+,a0 ; restore style ptr (in a0) jsrROM ROMGetDirection ; get style direction cmp.b TESysJust,d1 ; same as TESysJust ? beq @setStyle ; yes ! set the style for it. move.w d6,d0 ; no ! get the prev style, put offset into d0 sub.w #1,d0 ; be in prev jsrROM ROMGetCurStyle ; get this style @setStyle jsrROM ROMSetStyle ; set the font/style in the grafport move.w d6,d0 ; char offset in d0 needed by SetKeyboard2Font import ptchSetKeyboard2Font jsr ptchSetKeyboard2Font ; sync keyboard to font jsrROM ROMHiLite ; Hilite jsrROM ROMSelView ; insure selection is visible jsrROM ROMShowCaret ; force caret ON bra epilog6 ELSE bra.s leftRight ; <9Jan89smb> ENDIF @LRLineDir jsrROM ROMDoubleByte ; middle of char? Fix starting point <27June88smb> leftRight Ext.L D6 ; D6 comes back char loc Move.L D6,-(SP) ; pass start Move.L D6,-(SP) Move.L A4,-(SP) _TESetSelect jsrROM ROMDrawCaret ; force caret ON IF 0 THEN ; bye bye for now <32> Bra epilog6 ; <32> ELSE ; <32> Bra.w epilog6 ENDIF ; <32> PasteChar ; Go paste the character Move.L A2,D6 ; point to the character AddQ #1,D6 ; character in lower half MoveQ #1,D5 ; one long Bsr ptchBufferChar ; buffer if 2 byte character <27June88smb> IF 0 THEN ; bye bye for now <32> blt epilog6 ; the result isn't unsigned! <31Aug89smb> <32> ELSE ; <32> blt.w epilog6 ; the result isn't unsigned! <31Aug89smb> ENDIF ; <32> ; Must patch to clear the emBufferLen after the paste rather than the emBufferPtr. <16Nov89smb> moveq #0,D7 ; want to call ExtendStyle jsrROM ROMPasteGuts move.l teDispatchH(a3),a0 ; <1/9/90smb> finished w/ character so empty storage move.l (a0),a0 IF forLocalizability THEN ; <34b-YDS-9/2/91> move.w #0,TwoByteCharBuffer(a0) ELSE move.l #0,TwoByteCharBuffer(a0) ENDIF bra.w epilog6 backSpace ; dump text buffer before backspacing <14Sept89smb> Move.L teDispatchH(A3),A0 Move.L (A0),A0 move.l newTEFlags(a0),d0 btst #teFTextBuffering,d0 beq.s @noBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer ;;replaced with following backspace code. <2/28/90smb> jmpROM ROMbackspace move teSelStart(a3),d0 ; see if null selection cmp teSelEnd(a3),d0 bne.s cutit ;------------------------ IF 0 THEN ; bye bye for now <32> IF SysVers>= $700 THEN ; add support for the forward delete key <7jan91 fjs><19> tst.b d6 ; is this forward delete ? <19> beq.s @normalBS ; if 0 do normal backspace work <19> ; since there is no selection, eat characters to the right ; first, check if we are at the extreme right already cmp.w teLength(a3),d0 ; at extreme right of text? (really, the end… think R-L)<19> bge.s epilog6 ; yes, skip this <19> jsrROM ROMHideCaret ; remove the caret <19> ; check for double-byte characters and fix starting point move.w teSelEnd(a3),d6 ; current position <19> moveq #1,d3 ; direction to move <19> jsrROM ROMDoubleByte ; middle of char? Fix starting point. <19> move.w d6,teSelEnd(a3) ; adjust selection <19> bra.s cutit ; fall into the cut case <7jan91 fjs><19> @normalBS ENDIF ENDIF ; <32> ;------------------------ ; since there's no selection eat characters to the left. tst d0 ; see if at extreme left (really, the beginning… think R-L) beq.w epilog6 ; skip if so jsrROM ROMHideCaret ; remove the caret ; check for double-byte characters and fix starting point. <27June88smb> move.w teSelStart(a3),d6 ; current position <27June88smb> moveq #-1,d3 ; direction to move <27June88smb> jsrROM ROMDoubleByte ; middle of char? Fix starting point <27June88smb> move.w d6,teSelStart(a3) ; adjust selection cutit ; Need to synchronize keyboard to the font <2/28/90smb>; moved here from DelGuts. ; This must be done before the call to TEDelete in order to synchronize the kbd to ; the style that corresponds to the current selStart. tst.w teSize(a3) ; if unstyled, can't synch keyboard to font <2/28/90smb> IF forLocalizability THEN ; even if we dont have all info <34m-YDS-9/2/91> bpl.s @syncUnStyled ; sync for unstyled ELSE bpl.s @JustCut ; <2/28/90smb> ENDIF move.w teSelStart(a3),d0 ; get new offset position <2/28/90smb> jsrROM ROMGetCurStyle ; <2/28/90smb> jsrROM ROMSetStyle ; <2/28/90smb> import ptchSetKeyboard2Font jsr ptchSetKeyboard2Font ; synch keyboard to font <2/28/90smb> IF forLocalizability THEN ; synch for unstyled too <34m-YDS-9/2/91> bra @JustCut ; go to the cut if didn't come with a bpl.s @syncUnStyled IF 0 THEN ; now using 'itlb' flag in CubeE <46> ;; tst.b WordRedraw ; is it a R->L script ? <37> ;; bge.w @JustCut ; don't synch. <37> ; Really want to synchronize for unstyled text in ALL scripts. However, this will cause problems for <37> ; input methods, so we will skip this code in this case. (WordRedraw only indicates the <37> ; types of scripts installed and not the current one…) <37> subq #2,sp ; result space for Font2Script & GetScript <37> move.w teFont(a3),-(sp) ; app font id <37> _Font2Script ; it's a non-roman char so get script font <37> move.w (sp)+,d0 ; <37> beq @UseFont ; if Roman then always synchronize <37> cmp.w #smEastEurRoman,d0 ; Extended Roman? <40> beq @JustCut ; If so, never synchronize <40> subq #4,sp ; result space <37> move.w d0,-(sp) ; script <37> move.w #smScriptRedraw,-(sp) ; <37> _GetScript ; <37> move.l (sp)+,d1 ; <37><39> tst.b d1 ; leave in d1 for later <37><39> bgt @JustCut ; if double-byte script don't synchronize <37> ; otherwise, we have a single-byte non-Roman font <37> ; IF SysVers > $610 THEN ; move.l teDispatchH(a3),a0 ; ; move.l (a0),a0 ; move.l newTEFlags(a0),d0 ; move into reg the flags ; btst #teFInlineInput,d0 ; are we in an inline input window ? ; bne.w @JustCut ; yes, don't synch keyboard. ; ENDIF ELSE ; now using 'itlb' flag in CubeE <46> ; optimize for Roman-only: do not have to synch font & kbd <51> with smgrRecord ; <51> GetSMgrCore a0 ; load SMgr globals pointer. <51> cmp.b #1,smgrEnabled(a0) ; how many scripts enabled? <51> beq @JustCut ; skip synchronization for Roman-only system <51> endwith ; <51> subq #6,sp ; result space for Font2Script & GetScript <46> move.w teFont(a3),-(sp) ; app font id <46> _Font2Script ; get script font <46> ; script left on stack ; <46> move.w #smScriptFlags,-(sp) ; now get script-specific flags <46> _GetScript ; <46> move.l (sp)+,d0 ; <46> and.l #(1< beq.s @JustCut ; 0=> do not synchronize <46> ; otherwise synchronize ENDIF ; now using 'itlb' flag in CubeE <46> Move.w teSelStart(a3), d6 ; <33-YDS-10/1/91> d6 was set only for a one char delete, not for a selection delete ; Check char to determine how to synch move.l teTextH(a3),a2 ; handle to text <39> move.l (a2),a0 ; ptr to text <39> move.b 0(a0,d6.w),d0 ; get character <39> cmp.b #$20,d0 ; control char? <39> blo.s @JustCut ; if so, don't synch <39> move.b d1,-(sp) ; save scriptRedraw <39> subq #2,sp ; room for return move.l a0,-(sp) ; push text ptr on stack <39> move.w d6,-(sp) ; offset on stack _CharType ; what char is it move.w (sp)+,d0 ; take result move.b (sp)+,d1 ; recover scriptRedraw <39> ; Mask off what interested in: the Type ($000F) and the Direction ($2000) <37> ; Want a char whose Direction is LR (smCharLeft, $0000) and whose Type is Roman <37> ; which can be smCharAscii (1) or smCharEuro (7) or smCharPunct (0). <37> ; ; New approach. Different behavior for bidi and non-bidi scripts, because of caret <39> ; requirements for bidi scripts. <39> bne.s @doBidi ; check scriptRedraw for bidi <39> ; For non-bidirectional scripts, set keyboard to Roman for Roman letters, <39> ; sync to font for script letters, dont sync for anything else. <39> and.w #smcTypeMask,d0 ; isolate info we need <39> cmp.w #smCharPunct,d0 ; non-letter? <39> beq.s @JustCut ; if so, don't synch keyboard <39> cmp.w #smCharAscii,d0 ; low-ASCII Roman? <39> beq.s @isRoman ; if so, go set keyboard <39> cmp.w #smCharEuro,d0 ; Extended ASCII Roman? <39> beq.s @isRoman ; if so, go set keyboard <39> bra.s @UseFont ; otherwise, sync keyboard to font <39> ; For bidirectional scripts, don't synch control chars (stripped out above) or low-ASCII <39> ; (L-R) digits; synch other L-R chars to Roman, and everything else to font script. <39> @doBidi ; <39> and.w #smcTypeMask+smcClassMask+smcRightMask,d0 ; isolate info we need <39> cmp.w #smCharPunct+smPunctNumber+smCharLeft,d0 ; is char a low-ASCII digit? <39> beq.s @JustCut ; if so, don't synch <39> and.w #smcRightMask,d0 ; now just check direction <39> beq.s @isRoman ; if left-right, sync to Roman <39> ; Otherwise, synch the font to the script of the character <37> @UseFont subq #2,sp ; room for return move.w teFont(a3),-(sp) ; app font id _Font2script ; it's a non-roman char so get app font ; leave script on stack bra.s @SetKbd @isRoman move.w #smRoman,-(sp) ; we think it is roman @SetKbd move.w (sp), d0 ; script param on the stack move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 ; move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript _KeyScript ; set keyboard ENDIF @JustCut move.l a4,-(sp) ; pass the handle _TEDelete ; and cut it (A3 no good after) epilog6 moveq #6,d0 jmpROM ROMStdExit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELSE ; IF NOT (Scripts604 | SysVers>= $605) jsrROM ROMStdEntry _ObscureCursor ; nice knowing you cursor Move.W (A2),D1 ; store char away Cmp.B #backspaceChar,D1 ; is it a backspace? Beq @backSpace ; Cursor Key support - Added from 'Lonely Hearts' patch 14Jan86 ; left: If selStart isn't 0 it decrements it and places the caret there ; right: Increments selEnd and places caret there ; up: simulates a click one line above current selStart point ; down: simulates a click one line below current selStart point ; MoveQ #1,D2 ; assume going down MoveQ #$1F,D0 ; range $1C-$1F Sub.B D1,D0 ; get key code Blt.S @NormalChar Beq.S @downArrow ; is it a cursor key? SubQ.B #1,D0 Beq.S @upArrow SubQ.B #1,D0 Beq.S @rightArrow SubQ.B #1,D0 Beq.S @leftArrow bra.s @NormalChar @upArrow MoveQ #-1,D2 ; going up @downArrow Move D2,-(SP) ; save D2 Move teSelStart(A3),D3 ; pass selStart=selEnd Move D3,D4 MoveQ #teCaret,D7 ; position pen to caret IF SysVers < $700 THEN ; <25> bsr ptchTEDoText ; the port ret. in A0 <9Aug89smb> ELSE ; <25> ; not really necessary since this is for 6.0.4 but, for futures… jsrROM ROMDoText ; use the low mem TEDoText hook!! <25> ENDIF Move (SP)+,D2 ; restore D2 jsrROM ROMFindLineHite ; get current line hite MulS D1,D2 ; get delta -- a SIGNED 16-bit value<09Dec85 JTC> Move.L teSelRect(A3),teSelPoint(A3) ; pass caret point Add D2,teSelPoint(A3) ; adjust v value jsrROM ROMDoFind ; the port ret. in A0 move.b teLftClick(a3),teLftCaret(a3) ; <10Aug89smb> jmpROM ROMleftRight ; setselect'll force autoscroll @backSpace st teLftCaret(A3) ; jam caret to left jmpROM ROMbackspace @rightArrow jmpROM ROM@RightArrow ; <14Aug89smb> @leftArrow jmpROM ROM@LeftArrow ; <14Aug89smb> @NormalChar st teLftCaret(A3) ; jam caret to left jmpROM ROM@NormalChar ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTEDelete( h: TEHandle ); ; Patching bug at end of DelGuts, which is only called by ; TEDelete. ;---------------------------------------------------------------------- ptchTEDelete IF Scripts604 | SysVers>= $605 THEN bsr ptchStdEntry ; <28Sept89smb> ELSE jsrROM ROMStdEntry ENDIF jsrROM ROMHideCaret ; fall into ptchDelGuts ;---------------------------------------------------------------------- ; PROCEDURE ptchDelGuts ; <21July89smb> Added ConcatStyles to DelGuts - when it deletes ; a style it doesn't check to see if the two adjacent styles are ; the same. ; <1/17/90smb> Adding call to SetKeyboard2Font to set the ; keyscript correct when crossing a script boundary. ; <2/28/90smb> Removing 1/17/90 fix to call SetKeyboard2Font. ;---------------------------------------------------------------------- jsrROM ROMSelSort ; sort selection Move D0,D7 ; calc delta amount(selEnd in D0) Sub (A2),D7 ; ...for ReCalLines (A2 ^selStart) Beq outGuts ; skip if null selection ; ** Inserted test to change the way backspacing/deleting works. ; If you backspace to the beginning of a style, that style is saved to the null scrap. ; This allows you to type a selection, backspace over it, and retype without ; TextEdit reverting to the previous style. Tst.W teSize(A3) ; is this a styled record? Bpl.S @1 ; oops, never mind MoveM.L D0/D7/A2,-(SP) ; we need D0 and A2 temporarily Move.W teSelStart(A3),D0 ; find start of block to be yanked jsrROM ROMGetCurStyle ; find the associated style run Move.W teSelStart(A3),D0 ; get start of block again Cmp.W startChar(A0),D0 ; is it the beginning of a style? Beq.S @2 ; yes, so continue jsrROM ROMClearRsrved ; no null selection! Bra.S @3 ; @2 Move.W styleIndex(A0),D0 ; fetch index into style table jsrROM ROMGetStyle ; find associated style table entry Move.W #doAll,-(SP) ; build fake frame for SetRsrved Pea stFont(A0) ; point at embedded textstyle Clr.B -(SP) ; need another word, can't hurt Move.L SP,A2 ; point A2 at stacked parameters jsrROM ROMAltSetRsrved ; set null scrap style AddQ.W #8,SP ; fix up stack @3 MoveM.L (SP)+,D0/D7/A2 ; retrieve saved registers @1 ; Move.W D0,D1 ; selEnd ** MBK 6/18/86 ** Swap D0 ; selStart ** MBK 6/18/86 ** jsrROM ROMDeleteStyle ; del associated styles jsrROM ROMMungeSetup ; set up params for delete Move D7,-(SP) ; length for delete Clr -(SP) ; fake long length Clr.L -(SP) ; fake p2 Clr.L -(SP) ; fake l2 _Munger ; sloppy munger AddQ.L #4,SP ; pop result Move.L teTextH(A3),A0 ; RecalDraw expects text to be locked _Hlock ; and relock it Sub D7,teLength(A3) ; length:=length -(selEnd-selStart) Move (A2)+,(A2) ; selEnd:=selStart tst.w teSize(A3) ; is this a styled record? <24July89smb> bpl.S outGuts ; if so, no need to concat - only 1 run <24July8smb> jsrROM ROMConcatStyles ; <21July89smb> jsrROM ROMConcatRuns ; <25June89smb> outGuts jmpROM EndDelGuts IF Scripts604 | SysVers>= $605 THEN ;---------------------------------------------------------------------- ; PROCEDURE ptchTEActivate ; <28Sept89smb> Added outline highlighting. ; <3Oct89smb> Fixed caret display for outline highlighting. ;---------------------------------------------------------------------- ptchTEActivate with OutlineFrame bsr ptchStdEntry link a6,#OutlineFrameSz ; only link if outlining tst.b teActive(A3) ; see if already active bne goGoHome ; fix the selection when inactive bsr InitOutline move teSelStart(A3),D0 ; Only enable the caret cmp teSelEnd(A3),D0 bne.s @notSelPt st teCarAct(a3) ; activate caret ; hide the caret when outline highlight on <2Oct89smb> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFOutlineHilite,d0 beq.s @notSelPt ; no outlining desired jsrROM ROMDrawIt ; hide the caret @notSelPt st teActive(A3) ; flag as active jsrROM ROMHiLite bra.s DoneActivate ; rejoin flow of control ;---------------------------------------------------------------------- ; PROCEDURE ptchTEDeactivate ; <28Sept89smb> Added outline highlighting. ; <3Oct89smb> Fixed caret display for outline highlighting. ;---------------------------------------------------------------------- ptchTEDeactivate with OutlineFrame bsr ptchStdEntry link a6,#OutlineFrameSz ; only link if outlining tst.b teActive(A3) ; see if already inactive beq.s goGoHome move teSelStart(a3),d0 ; is this a selection point? cmp teSelEnd(a3),d0 bne.s @drawRegion ; fall through for caret processing ; is outlining desired? move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFOutlineHilite,d0 beq.s @drawRegion ; outline bit not on ; if caret on invert it tst.b teCarOn(a3) beq.s @noDraw jsrROM ROMDrawIt @noDraw ; turn on flag in case off - want to display an outlined caret st teCarOn(a3) ; will be turned off in HideCaret @drawRegion bsr.s InitOutline jsrROM ROMHideCaret ; hide the caret jsrROM ROMHiLite ; Remove old selection sf teActive(A3) ; flag as inactive ; drop through to common exit ;----------------------------------------- DoneActivate bsr.s TEOutlineHilite ; outline hilite now goGoHome unlk a6 jmpROM ROMEpilog4 ;---------------------------------------------------------------------- ; PROCEDURE InitOutline ; <28Sept89smb> ; Test for outline highlighting after setting up teRec. ; <3Oct89smb> Cleaned up code a bit! ;---------------------------------------------------------------------- InitOutline move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFOutlineHilite,d0 beq.s @RegHilite _OpenRgn move.l teHiHook(a3),oldHighHook(a6) ; save move.l teCarHook(a3),oldCaretHook(a6) ; save lea FrameHook,a0 ; just frame it move.l a0,teHiHook(a3) ; stuff it! move.l a0,teCarHook(a3) ; stuff it! st paintFlag(a6) ; init to always paint region <16Oct89smb> @RegHilite rts ;----------------------------------------- FrameHook _FrameRect Rts ;---------------------------------------------------------------------- ; PROCEDURE TEOutlineHilite ; <28Sept89smb> ;---------------------------------------------------------------------- TEOutlineHilite with OutlineFrame ; do we need anything fancy move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFOutlineHilite,d0 beq @DoneTEOutlineHilite ; don't do fancy stuff! ; now do the outlining <20Sept89smb> move.l a4,-(sp) ; save TE handle subq.l #4,sp ; handle to outline region _NewRgn ; handle to outline region still on stack move.l (sp),a2 ; save outline region _CloseRgn subq.l #4,sp ; handle to view region _NewRgn ; handle to view region still on stack move.l (sp),a4 ; save view region pea teViewRect(a3) ; view Rectangle _RectRgn move.l a4,-(sp) ; view region move.l a2,-(sp) ; outline region move.l a2,-(sp) ; intersection of view and outline regions _SectRgn move.l a4,-(sp) ; view region _DisposRgn ; set up for drawing pea oldPenState(a6) _GetPenState move.w #1,-(sp) move.w #1,-(sp) _PenSize move.l GrafGlobals(a5),a0 ; get graf globals move.w teSelStart(a3),d0 cmp.w teSelEnd(a3),d0 bne.s @NoCaret ; got a caret lea gray(a0),a4 ; modified a bit <2Oct89smb> move.w #PatXOr,d2 bra.s @doPen @NoCaret lea black(a0),a4 ; @black pattern ; test if color QD available move.w #PatXOr,d2 ; assume no color QD move.l #gestaltQuickdrawVersion,d0 _Gestalt ; result returned in a0 tst.w d0 ; OSErr result returned here bne SysErr move.l a0,d0 ; test result in a0! beq.s @doPen ; no color QD available move.w #50,d2 ; hilite @doPen move.w d2,-(sp) _PenMode move.l a4,-(sp) _PenPat ; draw move.w teSelStart(a3),d0 cmp.w teSelEnd(a3),d0 beq.s @Caret ; no caret so outline move.l a2,-(sp) _FrameRgn tst.b paintFlag(a6) ; don't paint for Updating <16Oct89smb> beq.s @NoPaint @Caret move.l a2,-(sp) _PaintRgn @NoPaint move.l a2,-(sp) _DisposRgn move.l (sp)+,a4 ; restore TE handle pea oldPenState(a6) _SetPenState move.l oldHighHook(a6),teHiHook(a3) ; restore move.l oldCaretHook(a6),teCarHook(a3) ; restore @DoneTEOutlineHilite rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;---------------------------------------------------------------------- ;---------------------------------------------------------------------- ; PROCEDURE ptchTEDispatch ; <1/4/91smb> Fixed bug #66732 in SetStylScrap. <19> ; <1/4/91smb> Fixed bug #58512 in TEStylInsert. <19> ;---------------------------------------------------------------------- ptchTEDispatch MoveQ #1,D0 ; tells stdEntry it's a style trap Bsr ptchStdEntry2 ; get addr of procedure in a0 IF SysVers>= $700 THEN ; <19> cmpROM ROMSetStylScrap,a0 ; are we dispatching to SetStylScrap? <19> bne.s @TestStylInsert ; nope, test for TEStylInsert call <19> ;---------------------------------------------------------------------- ; PROCEDURE ptchSetStylScrap ; <1/4/91smb> Per documentation, if a NIL StScrpHandle (newStyles) ; exist, do nothing and exit. <19> ;---------------------------------------------------------------------- tst.l 2(a2) ; is the scrap handle NIL <19> bne @Go2Proc ; nope, go to SetStylScrap <19> moveq #20,d0 ; Nil handle: # of params to strip <19> jmpROM ROMStdExit2 ; goodbye! <19> ;---------------------------------------------------------------------- ; PROCEDURE ptchTEStylInsert ; <1/4/91smb> Must patch since it calls InsGuts which is now patched. <19> ;---------------------------------------------------------------------- @TestStylInsert cmpROM ROMTEStylInsert,a0 ; are we dispatching to TEStylInsert? <19> bne @Go2Proc ;----------- jsrROM ROMHideCaret jsrROM ROMHiLite ; remove selection move.l (a2)+,d0 ; get style handle moveq #0,d7 ; delta = 0(No deletion) movem.l (a2)+,d5-d6 ; A2 points to length & pointer params ; If length is 0, punt tst.l d5 ; length? bz.s @15 ; Nope, so leave tst.l d0 ; check if handle is NIL beq.s @0 ; can't insert styles if NIL move.l d0,a2 ; save style handle in A2 tst.w teSize(a3) ; check style flag bpl.s @0 ; just insert text if not a style record jsrROM ROMMungeSetup ; setup for the insert clr.l -(sp) ; fake l1 move.l d6,-(sp) ; pointer to insert = p2 move.l d5,-(sp) ; length to insert = l2 _Munger ; use sloppy munger addq.l #4,sp ; pop result add d5,teLength(a3) ; adjust length by insert amount move.l teTextH(a3),a0 ; get text handle _Hlock ; and relock it move.l a2,a0 ; get style handle _HGetState ; get the style handle's tag move.b d0,-(sp) ; and save the flags _HLock ; and lock it movem.l d2-d6/a2/a4,-(sp) ; save stuff move.l a2,a4 ; style handle in a4 for call to PstStylGuts ; ** ** High word of D3 must be clear for PstStylGuts moveq #0,d3 ; clear whole register move.w teSelStart(a3),d3 ; selection start jsrROM ROMPstStylGuts ; go do the style paste movem.l (sp)+,d2-d6/a2/a4 ; restore stuff move.b (sp)+,d0 ; get the flags move.l a2,a0 ; get style handle _HSetState ; set the style handle's tag ; only call ConcatRuns when styles are pasted, hence moved here. Text inserted now so ; okay to call. jsrROM ROMConcatRuns ; <24Nov88smb> don't leave any null style runs sub d5,d7 ; adjust delta amount for ReCalLines bra.s @1 ; go recal @0 bsr ptchInsGuts ; no styles to insert, only text! <19> @1 jsrROM ROMRecalDraw ; redo the line stuff add d5,teSelStart(a3) ; selStart:=selstart + insert amount add d5,teSelEnd(a3) ; selEnd:=selEnd + insert amount @15 jsrROM ROMShowCaret jsrROM ROMHiLite ; restore selection moveq #18,d0 ; # of bytes on stack jmpROM ROMStdExit2 ; to be removed before exit ;----------- ENDIF @Go2Proc jmpROM ROMinTEDispatch ;---------------------------------------------------------------------- ptchTEGetText Bsr ptchStdEntry jmpROM ROMinTEGetText ;---------------------------------------------------------------------- ptchTESetText Bsr ptchStdEntry jmpROM ROMinTESetText ;---------------------------------------------------------------------- ptchTECalText Bsr ptchStdEntry jmpROM ROMinTECalText ;---------------------------------------------------------------------- ptchTECopy Bsr ptchStdEntry jmpROM ROMinTECopy ;---------------------------------------------------------------------- ptchTECut Bsr ptchStdEntry jmpROM ROMinTECut ;---------------------------------------------------------------------- ptchTEIdle Bsr ptchStdEntry IF forLocalizability THEN ; <34p-YDS-9/2/91> Tst.B teCarAct(A3) ; see if active Beq.S goHome SubQ #4,SP ; make room for result _TickCount ; Get current time Move.L (SP)+,A0 ; use A0 for auto extend Cmp.L teCarTime(A3),A0 ; see if done Blo.S goHome Add.L CaretTime,A0 ; next time Move.L A0,teCarTime(A3) Not.B teCarOn(A3) ; flip the flag jsrROM ROMDrawIt ; flip the caret goHome jmpROM ROM@goHome ELSE jmpROM ROMinTEIdle ENDIF ;---------------------------------------------------------------------- ptchTEPaste Bsr ptchStdEntry jmpROM ROMinTEPaste ;---------------------------------------------------------------------- ; PROCEDURE ptchTEInsert ; <1/4/91smb> Fixed bug #58512: Must patch TEInsert since ; it calls InsGuts which is now patched. <19> ;---------------------------------------------------------------------- ptchTEInsert Bsr ptchStdEntry IF SysVers>= $700 THEN jsrROM ROMHideCaret ; NO jsrROM ROMHiLite ; remove selection NO moveq #0,d7 ; delta = 0(No deletion) movem.l (a2)+,d5-d6 ; A2 points to l param bsr.s ptchInsGuts ; go insert the scrap <19> jmpROM ROMAfterInsert ; <19> ELSE jmpROM ROMinTEInsert ENDIF IF SysVers >= $700 THEN ;---------------------------------------------------------------------- ; PROCEDURE ptchInsGuts ; <1/4/91smb> Must be patched since calls InsRsrved which calls ; PstStylGuts which has an unlocked null scrap handle that must ; be locked since it uses it again after moving memory. <19> ;---------------------------------------------------------------------- ptchInsGuts jsrROM ROMMungeSetup ; setup for the insert NO Clr.L -(SP) ; fake l1 Move.L D6,-(SP) ; pointer to insert = p2 Move.L D5,-(SP) ; length to insert = l2 _Munger ; use sloppy munger AddQ.L #4,SP ; pop result Move.L teTextH(A3),A0 ; get text handle _Hlock ; and relock it Add D5,teLength(A3) ; adjust length by insert amount Sub D5,D7 ; adjust delta amount for ReCalLines Tst.W teSize(A3) ; check style flag Bpl.S @0 ; no, you're done ** MBK 6/18/86 ** ; lock down the nullscrap handle since InsRsrved expects to use it again after moving memory <19> move.l teStylesH(a3),a0 ; get style handle move.l (a0),a0 ; deref move.l nullStyle(a0),a0 ; get reserved handle move.l (a0),a0 ; deref move.l nullScrap(a0),a1 ; get handle to scrap for null selection move.l a1,-(sp) ; save scrap handle for unlocking later <19> ; Gotta lock down null scrap! <19> move.l a1,a0 ; <19> _HLock ; <19> jsrROM ROMInsRsrved ; insert the style NO ; Unlock previously locked null scrap <19> move.l (sp)+,a0 ; <19> _HUnlock ; <19> @0 Rts ENDIF ; <19> ;---------------------------------------------------------------------- ptchTESetJust Bsr ptchStdEntry jmpROM ROMinTESetJust ;---------------------------------------------------------------------- ; PROCEDURE ptchTEScroll ; <1/4/91smb> Must be patched since calls Scroll which calls ; Refresh, which is now patched. ;---------------------------------------------------------------------- ptchTEScroll Bsr ptchStdEntry IF SysVers>= $700 THEN jsrROM ROMHideCaret Move.L (A2)+,D3 ; get dv,dh pair Bsr.S ptchScroll epilog8 MoveQ #8,D0 jmpROM ROMStdExit ;---------------------------------------------------------------------- ; PROCEDURE ptchScroll ; <1/4/91smb> Must be patched since calls Refresh, which is ; now patched. ;---------------------------------------------------------------------- ptchScroll ; Amount to scroll in D3 Tst.L D3 ; escape if nothing there Beq.S ActCaret ; fix errant HideCaret (and Rts…) Pea teDestRect(A3) ; pass the dest rectangle Move.L D3,-(SP) ; pass dh, dv _OffsetRect SubQ #4,SP ; make room for temp region _NewRgn ; get it Move.L (SP)+,A2 ; save its handle Pea teViewRect(A3) ; pass rect to scroll Move.L D3,-(SP) ; pass dh, dv Move.L A2,-(SP) ; pass the temp region _ScrollRect Bsr.S ActCaret ; just activate, don't draw NO Move.L A2,-(SP) ; clip to it update rgn _SetClip Move.L (A2),A0 ; point to region Lea rgnBBox(A0),A0 import ptchRefresh ; <19> jsr ptchRefresh ; and redraw those lines <19> Move.L A2,-(SP) ; get rid of temp region _DisposRgn @0 handyReturn Rts ;----------------------------------------------- ; ** ** Don't draw caret yet, just activate it ActCaret Tst.B teActive(A3) ; do nothing if not active Beq.S @0 ; NO Move teSelStart(A3),D0 ; see if should be turned on Cmp teSelEnd(A3),D0 Bne.S @0 ; if selection <> 0 then escape ST teCarAct(A3) ; replaced ShowCaret @0 Rts ;----------------------------------------------- ELSE ; <19> jmpROM ROMinTEScroll ENDIF ; <19> ;---------------------------------------------------------------------- ; PROCEDURE ptchTEPinScroll ; <1/4/91smb> Must be patched since calls Refresh, which is ; now patched. ;---------------------------------------------------------------------- ptchTEPinScroll Bsr ptchStdEntry IF SysVers>= $700 THEN ; <19> jsrROM ROMHideCaret ; get vertical parameter move (a2),d0 ; get dV bpl.s @PinTop ; pin top move.w teNLines(A3),d1 ; last line ** MBK 6/18/86 ** move.w teLength(A3),d0 ; last char ** ** tst.w d0 ; anything in file? ** ** beq.s @0 ; skip test if not ** ** move.l teTextH(a3),a0 ; text handle ** ** Move.l (a0),a0 ; dereference ** ** cmp.b #$0D,-1(a0,d0) ; file end with CR? ** ** bne.s @0 ; end of file if not ** ** addq #1,d1 ; else 1 more line ** ** @0 moveq #0,d0 ; 1st line ** MBK 6/18/86 ** jsrROM ROMGetLineHites ; compile max hites ** MBK 6/18/86 ** move.w d0,d1 ; hite from 1st to last ** MBK 6/18/86 ** move.w (a2),d0 ; restore D0 ** MBK 6/18/86 ** add teDestRect+top(a3),d1 ; get destRect.top sub teViewRect+bottom(A3),d1; a diff. viewRect.bottom ble.s @2 ; dest already gone... add d1,d0 ; see what delta does bpl.s pinH bra.s @2 ; should be subtracted because it's negative @PinTop ; scrolling down move teDestRect+top(a3),d1 ; add destRect.top sub teViewRect+top(a3),d1 ; diff. viewRect.top bpl.s @2 ; already bad add d1,d0 bmi.s pinH @2 sub d0,(a2) ; adjust scroll pinH move 2(a2),d0 ; get dH bpl.s @1 ; pin top move teDestRect+right(a3),d1 ; add destrect.right sub teViewRect+right(a3),d1 ; a diff. viewRect.right ble.s @2 ; already past, cancel scroll add d1,d0 bpl.s pinDone sub d0,2(a2) ; bug found in MacDTS <12/19/88smb> bra.s pinDone @1 move teDestRect+left(a3),d1 ; add destRect.left sub teViewRect+left(a3),d1 ; diff. viewRect.left bpl.S @2 ; already past, cancel scroll add d1,d0 bmi.s pinDone @2 sub d0,2(a2) ; adjust scroll pinDone move.l (a2)+,d3 ; get dv,dh pair bsr ptchScroll ; and go scroll it <19> bsr ActCaret ; just activate, don't draw ** ** Bra epilog8 ELSE ; <19> jmpROM ROMinTEPinScroll ENDIF ; <19> ;---------------------------------------------------------------------- ptchTESelView Bsr ptchStdEntry ; doo dah... jmpROM ROMinTESelView ;---------------------------------------------------------------------- ptchTEAutoView Bsr ptchStdEntry ; doo dah... jmpROM ROMinTEAutoView ;---------------------------------------------------------------------- ; PROCEDURE ptchTEGetOffset ; <1/4/91smb> Must patch more since DoFind is now patched. ;---------------------------------------------------------------------- ptchTEGetOffset Bsr ptchStdEntry IF SysVers>= $700 THEN Move.L teSelPoint(A3),-(SP) ; save selPoint ; Find the point and get char index of it in D6 Move.L (A2)+,teSelPoint(A3) ; pass selPoint import ptchDoFind ; <19> jsr ptchDoFind ; juggle dispStart/End and do find Move.W D6,(A2) ; dispStart Move.L (SP)+,teSelPoint(A3) ; restore selPoint bra.s Epilog8 ; is Epilog8 in this proc? (if not, use jmpROM ROMEpilog8 ????????????) ELSE jmpROM ROMinTEGetOffset ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTESetStyle ; <7Dec89smb> ; Testing possible additive combination of mode which could include ; the font bit before call to SetKeyboard2Font. ; <16Dec89smb> ; Remove TEDispatch return address from stack. ;---------------------------------------------------------------------- ptchTESetStyle addq.l #4,sp ; Clean up from ptchStdEntry jump.<16Dec89smb> tst.w teSize(A3) ; check style flag Bpl.S @DontSet ; if not, sorry, can't set it jsrROM ROMSetRsrved ; save the style in the grafport ; mode may be an additive combination so must test the font bit <3Dec89smb> move.w 6(a2),d0 ; <3Dec89smb> btst #fontBit,d0 ; is mode = doFont? <3Dec89smb> beq.s @KeybdOK ; <3Dec89smb> ;; cmpi.w #doFont,6(a2) ; is mode = doFont? <12July89smb> ;; bne.s @KeybdOK ; <12July89smb> import ptchSetKeyboard2Font jsr ptchSetKeyboard2Font ; synch keyboard to new font <10Nov88smb> @KeybdOK jmpROM ROM@KeybdOK @DontSet MoveQ #14,D0 jmpROM ROMStdExit2 ;---------------------------------------------------------------------- ; PROCEDURE ptchTEUpdate ; <16Oct89smb> ; Added updating of outlined region in TEUpdate. ;---------------------------------------------------------------------- ptchTEUpdate Bsr ptchStdEntry Move.L (A2)+,A0 ; get rect IF SysVers>= $700 THEN ; <19> import ptchRefresh ; <19> jsr ptchRefresh ; <19> ELSE jsrROM ROMRefresh ENDIF ; if window is active, don't bother with outlining. <16Oct89smb> tst.b teActive(a3) beq.s @TestOutline jmpROM ROMEpilog8 @TestOutline ; if outlining is on, redraw outline! <16Oct89smb> with OutlineFrame link a6,#OutlineFrameSz ; only link if outlining move teSelStart(a3),d0 ; is this a selection point? cmp teSelEnd(a3),d0 bne.s @drawRegion ; fall through for caret processing ; is outlining desired? move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFOutlineHilite,d0 beq.s @drawRegion ; outline bit not on ; if caret on invert it tst.b teCarOn(a3) beq.s @noDraw jsrROM ROMDrawIt @noDraw ; turn on flag in case off - want to display an outlined caret st teCarOn(a3) ; will be turned off in HideCaret @drawRegion bsr InitOutline move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFOutlineHilite,d0 beq.s @noOutline ; outline bit not on st teActive(a3) ; flag as active for hiliting jsrROM ROMHideCaret ; hide the caret jsrROM ROMHiLite ; Frame new region sf teActive(a3) ; flag as inactive sf paintFlag(a6) ; don't paint region! bsr TEOutlineHilite @noOutline unlk a6 jmpROM ROMEpilog8 ;---------------------------------------------------------------------- SysErr _SysError ; go bye-bye with error in d0 ;---------------------------------------------------------------------- ; PROCEDURE ptchTESetSelect ; <7Dec89smb> Added new routine ClickKeyboard2Font for unsynching keyboard ; and font. ; <9/6/90smb> If inline input is active, then don't unsynch the keyboard. ;---------------------------------------------------------------------- ptchTESetSelect bsr ptchStdEntry jsrROM ROMClearRsrved ; clear out reserved style jsrROM ROMHideCaret jsrROM ROMHiLite move 14(a6),teSelEnd(a3) ; Jam the selection end move 18(a6),teSelStart(a3) ; jam selStart jsrROM ROMCleanUpSel ; sort and clean up selection ; set the current font in the grafort so can synch the keyboard to the font <10Nov88smb> tst.w teSize(a3) ; if unstyled, can't synch keyboard to font <1Dec88smb> bpl.s @DoneWithSynch move.w teSelStart(a3),d0 beq.s @BufferStart ; <6Dec89smb> sub.w #1,d0 ; backup one to get previous style <6Dec89smb> @BufferStart move.w d0,d3 ; save offset position <6Dec89smb> jsrROM ROMGetCurStyle jsrROM ROMSetStyle move.w d3,d0 ; <6Dec89smb> IF hasInlineInput THEN ; <16> ; if inline input is on then don't unsynchronize the keyboard! <16> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d1 ; move into reg for modulo 32 bit ops btst #teFInlineInput,d1 ; is Inline Input active? bne.s @DoneWithSynch ; yes, so don't unsynch! ENDIF ; <16> import ClickKeyboard2Font jsr ClickKeyboard2Font ; <3Dec89smb> @DoneWithSynch jmpROM ROM@NoSynchInSetSelect ;---------------------------------------------------------------------- ; PROCEDURE ptchTEClick ; <7Dec89smb> ; Added new routine ClickKeyboard2Font for unsynching keyboard ; and font. ; <1/23/90emt/smb> ; Added humane scrolling to DefClikProc. ;---------------------------------------------------------------------- ptchTEClick Bsr ptchStdEntry jsrROM ROMClearRsrved ; clear out reserved style ; Find the new point and get index of it in d6 move.l 14(a6),teSelPoint(a3) ; pass selPoint IF SysVers>= $700 THEN ; <19> import ptchDoFind ; <19> jsr ptchDoFind ; you guessed it: it's patched now! <19> ELSE jsrROM ROMDoFind ; juggle dispStart/End and do find ENDIF ; <19> jsrROM ROMHideCaret ; Remove caret subq #4,sp ; make room for the tickCount _TickCount move.l (SP)+,d0 ; Ticks in D0 sub.l teClikTime(a3),d0 ; see if double click IF SysVers>= $605 THEN add.l d0,teClikTime(a3) ; Update click time for click proc. <4> ENDIF cmp.l DoubleTime,d0 ; 1/2 second click time sle d5 ; D5 = 0 if single click cmp teClikLoc(a3),d6 ; see if same location seq d1 and.b d1,d5 ; D5 ST if double click ror.l #8,d5 ; get switch in high D5 move d6,teClikLoc(a3) ; double click only if not moved ; synch the keyboard to the font <10Nov88smb> tst.w teSize(a3) ; if unstyled, synch keyboard to font IF forLocalizability THEN ; even if we dont have all info <34g-YDS-9/2/91> bmi.w @Styled ; styles !!! tst.w teLength(A3) ; do we have text at all ? beq.w @DoneWithPsynching ; don't synch if no text !!! IF 0 THEN ; now using 'itlb' flag in CubeE <46> ; 6.1 : synch only r->l, for 7.0 synch for double byte ;; tst.b WordRedraw ; is it a R->L script ? <37> ;; bge.w @DoneWithPsynching ; don't synch. <37> ; Really want to synchronize for unstyled text in ALL scripts. However, this will cause problems for <37> ; input methods, so we will skip this code in this case. (WordRedraw only indicates the <37> ; types of scripts installed and not the current one…) <37> subq #2,sp ; result space for Font2Script & GetScript <37> move.w teFont(a3),-(sp) ; app font id <37> _Font2Script ; it's a non-roman char so get script font <37> move.w (sp)+,d0 ; <37> beq @UseFont ; if Roman then always synchronize <37> cmp.w #smEastEurRoman,d0 ; Extended Roman? <40> beq @DoneWithPsynching ; If so, never synchronize <40> subq #4,sp ; result space <37> move.w d0,-(sp) ; script <37> move.w #smScriptRedraw,-(sp) ; <37> _GetScript ; <37> move.l (sp)+,d1 ; <37><39> tst.b d1 ; leave in d1 for later <37><39> bgt @DoneWithPsynching ; if double-byte script don't synchronize <37> ; otherwise, we have a single-byte non-Roman font <37> ; IF SysVers > $610 THEN ; move.l teDispatchH(a3),a0 ; <11-YDS-8/5/91> ; move.l (a0),a0 ; move.l newTEFlags(a0),d0 ; move into reg the flags ; btst #teFInlineInput,d0 ; are we in an inline input window ? ; bne.w @DoneWithPsynching ; yes, don't synch keyboard. ; ENDIF ELSE ; now using 'itlb' flag in CubeE <46> ; optimize for Roman-only: do not have to synch font & kbd <51> with smgrRecord ; <51> GetSMgrCore a0 ; load SMgr globals pointer. <51> cmp.b #1,smgrEnabled(a0) ; how many scripts enabled? <51> beq @DoneWithPsynching ; skip synchronization for Roman-only system <51> endwith ; <51> subq #6,sp ; result space for Font2Script & GetScript <46> move.w teFont(a3),-(sp) ; app font id <46> _Font2Script ; get script font <46> ; script left on stack ; <46> move.w #smScriptFlags,-(sp) ; now get script-specific flags <46> _GetScript ; <46> move.l (sp)+,d0 ; <46> and.l #(1< beq @DoneWithPsynching ; 0=> do not synchronize <46> ; otherwise synchronize ENDIF ; now using 'itlb' flag in CubeE <46> move.w d6,d3 ; don't trash d6 tst.b teLftClick(a3) ; check if the click was on the previos char. bne.s @2 ; else sub 1 sub.w #1,d3 ; see the char we clicked (from 0 !!!) @2 ; Check char to determine how to synch move.l teTextH(a3),a2 ; handle to text <39> move.l (a2),a0 ; ptr to text <39> move.b 0(a0,d3.w),d0 ; get character <39> cmp.b #$20,d0 ; control char? <39> blo @DoneWithPsynching ; if so, don't synch <39> move.b d1,-(sp) ; save scriptRedraw <39> subq #2,sp ; room for return move.l a0,-(sp) ; push text ptr on stack <39> move.w d3,-(sp) ; offset on stack _CharType ; what char is it move.w (sp)+,d0 ; take result move.b (sp)+,d1 ; recover scriptRedraw <39> ; Mask off what interested in: the Type ($000F) and the Direction ($2000) <37> ; Want a char whose Direction is LR (smCharLeft, $0000) and whose Type is Roman <37> ; which can be smCharAscii (1) or smCharEuro (7). smCharPunct (0) should not synch the font. <37> ; ; New approach. Different behavior for bidi and non-bidi scripts, because of caret <39> ; requirements for bidi scripts. <39> bne.s @doBidi ; check scriptRedraw for bidi <39> ; For non-bidirectional scripts, set keyboard to Roman for Roman letters, <39> ; sync to font for script letters, dont sync for anything else. <39> and.w #smcTypeMask,d0 ; isolate info we need <39> cmp.w #smCharPunct,d0 ; non-letter? <39> beq.s @DoneWithPsynching ; if so, don't synch keyboard <39> cmp.w #smCharAscii,d0 ; low-ASCII Roman? <39> beq.s @isRoman ; if so, go set keyboard <39> cmp.w #smCharEuro,d0 ; Extended ASCII Roman? <39> beq.s @isRoman ; if so, go set keyboard <39> bra.s @UseFont ; otherwise, sync keyboard to font <39> ; For bidirectional scripts, don't synch control chars (stripped out above) or low-ASCII <39> ; (L-R) digits; synch other L-R chars to Roman, and everything else to font script. <39> @doBidi ; <39> and.w #smcTypeMask+smcClassMask+smcRightMask,d0 ; isolate info we need <39> cmp.w #smCharPunct+smPunctNumber+smCharLeft,d0 ; is char a low-ASCII digit? <39> beq.s @DoneWithPsynching ; if so, don't synch <39> and.w #smcRightMask,d0 ; now just check direction <39> beq.s @isRoman ; if left-right, sync to Roman <39> ; Otherwise, synch the font to the script of the character @UseFont subq #2,sp ; room for return move.w teFont(a3),-(sp) ; app font id _Font2script ; it's a non-roman char so get app font ; leave script on stack bra.s @SetKbd @isRoman move.w #smRoman,-(sp) ; we think it is roman @SetKbd move.w (sp), d0 ; script param on the stack move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 ; move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript _KeyScript ; set keyboard bra.s @DoneWithPsynching ELSE bpl.s @DoneWithPsynching ENDIF @Styled move.w d6,d0 beq.s @BufferStart ; <6Dec89smb> IF forLocalizability THEN ; <34e-YDS-9/2/91> tst.b WordRedraw ; do we have a R->L script bge.s @BufferStart ; no, take the prev allways tst.b teLftClick(a3) ; check if the click was on the previos char. bne.s @BufferStart ; else sub 1 ENDIF sub.w #1,d0 ; backup one to get previous style <6Dec89smb> @BufferStart move.w d0,d3 ; save offset position <6Dec89smb> jsrROM ROMGetCurStyle ; returns ptr to current style in a0 jsrROM ROMSetStyle ; set the font in the grafport move.w d3,d0 ; char offset needed in ClickKeyboard2Font <6Dec89smb> import ClickKeyboard2Font jsr ClickKeyboard2Font ; sink up! <3Dec89smb> @DoneWithPsynching ;-------------------- IF SysVers>= $700 THEN ; Must patch out the rest of this routine for the other DoFind call (since it's ; embedded in a loop!) <19> ;------ ; D6 now contains the character location at which to look ; ; Find out if we want an extended selection or a normal one ; For an extended selection, fake out the loop below by fooling it into thinking ; we've already entered it "normally" but with the old selection already ; hilighted, etc. IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; preserve teHandle for hook calls <29> ENDIF ; <29> Tst.B 12(A6) ; see if extend flag is on Beq.S notExtended MoveM teSelStart(A3),D0-D1 ; get old selection Cmp D6,D0 ; chk side of new loc Bhs.S useRight Move D0,A2 ; save anchor left Move D0,A4 ; and anchor right Bra.S goToIt useRight Move D1,A2 ; save anchor left Move D1,A4 ; and anchor right goToIt Move D6,D5 Bra.S goSelect notExtended ; a4 ok here due to bra to this point <29> jsrROM ROMHiLite ; Remove old selection MoveQ #teWordSelect,D2 ; say "ClickExpand, word selection" jsrROM ROMClickExpand ; NO ; D0/D1 now contain the "bounds" of this click MoveM D0-D1,teSelStart(A3) Move D0,A2 ; save anchor left Move D1,A4 ; and anchor right Move D6,D5 ; save "old" D6 ; remember whether initial click was to left or right of character Move.B teLftClick(A3),teLftCaret(A3) IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; save current use of a4 across calls <29> move.l 4(sp),a4 ; restore teHandle <29> ENDIF ; <29> jsrROM ROMShowCaret ; feedback to user jsrROM ROMHiLite IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore TEClick's use of a4 <29> ENDIF ; <29> waitLoop Move.L teClikProc(A3),D0 ; call the click proc Beq.S noClikProc Move.L D0,A0 Jsr (A0) Beq done1 ; if returns zero abort drag noClikProc Clr -(SP) ; make room for result _WaitMouseUp ; see if button still down Tst.b (SP)+ ; pop result <38> Beq.S done1 Pea teSelPoint(A3) ; pass address for point _GetMouse IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; save current use of a4 across calls <29> move.l 4(sp),a4 ; restore teHandle <29> ENDIF ; <29> import ptchDoFind jsr ptchDoFind ; juggle dispStart/End and do find <19> IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore TEClick's use of a4 <29> ENDIF ; <29> Cmp D6,D5 ; see if change Beq.S waitLoop IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; save current use of a4 across calls <29> move.l 4(sp),a4 ; restore teHandle <29> ENDIF ; <29> jsrROM ROMHideCaret IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore TEClick's use of a4 <29> ENDIF ; <29> ; There was a change so highlight only the new part. This is a really tricky part... ; The thing we're trying to do is highlight only the part that changes of the ; selection which is being dragged out in this loop goSelect MoveQ #teWordDrag,D2 ; say "ClickExpand, word dragging" jsrROM ROMClickExpand ; Get new points Lea teSelEnd(A3),A0 ; point between selStart/End Cmp D6,A4 ; see if less than anchor right Blo.S notToLeft ; skip if not to left of anchor Move -(A0),D3 ; save previous left Move D0,(A0)+ ; save new left (in teSelStart!) Move D0,D4 ; save dispEnd too Swap D3 Swap D4 Move A4,D3 ; save other dispStart Move (A0),D4 ; save other dispEnd (old teSelEnd) Move A4,(A0) Bra.S hiliteIt notToLeft Cmp D6,A2 ; see if greater than anchor left Bhi.S keepWaiting ; skip if not to right of anchor Move (A0),D3 ; save previous right Move D1,(A0) ; save new right Move D1,D4 ; save dispEnd too Swap D3 Swap D4 Move -(A0),D3 ; save other dispEnd Move A2,D4 ; save other dispStart Move A2,(A0)+ hiliteIt IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; save current use of a4 across calls <29> move.l 4(sp),a4 ; restore teHandle <29> ENDIF ; <29> MoveQ #teHighlight,D7 ; set mark mode ;; bsr ptchTEDoText ; do one half <25> jsrROM ROMDoText ; use the low mem TEDoText hook!! <25> Swap D3 ; get other dispStart/End Swap D4 ; and hilight too ;; bsr ptchTEDoText ; and other half <25> jsrROM ROMDoText ; use the low mem TEDoText hook!! <25> IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore TEClick's use of a4 <29> ENDIF ; <29> keepWaiting Move D6,D5 ; save new end Bra.S waitLoop ; continue on done1 IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore teHandle for the last time <29> ENDIF ; <29> jsrROM ROMShowCaret ; redisplay caret ; ** ** Save tick count at the end of TEClick so that ; extra TextEdit computing time will not be counted between clicks SubQ #4,SP ; make room for the tickCount _TickCount Move.L (SP)+,teClikTime(A3) ; remember click time epilog10 MoveQ #10,D0 jmpROM ROMStdExit ELSE jmpROM ROM@NoSynchInTEClick ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTEKeyStdEntry,StdEntry,StdEntry2 ; <28Sept89smb> ; Added testing of buffer bit at end of routine. Also added ; a new entry point for TEKey. ;---------------------------------------------------------------------- ptchTEKeyStdEntry ; Added new entry point for TEKey since need to save/clear textBuffering flag around this routine.<28Sept89smb> moveq #0,d0 ; not a style trap move.l (sp)+,a0 ; save return address move.l (sp)+,a1 ; save newTEFlags link a6,#stdLink ; stack frame movem.l d2-d7/a2-a4,-(SP) move.l a1,-(sp) ; newTEFlags to restore move.l a0,-(sp) ; push return address back on stack bra.s NotStyleTrap ptchStdEntry MoveQ #0,D0 ; not a style trap ** ** StyleTrap Move.L A4,A0 ; set up for GetState _HGetState ; get handle flags Move.B D0,saveHandle(A6) ; save handle flags Pea savePort(A6) ; save incoming port _GetPort ; Move.L A4,A0 ; get the TEHandle _HLock Move.L (A4),A3 ; Dereference into A3 ** = $700 THEN ; Set up font, etc. AFTER saving the grafport information! <19> move.l teGrafPort(a3),a0 ; pt to GrafPort move.w txFont(a0),saveFont(a6) ; save current font bclr #7,txFace+1(a0) ; in case direction set here <30May89smb> move.w txFace(a0),saveFace(a6) ; save current face move.w txSize(a0),saveSize(a6) ; save current size pea saveColor(a6) ; place to save color ** ** tst.w teSize(a3) ; check style flag bmi.s DontSet ; don't set style ** MBK 6/20/86 ** move.l teFontStuff(A3),txFont(A0) ; set the font/face move.l teFontStuff+4(A3),txFont+4(A0) ; set the mode/size DontSet ELSE Move.L teGrafPort(A3),A0 ; pt to GrafPort Tst.W teSize(A3) ; check style flag Bmi.S DontSet ; don't set style ** MBK 6/20/86 ** Move.L teFontStuff(A3),txFont(A0) ; set the font/face Move.L teFontStuff+4(A3),txFont+4(A0) ; set the mode/size DontSet Move.W txFont(A0),saveFont(A6) ; save current font bclr #7,txFace+1(a0) ; in case direction set here <30May89smb> Move.W txFace(A0),saveFace(A6) ; save current face Move.W txSize(A0),saveSize(A6) ; save current size Pea saveColor(A6) ; place to save color ** ** ENDIF Move.W teMode(A3),txMode(A0) ; do set the mode ** ** Move.L teTextH(A3),A0 ; get handle size _HGetState ; get the text handle's tag Move.B D0,saveTH(A6) ; and save the flags _HLock ; and lock it _GetHandleSize ; get its size Move D0,teLength(A3) ; stuff its length ; Clean up the selection (This must be the last guy because of alternate entry) CleanUpSel Move teLength(A3),D0 ; get the text length Move teSelEnd(A3),D1 ; make sure selEnd is cool Sub D0,D1 ; selEnd-length Bls.S okSelEnd ; if >0 then bad selend Move D0,teSelEnd(A3) ; set to length if > length okSelEnd Move teSelStart(A3),D1 ; make sure selStart is cool Sub teSelEnd(A3),D1 ; selStart-selend Bls.S okSelStart ; if >0 then bad selStart Sub D1,teSelStart(A3) ; set to selend if > selend okSelStart jsrROM ROMSelSort ; I wish i could fall into it Tst.L D3 ; addr of style trap? ** move.l a0,-(sp) move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops btst #teFTextBuffering,d0 ; <28Sept89smb> beq.s @noBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer move.l (sp)+,a0 ; if the selector corresponds to TEFeatureFlag then go to patched code here <28Sept89smb> cmpROM ROMTEFeatureFlag,a0 beq.s ptchTEFeatureFlag ; if the selector corresponds to TEGetPoint then go to patched code here <16Nov89smb> cmpROM ROMTEGetPoint,a0 beq ptchTEGetPoint ; if the selector corresponds to TESetStyle then go to patched code here <7Dec89smb> cmpROM ROMTESetStyle,a0 beq.s ptchTESetStyle Rts ;---------------------------------------------------------------------- ; ptchTEFeatureFlag ; <28Sept89smb> ; Moved newTEFlags longword into a register for modulo 32 bit ; operations. ;---------------------------------------------------------------------- ptchTEFeatureFlag adda.l #4,sp ; pop TEDispatch's return address moveq #0,d0 moveq #0,d1 move.w (a2)+,d0 ; action move.w (a2)+,d1 ; verb bit (which feature to affect) move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d2 ; move into reg for modulo 32 bit ops <15Sept89smb> clr.w (a2) ; <6Oct89smb> necessary so the return result of 'clear' is correct. btst d1,d2 ; <15Sept89smb> sne (a2) ; save result tst.w d0 ; whatcha wanna do? blt.s @done ; action = testFlag; result already on stack beq.s @clear bset d1,d2 ; action = setFlag <15Sept89smb> bra.s @done @clear bclr d1,d2 ; action = clearFlag <15Sept89smb> @done move.l d2,newTEFlags(a0) ; <15Sept89smb> tst.b (a2) ; <13Sept89smb> beq.s @OK move.w #1,(a2) @OK moveq #10,d0 ; # of bytes on stack (include selector!) jmpROM ROMStdExit2 ;---------------------------------------------------------------------- ; PROCEDURE ptchTEGetPoint ; <16Nov89smb> Need TEFormatOrder record due to VisibleLength ; changes in LineWidth (which is called from here by LineRect.) ; <7Dec89smb> Fixed use of teForceLeft justification. ; <16Dec89smb> Remove TEDispatch return address from stack. ; <1/8/90smb> Special case of 0 length in teRec returned invalid results. ;---------------------------------------------------------------------- ptchTEGetPoint addq.l #4,sp ; Clean up from ptchStdEntry jump.<16Dec89smb> move.w (a2)+,d0 ; get the offset move.l a2,-(sp) ; preserve parameter ptr move.w d0,-(sp) ; preserve offset cmp.w teLength(a3),d0 ; pin it to the length blo.s @LengthOK ; ok if less or same ;---------------------------------------------------------------------- ; special case of 0 length and any offset: set the point to the DestRect's left/right edge and use ; the lineHeight + the DestRect's top. <1/8/90smb> cmpi.w #0,teLength(a3) ; is it a 0 length record? <1/8/90smb> bne.s @OffsetGELength ; bra if length <> 0 => offset >= length ; set up return point to be valid (or at least more correct than it was!) lea teDestRect+8(a3),a0 ; point past destRect lea teSelRect+8(a3),a1 ; and past stack rect move.l -(a0),-(a1) ; copying teDestRect to teSelRect move.l -(a0),-(a1) ; copying teDestRect to teSelRect move top(a1),bottom(a1) ; temporarily the same moveq #0,d0 ; current line jsrROM ROMGetHite ; height of this line returned in d1 add d1,bottom(a1) ; add line height to get bottom bound of line rect addq #1,teSelRect+left(A3) ; indent for caret in case L just adda.l #2,sp ; pop offset bra.s @AssumeLeftJust ; finished w/ changes <1/8/90smb> ;---------------------------------------------------------------------- @OffsetGELength move.w teLength(a3),d0 ; else pin to end move.w d0,(sp) ; replace offset subq #1,d0 ; just for GetLine @LengthOK lea teLines(a3),a2 ; pt to start of array jsrROM ROMGetLine ; get ptr to line it's on with TextFrame,TEFormatOrder ; <1Nov89smb> link a6,#TextFrameSz ; for LineRect: calls FormatOrder code <1Nov89smb> jsrROM ROMLineRect ; sets up selRect from destRect and justification unlk a6 ; <1Nov89smb> move.w (a2),d6 ; start of line move.w (sp)+,d7 ; offset to measure to ; If the last char is a CR, the h coord should be at the beginning of the next line after the CR ; (the v coord was correct, but the h was at the point preceding the CR on the previous line). cmp.w teLength(a3),d7 ; is offset = text length? bne.s @DoEndOfLine ; skip CR test if not move.l teTextH(a3),a0 move.l (a0),a0 cmp.b #returnChar,-1(a0,d7) ; if last char = CR then... bne.s @DoEndOfLine @AssumeLeftJust ; assume left justification move.w teSelRect+left(a3),d0 move.w teJust(a3),d1 bne.s @DoNonLeftJust move.w TESysJust,d1 beq.s @DoTheJustThing @DoNonLeftJust ; <7Dec89smb> move test to teForceLeft to where it's useful! cmp.w #teForceLeft,d1 ; <7Dec89smb> beq.s @DoTheJustThing ; <7Dec89smb> jmpROM ROMinTEGetPoint ; right or center justification @DoEndOfLine IF forLocalizability THEN ; fix for TEGetPoint Bug <34h-YDS-9/2/91> move.l ExpandMem,a0 ; do we have more then the roman script cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) beq.s @romanMeas ; use MeasureIt link a6,#TextFrameSz ; DoMeasure uses a stack frame bsr ptchWholeDoMeasure ; measure with LR styles unlk a6 add.w teSelRect+left(A3),d0 ; add in justification bra.s @DoTheJustThing ENDIF @romanMeas jmpROM ROM@DoEndOfLine @DoTheJustThing jmpROM ROM@DoTheJustThing endWith ;---------------------------------------------------------------------- ; ptchDumpBuffer ; <28Sept89smb> ; Added call to SetFont2Keyboard, wasn't fetching handle ; correctly for disposing, turned off buffering bit in newTEFlags, ; and fixed setup before PasteGuts call. ; <16Nov89smb> ; Replaced use of emBufferPtr by dereferencing emBufferHandle; misc. ; other cleanup. ; <7Dec89smb> Changed d2.l to d2.w to get character at correct address. ; <1/29/90smb> No longer call SetFont2Keyboard. ;---------------------------------------------------------------------- ptchDumpBuffer dumpRegs reg d0-d7/a1-a2 ; don't save a3/a4! creating a dangling ptr w/ a3 <20> movem.l dumpRegs,-(sp) moveq.l #0,d3 move.l ExpandMem,a2 ; <1Feb89smb> buffer is 0 -> n-1 lea ExpandMemRec.emBufferLen(a2),a2 ; changed to lea <12July89smb> move.w (a2),d2 ; buffer length, n ; test if buffer is empty beq @Empty ; nothing to dump ; test last (n-1) character in buffer to see if is double-byte char subq.w #1,d2 move.l ExpandMem,a1 ; <1Feb89smb> pointer to buffer of chars move.l ExpandMemRec.emBufferHandle(a1),a1 ; <13Nov89smb> move.l (a1),a1 ; deref for pointer <13Nov89smb> movem.l a1/d2,-(sp) ; preserve, for unstyled too!<17Sept89smb> tst.w teSize(a3) ; if unstyled, can't synch font to keyboard <12Sept89smb> bpl.s @NoSynch ; <12Sept89smb> move.w teSelStart(a3),d0 ; pass current position <12Sept89smb> beq.s @ZeroOffset ; skip test if zero <12Sept89smb> sub.w #1,d0 ; backup one to get previous style <12Sept89smb> @ZeroOffset ; just need to use the current position's font: no need to call SetFont2Keyboard! <1/29/90smb> ;; <1/29/90smb> bsr SetFont2Keyboard ; <12Sept89smb> jsrROM ROMGetCurStyle ; <1/29/90smb> jsrROM ROMSetStyle ; <1/29/90smb> movem.l (sp),a1/d2 ; restore but don't pop yet <16Nov89smb> @NoSynch clr.w -(sp) ; room for return move.l a1,-(sp) ; use a1 now not the contents of it! <13Nov89smb> move.w d2,-(sp) ; offset in buffer _CharByte move.w (sp)+,d7 ; pop result movem.l (sp)+,a1/d2 ; restore <13Nov89smb> tst.w d7 ; high byte of character? bge.s @GoDump ; no ; yep, gotta save it move.b (a1,d2.w),d3 ; changed to d2.w <7Dec89smb> subq.w #1,(a2) ; new length to paste beq.s @Only1Char ; short cut <13Nov89smb> @GoDump ; must turn off buffering bit since PasteGuts calls _TEPinScroll which calls StdEntry. move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),-(sp) bclr #teFTextBuffering,newTEFlags+3(a0) ;setUp for buffer dump move.l a1,d6 ; pointer to text to insert (for PasteGuts) <13Nov89smb> moveq #0,d5 ; need high word cleared (for PasteGuts) <14Sept89smb> move.w (a2),d5 ; length of text to insert movem.l d3/a1/a2,-(sp) moveq #0,d7 ; want to call ExtendStyle jsrROM ROMPasteGuts movem.l (sp)+,d3/a1/a2 ; restore buffering bit move.l teDispatchH(a3),a0 move.l (a0),a0 move.l (sp)+,newTEFlags(a0) ; test if need to rebuffer 1st byte of double-byte character. tst.b d3 ; place holder for character beq.s @DeleteHandle ; last byte in buffer was 1st byte of a double-byte charaacter. Rebuffer it. move.b d3,(a1) ; <13Nov89smb> @Only1Char move.w #1,(a2) ; incr length for byte bra.s @Empty @DeleteHandle ; deallocate the handle move.l ExpandMem,a0 move.l ExpandMemRec.emBufferHandle(a0),a0 ; get to handle! <19Sept89smb> _DisposHandle bne SysErr ; <19Sept89smb> move.w #0,(a2) ; set buffer length to zero. Used as a flag. IF hasBufferingFix THEN ; <17> move.l ExpandMem,a0 ; length is initially zero so clear storage for handle <17> clr.l ExpandMemRec.emBufferHandle(a0) ; flags a disposed handle <17> ENDIF ; <17> @Empty movem.l (sp)+,dumpRegs rts ;---------------------------------------------------------------------- ; ptchBufferChar ; <28Sept89smb> ; Test the length, rather than the ptr, to determine if a byte ; already buffered. ; <16Nov89smb> ; Must set the emBufferLen since it is used to determine if a ; char has been buffered. ; <7Dec89smb> ; Now using emBufferHandle for storage instead of emBufferPtr. ; <1/9/90smb> ; Now using TEDispatchRec for storage instead of ExpandMem. ;---------------------------------------------------------------------- ptchBufferChar ; now buffering a double-byte character in the newTEFlags space off the dispatch record. <1/9/90smb> move.l teDispatchH(a3),a0 move.l teDispatchH(a3),a0 move.l (a0),a0 lea TwoByteCharBuffer(a0),a0 ; move into reg for modulo 32 bit ops tst.b (a0) ; test for existance of first byte beq.s Empty move.b 1(a2),1(a0) ; 2nd byte of double byte char move.l a0,D6 ; pointer to 2byte character (f. PasteGuts) add.w #1,D5 ; length = 2 bytes (f. PasteGuts) bra.s GoPaste Empty ; possible first byte of 2 byte char move.b 1(a2),(a0) ; buffer character; 2 byte? tst.w teSize(A3) ; check style flag bpl.S @DontSet ; don't set style move.w teSelStart(a3),d0 ; pass current position beq.s @1 ; skip test if zero sub.w #1,d0 ; backup one to get previous style @1 ; On a Kanji script system when the styled teRec is created, the current grafport's font is ; the font in the initial style run of 0 characters. If it's created with a Roman ; font and then the keyboard is switched to Japanese to enter Kanji, via the input window ; (different unstyled teRec), the font for the 0th posn is still Roman, rather than Kanji, ; when it's used here. Hence must set the grafport via the SetFont2Keyboard code. <2Sept89smb> import ptchSetFont2Keyboard jsr ptchSetFont2Keyboard ; <2Sept89smb> @DontSet ; now test with charbyte clr.w -(sp) ; room for return move.l d6,-(sp) ; pointer to character move.w #0,-(sp) ; offset in buffer _CharByte tst.w (sp)+ ; high byte of character? GoPaste rts ;---------------------------------------------------------------------- ; ptchTEBufferText ; <28Sept89smb> ; Test the length to determine if a byte already buffered. Also, ; if dumped the buffer here, loop again to add the char. ; <16Nov89smb> ; Must dereference the emBufferHandle rather than use the emBufferPtr. ; <2/28/90smb> Must set d0 before calling SetFont2Keyboard. ; <9/19/90smb> Preserve the expandmem ptr around the SetFont2Keyboard call, ; and test if the buffer was dumped during that call. <17> ;---------------------------------------------------------------------- ptchTEBufferText ; does a pointer to a buffer already exist? move.l ExpandMem,a1 ; <1Feb89smb> ;; tst.w ExpandMemRec.emBufferLen(a1) ; <14Sept89smb> test for zero len <18> tst.l ExpandMemRec.emBufferHandle(a1) ; test for no buffer (using handle now for consistency) <18> bne.s @HaveBuffer @GetBuffer moveq #BufferSize,d0 ; longize <17> IF SysVers>=$700 THEN bsr ptchGetHandle ; <20> ELSE jsrROM ROMGetHandle ; allocate handle for buffer; in a0 ENDIF ; dereference the handle and save move.l ExpandMem,a1 ; <1Feb89smb> move.l a0,ExpandMemRec.emBufferHandle(a1) ; save handle @HaveBuffer ; if keybd changes in the middle of buffering must dump the buffer and synch the font to the keybd. <1/26/90smb> ; must set d0 to the current position before calling SetFont2Keyboard<2/28/90smb> tst.w teSize(a3) ; check style flag bpl.S @DontSet ; don't set style move.w teSelStart(a3),d0 ; pass current position <2/28/90smb> beq.s @SynchUp ; skip test if zero <2/28/90smb> sub.w #1,d0 ; backup one to get previous style <2/28/90smb> @SynchUp import ptchSetFont2Keyboard jsr ptchSetFont2Keyboard ; <1/26/90smb> IF hasBufferingFix THEN ; <17> move.l ExpandMem,a1 ; reload ExpandMem ptr <17> ; SetFont2Keyboard may have called DumpBuffer so test for a deallocated handle <17> tst.l ExpandMemRec.emBufferHandle(a1) ; is this zero? <17> beq.s @GetBuffer ; if so, then get another storage handle <17> ENDIF ; <17> @DontSet move.l ExpandMemRec.emBufferHandle(a1),a0 ; get handle of storage space <13Nov89smb> move.l (a0),a0 ; get to storage space <13Nov89smb> IF hasBufferingFix THEN ; <17> moveq #0,d0 ; longize <17> ENDIF ; <17> move.w ExpandMemRec.emBufferLen(a1),d0 ; <1Feb89smb> length = number of bytes already in buffer ; have we maxed out on the buffer? cmpi.w #BufferSize,d0 bne.s @MoreRoom bsr.s ptchDumpBuffer IF hasBufferingFix THEN ; <17> tst.l ExpandMemRec.emBufferHandle(a1) ; the high byte of a char may be in the buffer <17> beq.s @GetBuffer ; if empty then ok to get another handle <17> ELSE ; <17> bra.s @GetBuffer ENDIF ; <17> @MoreRoom jmpROM ROM@MoreRoom IF SysVers>= $700 THEN ;---------------------------------------------------------------------- ; ptchGetHandle ; <17Jan90smb> Allocate this handle in the System heap now ; rather than the application's heap since it's a global buffer. <20> ;---------------------------------------------------------------------- ptchGetHandle _NewHandle ,SYS,CLEAR ; allocate & clear a block in System heap now <20> jmpROM ROMinGetHandle ; back to you, ROM… ENDIF ;---------------------------------------------------------------------- ; ptchGetWidth ; <14Nov89smb> Added a fix to only measure up to the visible length. ; <2/8/90smb> Must patch TEWidthHook which is called here. ; <9/20/90smb> Call TETextWidthHook now. <17> ;---------------------------------------------------------------------- ptchGetWidth tst.w teSize(A3) ; record with style? bpl.s @Unstyled ; if not, A0 is nothing ; styled text Move.L teStylesH(a3),a1 ; get style handle Move.L (a1),a1 ; dereference Sub.L a1,a0 ; save as offset @Unstyled Move.L a0,-(SP) ; save A0 Move.L teTextH(a3),a0 ; get text handle Move.L (a0),a0 ; dereference ; get start of text into a0, max(d7,d0)-d6 into d1 <27June88smb> add.w d6,a0 ; point at real start of text move.w d7,d1 ; get the end ; adjust the start of the next style run to max at the end of the line <22Sept88smb> cmp.w 2(a2),d0 ; length > end of line bls.s @GotStyleEnd ; ok move.w 2(a2),d0 ; fix it. @GotStyleEnd ; pick the min of the style run end and the text end <26Sept88smb> sub.w d6,d0 ; sub start of text from end sub.w d6,d1 ; sub start of text from offset blt.s @FullStyleRun ; d1 outside of range <26Sept88smb> cmp.w d0,d1 ; d1 higher than range, IF forLocalizability THEN ; <34k-YDS-9/2/91> bgt.s @FullStyleRun ; allow measure when equal too (for R->L) ELSE bcc.s @FullStyleRun ; bail: want to bra on equal too. <19June89smb> <26June89smb> made unsigned ENDIF ; if drawing, then try this out! use textWidth for draw and C2P for caret. <21Sept88smb> move.l ExpandMem,a1 ; <1Feb89smb> full line flag tst.b ExpandMemRec.emMeasureLine(a1) ; line width flag set? beq.s @UseChar2Pixel ; no, do real stuff <22Sept88smb> ; we are measuring the whole line, BUT we only want to measure up to visible length <6Nov89smb> cmp.w d0,d1 ; take the minimum <6Nov89smb> bhs.s @FullStyleRun ; d0 < d1, so skip <6Nov89smb> move.w d1,d0 ; stuff the visibleLength <6Nov89smb> ;; replaced next 4 lines <2/8/90smb> ;;@FullStyleRun ;; jmpROM ROM@FullStyleRun ;;@UseChar2Pixel ;; jmpROM ROM@UseChar2Pixel ; the rest of this routine is new as of <2/8/90smb> @FullStyleRun ; don't test interior of style run IF hasTextWidthHook THEN ; <17> moveq #0,d1 ; wants offset here <17> import TETextWidthHook ; <17> jsr TETextWidthHook ; hook out TextWidth <17> ELSE ; <17> clr.w -(sp) ; allocate return <21Sept88smb> move.l a0,-(sp) ; pointer move.w #0,-(sp) ; no first byte move.w d0,-(sp) ; bytecount _TextWidth ; go for it move.w (sp)+,d1 ; got the width ENDIF ; <17> bra @Continue ; rejoin <21Sept88smb> @UseChar2Pixel MoveQ #smHilite,D2 ; hilite flag <27June88smb> swap d2 ; hilite in high word; slop in low <27June88smb> ** ** import ptchTEWidthHook ; <2/8/90smb> jsr ptchTEWidthHook ; <2/8/90smb> @Continue Move.L (SP)+,A0 ; restore A0 Tst.W teSize(A3) ; record with style? Bpl.S @done ; if not, A0 is nothing Move.L teStylesH(A3),A1 ; get style handle Move.L (A1),A1 ; dereference Add.L A1,A0 ; restore as pointer @done Rts ;---------------------------------------------------------------------- ; ptchGetRLPosition ; <20Nov89smb> ; Test if the CR is at the end of the document by checking if ; at end of lineStarts array. This is necessary since we're ; using 2(a2) as a condition for getting the next style run. However, ; if there isn't another style run, we read random memory and ; sometimes crash! Called only by CaretDisplay. ; <9/20/90smb> Patched to call ptchMeasureWholeRun for ; TextWidth hook. ;---------------------------------------------------------------------- ptchGetRLPosition RLPosnRegs reg a0 with SharedFrame,TEFormatOrder movem.l RLPosnRegs,-(sp) sf doneFlag(a6) clr.w highCaret(a6) ; set lineEndFlag and highCaret to F. <6mar89smb> st gotOneRun(a6) clr.l d2 ; used for direction params for C2P ; save original edges of selection rectangle move.l a2,-(sp) lea teSelRect+top(a3),a1 lea selRectT(a6),a2 move.l (a1)+,(a2)+ move.l (a1)+,(a2)+ move.l (sp)+,a2 tst.b onBoundaryFlag(a6) ; cursor on boundary of run beq @InRLMiddle tst.w teSize(a3) ; need to test if on a block boundary for bpl @InRLMiddle ; old-styled TE <1Dec88smb> ; on a boundary so must test scripts of surrounding style runs (backing-store order) to ; determine if on a cluster boundary. jsrROM ROMGetDirection ; get this style run's direction in byte of d1 <7June89smb> tst.b prevStyleFlag(a6) ; test if at end or beginning of cursor style run beq.s @GotCursorStyle ; got script for style run previous to cursor style run move.b d1,previousScriptDir(a6) ; <7June89smb> ; test for EOL cluster boundary since in previous style run <8Nov88smb> cmp.w 2(a2),d3 ; is cursor posn at EOL? beq @LineEnd ; if already at EOL then make sure not looking beyond lineStarts array <20Nov89smb> move.l a0,-(sp) lea 2(a2),a0 lea teLines(a3),a1 ; <20Nov89smb> move.w teNLines(a3),d0 ; get num of lines <20Nov89smb> add.w d0,d0 ; double for words <20Nov89smb> adda.w d0,a1 ; <20Nov89smb> cmpa.l a1,a0 ; <20Nov89smb> movem.l (sp)+,a0 ; <20Nov89smb> bgt.s @LineEnd ; bra if beyond end <20Nov89smb> IF forLocalizability THEN ; <34a-YDS-9/2/91> - big apple link bug <3> ; had to patch since we call SetUp2Rectangles ; truly in the lineStarts array! move.l a0,-(sp) ; save <21June89smb> addq.l #stStartSize,a0 ; in previous style run, so need next style run bra.s @GetScript @GotCursorStyle ; got script for cursor style run move.b d1,cursorScriptDir(a6) ; <7June89smb> ; test for BOL cluster boundary since in cursor style run <8Nov88smb> cmp.w (a2),d3 ; is cursor posn at BOL? beq.s @LineEnd move.l a0,-(sp) ; save <21June89smb> subq.l #stStartSize,a0 ; at beginning so need to check previous style run @GetScript ; get the other style run's direction (in display order!) jsrROM ROMGetDirection ; <7June89smb> tst.b prevStyleFlag(a6) beq.s @GotPrevStyleNow move.b d1,cursorScriptDir(a6) ; <7June89smb> bra.s @CmpDirs ; <7June8smb> @GotPrevStyleNow move.b d1,previousScriptDir(a6) ; <7June89smb> @CmpDirs move.l (sp)+,a0 ; restore <21June89smb> ; compare scripts to see if on a cluster boundary move.b cursorScriptDir(a6),d0 cmp.b previousScriptDir(a6),d0 bne.s @ClusterBoundary ; same script so display one cursor jsrROM ROMOneCursor ; added for simplicity <12/13/88smb> bra.s @done ; <12/13/88smb> ;********************** @ClusterBoundary ; on a cluster boundary: need split cursors tst.b prevStyleFlag(a6) beq.s @GetScriptDirection ; in cursor script move.b previousScriptDir(a6),d0 @GetScriptDirection move.b d0,scriptDirection(a6) cmp.b TESysJust,d0 ; added <22Dec88smb> bne.s @DiffDirections ; added <22Dec88smb> st highCaret(a6) ; added <22Dec88smb> @DiffDirections tst.b d0 bne.s @RLScript @LRScript ; if in previous style and LR script direction then measure since at end of style run ; if in cursor style, width is 0 since at beginning of run so, have width to use <7Nov88smb> tst.b prevStyleFlag(a6) bne.s @MeasureRun ; bra to measure if in prevStyle's run bra.s @SetUpTwoRects @RLScript ; if in cursor style and RL script direction then measure since at beginning of style run ; if in previous style and RL script direction AND ; if RL flow, width is 0 since at end of run, so have width to use <7Nov88smb> ; if LR flow, then measure since at beginning of RL script run <8Nov88smb> tst.b prevStyleFlag(a6) bne.s @SetUpTwoRects ; bra to measure since in prevStyle's run <12July89smb> @MeasureRun import ptchMeasureWholeRun jsr ptchMeasureWholeRun add.w d0,d5 @SetUpTwoRects ; Setup two rectangles for the split cursors. bsr.s ptchSetUp2Rectangles ; moved init of rects into proc <12July89smb> bra.s @done ELSE jmpROM ROMinGetRLPosn @GotCursorStyle jmpROM ROM@GotCursorStyle ENDIF @LineEnd jmpROM ROM@LineEnd @InRLMiddle jmpROM ROM@InRLMiddle IF forLocalizability THEN ; <34a-YDS-9/2/91> <3> @done jmpROM ROM@RLDone ENDIF IF forLocalizability THEN ; <34a-YDS-9/2/91> <3> ;---------------------------------------------------------------------- ; ; ptchSetUp2Rectangles ; 34a-YDS-9/2/91> - patched to fix big apple link bug ; ;---------------------------------------------------------------------- ptchSetUp2Rectangles with SharedFrame,TEFormatOrder add.w d5,teSelRect+left(a3) ; left edge of rectangle add.w d5,teSelRect+right(a3) ; right edge of rectangle ; Use half a line heighth for split cursors. move.w teSelRect+bottom(a3),d2 add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance asr.w #1,d2 ; 1/2 line height - fix Applink bug <3.1> jmpROM ROMinSetUp2Rectangles ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchGetLRPosition ; <2/8/90smb> Must patch TEWidthHook which is called here. ;---------------------------------------------------------------------- ptchGetLRPosition move.l a0,-(sp) ; call Char2Pixel to get the pixel position for the cursor move.l teTextH(a3),a1 ; get text handle move.l (a1),a1 ; dereference add.w startChar(a0),a1 ; add beginning of the style run to get to desired line exg a1,a0 ; C2P wants text ptr here ; test if style run begins on previous line, and if so adjust text ptr & offset posn in run moveq #0,d4 move.w (a2),d0 cmp.w startChar(a1),d0 bls.s @StyleStartOK ; <26June89smb> made unsigned ; pin to lineStart sub.w startChar(a1),d0 ; |begin of line - begin of style run| add.w d0,a0 ; fix text ptr move.w d0,d4 ; save difference for length adjustment move.w d3,d1 ; cursor posn: C2P wants offset here sub.w (a2),d1 ; offset from start of line bra.s @getLength @StyleStartOK move.w d3,d1 sub.w startChar(a1),d1 ; cursor posn relative to start of style run @getLength ; test if style run ends on next line, and if so, pin to end of this line & adjust length move.l a0,-(sp) ; <6Mar89smb> move.l a1,a0 ; <6Mar89smb> jsrROM ROMFixFormatEnd ; <6Mar89smb> move.l (sp)+,a0 ; <6Mar89smb> cmp.w 2(a2),d0 bls.s @UseStyleEnd ; <26June89smb> made unsigned move.w 2(a2),d0 ; pin to line end @UseStyleEnd sub.w startChar(a1),d0 ; length of style run sub.w d4,d0 ; adjust for lineStart swap d2 ; direction:slop import ptchTEWidthHook ; <2/8/90smb> jsr ptchTEWidthHook ; returns in d1 <2/8/90smb> move.l (sp)+,a0 rts IF forLocalizability THEN ;---------------------------------------------------------------------- ; ; ptchOnLineEnd ; ; <34a-YDS-9/2/91> had to patch it to fix big carret bug. ; ;---------------------------------------------------------------------- ptchOnLineEnd with SharedFrame,TEFormatOrder ; at EOL/BOL. Is the style run of different persuasion then the line direction? <8Nov88smb> jsrROM ROMGetDirection ; <30May89smb> cmp.b TESysJust,d1 ; test if TESysJust = script direction <30May89smb> bne.s @EOLClusterBoundary ; if not then on a EOL cluster boundary ; on a line end but the style run has the same direction as the line, so only one cursor. st doneFlag(a6) ; modified <12/13/88smb> tst.b d1 ; <30May89smb> bne.s @RLDirection ; LR direction ; if in previous style and LR script direction, then measure since at end of style run ; if in cursor style, width is 0 since at beginning of run, so have width to use <7Nov88smb> tst.b prevStyleFlag(a6) bne @MeasureRun ; bra to measure if in prevStyle's run bra @finis @RLDirection ; if in cursor style and RL script direction then measure since at beginning of style run ; if in previous style and RL script direction AND ; if RL flow, width is 0 since at end of run so, have width to use <7Nov88smb> ; if LR flow, then measure since at beginning of RL script run <8Nov88smb> tst.b prevStyleFlag(a6) beq @MeasureRun ; bra to measure if in cursor's run tst.b TESysJust beq @MeasureRun ; LR flow but RL script bra @finis ;*********** @EOLClusterBoundary ; on a cluster boundary at a line end => script direction different from line direction. ; need split cursors tst.b d1 ; <30May89smb> beq.s @LRdirection ; RL script direction cmp.w 2(a2),d3 beq.s @AtDisplayR ; bra if d3 = lineEnd bra.s @AtDisplayL ; d3 = lineStart @LRdirection ; LR script direction cmp.w (a2),d3 beq.s @AtDisplayR ; bra if d3 = lineStart ;----------------------------------------------------------------------------------------- @AtDisplayL ; at left end of display line ; if in LR flow, RL script direction, at BOL, OR if in RL flow, LR script direction, at EOL then ; 1st cursor at left edge of screen (high caret) and ; 2nd cursor at measured end of this style run (low caret) move.w selRectL(a6),teSelRect+left(a3) ; 1st cursor at L. edge move.w selRectL(a6),teSelRect+right(a3) ; measure style run for second cursor import ptchMeasureWholeRun jsr ptchMeasureWholeRun add.w d0,d5 st doneFlag(a6) st lineEndFlag(a6) ; use half a line heighth for split cursors move.w teSelRect+bottom(a3),d2 add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance asr.w #1,d2 ; 1/2 line height - fix Applink bug move.w d2,teSelRect+bottom(a3) ; new bottom (raised by 1/2 the heighth) <12July89smb> move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level! st ExpandMemRec.emTwoCursorsFlag(a0) ; The high cursor (T) goes with the line ending. the top edge is ok. Adjust the bottom. Can only ; set the top and bottom edges now. May need to measure more style runs. <12/13/88smb> lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb> move.w teSelRect+bottom(a3),(a0)+ ; top edge addq #2,a0 move.w selRectB(a6),(a0) ; use original bottom bra.s @finis ;----------------------------------------------------------------------------------------- @AtDisplayR ; at right end of display line ; if in LR flow, RL script direction, at EOL, OR if in RL flow, LR script direction, at BOL then ; 1st cursor at present measured width (low caret) and ; 2nd cursor at end of all style runs on the display line (high caret) (continue measuring till out of runs) add.w d5,teSelRect+left(a3) ; 1st cursor at present measured width add.w d5,teSelRect+right(a3) ; Setup two rectangles for the split cursors. The low cursor goes with this script run. So, ; adjust the top edge of the rectangle. <12/13/88smb> st lineEndFlag(a6) ; use half a line heighth for split cursors move.w teSelRect+bottom(a3),d2 add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance asr.w #1,d2 ; 1/2 line height - fix Applink bug <3.1> move.w d2,teSelRect+top(a3) ; new top (lower by 1/2 the heighth) <12July89smb> move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level! st ExpandMemRec.emTwoCursorsFlag(a0) ; say high caret in Cursor2Rect space <21Dec88smb> - for TESelView ori.w #$00FF,ExpandMemRec.emTwoCursorsFlag(a0) ; The high cursor (T) goes with the line ending. the top edge is ok. Adjust the bottom. Can only ; set the top and bottom edges now. May need to measure more style runs. <12/13/88smb> lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb> move.w selRectT(a6),(a0)+ ; use original top of line addq #2,a0 move.w teSelRect+top(a3),(a0) ; bottom edge bra.s @finis @MeasureRun import ptchMeasureWholeRun jsr ptchMeasureWholeRun add.w d0,d5 add.w d5,teSelRect+left(a3) ; left edge of rectangle add.w d5,teSelRect+right(a3) ; right edge of rectangle @finis rts endwith ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchCaretInsideRun ; <7Dec89smb> Set flags in caret display code to indicate when ; in the middle of a style run but on a line end. ; <2/8/90smb> Must patch TEWidthHook which is called from PixelWidths. ; <4/4/90smb> Adding forgotten code for scrolling down bug fix! ; <9/6/90smb> Revisited scrolling down bug: must also bra if equal. ;---------------------------------------------------------------------- ptchCaretInsideRun with SharedFrame,TEFormatOrder ; cursor is in the middle of this run, so call C2P twice to see if split cursors necessary st doneFlag(a6) move.w #smRightCaret,d2 ; second offset to measure swap d2 move.w #smLeftCaret,d2 ; first offset to measure ; parameters for PixelWidths routine (calls Char2Pixel twice) move.l a0,a1 ; save pointer to current style run move.w d5,-(sp) ; save pixel width from MeasureAndHilite routine move.w d3,d0 sub.w startChar(a1),d0 ; cursor posn relative to start of style run ; pin to lineStart <5Dec88smb> move.w (a2),d1 ; lineStart <5Dec88smb> cmp.w startChar(a1),d1 ; <5Dec88smb> bls.s @UseStyleStart ; <5Dec88smb> <26June89smb> made unsigned sub.w startChar(a1),d1 ; |beginning of line - beginning of style run| <5Dec88smb> sub.w d1,d0 ; pin to lineStart! <5Dec88smb> ; may be at lineStart bne.s @UseStyleStart ; <6Dec89smb> ; if at offset 0 of this line then at the lineStart and may need to measure more style runs <6Dec89smb> sf doneFlag(a6) ; <6Dec89smb> st lineEndFlag(a6) ; <6Dec89smb> @UseStyleStart ;;<2/8/90smb> jmpROM ROM@UseStyleStart ; added 2 more lines since patching PixelWidths move.w d0,d1 ; same posn just different direction import ptchPixelWidths ; <2/8/90smb> bsr ptchPixelWidths ; returns pixelwidths in d5 (R block) & d6 (L block) ;;<4/490smb> jmpROM ROMbeyond@UseStyleStart ;----------------------------------------------------------------------------------------- ; adding omitted code for scrolling down bug fix! <4/4/90smb> ; <3May89smb> this is a special case that makes this UGLY! If LR text and RL line direction ; and (offset = SOL or EOL), then must setup teSelRect a little differently with the ; results returned from C2P. tst.b TESysJust beq.s @LRdownstream ; RL line direction. a0 contains the current style. jsrROM ROMGetDirection ; returns script direction in d1 cmp.b TESysJust,d1 beq.s @RLdownstream ; RL line direction & RL script run ; Otherwise, RL line and LR script cmp.w d5,d6 beq.s @RLdownstream tst.w d5 beq.s @ZeroWidth exg d5,d6 ; want 0 width in d5: L&R edges are already set in teSelRect. @ZeroWidth add.w (sp),d6 bra.s @SetUp2nd ; set up the second rectangle ; test line direction to determine where high caret and low caret should display. <12/13/88smb> ;; tst.b TESysJust ;; bne.s @RLdownstream ; <3May89smb> done with mods. ; L-R is the downstream direction. d6 is the L block's width. <12/13/88smb> ; Want downstream script's width in d5. Simplifies set up for second rectangle. @LRdownstream exg d5,d6 @RLdownstream ; R-L is the downstream direction. d5 is the R block's width. <12/13/88smb> add.w (sp),d5 ; add pixel width of previous runs on line add.w d5,teSelRect+left(a3) add.w d5,teSelRect+right(a3) add.w (sp),d6 ; test for one cursor cmp.w d5,d6 beq.w @finis ; Setup two rectangles for the split cursors. ; The high cursor (T): the top edge is ok. Adjust the bottom. <12/13/88smb> ; use half a line heighth for split cursors @SetUp2nd move.w teSelRect+bottom(a3),d2 IF NOT forLocalizability THEN ; <34a-YDS-9/2/91> bls.s @ScrollDownBug ; scrolling down in hebrew applelink <1/15/90smb> <14> ENDIF add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance IF forLocalizability THEN ; <34a-YDS-9/2/91> asr.w #1,d2 ; 1/2 line height - fix Applink bug <3.1> ELSE lsr.w #1,d2 ; 1/2 line height ENDIF move.w d2,teSelRect+bottom(a3) ; new bottom (raised by 1/2 the heighth) <12July89smb> ; need two cursors because have arabic/english in same run OR on a cluster boundary move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level! st ExpandMemRec.emTwoCursorsFlag(a0) ; <7July89smb> indicate that high caret is not stored in ExpandMem space. andi.w #$FF00,ExpandMemRec.emTwoCursorsFlag(a0) ; set up low cursor (perpendicular symbol). <12/13/88smb> ; top edge of rectangle lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb> move.w teSelRect+bottom(a3),(a0)+ ; new top of line (same as other rect's bottom edge) add.w selRectL(a6),d6 ; add original L. edge move.w d6,(a0) ; left sub.w #1,(a0)+ ; cursor posn move.w selRectB(a6),(a0)+ ; use original bottom of line move.w d6,(a0) ; right (same as left) IF forLocalizability THEN ;YS - added to support single carret option ; handles unstyled text !!!! <34c-YDS-9/2/91> clr.l -(sp) ; make space for function result move #smGenFlags,-(sp) ; put smSysScript verb to get the SMGR general flags _GetEnvirons ; now wh have the general flags Move.l (sp)+, d5 ; take return value. and.l #(1< move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 move.b lastScript(a0),d5 ; push script numberused to highligt (d5) to lastScript bra.s @2 @1 move #smKeyScript,-(sp) ; we will call _GetEnvirons to get the current active (keyboard) script. _GetEnvirons ; now we know who the active script Move.l (sp), d5 ; take return value (the script number (long !!!)), leave place for return value move.l teDispatchH(a3),a0 ; get teDispatchH addres move.l (a0),a0 move.b d5, lastScript(a0) ; push script numberused to highligt (d5) to lastScript @2 move.w d5, -(sp) ; push the script (word !!!) for the next call we will need move #smScriptRight,-(sp) ; is that script a right to left script ? _GetScript ; we have smScriptRightflag the stack move.l (sp)+, d0 ; do = result move.l ExpandMem,a0 ; get the scplit cursor addres into A0 lea ExpandMemRec.emCursor2Rect(a0),a0 cmp.b TESysJust, d0 beq.s @UseTop @UseBottom move.w teSelRect+top(a3),top(a0) ; strech lower cursor move.w teSelRect+top(a3),teSelRect+bottom(a3) ; make top = bottom in upper cursor bra.s @finis @UseTop move.w bottom(a0),teSelRect+bottom(a3) ; strech upper cursor move.w bottom(a0),top(a0) ; make top = bottom in lower cursor ENDIF @finis addq.l #2,sp ; restore stack (d5 pushed) rts IF NOT forLocalizability THEN ; <34a-YDS-9/2/91> @ScrollDownBug ; when scrolling down the selRect top & bottom are negative. this causes a large caret while divided move.l ExpandMem,a0 ; <1/15/90smb> sf ExpandMemRec.emTwoCursorsFlag(a0) ; <1/15/90smb> addq.l #2,sp ; restore stack (d5 pushed) rts ENDIF endwith ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTrimMeasure ; <7Aug89smb> Added SMgr VisibleLength for trimming white space ; off the display right of a line. ; <31Oct89smb> Fixed TETrimMeasure to call VisibleLength at the ; appropriate times for unstyled text: LineRect uses the line direction ; and justification to determine when to call it. ;---------------------------------------------------------------------- ptchTrimMeasure IF Scripts604 | SysVers>= $605 THEN ; <31Oct89smb> ; We need to strip off trailing spaces IF they are trailing in display order (on the L. in a ; R-L line and on the R. in a L-R line.) ; if the line direction = teJust (corrected for teSysJust), then go directly to MeasureIt. ; if teJust = teJustCenter OR teJust = teJustLeft, skip cmp d6,d7 ; nothing to measure? <31Oct89smb> bls zeroExit ; <31Oct89smb> move.w teJust(a3),d0 ; <31Oct89smb> bge @MeasureIt ; <31Oct89smb> ; if teJust = teSysJust, skip cmp.w teSysJust,d0 ; <31Oct89smb> beq @MeasureIt ; <31Oct89smb> implies teSysJust = RL ; ow, the line direction = LR and teJust = right tst.b WordRedraw ; test if Arabic installed w/ line direction LR beq @RomanTrim ; bra for Roman ;---------------------------------------------------------------------- ; Adding call to GetStylesInOrder in order to call VisibleLength for a line's style runs. ; We need to traverse the style runs in display order but backwards! This is because it's ; possible to have style runs at the end of a line containing only blanks (silly but true!) with TextFrame,TEFormatOrder move.l d5,-(sp) clr.w d5 ; flag that signifies we are done w/ VisibleLength move.w d6,-(sp) ; save original lineStart tst.w teSize(a3) ; do something different for unstyled! <7Nov89smb> bmi.s @GetStyles ; bra if styled edit record ; old-style record: one style for the whole record. My code is expecting a0 to contain a ptr to ; the startChar for the current style so must fake the setup. clr.l firstStyleRun(a6) clr.l secondStyleRun(a6) move.w teLength(a3),secondStyleRun(a6) lea firstStyleRun(a6),a0 move.l a0,a2StyleRun(a6) ; save style run of lineStart as a ptr ;;<16Nov89smb> move.w #1,d2 ;;<16Nov89smb> move.w d2,numberOfRuns(a6) ; save ; cleared since don't need to go thru initial @styleLoop code. <16Nov89smb> clr.w d2 ;<16Nov89smb> clr.w numberOfRuns(a6) ;<16Nov89smb> lea.l fmtOrdering(a6),a1 move.l a1,fmtOrderingPtr(a6) ;;<16Nov89smb> move.w #1,fmtOrderingIndex(a6) ; decrement below @styleLoop clr.w fmtOrderingIndex(a6) ;<16Nov89smb> clr.w (a1) ;;<16Nov89smb> bra.s @styleLoop bra.s @UnStyled ;<16Nov89smb> @GetStyles move.w d6,d0 ; start of selection move.w d7,d1 ; end of selection bsr ptchTEGetFormatOrder move.w numberOfRuns(a6),d2 move.w d2,fmtOrderingIndex(a6) ; start w/ the last style run ;---------------------------------------------------------------------- @styleLoop subq #1,fmtOrderingIndex(a6) ; decr the style run counter bsr ptchGetNextDisplayStyle subq #1,d2 ; dec the style counter ;;<16Nov89smb> tst.w teSize(a3) ; record with style? ;;<16Nov89smb> bpl.s @UnStyled ; if not, go do it the old way jsrROM ROMSetStyle ; set current style @UnStyled ; If we've already found the first (or visibly last) non-blank style run on the line, the flag ; will be set and we need to loop to determine if this is the greatest style run offset. <7Dec89smb> tst.b d5 ; <7Dec89smb> bne.s @GetStyleEnd ; yep <7Dec89smb> ; must be blanks on the line end <7Dec89smb> ;---------------------------------------------------------------------- ; call VisibleLength to correctly determine the text to measure movem.l d2/a0/a2,-(sp) ; pin to style run boundaries move.w startChar(a0),d6 jsrROM ROMFixFormatEnd ; if last format run, must decrement end offset move.l teTextH(a3),a0 ; get text handle move.l (a0),a0 ; dereference add.w d6,a0 ; set to LineStart sub.w d6,d0 clr.l -(sp) ; longint return move.l a0,-(sp) ; textPtr swap d0 ; clear high word clr.w d0 swap d0 move.l d0,-(sp) ; textLen _VisibleLength move.l (sp)+,d7 ; length of visible text movem.l (sp)+,d2/a0/a2 beq.s @LoopExit ; if all blanks, keep looping ;---------------------------------------------------------------------- add.w d6,d7 ; non-blank => done; get real position ; set flag in high word saying done w/ VisibleLength st d5 @GetStyleEnd ; Once we encounter a non-blank style run, we need to loop through all the previous style runs ; on the line, searching for the largest end offset that is larger then the VisibleLength offset. ; Get the maximum of the style run's end offset and the visibleLength offset. ; per Mark Davis. I'm a believer now! <6Dec89smb> ; d7 = visibleLength initially; is replaced by the end offset of a style run which is larger. ; a0 = ptr to current style run jsrROM ROMFixFormatEnd ; if last format run, must decrement end offset cmp.w d0,d7 bge.s @LoopExit ; VisibleLength is the larger, keep looping move.w d0,d7 ; prev style run is max. ;---------------------------------------------------------------------- ; if all blanks, keep looping @LoopExit tst.w d2 ; more styles?<1Nov89smb> bne.s @styleLoop ; yes, loop again move.w (sp)+,d6 ; restore original lineStart move.l (sp)+,d5 @MeasureIt jmpROM ROMMeasureIt ; if all blanks on this line, will terminate in MeasureIt @RomanTrim jmpROM ROM@RomanTrim zeroExit moveq #0,D0 ; nothing to measure Rts endWith ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELSE ; If a Roman system then use old TrimMeasure code rather than SMgr VisibleLength <2Aug89smb> tst.b teSysJust bne.s @VisLen ; use VisibleLength for RL line direction tst.b WordRedraw ; test for Arabic w/ line direction LR beq.s @RomanTrim ; bra for Roman ; Use SMgr VisibleLength to measure visible text <2Aug89smb> @VisLen move.l teTextH(A3),A0 ; get text handle move.l (A0),A0 ; dereference add.w d6,a0 ; set to LineStart sub.w d6,d7 clr.l -(sp) ; longint return move.l a0,-(sp) ; textPtr swap d7 ; clear high word clr.w d7 swap d7 move.l d7,-(sp) ; textLen _VisibleLength move.l (sp)+,d7 ; length of visible text add.w d6,d7 ; get real position jmpROM ROMMeasureIt @RomanTrim jmpROM ROM@RomanTrim ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IF hasTextWidthHook THEN ; <17> ;---------------------------------------------------------------------- ; PROCEDURE ptchDoErase ; <9/20/90smb> New. Call TETextWidthHook now. ;---------------------------------------------------------------------- ptchDoErase with TextFrame,TEFormatOrder Move.W teSelRect+left(A3),-(SP) ; save left side for draw Cmp.W (A2),D3 ; at start of line? Beq.s @GoErase ; don't worry if so ; If the mode is XOR, we must erase the previous character as well as redrawing it. ; Redrawing the character in XOR without erasing it first just erases it. This means ; the italics problem will not be fixed in this mode. Cmp.W #srcXor,teMode(A3) ; is drawing mode XOR? Beq.s @GoErase ; do it the old way if so Tst.W teSize(A3) ; TERec with style? Bpl.S @MeasureChar ; skip style setup if not ; determine if display order is different from backin-store order <28Sept88smb> tst.b WordRedraw ; $FF if a R->L directional script installed bge.s @getStyleOld ; nope, only L->R directional text Move.W D3,D0 ; start offset Move.W D4,D1 ; end of selection bsr ptchGetStylesInOrder ; <15Nov88smb> bra.s @SetPort @getStyleOld Move.W D3,D0 ; selection start Move.W D0,D1 ; don't care about end jsrROM ROMGetCurStyle ; get its style <7Oct88smb> replaces GetFirstStyle call jsrROM ROMGetNumStyles ; # of styles between offsets <7Oct88smb> @SetPort jsrROM ROMSetStyle ; set the port @MeasureChar move.l teTextH(a3),a0 ; text handle <17> move.l (a0),a0 ; wants text ptr here <17> move.w d3,d1 ; wants offset here <17> moveq #1,d0 ; wants length here <17> import TETextWidthHook ; <17> jsr TETextWidthHook ; hook out TextWidth <17> ; Don't want to erase the prev character because that destroys part of the character ; before it (if it's italics or a kerned font). However, the last pixel should be erased ; in case the application leaves a caret drawn there (like Mac3D does). Tst.W D0 ; nothing to do if no width ** ** Beq.S @ZeroWidth ; else subtract one from char width ** ** SubQ.W #1,D0 ; to fix caret erase problem ** ** @ZeroWidth jmpROM ROM@ZeroWidth ; <17> @GoErase jmpROM ROM@GoErase ; <17> endWith ENDIF ; <17> ENDPROC ; one proc since many interdependencies <9Aug89smb> IF Scripts604 | SysVers>= $605 THEN ;---------------------------------------------------------------------- ; PROCEDURE ptchMeasureWidth ; <29Aug89smb> A bug occurs in hilighting when the line direction ; is RL on a system whose normal line direction is from L-R. The ; code does not completely determine if its done measuring style ; runs for hiliting. ; <17Dec89smb> Have to patch a bug in HiliteMiddle. ; <9/20/90smb> Patched to call ptchMeasureWholeRun for ; TextWidth hook. ;---------------------------------------------------------------------- ptchMeasureWidth PROC EXPORT import ptchHiliteMiddle with SharedFrame,TEFormatOrder ; is this d3's style run? move.w styleRunIndex(a6),d0 cmp.w d3FmtIndex(a6),d0 beq.s @MeasureD3Run tst.b sameStyle(a6) bne @justMeasure ; bra if [d3,d4] in same style ; is this d4's style run? cmp.w d4FmtIndex(a6),d0 beq.s @MeasureD4Run blt.s @inBetween ; bra to check if inbetween d3 & d4 runs jmpROM ROM@justMeasure ; not to be hilited: just measure <17Dec89smb> changed to jmpROM @MeasureD3Run ; measure [d3,end of style] move.w d3,saveD3(a6) move.w d4,saveD4(a6) tst.b sameStyle(a6) bne.s @TestDirection ; when in RL text may need to measure the rest of the line jsrROM ROMFixFormatEnd move.w d0,d4 bra.s @dontQuit @MeasureD4Run ; measure [begin of style,d4] move.w d3,saveD3(a6) move.w d4,saveD4(a6) move.w startChar(a0),d3 @TestDirection tst.b teSysJust ; RL line direction (Roman, Kanji or Arabic)? <29Aug89smb> bne.s @dontQuit ; yep, not done at this style run <29Aug89smb> tst.b WordRedraw ; <4Oct89smb blt.s @dontQuit ; <4Oct89smb ;------------------------------------------------ ; added <17Dec89smb> to patch HiliteMiddle @hiliteIt st doneFlag(a6) ; once hilited d4 @dontQuit tst.b hiliteInbetween(a6) beq.s @HiliteOffsetRun ; nothing inbetween: just hilite the offset's run bsr ptchHiliteMiddle ; hilite runs prior to offset run, then the offset run <17Dec89smb> jmpROM ROM@HiliteOffsetRun @inBetween ; test if style run in between d3 and d4's style runs! cmp.w d3FmtIndex(a6),d0 bhi.s @hiliteRun ; bra to be hilited <26June89smb> made unsigned ; not inbetween therefore, only measure. don't hilite IF hasTextWidthHook THEN ; <17> import ptchMeasureWholeRun ; <17> bsr ptchMeasureWholeRun ; <17> ELSE ; <17> jsrROM ROMMeasureWholeRun ENDIF ; <17> add.w d0,totalWidth(a6) tst.b hiliteInbetween(a6) beq.s @exit bsr ptchHiliteMiddle ; hilite runs prior to non-hilited run <17Dec89smb> move.w totalWidth(a6),d0 add.w d0,anchorL(a6) ; new left anchor jmpROM ROM@exit @justMeasure jmpROM ROM@justMeasure @HiliteOffsetRun jmpROM ROM@HiliteOffsetRun @hiliteRun jmpROM ROM@hiliteRun @exit jmpROM ROM@exit ;------------------------------------------------ ;; replaced <17Dec89smb> ;; jmpROM ROM@hiliteIt ;;@dontQuit jmpROM ROM@dontQuit ;;@inBetween jmpROM ROM@inBetween ;------------------------------------------------ endWith ENDPROC ;---------------------------------------------------------------------- ; PROCEDURE ptchInvrtRectangle ; <7Dec89smb> Fixed LR highlighting bug at line ends. ; <2/8/90smb> Must patch TEWidthHook which is called from PixelWidths. ; <9/6/90smb> If inline input is active then don't hilite to the ends ; of the selRect. ;---------------------------------------------------------------------- ptchInvrtRectangle PROC EXPORT InvrtRectRegs reg d0/d1/a0/a1 with SharedFrame,TEFormatOrder move.w d2,-(sp) ;; moved below since saved in PixelWidths <5Dec89smb> Movem.l InvrtRectRegs,-(sp) move.w d5,-(sp) ; save pixel width from MeasureAndHilite routine move.w #smHilite,d2 ; 1st offset's direction param swap d2 move.w #smHilite,d2 ; 2nd offset's direction param ;;<2/8/90smb> jsrROM ROMPixelWidths ; Calls Char2Pixel for each element of hilite pair ; returns pixelwidths of both elements in d5 & d6 import ptchPixelWidths ; <2/8/90smb> bsr ptchPixelWidths ; now patching PixelWidths due to TEWidthHook <2/8/90smb>. ; Check pixel widths for stroke direction. cmp.w d5,d6 ; which is true left/right edge of rectangle bcs.s @rightLeft ; bra if right-left text add.w selRectR(a6),d5 ; need dest rect right edge added on add.w (sp),d5 ; add pixel width of previous runs on line add.w selRectR(a6),d6 ; need dest rect right edge added on add.w (sp),d6 ; add pixel width of previous runs on line bra.s @edgesOK @rightLeft ; right to left add.w selRectL(a6),d5 ; need dest rect left edge added on add.w (sp),d5 ; add pixel width of previous runs on line add.w selRectL(a6),d6 ; need dest rect left edge added on add.w (sp),d6 ; add pixel width of previous runs on line exg d5,d6 ; swap for R-L text. @edgesOK ; call InvertRect on pair (set up selRect) Movem.l InvrtRectRegs,-(sp) ; <5Dec89smb> move.w d5,teSelRect+left(A3) ; left edge of rectangle move.w d6,teSelRect+right(A3) ; right Move.L teHiHook(A3),D0 ; do the inversion via hook if exists jsrROM ROMInvertHook ; hilite it Movem.l (sp)+,InvrtRectRegs Move.w (sp)+,d5 ; restore pixel width from MeasureAndHilite routine ; Test whether should also hilite visible (screen) line start and end. Must first determine ; whether style run should be pinned to the start of the line. move.w (a2),d2 ; <22Dec88smb> cmp.w startChar(a0),d2 ; <22Dec88smb> bls.s @UseStyleStart ; <22Dec88smb> <26June89smb> made unsigned ; pin to lineStart to get buffer position of offsets add.w d2,d0 ; <22Dec88smb> add.w d2,d1 ; <22Dec88smb> bra.s @TestEnds @UseStyleStart add.w startChar(a0),d0 ; buffer position of 1st offset in line add.w startChar(a0),d1 ; buffer position of 2nd offset in line @TestEnds cmp.w d0,d1 ; <5Dec89smb> bcc.s @OffsetsOK ; <5Dec89smb> exg d0,d1 ; swap for R-L text <5Dec89smb> @OffsetsOK IF hasInlineInput THEN ; <16> ; if inline input is on then don't hilite to the end of the selRect! <16> movem.l a0/d2,-(sp) ; must preserve <16> move.l teDispatchH(a3),a0 ; <16> move.l (a0),a0 ; <16> move.l newTEFlags(a0),d2 ; move into reg for modulo 32 bit ops <16> btst #teFInlineInput,d2 ; is Inline Input active? <16> movem.l (sp)+,a0/d2 ; restore now <16> bne.s @NoLineEnds ; yes, so don't hilite line ends! <16> ENDIF ; <16> jsrROM ROMHiliteLineEnds @NoLineEnds ; <16> Move.w (sp)+,d2 Rts ENDPROC ;---------------------------------------------------------------------- ; PROCEDURE ptchHiliteMiddle ; <17Dec89smb> I need to save d2 since it contains the ; line's style run count left to be processed. InvertHook ; wipes it out. ;---------------------------------------------------------------------- ptchHiliteMiddle PROC EXPORT with SharedFrame,TEFormatOrder movem.l d0/d2/a0,-(sp) ; <17Dec89smb> ; do middle rectangle move.w selRectL(a6), teSelRect+left(a3) ; left edge move.w anchorL(a6),d0 add.w d0,teSelRect+left(a3) move.w selRectR(a6), teSelRect+right(a3) ; right edge move.w anchorR(a6),d0 add.w d0,teSelRect+right(a3) ; top and bottom edges should be the same Move.L teHiHook(A3),D0 ; do the inversion via hook if exists jsrROM ROMInvertHook ; hilite it sf hiliteInbetween(a6) movem.l (sp)+,d0/d2/a0 ; <17Dec89smb> Rts endWith ENDPROC ENDIF IF Scripts604 | SysVers>= $605 THEN PROC EXPORT ptchInstallIntDispatch EXPORT ptchTENew EXPORT ptchTEStylNew EXPORT OldChar2Pixel ; <2/8/90smb> ;---------------------------------------------------------------------- ; PROCEDURE ptchInstallIntDispatch ; <1/9/90smb> Adding storage for double-byte characters ; at the end of the dispatch record. ; <2/8/90smb> Added new hook nWidthHook for SMgr-compatible C2P ; and restored WidthHook to use old TE C2P. ; <9/20/90> Should be using patched C2P for nWidthHook. Also ; initializing new TextWidthHook in the dispatch table. <17> ;---------------------------------------------------------------------- ptchInstallIntDispatch moveq #intDispSize,d0 jsrROM ROMMyNewHandle move.l a0,teDispatchH(a3) ; install it in the record move.l (a0),a0 leaROM ROMXEOLHook,a1 Move.l a1,EOLHook(a0) leaROM ROMXDRAWHook,a1 move.l a1,DRAWHook(a0) lea OldChar2Pixel,a1 ; install old routine here <2/8/90smb> move.l a1,WIDTHHook(a0) leaROM ROMPixel2Char,a1 move.l a1,HITTESTHook(a0) clr.l newTEFlags(a0) clr.l newTEFlags+4(a0) ; <1/9/90smb> storage for double-byte char ; added for SMgr's C2P interface <2/8/90smb> IF hasTextWidthHook THEN ; use patched version of C2P <17> lea ptchTEChar2Pixel,a1 ; oops, should have used this before! <17> ELSE ; <17> leaROM ROMChar2Pixel,a1 ; install SMgr-compatible routine here <2/8/90smb> ENDIF ; <17> move.l a1,nWIDTHHook(a0) ; <2/8/90smb> IF hasTextWidthHook THEN ; <17> ; added so developers can hook the TextWidth calls in TextEdit <17> lea OldChar2Pixel,a1 ; install TextWidth routine as the default for the hook <17> move.l a1,TextWidthHook(a0) ; <17> ENDIF rts ;---------------------------------------------------------------------- ; PROCEDURE ptchTENew ; <1/9/90smb> Need to patch the dispatch record install code, ; InstallIntDispatch. ;---------------------------------------------------------------------- ptchTENew Link A6,#0 MoveM.L D2-D7/A2-A4,-(SP) ; Save regs Clr.L 16(A6) ; return NIL MoveQ #teRecSize,D0 ; Allocate a record _NewHandle ,CLEAR Bne badExit ; escape if error NO Move.L A0,A4 ; save handle _HLock ; get object handle and lock it Move.L (A4),A3 ; dereference it MoveQ #0,D0 ; get text handle _NewHandle Bne badExit ; escape if error NO Move.L A0,teTextH(A3) ; Dest and view rect must be together in record Lea teDestRect(A3),A0 ; point to rects in beginning Move.L 12(A6),A2 ; Get dest rectangle arg Move.L (A2)+,(A0)+ ; save away in record Move.L (A2)+,(A0)+ Move.L 8(A6),A2 ; Get view rectangle arg Move.L (A2)+,(A0)+ ; save away in record Move.L (A2)+,(A0)+ ; Get line height, etc. for font jsrROM ROMGetSize ; get ascent & hite ** ** Move.W D0,teAscent(A3) ; save in ascent ** ** Move.W D1,teLineHite(A3) ; save in line height ** ** ; Get the font and face and save away Move.L GrafGlobals(A5),A2 ; get lisagraf globals and then Move.L thePort(A2),A2 ; thePort Move.L A2,teGrafPort(A3) ; save this port Move.L txFont(A2),teFontStuff(A3) ; save the font/face Move.L txFont+4(A2),teFontStuff+4(A3) ; save the mode/size ; set the direction of the font in the high bit of the high-order byte <30May89smb> move.l a0,-(sp) ; save move.w teFontStuff(a3),d1 ; font lea teFace+1(a3),a0 ; store direction here jsrROM ROMSetDirection move.l (sp)+,a0 Move.L TEWdBreak,teWordBreak(A3) ; Set global word breaker ENDIF ; Endif applies to: IF Scripts604 | SysVers>= $605 THEN ; Fixed a bug in DefClikProc so have to load the patch address for builds >= 6.0.5 IF SysVers>= $605 THEN import ptchDefClikProc ; <1/23/90smb> <4> lea ptchDefClikProc,A0 ; setup default click proc <4> ELSEIF Scripts604 THEN leaROM ROMDefClikProc,A0 ; setup default click proc ENDIF IF Scripts604 | SysVers>= $605 THEN Move.L A0,teClikProc(A3) Bsr ptchInstallIntDispatch ; install new internal dispatch tbl jmpROM ROMinTENew ;---------------------------------------------------------------------- ; PROCEDURE ptchTEStylNew ; <1/9/90smb> Need to patch the dispatch record install code, ; InstallIntDispatch. ;---------------------------------------------------------------------- ptchTEStylNew Link A6,#0 MoveM.L D2-D7/A2-A4,-(SP) ; Save regs Clr.L 16(A6) ; return NIL MoveQ #teRecSize,D0 ; Allocate a record _NewHandle ,CLEAR Bne badExit ; escape if error NO Move.L A0,A4 ; save handle _HLock ; get object handle and lock it Move.L (A4),A3 ; dereference it MoveQ #0,D0 ; get text handle _NewHandle Bne badExit ; escape if error NO Move.L A0,teTextH(A3) ; Dest and view rect must be together in record Lea teDestRect(A3),A0 ; point to rects in beginning Move.L 12(A6),A2 ; Get dest rectangle arg Move.L (A2)+,(A0)+ ; save away in record Move.L (A2)+,(A0)+ Move.L 8(A6),A2 ; Get view rectangle arg Move.L (A2)+,(A0)+ ; save away in record Move.L (A2)+,(A0)+ ; Set size to -1 to indicate this is a stylish record & allocate handle to style Move.W #-1,teSize(A3) ; set style flag (Go style) MoveQ #teStylSize,D0 ; min size is for 1 style descriptor jsrROM ROMMyNewHandle ; get handle to style info ** ** Move.L A0,teStylesH(A3) ; former txFont location ; Get Style Handle for storing font, face, size, and color MoveQ #stRecSize,D0 ; size of style descriptor jsrROM ROMMyNewHandle ; get StyleHandle NO Move.L teStylesH(A3),A2 ; handle to style info Move.L (A2),A2 ; dereference Move.L A0,styleTab(A2) ; store handle to styles array ; Get handle to array of largest line height on each line MoveQ #4,D0 ; Make room for one entry in line height array jsrROM ROMMyNewHandle ; allocate handle to line hites NO Move.L A0,A1 ; save handle Move.L teStylesH(A3),A0 ; handle to style info Move.L (A0),A0 ; dereference Move.L A1,lhTab(A0) ; store line hites handle ; Save the GrafPort and save default style from GrafPort Move.L GrafGlobals(A5),A1 ; get lisagraf globals and then Move.L thePort(A1),A1 ; thePort Move.L A1,teGrafPort(A3) ; save this port Move.W txMode(A1),teMode(A3) ; save the mode MoveQ #1,D0 ; length of text + 1 jsrROM ROMGetDefStyle ; save default style in StyleRec ; Store one entry in line height array Move.L teStylesH(A3),A0 ; style handle Move.L (A0),A0 ; dereference Move.L lhTab(A0),A1 ; handle to line height table Move.L (A1),A1 ; dereference Move.L styleTab(A0),A0 ; handle to StyleRec's Move.L (A0),A0 ; dereference Move.W stAscent(A0),2(A1) ; save ascent Move.W stHeight(A0),(A1) ; save line height Move.W #$FFFF,teAscent(A3) ; won't be used unless somebody Move.W #$FFFF,teLineHite(A3) ; sets the ascent and line height Move.L TEWdBreak,teWordBreak(A3) ; Set global word breaker ENDIF ; Endif applies to: IF Scripts604 | SysVers>= $605 THEN ; Fixed a bug in DefClikProc so have to load the patch address for builds >= 6.0.5 IF SysVers>= $605 THEN import ptchDefClikProc ; <1/23/90smb> <4> lea ptchDefClikProc,A0 ; setup default click proc <4> ELSEIF Scripts604 THEN leaROM ROMDefClikProc,A0 ; setup default click proc ENDIF IF Scripts604 | SysVers>= $605 THEN Move.L A0,teClikProc(A3) Bsr ptchInstallIntDispatch ; install new internal dispatch tbl jmpROM ROMinTEStylNew badExit Move.W #dsMemFullErr,D0 ; memory full error _SysError ; go away and never come back rts ;---------------------------------------------------------------------- ; ; OldChar2Pixel ; ; Using if the old WidthHook is preferred over the nWidthHook. ; Never come here for script systems; always use new Char2Pixel. ; See ScriptChar2Pixel and TEWidthHook dispatch code. <2/8/90smb> ; Also coming here as the default for TextWidthHook (see TETextWidthHook) <17> ; ; Entry: a0 ptr to text ; d0.w length of text to be measured ; d1.w offset into text ; ; Exit: d1.w width of measured text ; ;---------------------------------------------------------------------- OldChar2Pixel subq #2,sp ; room for result move.l a0,-(sp) ; pass pointer move.w d1,-(sp) ; offset move.w d0,-(sp) ; length _TextWidth ; get width move.w (sp)+,d1 ; resulting width rts ENDPROC ENDIF IF SysVers>= $605 THEN ;---------------------------------------------------------------------- ; PROCEDURE ptchDefClikProc ; <1/23/90emt/smb> Added humane scrolling (slower) to DefClikProc ; (also see TEClick). ;---------------------------------------------------------------------- ptchDefClikProc PROC EXPORT MoveM.L D0-D7/A0-A4,-(SP) ; save ALL regs Move.L teDispatchH(A3),A0 ; Move.L (A0),A0 ; Move.L newTEFlags(A0),D0 ; BTst #teFAutoScr,D0 ; Beq.S doneAuto ; if not, must skip Lea teViewRect+8(A3),A0 ; point to view rect Lea TempRect+8,A2 ; copy into TempRect Move.L -(A0),-(A2) Move.L -(A0),-(A2) SubQ #4,SP ; room for pt Move.L SP,-(SP) _GetMouse Move (SP)+,D6 ; get V coordinate Move (SP)+,D7 ; get H coordinate MoveQ #0,D4 ; horz scroll amt Move teLineHite(A3),D1 ; vert scroll amt Bpl.S @1 ; use if not negative ** ** Move.W D6,D0 ; find D6 line ** ** Cmp.W teDestRect+bottom(A3),D0 ; pt below the rect? ** ** Ble.S @0 ; okay if less or same ** ** Move.W teDestRect+bottom(A3),D0 ; else reset to bottom ** ** @0 IF SysVers>= $700 THEN ; <19> import ptchPtToLine ; <19> bsr ptchPtToLine ; try to find its line # in the patched version! <19> ELSE jsrROM ROMPtToLine ; try to find its line # ** ** ENDIF ; <19> Bge.S noAuto ; no scroll if line doesn't exist ** ** <4> jsrROM ROMGetHite ; else get its height @1 Cmp (A2)+,D6 ; subtract top of viewRect Blt.S scrollUp ; scroll up Cmp (A2)+,D7 ; subtract left of viewRect Blt.S scrollLeft ; scroll left Cmp (A2)+,D6 ; subtract bottom of viewRect Bgt.S scrollDown ; scroll down Cmp (A2)+,D7 ; subtract right of viewRect Bgt.S scrollRight ; scroll right noAuto ; <4> clr.l teClikTime(a3) ; clear it out because we're not scrolling <4> doneAuto MoveQ #1,D0 ; cc's <> 0 MoveM.L (SP)+,D0-D7/A0-A4 ; restore ALL regs Rts scrollDown Neg D1 ; flip direction scrollUp Bra.S scrollEm scrollRight Neg D1 ; flip direction scrollLeft Exg D4,D1 ; switch axes scrollEm ; Finally do the scroll lea -10(sp), sp ; reserve space for call to ScrollDelay <4> move.w #1,-(sp) ; itemsVisible = smallest possible (1) <4> move d4,-(sp) ; pass dh move d1,-(sp) ; pass dv move.l 8(a6),-(sp) ; tehandle subq.l #4,sp ; <4> _TickCount ; Get a time stamp. <4> move.l (sp)+,d1 ; Copy it into D1. <4> move.l d1,10(sp) ; And put it on the stack for ScrollDelay. <4> ; Note: teClikTime is a state variable in the TERecord which is used by TEClick. ; Fortunately, TEClick does not use at all within its body; it only checks its ; value on entry and sets it on exit. This code relies on it also being set on ; entry, just after it has been tested. Of course, this restricts its use to ; click procs, but that's okay. move.l teClikTime(a3),d0 ; See if it's a new scroll <4> bne.s @gotTime ; Skip if not <4> move.l d1,teClikTime(a3) ; Otherwise, put in a new stamp <4> move.l d1,d0 ; in D0 too <4> @gotTime move.l d0,14(sp) ; D0 is startTicks for ScrollDelay <4> _TEPinScroll ;_TEPinScroll ** ** _ScrollDelay ; <4> AddQ.L #2,SP ; Toss the result <4> Bra.S doneAuto ; NO ENDPROC ENDIF IF Scripts604 | SysVers>= $605 THEN PROC EXPORT ptchTEWidthHook EXPORT ScriptChar2Pixel EXPORT TETextWidthHook ; <17> ;---------------------------------------------------------------------- ; ; ptchTEWidthHook ; modified <2/8/90smb> ; This internal interface still uses TextEdit's old Char2Pixel routine ; for backwards compatibility for developers. Specifically, if a developer ; has been using this interface, and chains his routine in, the new Char2Pixel ; routine would have broken his application. We now have a new interface, ; ScriptChar2Pixel (below) that allows a developer to replace our new ; Char2Pixel routine or chain with it instead. ; ; However, if a script system is installed, we override this hook and ; automatically use the new hook. Also, if a developer has not replaced our ; internal measuring routine (OldChar2Pixel) then we use the new routine. ; Hence, the only time we use the OldChar2Pixel code is when a developer has ; used this hook. <2/8/90smb> ; ; Measures from start of text to offset, length means length of style run!!!! ; ; ENTRY: ; a0.l => ptr to text to measure ; d0.w = Length of text to be measured ; d1.w = Offset into text ; d2.l = Slop (low word) ; Hilite flag (high word) ; ; EXIT: ; d1.w = Width of measured text ; ;---------------------------------------------------------------------- ptchTEWidthHook ; If a non-Roman system then use new WidthHook routine. move.l ExpandMem,a1 ; <2/8/90smb> cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1) ; total number of installed scripts bne.s ScriptChar2Pixel ; <2/8/90smb> ; Test if the hook contains our internal address <2/8/90smb> move.l teDispatchH(a3),a1 move.l (a1),a1 move.l WIDTHHook(a1),a1 ; if the address of the TEWidthHook is our own OldChar2Pixel routine then use the ; new Char2Pixel routine. Otherwise, use the old routine. <2/8/90smb> pea OldChar2Pixel ; <2/8/90smb> cmpa.l (sp)+,a1 ; <2/8/90smb> beq.s ScriptChar2Pixel ; <2/8/90smb> ; set up the length and offset correctly for the OldChar2Pixel (at this point they have ; been set up for the new Char2Pixel that calls the SMgr's C2P routine. ; adjust the length to reflect the length to measure (from the offset) rather than the ; whole length of the text that the SMgr's C2P expects. <2/8/90smb> move.w d1,d0 ; the C2P offset (d1) should be the byte count or length (d0) <2/8/90smb> move.w #0,d1 ; set the offset to 0. <2/8/90smb> jmp (a1) ; default is to call OldChar2Pixel which calls TextWidth ;---------------------------------------------------------------------- ; ; ScriptChar2Pixel ; ; new <2/8/90smb> ; This internal interface uses the new width hook which allows ; a developer to replace TextEdit's new Char2Pixel code that ; uses the Script Manager's Char2Pixel routine. ; ; If a developer chains in his routine w/o understanding our new interface ; (ie - he expects the old TEWidthHook registers to be used) then his code ; will not work. ; ; Stock version only calls new Char2Pixel. ; ; Measures from start of text to offset, length means length of style run!!!! ; ; ENTRY: ; a0.l => ptr to text buffer ; a2.l => ptr to current lineStart (from teLines) ; d0.w = overall style run length, pinned to the line end ; d1.w = offset position within the style run, pinned to the line start ; d2.l = slop (low word) (see SMgr C2P routine) ; direction flag (high word) (see SMgr C2P routine) ; ; EXIT: ; d1.w = width of measured text ;---------------------------------------------------------------------- ScriptChar2Pixel ; renamed from nTEWidthHook <17> move.l teDispatchH(a3),a1 move.l (a1),a1 move.l nWIDTHHook(a1),a1 ; default is Char2Pixel jmp (a1) IF hasTextWidthHook THEN ; <17> ;---------------------------------------------------------------------- ; ; TETextWidthHook <17> ; ; new <9/19/90smb> ; ; This internal interface uses the new TextWidth hook which allows ; a developer to replace the TextWidth calls in TextEdit with their ; own measuring code. ; ; The default is to use the OldChar2Pixel routine which calls ; _TextWidth. ; ; ENTRY: ; a0.l => ptr to text to measure ; d0.w = Length of text to be measured ; d1.w = Offset into text ; ; EXIT: ; d0.l, ; d1.l = Width of measured text, with result in low word and high word clear ; (using both registers since some callers use d0 for the result and ; others use d1) ;---------------------------------------------------------------------- TETextWidthHook move.l teDispatchH(a3),a1 ; <17> move.l (a1),a1 ; <17> move.l TextWidthHook(a1),a1 ; <17> jsr (a1) ; result in d1.w <17> moveq #0,d0 ; <17> move.w d1,d0 ; result in longized d0 <17> move.w d0,d1 ; result in longized d1 <17> rts ; <17> ENDIF ; <17> ENDPROC ;---------------------------------------------------------------------- ; PROCEDURE ptchPixelWidths ; <2/8/90smb> Must patch TEWidthHook which is called here. ; <6/12/90smb> Must test for EOD and if hit it, use style end. ;---------------------------------------------------------------------- ptchPixelWidths PROC EXPORT IF SysVers >= $700 THEN ; remove a4 from these lists of registers <29> PixelWidthRegs reg d0-d4/a0-a2 ; <29> C2Pparams reg d0/a0/a1 ; length, direction, textPtr, styleRunPtr <29> ELSE ; <29> PixelWidthRegs reg d0-d4/a0-a2/a4 C2Pparams reg d0/a0/a1/a4 ; length, direction, textPtr, styleRunPtr, direction locale ENDIF ; <29> movem.l PixelWidthRegs,-(sp) IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; save the teHandle <29> ENDIF ; <29> move.l ExpandMem,a4 ; <1Feb89smb> move.l d2,ExpandMemRec.emDirection(a4) ; <27Oct88smb> direction for both offsets passed in Movea.l a0,a1 ; save beginning posn of current style Move.L teTextH(a3),a0 ; get text handle Move.L (a0),A0 ; dereference Add.w (a1),a0 ; add beginning of the style run to get to desired line ; 1st offset's width move.w d1,-(sp) ; save 2nd offset ; test if style run starts on previous line, and if so adjust textptr & offset posn in run move.w d0,d1 ; Char2Pixel wants the start offset here moveq #0,d4 move.w (a2),d0 ; linestart cmp.w startChar(a1),d0 bls.s @getLength ; bra if so => offset is ok <26June89smb> made unsigned ; pin to beginning of this line sub.w startChar(a1),d0 ; |begin of line - begin of the style run| add.w d0,a0 ; fix text ptr move.w d0,d4 ; save difference for length adjustment @getLength ; test if style run ends on next line, and if so pin to end of this line & adjust length move.l a0,-(sp) ; <6Mar89smb> move.l a1,a0 ; <6Mar89smb> jsrROM ROMFixFormatEnd ; <6Mar89smb> returns in d0 move.l (sp)+,a0 ; <6Mar89smb> move.w teLength(a3),d2 ; <13> cmp.w (a2),d2 ; at the end of the text? <13> beq.s @UseStyleEnd ; yes -> use style end <13> cmp.w 2(a2),d0 ; style contained in the line? bls.s @UseStyleEnd ; yes -> use style end. move.w 2(a2),d0 ; pin to end of line. @UseStyleEnd sub.w startChar(a1),d0 ; Char2Pixel wants the length here sub.w d4,d0 ; adjust for lineStart clr.l d2 ; <27Oct88smb> move.l ExpandMem,a4 ; <1Feb89smb> lea ExpandMemRec.emDirection(a4),a4 ; changed to lea <12July89smb> move.w (a4)+,d2 ; <27Oct88smb> swap d2 ; 1st offset's direction in high word; slop in low IF SysVers >= $700 THEN ; <29> move.l a4,-(sp) ; save direction values <29> move.l 6(sp),a4 ; restore teHandle to a4 <29> ENDIF ; <29> movem.l C2Pparams,-(sp) ; save to be used again import ptchTEWidthHook ; <2/8/90smb> bsr ptchTEWidthHook ; <2/8/90smb> move.w d1,d5 ; 1st element's pixel width ; 2nd offset's width ; restore params: length, direction, textPtr, styleRunPtr, direction locale movem.l (sp)+,C2Pparams IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore direction values <29> ENDIF ; <29> move.w (sp)+,d1 ; restore offset2 clr.l d2 ; <7Nov88smb> move.w (a4),d2 ; <27Oct88smb> swap d2 ; 2nd offset's direction in high word; slop in low IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore teHandle <29> ENDIF ; <29> bsr ptchTEWidthHook ; <2/8/90smb> move.w d1,d6 ; 2nd element's pixel width movem.l (sp)+,PixelWidthRegs rts ENDPROC ENDIF IF hasTextWidthHook THEN ; <17> PROC ; <17> EXPORT ptchMeasureWholeRun ; <17> ;---------------------------------------------------------------------- ; PROCEDURE ptchMeasureWholeRun ; <9/20/90smb> New. Call TETextWidthHook now. ;---------------------------------------------------------------------- ptchMeasureWholeRun WholeRunRegs reg d2/a0/a4 IF SysVers >= $700 THEN ; <29> movem.l d2/a0,-(sp) ; <29> move.l a4,-(sp) ; separate out so can restore teHandle to a4 before hook call <29> ELSE ; <29> movem.l WholeRunRegs,-(sp) ENDIF ; <29> movea.l a0,a1 ; save beginning posn of current style move.l teTextH(a3),a0 ; get text handle move.l (a0),a0 ; dereference add.w (a1),a0 ; add beginning of the style run to get to desired line move.l a0,a4 movea.l a1,a0 ; restore current style run ; If style run starts on previous line, then pin text pointer to start of current line moveq #0,d1 ; used to adjust length move.w (a2),d0 ; beginning of line cmp.w startChar(a0),d0 bls.s @getLength ; bra if lineStart is prior or equal to the styleRun start <21June89smb> ; Adjust text pointer and length for lineStart within styleRun sub.w startChar(a0),d0 ; difference from start of styleRun to lineStart add.w d0,a4 ; pin pointer to beginning of line move.w d0,d1 ; save for length adjustment below ; If style run ends on next line, then use the current line's end for determining length! @getLength jsrROM ROMFixFormatEnd ; <6Mar89smb> returns end of style run in d0 cmp.w 2(a2),d0 ; inside the line's end? bls.s @UseStyleEnd ; <26June89smb> made unsigned move.w 2(a2),d0 ; use the line's end @UseStyleEnd sub.w startChar(a0),d0 sub.w d1,d0 ; adjust for LineStart tst.w teSize(a3) ; <1Dec88smb> bpl.s @DontSet movem.l d0/d1,-(sp) ; SetStyle mucks with this guy - not good! jsrROM ROMSetStyle ; set grafport style from current style in a0 movem.l (sp)+,d0/d1 @DontSet ;get PixelWidth of this style on this line move.l a4,a0 ; wants text ptr here <17> moveq #0,d1 ; wants offset here <17> IF SysVers >= $700 THEN ; <29> move.l (sp)+,a4 ; restore teHandle to a4 <29> ENDIF ; <29> import TETextWidthHook ; <17> bsr TETextWidthHook ; hook out TextWidth <17> IF SysVers >= $700 THEN ; <29> movem.l (sp)+,d2/a0 ; already restored a4 before TETextWidthHook call <29> ELSE ; <29> movem.l (sp)+,WholeRunRegs ENDIF ; <29> rts ENDPROC ; <17> ENDIF ; IF hasTextWidthHook <17> ;---------------------------------------------------------------------- IF SysVers >= $700 THEN ; <19> PROC ; <19> EXPORT ptchReCalLines ; <19> EXPORT ptchPtToLine ; <19> EXPORT ptchDoFind ; EXPORT ptchPinDisplay ; <19> EXPORT ptchPinA0Rect ; <19> EXPORT ptchRefresh ; <19> ;---------------------------------------------------------------------- ; PROCEDURE ptchReCalLines ; <1/4/91smb> KT bug: Only draw line when wordRedraw is <1 (was ; testing <> 0). ;---------------------------------------------------------------------- ptchReCalLines link a6,#RecalLink movem.l d3/d5-d6/a2,-(sp) ; save regs (SEE .EQU ABOVE) move.w teNLines(a3),oldNLines(a6) ; save old # of lines ** ** clr.w teNLines(a3) ; prime nLines:=0 clr.w savedD2(a6) ; default redraw beginning move teLength(a3),savedD4(a6); default redraw end tst.w teLength(a3) ; any text? beq ClrLineSts ; <19Mar89smb> if not, nothing to recal ; D3 contains the start point to recal from, so find the line containing D3 lea teLines(a3),a2 ; point to line starts moveq #teFromRecal,d2 ; say ReCalLines is calling move teSelStart(a3),d0 ; put start position in D0 jsrROM ROMFindWord ; get word around selstart for...NO vectored so jsr to ROM addr <21> move d0,d3 ; comparison stage1 move (a2)+,d6 ; i(start):=lineStarts[line] move d6,savedD2(a6) ; save away as default redraw start cmp (a2),d3 ; while selWordNO vectored so jsr to ROM addr <21> cmp d0,d3 ; did the line break change? bhs.s stageBad ; if so, must redraw whole thing stageGood ; tst.b WordRedraw ; should we redraw the whole word? bgt.s stageBad ; => yes, app wants whole word blt.s stage2A ; => app wants whole line move teSelStart(a3),d3 ; return selStart stageBad IF forLocalizability THEN ; <42-YDS-2/5/92> Cmp.w #teForceLeft,teJust(A3) ; are we forcing left ? Beq.S @1 ; if so, skip the TESysJust test. ENDIF tst.W teJust(A3) ; see what format, for right or bne.S stage2A ; centered, must use linestart tst.W TESysJust ; check text direction ** ** bne.s stage2A ; not left ** ** ; Special case: redraw line didn't work because stage2x jumped here w/o checking the redraw flag. @1 tst.b WordRedraw ; should we redraw the whole word? ** ** blt.s stage2A ; => app wants whole line <19> replaced bne.s w/ original blt.s above move d3,savedD2(a6) ; return word start-1 beq.s stage2A IF SysVers >= $700 THEN ; fix for KanjiTalk redrawing <27> ; must call DoubleByte here to backup to the correct position <27> subq #1,savedD2(a6) tst.b wordRedraw ; if Roman then don't call DoubleByte <27> beq.s stage2A ; <27> movem.l d0-d4/d6/d7/a2,-(sp) ; save regs across call (better safe than sorry!) <27> move.w d3,d6 ; DoubleByte wants offset here <27> move.w #-1,d3 ; incremental direction to move <27> jsrROM ROMDoubleByte ; <27> move.w d6,savedD2(a6) ; <27> movem.l (sp)+,d0-d4/d6/d7/a2 ; <27> ELSE ; <27> subq #1,savedD2(a6) ENDIF ; <27> bra.s stage2A ; <21> stage2y jmpROM ROMstage2y stage2A jmpROM ROMstage2A ClrLineSts jmpROM ROMClrLineSts ;---------------------------------------------------------------------- ; PROCEDURE ptchPtToLine ; <1/4/91smb> Fixed bug # 35646 (fixed for SS-6.0.4 and 6.0.5 ; in ptch0) - up-arrow key doesn't get to beginning of text. ;---------------------------------------------------------------------- ptchPtToLine MoveM.L D2/D6-D7/A0,-(SP) Sub teDestRect+top(A3),D0 ; origin to destRect Ext.L D0 ; extend to long Move.W teNLines(A3),D7 ; save total # of lines Beq.S @4 ; if none, quit now ; special check for negative, return negative! <1/30/90smb> tst.l d0 ; before start of rect? <1/30/90smb> blt.s @4 ; yes, return above top line <1/30/90smb> jmpROM ROMinPtToLine @4 Cmp D7,D0 ; compare the max # lines MoveM.L (SP)+,D2/D6-D7/A0 Rts ;---------------------------------------------------------------------- ; PROCEDURE ptchDoFind ; <1/4/91smb> Must be patched since calls PtToLine, which is ; now patched. ;---------------------------------------------------------------------- ptchDoFind ; find out which text line it's on Move teSelPoint+v(A3),D0 ; i:=(selPoint.v-destRect.top) Bsr ptchPtToLine ; line index in D0 jmpROM ROMinDoFind ; <19> ;---------------------------------------------------------------------- ; PROCEDURE ptchPinDisplay ; PROCEDURE ptchPinA0Rect ; <1/4/91smb> Must be patched since calls PtToLine, which is ; now patched. ;---------------------------------------------------------------------- ptchPinDisplay Lea teViewRect(A3),A0 ; use viewRect ptchPinA0Rect Move top(A0),D0 ; load D0 w/top Bsr.S ptchPtToLine ; turn into a lineStart in d0 <19> Bge.S @4 ; escape if top gone Add D0,D0 ; double for array ref. Blt.S @1 Cmp teLines(A3,D0),D3 ; pin D3 to viewRect.top Bhs.S @0 Move teLines(A3,D0),D3 ; dispStart = lines[i] @0 Cmp teLines(A3,D0),D4 ; pin D4 to viewRect.top Bhs.S @1 Move teLines(A3,D0),D4 ; dispEnd = lines[i] @1 Move bottom(A0),D0 ; get bottom in D0 SubQ #1,D0 Bsr.S ptchPtToLine ; <19> jmpROM ROMinPinDisplay @4 Move D3,D4 ; nothing in range Rts ;---------------------------------------------------------------------- ; PROCEDURE ptchRefresh ; <1/4/91smb> Must be patched since calls PinA0Rect, which is ; now patched. ;---------------------------------------------------------------------- ptchRefresh MoveQ #0,D3 ; min/max redraw pins in DoDraw MoveQ #-1,D4 Bsr ptchPinA0Rect ; pass A0 rect to Pin code <19> jmpROM ROMinRefresh ENDPROC ENDIF IF SysVers>=$700 THEN IF forLocalizability THEN ; <41-YDS-1/30/92> ;---------------------------------------------------------------------- ; PROCEDURE ptchTextBox ; bug #1018683 , for TextBox with #teForceLeft, don't set ; the justification to the system just. ;---------------------------------------------------------------------- PROC EXPORT ptchTextBox ptchTextBox Link A6,#0 MoveM.L D2-D7/A2-A4,-(SP) ; save StdRegs on stack Tst.W TBJust(A6) ; “left” justified? Bne.S @05 ; no => skip this Move.W TESysJust,TBJust(A6) ; he meant, “default justification” @05 jmpROM RONInTextBox ENDPROC ENDIF IF forLocalizability THEN ; <43-YDS-2/6/92> ;---------------------------------------------------------------------- ; PROCEDURE ptchTextBoxAfterGetFontInfo ; <2/6/92YDS> Patched to handle the font info of an associated font ; if has one. ; come from patch on _GetFontInfo in TextBox. ; If we are here, it is unstyled text & we dont have a teRecord ! ; ;---------------------------------------------------------------------- ptchTextBoxAfterGetFontInfo ComeFromAfterPatchProc _GetFontInfo,ROMAfterGetFInfoInTextBox,(IIci) ; <30> ; see <43> <43-YDS-2/6/92>.we are in ; an un styled record, give the hight of the assoc ; font or the script font (the bigger) Subq #2,sp ; make room on stack _FontScript ; get the script Move.W (SP)+, D4 ; into D4 Beq.W @DoNothing ; it roman ! do nothing Subq #4,sp ; make room on stack, will use it later Move.W D4, -(SP) ; push script number on stack for later Move.L GrafGlobals(A5),A3 ; get lisagraf globals and then Move.L thePort(A3),A3 ; thePort Move.W txFont(A3),D5 ; get the font <44-YDS-4/2/92> Cmp.W #sysFont, D5 ; is it system font ? Beq.S @SystemFont ; yes Cmp.W #applFont, D5 ; is it app font ? Beq.S @AppFont ; yes Subq #4,sp ; make room on stack for result Move.W D4, -(SP) ; push script # on stack Move.W #smScriptSysFond, -(SP) ; push verb _GetScript ; get the system pref fond id Move.L (SP)+, D0 ; take result font Cmp.W D5, D0 ; are you sure it's not system font ? Beq.S @SystemFont ; it is ! Subq #4,sp ; make room on stack for result Move.W D4, -(SP) ; push script # on stack Move.W #smScriptAppFond, -(SP) ; push verb _GetScript ; get the application pref fond id Move.L (SP)+, D0 ; take result font Cmp.W D5, D0 ; are you sure it's not application font ? Beq.S @AppFont ; it is ! @OtherFont Move.W #smScriptFntBase ,-(SP) ; we have result space & script # on stack allready Bra.S @GetTheFont ; so push the right verb @SystemFont Move.W #smScriptSysBase ,-(SP) ; we have result space & script # on stack allready Bra.S @GetTheFont ; so push the right verb @AppFont Move.W #smScriptAppBase ,-(SP) ; we have result space & script # on stack allready @GetTheFont _GetScript ; so push the right verb Move.L (SP)+, D0 ; get the associated font Tst.W D0 ; test the low byte <44-YDS-4/2/92> Beq.S @DoNothing ; no associated font ? bail out ! Move.W D0, txFont(A3) ; set the font to the assoc font SubQ #8,SP ; space on stack Move.L SP,-(SP) ; push addres _GetFontInfo ; get the assoc font info Move.W D5, txFont(A3) ; restore port font Move.W (SP), D0 ; get assoc font ascent Cmp.W 8(SP), D0 ; compare with script font ascent Bgt.S @3 Move.W D0, 8(SP) ; let the bigger one win ! @3 AddQ #8,SP ; strip stack @DoNothing jmpROM ROMAfterGetFInfoInTextBox ; …it's back to you, TE! ENDPROC ENDIF ;---------------------------------------------------------------------- ; PROCEDURE ptchTextBoxPreserveGlyph ; <1/21/91smb> Patched to set PreserveGlyph FALSE before ; drawing, and then restoring it afterwards. ;---------------------------------------------------------------------- ptchTextBoxPreserveGlyph ComeFromAfterPatchProc _MoveTo,AfterMoveToInTextBox,(IIci) ; <30> ;;ptchTextBoxPreserveGlyph ComeFromAfterPatchProc _DrawText,AfterMoveToInTextBox,(IIci) ; <30> ; come from patch on _MoveTo in TextBox tst.w TBJust(a6) ; look at justification and leave high byte for others beq.s @2 ; if left go do it IF forLocalizability THEN ; <41-YDS-1/30/92> don't forget to check Cmp.W #teForceLeft,TBJust(A6) ; for #teForceLeft here Beq.S @2 ; ENDIF ; assume centered move.l TBBox(a6),a0 ; point to rect move right(a0),d0 ; calc width sub left(a0),d0 sub d3,d0 ; subtract text width subq #1,d0 ; caret space TE compatibility tst.w TBJust(a6) ; look at justification bmi.s @1 ; if right skip right shift asr #1,d0 ; divide by two @1 move d0,-(sp) ; move over clr -(sp) ; dv = 0 _Move @2 ;----------------------------------------------- <22> ; Turn PreserveGlyph off before drawing, but save its previous setting <22> clr.w -(sp) ; boolean result <22> _GetPreserveGlyph ; <22> ; leave result on stack tst.w (sp) ; preserve or squash? (byte result but cleared word) beq.s @IsFalse ; <22> move.b #0,-(sp) ; set PreserveGlyph FALSE <22> _SetPreserveGlyph ; <22> @IsFalse ;----------------------------------------------- <22> move.l TBText(a6),-(sp) ; pass text clr -(sp) move TBLength+2(a6),-(sp) ; pass length (low word) _DrawText ;----------------------------------------------- <22> ; Restore PreserveGlyph ; previous PreserveGlyph value still on stack _SetPreserveGlyph ; <22> ;----------------------------------------------- <22> jmpROM ROMGo14Exit ; …it's back to you, TE! ENDPROC IF forLocalizability THEN ; <43-YDS-2/6/92> ;---------------------------------------------------------------------- ; PROCEDURE ptchGetSizeAfterGetFontInfo ; <2/6/92YDS> Patched to handle the font info of an associated font ; if has one. ; come from patch on _GetFontInfo in GetSize ; can be styled or unstyled. A3 is the teRect. ; ;---------------------------------------------------------------------- ptchGetSizeAfterGetFontInfo ComeFromAfterPatchProc _GetFontInfo,ROMAfterGetFInfoInGetSize,(IIci) ; <30> ; see <43> <43-YDS-2/6/92>.if we are in ; an un styled record, give the hight of the assoc ; font or the script font (the bigger) Tst.W teSize(a3) ; is it styled ? Bmi.W @NoAssocFont ; if yes, don't do anything Move.L D3, -(SP) ; save d3 on stack for now Subq #2,sp ; make room on stack _FontScript ; get the script Move.W (SP)+, D3 ; into D3 Beq.W @DoNothing ; it roman ! do nothing Subq #4,sp ; make room on stack, will use it later Move.W D3, -(SP) ; push script number on stack for later Cmp.W #sysFont, teFont(A3) ; is it system font ? Beq.S @SystemFont ; yes Cmp.W #applFont, teFont(A3) ; is it app font ? Beq.S @AppFont ; yes Subq #4,sp ; make room on stack for result Move.W D3, -(SP) ; push script # on stack Move.W #smScriptSysFond, -(SP) ; push verb _GetScript ; get the system pref fond id Move.L (SP)+, D0 ; take result font Cmp.W teFont(A3), D0 ; are you sure it's not system font ? Beq.S @SystemFont ; it is ! Subq #4,sp ; make room on stack for result Move.W D3, -(SP) ; push script # on stack Move.W #smScriptAppFond, -(SP) ; push verb _GetScript ; get the application pref fond id Move.L (SP)+, D0 ; take result font Cmp.W teFont(A3), D0 ; are you sure it's not application font ? Beq.S @AppFont ; it is ! @OtherFont Move.W #smScriptFntBase ,-(SP) ; we have result space & script # on stack allready Bra.S @GetTheFont ; so push the right verb @SystemFont Move.W #smScriptSysBase ,-(SP) ; we have result space & script # on stack allready Bra.S @GetTheFont ; so push the right verb @AppFont Move.W #smScriptAppBase ,-(SP) ; we have result space & script # on stack allready @GetTheFont _GetScript ; so push the right verb Move.L (SP)+, D0 ; get the associated font Tst.W D0 ; teat the low word <44-YDS-4/2/92> Beq.S @DoNothing ; no associated font ? bail out ! Move.L (SP)+, D3 ; restore D3, we need a fresh stack Move.L teGrafPort(A3),A0 ; get thePort Move.W D0, txFont(A0) ; set the font to the assoc font SubQ #8,SP ; space on stack Move.L SP,-(SP) ; push addres _GetFontInfo ; get the assoc font info Move.L teGrafPort(A3),A0 ; get thePort Move.W teFont(A3), txFont(A0) ; restore the font Move.W (SP)+, D0 ; get assoc font ascent Cmp.W 6(SP), D0 ; compare with script font ascent Bgt.S @1 Move.W D0, 6(SP) ; let the bigger one win ! @1 Move.W (SP)+, D0 ; get assoc font descent Cmp.W 6(SP), D0 ; compare with script font ascent Bgt.S @2 Move.W D0, 6(SP) ; let the bigger one win ! @2 AddQ #2,SP ; skip max wid Move.W (SP)+, D0 ; get assoc font leading Cmp.W 6(SP), D0 ; compare with script font ascent Bgt.S @3 Move.W D0, 6(SP) ; let the bigger one win ! @3 Bra.S @NoAssocFont ; back to normal ! @DoNothing Move.L (SP)+, D3 ; restore D3, @NoAssocFont jmpROM ROMAfterGetFInfoInGetSize ; …it's back to you, TE! ENDPROC ENDIF ;---------------------------------------------------------------------- ; ; PROCEDURE ptchTEDispose ; ; <1/16/91smb> Patched to call DumpBuffer (since not ; everyone calls TEIdle like they should) to empty ; text buffer, clear byte count, and dispose of handle. <20> ; ; Entry: teHandle on stack ; ;---------------------------------------------------------------------- ptchTEDispose PROC EXPORT link a6,#0 movem.l d2-d7/a2-a4,-(SP) ; save stdregs move.l 8(a6),a4 ; Pop handle into A4 move.l (a4),a3 ; Dereference into A3 ; dump text buffer before exiting (cleanup!) <21> move.l teDispatchH(a3),a0 move.l (a0),a0 move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <20> btst #teFTextBuffering,d0 beq.s @noBuffer import ptchDumpBuffer bsr ptchDumpBuffer ; dump text from buffer @noBuffer jmpROM ROMinTEDispose ; finish disposing all other handles ENDPROC ;---------------------------------------------------------------------- <29> ; PROCEDURE ptchHiliteTextPreserveA4 <29> ; <2/12/91smb> Patched to preserve a4 across call to <29> ; ptchInvrtRectangle. <29> ;---------------------------------------------------------------------- <29> ptchHiliteTextPreserveA4 ComeFromAfterPatchProc _ScriptUtil,AfterHiliteText,(IIci) ; <29> ; come from patch on _HiliteText in teHiliteText <29> HiliteTxtRegs reg d2-d4/a0/a1 ; <29> movem.l (sp)+,HiliteTxtRegs ; <29> ; HiliteText returns 3 pairs of possibly disjoint char offsets within a style run for highlighting. <29> moveq #2,d7 ; set up dbra:counter for OffsetTable pairs <29> @tblLoop ; <29> move.w (a4)+,d0 ; get offset1 of pair <29> move.w (a4)+,d1 ; get offset2 of pair <29> cmp.w d0,d1 ; equal? <29> beq.s @nxtPair ; yes,skip: pair is empty <29> ; process a pair from HiLiteText <29> move.l a4,-(sp) ; preserve pairs counter and offset pairs <29> ; want to restore a4 to contain the teHandle <29> move.l 4(sp),a4 ; teHandle on the stack <29> bsr ptchInvrtRectangle ; skip the vector to avoid wiping out a4! <29> move.l (sp)+,a4 ; <29> @nxtPair ; <29> dbra d7,@tblLoop ; loop thru record <29> move.l (sp)+,a4 ; restore original value <22Dec88smb> <29> rts ; <29> ENDPROC ; <29> ENDIF ; IF SysVers>=$700 THEN ;---------------------------------------------------------------------- MakePatch ptchSetFont2Keyboard,ExpandMemRec.vSetFont2Keyboard MakePatch ptchCursorMovement,ExpandMemRec.vCursorMovement MakePatch ptchTEGetFormatOrder,ExpandMemRec.vteGetFormatOrder MakePatch ptchCaretDisplay,ExpandMemRec.vCaretDisplay MakePatch ptchGetStylesInOrder,ExpandMemRec.vGetStylesInOrder MakePatch ptchOnSameLine,ExpandMemRec.vOnSameLine MakePatch ptchTestRunDirection,ExpandMemRec.vTestRunDirection MakePatch ptchMeasureWidth,ExpandMemRec.vMeasureWidth MakePatch ptchTEBufferText,ExpandMemRec.vTEBufferText MakePatch ptchDumpBuffer,ExpandMemRec.vDumpBuffer MakePatch ptchBufferChar,ExpandMemRec.vBufferChar MakePatch ptchGetWidth,ExpandMemRec.vGetWidth MakePatch ptchGetRLPosition,ExpandMemRec.vGetRLPosition MakePatch ptchCaretInsideRun,ExpandMemRec.vCaretInsideRun MakePatch ptchInvrtRectangle,ExpandMemRec.vInvrtRectangle MakePatch ptchSetKeyboard2Font,ExpandMemRec.vSetKeyboard2Font MakePatch ptchGetLRPosition,ExpandMemRec.vGetLRPosition MakePatch ptchPixelWidths,ExpandMemRec.vPixelWidths IF hasTextWidthHook THEN ; <17> MakePatch ptchMeasureWholeRun,ExpandMemRec.vMeasureWholeRun ; <17> MakePatch ptchDoErase,ExpandMemRec.vDoErase ; <17> ENDIF ; <17> IF forLocalizability THEN MakePatch ptchOnLineEnd,ExpandMemRec.vOnLineEnd ; <34a-YDS-9/2/91> ENDIF MakePatch ptchTEInit,$A9CC MakePatch ptchTEStylNew,$A83E MakePatch ptchTESetSelect,$A9D1 MakePatch ptchTENew,$A9D2 MakePatch ptchTEUpdate,$A9D3 MakePatch ptchTEClick,$A9D4 MakePatch ptchTEDispatch,$A83D MakePatch ptchTEGetText,$A9CB MakePatch ptchTESetText,$A9CF MakePatch ptchTECalText,$A9D0 MakePatch ptchTECopy,$A9D5 MakePatch ptchTECut,$A9D6 MakePatch ptchTEIdle,$A9DA MakePatch ptchTEPaste,$A9DB MakePatch ptchTEInsert,$A9DE MakePatch ptchTESetJust,$A9DF MakePatch ptchTEScroll,$A9DD MakePatch ptchTEPinScroll,$A812 MakePatch ptchTESelView,$A811 MakePatch ptchTEAutoView,$A813 MakePatch ptchTEGetOffset,$A83C MakePatch ptchTEKey,$A9DC MakePatch ptchTEDelete,$A9D7 MakePatch ptchTEActivate,$A9D8 MakePatch ptchTEDeactivate,$A9D9 MakePatch ptchTrimMeasure,TETrimMeasure MakePatch ptchTEDoText,TEDoText IF SysVers>= $700 THEN ; <19> MakePatch ptchReCalLines,TERecal ; <19> MakePatch ptchTEDispose, $A9CD ; <20> ENDIF ; <19> IF forLocalizability THEN ; <41-YDS-1/30/92>, istall a new patch MakePatch ptchTextBox, $A9CE ENDIF GestaltTEInstall InstallProc IMPORT GestaltTEciVersion move.l #gestaltTextEditVersion, d0 leaResident GestaltTEciVersion, a0 _NewGestalt rts EndProc END ;——————————————————————————————————————————————————————————— ;****************** EOP (End of Patch!) ************** ;———————————————————————————————————————————————————————————