mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-28 13:52:37 +00:00
8760 lines
353 KiB
Plaintext
8760 lines
353 KiB
Plaintext
|
;
|
||
|
; 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 <gbm>: Removed font/keyboard synchronization for
|
||
|
; Roman-only systems. It's unnecessary and slows things down!
|
||
|
; <50> 7/15/92 SMB ## <ys>: 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 <csd>: 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 <yds>: 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,<pke>: 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 <Y8> 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 <EHB 01Oct85>
|
||
|
swap d2 ; get constant into high word <EHB 01Oct85>
|
||
|
move.w d0,d2 ; save position in low word <EHB 01Oct85>
|
||
|
|
||
|
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) <EHB 01Oct85>
|
||
|
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 ; <EHB 01Oct85>
|
||
|
@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) <EHB 01Oct85>
|
||
|
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!),
|
||
|
; <OR> in 1 for each double-byte script and <OR> 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 <C971/RWW102887>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 <C971/RWW102887>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
|
||
|
|
||
|
; ** <C105/14aug86/MBK> 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 ** <C105/18aug86/MBK> 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… <C971/RWW110387>
|
||
|
move.w d4,d1 ; …one would expect _DrawText… <C971/RWW110387>
|
||
|
sub.w d3,d1 ; …to blow them away anyways <C971/RWW110387>
|
||
|
jsrROM ROMTEDrawHook ; go draw it
|
||
|
|
||
|
bra @nxtLine ; <C971/RWW102887>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 ** <C381/6nov86/MBK> **
|
||
|
lsl.l #2,d0 ; mult by 4 ** <C381/6nov86/MBK> **
|
||
|
|
||
|
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 ** <C381/6nov86/MBK> **
|
||
|
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 <C971/RWW110387>
|
||
|
sub.w d0,d1 ; <C971/RWW110387>
|
||
|
clr.w d0 ; no offset <C971/RWW110387>
|
||
|
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
|
||
|
|
||
|
; ** <C105/14aug86/MBK> 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** <C182/2oct86/MBK> **
|
||
|
ENDIF ; <17>
|
||
|
|
||
|
Move.W saveLeft(A6),-(SP) ; saved true left value ** <C105/18aug86/MBK> 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 ** <C381/6nov86/MBK> **
|
||
|
LsL.L #2,D0 ; mult by 4 ** <C381/6nov86/MBK> **
|
||
|
|
||
|
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 ** <C381/6nov86/MBK> **
|
||
|
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 <C971/RWW110387>
|
||
|
jsrROM ROMTEEOLHook ; <C971/RWW110387>
|
||
|
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 ** <C105/14aug86/MBK> **
|
||
|
|
||
|
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 <C971/RWW102887>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... <C971/RWW102887>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 ** <C381/6nov86/MBK> **
|
||
|
|
||
|
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 <C971/RWW102887>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]<c<f[r,1] OR
|
||
|
; ((f[r,0]=c or f[r,1]=c) AND IF on a cluster boundary then d(r)=ld
|
||
|
; Else find r s.t. c = f[r,e])
|
||
|
bsr ptchFindStyleRun ; returns a0 pointing to style run of d6, d1 = r <9Aug89smb>
|
||
|
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<<smfDualCaret),d5 ; leave only the right bit
|
||
|
bne.w @done ; leave the split carret as is ?
|
||
|
|
||
|
move.l ExpandMem,a0 ; get the scplit cursor addres into A0
|
||
|
lea ExpandMemRec.emCursor2Rect(a0),a0
|
||
|
Move.w top(a0), d5 ; some times we get the lower
|
||
|
Cmp.w teSelRect+top(a3), d5 ; in selrect & the upper in "ExpandMem"
|
||
|
bgt.s @3 ; so we would like to sort it out.
|
||
|
|
||
|
move.l top(a0),d5 ; switch the two rects. keep in mind
|
||
|
move.l teSelRect+top(a3),top(a0) ; that the upper one has the width of
|
||
|
move.l d5,teSelRect+top(a3) ; zero, while the lower one has the
|
||
|
move.w bottom(a0),d5 ; witdth of 1, sorry, not my fault,
|
||
|
move.w teSelRect+bottom(a3),bottom(a0) ; that's how it is now, and i'm not
|
||
|
move.w d5,teSelRect+bottom(a3) ; going to change it.
|
||
|
move.w teSelRect+left(a3),teSelRect+right(a3)
|
||
|
move.w left(a0),right(a0)
|
||
|
add.w #1,right(a0)
|
||
|
|
||
|
@3 clr.l -(sp) ; we will need a place on the stack anyway !
|
||
|
Tst.b teCarOn(A3) ; if caret on, we would like to calculate the same caret allways
|
||
|
bne.s @1 ; carret is going on, calculate a new one <34p-YDS-9/2/91>
|
||
|
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 ** <C381/6nov86/MBK> **
|
||
|
|
||
|
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 ** <C381/6nov86/MBK> **
|
||
|
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 ** <C381/6nov86/MBK> **
|
||
|
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 ** <C229/28oct86/MBK> **
|
||
|
jsrROM ROMSetStyle ; set the style
|
||
|
Move.W (SP)+,D0 ; restore length to measure ** <C229/28oct86/MBK> **
|
||
|
|
||
|
@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<<smsfSynchUnstyledTE),d0 ; leave only the synchronize bit <46>
|
||
|
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
|
||
|
|
||
|
; ** <C971/RWW102987> 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? <C971/RWW102987>
|
||
|
Bpl.S @1 ; oops, never mind <C971/RWW102987>
|
||
|
|
||
|
MoveM.L D0/D7/A2,-(SP) ; we need D0 and A2 temporarily <C971/RWW102987>
|
||
|
Move.W teSelStart(A3),D0 ; find start of block to be yanked <C971/RWW102987>
|
||
|
jsrROM ROMGetCurStyle ; find the associated style run
|
||
|
Move.W teSelStart(A3),D0 ; get start of block again <C971/RWW102987>
|
||
|
Cmp.W startChar(A0),D0 ; is it the beginning of a style? <C971/RWW102987>
|
||
|
Beq.S @2 ; yes, so continue <C971/RWW102987>
|
||
|
|
||
|
jsrROM ROMClearRsrved ; no null selection!
|
||
|
Bra.S @3 ; <C971/RWW102987>
|
||
|
|
||
|
@2 Move.W styleIndex(A0),D0 ; fetch index into style table <C971/RWW102987>
|
||
|
jsrROM ROMGetStyle ; find associated style table entry
|
||
|
Move.W #doAll,-(SP) ; build fake frame for SetRsrved <C971/RWW102987>
|
||
|
Pea stFont(A0) ; point at embedded textstyle <C971/RWW102987>
|
||
|
Clr.B -(SP) ; need another word, can't hurt <C971/RWW102987>
|
||
|
Move.L SP,A2 ; point A2 at stacked parameters <C971/RWW102987>
|
||
|
jsrROM ROMAltSetRsrved ; set null scrap style
|
||
|
AddQ.W #8,SP ; fix up stack <C971/RWW102987>
|
||
|
|
||
|
@3 MoveM.L (SP)+,D0/D7/A2 ; retrieve saved registers <C971/RWW102987>
|
||
|
@1 ; <C971/RWW102987>
|
||
|
|
||
|
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
|
||
|
|
||
|
; ** <C851/23Apr87/MBK> ** 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 ; <C971/RWW102887>NO
|
||
|
jsrROM ROMHiLite ; remove selection <C971/RWW102887>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 <C971/RWW102887>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 <C971/RWW102887>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…) <C971/RWW110587>
|
||
|
|
||
|
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 <C971/RWW102887>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
|
||
|
;-----------------------------------------------
|
||
|
; ** <C207/14oct86/MBK> ** Don't draw caret yet, just activate it
|
||
|
ActCaret Tst.B teActive(A3) ; do nothing if not active
|
||
|
Beq.S @0 ; <C971/RWW102887>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 **<C207/14oct86/MBK> **
|
||
|
tst.w d0 ; anything in file? **<C207/14oct86/MBK> **
|
||
|
beq.s @0 ; skip test if not **<C207/14oct86/MBK> **
|
||
|
|
||
|
move.l teTextH(a3),a0 ; text handle **<C207/14oct86/MBK> **
|
||
|
Move.l (a0),a0 ; dereference **<C207/14oct86/MBK> **
|
||
|
cmp.b #$0D,-1(a0,d0) ; file end with CR? **<C207/14oct86/MBK> **
|
||
|
bne.s @0 ; end of file if not **<C207/14oct86/MBK> **
|
||
|
|
||
|
addq #1,d1 ; else 1 more line **<C207/14oct86/MBK> **
|
||
|
|
||
|
@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 ** <C207/14oct86/MBK> **
|
||
|
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<<smsfSynchUnstyledTE),d0 ; leave only the synchronize bit <46>
|
||
|
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" <EHB 01Oct85>
|
||
|
jsrROM ROMClickExpand ; <C971/RWW102887>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
|
||
|
|
||
|
; ** <C139/23Sep86/MBK> ** 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 ** <C105/28aug86/MBK **
|
||
|
ptchStdEntry2
|
||
|
Move.L (SP)+,A0 ; save return address
|
||
|
Link A6,#stdLink ; stack frame
|
||
|
MoveM.L D2-D7/A2-A4,-(SP)
|
||
|
Move.L A0,-(SP) ; push return address back on stack
|
||
|
|
||
|
Tst.W D0 ; is it a style trap? ** <C105/28aug86/MBK **
|
||
|
Beq.S NotStyleTrap ; if not, skip this ** <C105/28aug86/MBK **
|
||
|
|
||
|
Move.W inHandle(A6),D0 ; get the selector ** <C105/28aug86/MBK **
|
||
|
LeaROM ROMAddrTable,A0 ; table of addresses ** <C105/28aug86/MBK **
|
||
|
Add.W D0,D0 ; each entry is 2 bytes ** <C381/5nov86/MBK **
|
||
|
Move.W 0(A0,D0),D0 ; get offset to the trap** <C381/5nov86/MBK **
|
||
|
Lea 0(A0,D0),A0 ; get trap's addr ** <C381/5nov86/MBK **
|
||
|
Move.L A0,D3 ; save addr in D3 ** <C381/5nov86/MBK **
|
||
|
|
||
|
Move.L inHandle+2(A6),A4 ; get TEHandle ** <C105/28aug86/MBK **
|
||
|
Bra.S StyleTrap
|
||
|
NotStyleTrap
|
||
|
MoveQ #0,D3 ; use D3 as a flag ** <C105/28aug86/MBK **
|
||
|
Move.L inHandle(A6),A4 ; Pop handle into A4
|
||
|
|
||
|
; Modified to use _HGetState ** <C105/5sep86/MBK> **
|
||
|
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 ** <C381/8nov86/MBK **
|
||
|
|
||
|
; Do all safety related entry stuff
|
||
|
Move.L teGrafPort(A3),A2 ; save "thePort" for below
|
||
|
Move.L A2,-(SP) ; set to our port
|
||
|
_SetPort
|
||
|
|
||
|
; Get clip from this port into rgn defined above
|
||
|
SubQ #4,SP ; make room for clip
|
||
|
_NewRgn
|
||
|
Move.L (SP),saveClip(A6) ; save user's clip in frame
|
||
|
Move.L (SP),-(SP) ; stay on stack for sectrgn below
|
||
|
_GetClip ;
|
||
|
|
||
|
Pea teViewRect(A3) ; clip to viewRect
|
||
|
_ClipRect
|
||
|
|
||
|
; First param on stack from above. Do not pass go. Do not collect $200
|
||
|
Move.L clipRgn(A2),-(SP)
|
||
|
Move.L (SP),-(SP) ; destination
|
||
|
_SectRgn
|
||
|
|
||
|
IF SysVers>= $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 ** <C182/60ct86/MBK> **
|
||
|
|
||
|
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 ** <C182/60ct86/MBK> **
|
||
|
ENDIF
|
||
|
|
||
|
Move.W teMode(A3),txMode(A0) ; do set the mode ** <C815/13feb87/MBK **
|
||
|
_GetForeColor ; for Ikki ** <C182/6oct86/MBK> **
|
||
|
|
||
|
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? ** <C105/28aug86/MBK **
|
||
|
Beq.S @2 ; if not, skip this ** <C105/28aug86/MBK **
|
||
|
|
||
|
Move.L D3,A0 ; return it in A0 ** <C381/5nov86/MBK **
|
||
|
Lea inHandle+6(A6),A2 ; pt to next param ** <C105/28aug86/MBK **
|
||
|
Bra.S endEntry ; that's it ** <C105/28aug86/MBK **
|
||
|
|
||
|
@2 Lea inHandle+4(A6),A2 ; Point to next to last param
|
||
|
; (1st on stack after handle)
|
||
|
endEntry
|
||
|
; dump text buffer before processing any calls <28Sept89smb>
|
||
|
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> ** <C139/22Sep86/MBK> **
|
||
|
|
||
|
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<<smfDualCaret),d5 ; leave only the right bit
|
||
|
bne.w @finis ; leave the split carret as is ?
|
||
|
|
||
|
clr.l -(sp) ; we will need a place on the stack anyway !
|
||
|
Tst.b teCarOn(A3) ; if caret on, we would like to calculate the same caret allways
|
||
|
bne.s @1 ; carret is going on, calculate a new one <34p-YDS-9/2/91>
|
||
|
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 ** <C485/04dec86/MBK> **
|
||
|
Beq.S @ZeroWidth ; else subtract one from char width ** <C485/04dec86/MBK> **
|
||
|
SubQ.W #1,D0 ; to fix caret erase problem ** <C485/04dec86/MBK> **
|
||
|
@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 <C971/RWW102887>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 <C971/RWW102887>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 ** <C207/10oct86/MBK> **
|
||
|
Move.W D0,teAscent(A3) ; save in ascent ** <C207/10oct86/MBK> **
|
||
|
Move.W D1,teLineHite(A3) ; save in line height ** <C207/10oct86/MBK> **
|
||
|
|
||
|
; 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 <C971/RWW110387>
|
||
|
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 <C971/RWW102887>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 <C971/RWW102887>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 ** <C381/7nov86/MBK> **
|
||
|
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 <C971/RWW102887>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 <C971/RWW102887>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 <C971/RWW110387>
|
||
|
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 ; <PMAB381/RWW020488>
|
||
|
Move.L (A0),A0 ; <PMAB381/RWW020488>
|
||
|
Move.L newTEFlags(A0),D0 ; <PMAB381/RWW020488>
|
||
|
BTst #teFAutoScr,D0 ; <PMAB381/RWW020488>
|
||
|
|
||
|
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 ** <C207/13oct86/MBK> **
|
||
|
|
||
|
Move.W D6,D0 ; find D6 line ** <C207/13oct86/MBK> **
|
||
|
Cmp.W teDestRect+bottom(A3),D0 ; pt below the rect? ** <C207/13oct86/MBK> **
|
||
|
Ble.S @0 ; okay if less or same ** <C207/13oct86/MBK> **
|
||
|
|
||
|
Move.W teDestRect+bottom(A3),D0 ; else reset to bottom ** <C207/13oct86/MBK> **
|
||
|
|
||
|
@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 # ** <C207/13oct86/MBK> **
|
||
|
ENDIF ; <19>
|
||
|
Bge.S noAuto ; no scroll if line doesn't exist ** <C207/13oct86/MBK> ** <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 ** <C381/6nov86/MBK> **
|
||
|
|
||
|
_ScrollDelay ; <4>
|
||
|
AddQ.L #2,SP ; Toss the result <4>
|
||
|
Bra.S doneAuto ; <C971/RWW102887>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 ** <C229/28oct86/MBK> **
|
||
|
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 <EHB 01Oct85>
|
||
|
move teSelStart(a3),d0 ; put start position in D0 <EHB 01Oct85>
|
||
|
jsrROM ROMFindWord ; get word around selstart for...<C971/RWW102887>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 selWord<lineStarts[line+1]
|
||
|
blo.s stage2x ; if inclusive
|
||
|
beq.s stage2y ; if at next line start
|
||
|
|
||
|
addq #1,teNLines(A3) ; one more line, keep looking for
|
||
|
bra.s stage1 ; line containing selStart(D3)
|
||
|
|
||
|
; Return the refresh start in savedD2
|
||
|
|
||
|
stage2x
|
||
|
jsrROM ROMFindLine ; get line after D6 <C971/RWW102887>NO 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 ; <EHB 05-Nov-85>
|
||
|
tst.b WordRedraw ; should we redraw the whole word? <EHB 31-Oct-85>
|
||
|
bgt.s stageBad ; => yes, app wants whole word <EHB 31-Oct-85>
|
||
|
blt.s stage2A ; => app wants whole line <EHB 01-Nov-85>
|
||
|
|
||
|
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 ** <C105/14aug86/MBK> **
|
||
|
bne.s stage2A ; not left ** <C105/14aug86/MBK> **
|
||
|
|
||
|
; 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? ** <C454/21nov86/MBK> **
|
||
|
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? <C971/RWW110987>
|
||
|
Bne.S @05 ; no => skip this <C971/RWW110987>
|
||
|
|
||
|
Move.W TESysJust,TBJust(A6) ; he meant, “default justification” <C971/RWW110987>
|
||
|
|
||
|
@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!) **************
|
||
|
;———————————————————————————————————————————————————————————
|
||
|
|