DIRECTORY PrincOps USING [ BBptr, BBTableSpace, CharEntry, TextBltArg, TextBltFontHandle, TextBltResult], PrincOpsUtils USING [AlignedBBTable, BITBLT], SoftwareTextBlt USING []; TextBltImpl: PROGRAM IMPORTS PrincOpsUtils EXPORTS SoftwareTextBlt = BEGIN TextBlt: PUBLIC PROC [ index: CARDINAL, bitPos: CARDINAL, micaPos: CARDINAL, count: INTEGER, ptr: POINTER TO PrincOps.TextBltArg] RETURNS [ newIndex: CARDINAL, newBitPos: CARDINAL, newMicaPos: CARDINAL, newCount: INTEGER, result: PrincOps.TextBltResult] = { bbtablespace: PrincOps.BBTableSpace; bb: PrincOps.BBptr = PrincOpsUtils.AlignedBBTable[@bbtablespace]; font: PrincOps.TextBltFontHandle = ptr.font; UNTIL index > ptr.last DO FetchChar: PROC RETURNS [CHARACTER] = INLINE {RETURN[ptr.text[index]]}; BitWidth: PROC RETURNS [CARDINAL] = INLINE {RETURN[font.font.widths[char]]}; Height: PROC RETURNS [CARDINAL] = INLINE {RETURN[font.height]}; MicaWidth: PROC RETURNS [CARDINAL] = INLINE {RETURN[font.font.char[char].mica]}; Pad: PROC RETURNS [BOOL] = INLINE {RETURN[font.rgflags[char].pad]}; Stop: PROC RETURNS [BOOL] = INLINE {RETURN[font.rgflags[char].stop]}; char: CHARACTER = FetchChar[]; IF ptr.function = resolve THEN ptr.coord[index] _ bitPos; IF Stop[] THEN GOTO Quit; IF micaPos + MicaWidth[] > ptr.margin THEN GOTO Margin; IF ptr.function = display THEN DisplayChar[ptr, bitPos, char, bb]; bitPos _ bitPos + BitWidth[]; micaPos _ micaPos + MicaWidth[]; IF Pad[] THEN { count _ count + 1; IF ptr.function # format THEN { bitPos _ bitPos + ptr.space; IF count <= 0 THEN bitPos _ bitPos + 1; }; }; index _ index + 1; REPEAT Quit => result _ stop; Margin => result _ margin; FINISHED => result _ normal; ENDLOOP; RETURN[index, bitPos, micaPos, count, result] }; DisplayChar: PROC [ ptr: POINTER TO PrincOps.TextBltArg, bitPos: CARDINAL, char: CHARACTER, bb: PrincOps.BBptr] = --INLINE-- { font: PrincOps.TextBltFontHandle = ptr.font; ce: LONG POINTER TO PrincOps.CharEntry = @font.font.char[char]; KernLeftWidth: PROC RETURNS [CARDINAL] = INLINE {RETURN[LOOPHOLE[ce.leftKern]]}; KernRightWidth: PROC RETURNS [CARDINAL] = INLINE {RETURN[LOOPHOLE[ce.rightKern]]}; bitPos _ bitPos - KernLeftWidth[]; bb.dst _ [word: ptr.dst + bitPos/16, reserved: 0, bit: bitPos MOD 16]; bb.dstBpl _ INTEGER[ptr.dstBpl]; bb.src _ [word: @font.font.bits[ce.offset], reserved: 0, bit: 0]; bb.srcDesc.srcBpl _ bb.width _ font.font.widths[char] + KernLeftWidth[] + KernRightWidth[]; bb.height _ font.height; bb.flags _ [ direction: forward, disjoint: TRUE, disjointItems: TRUE, gray: FALSE, srcFunc: null, dstFunc: or, reserved: 0 ]; bb.reserved _ 0; PrincOpsUtils.BITBLT[bb]; }; END. FTextBltImpl.mesa Last Edited by: Levin, April 11, 1983 9:48 am Êa˜Jšœ™Jšœ-™-J˜šÏk ˜ šœ œ˜JšœN˜N—Jšœœœ˜-Jšœœ˜J˜—šœ ˜Jšœ˜Jšœ˜—J˜Jš˜J˜šÏnœœœ˜Jšœœ œ œ˜5Jšœœœœ˜4šœ˜ Jš œ œ œœ œ˜QJšœ#˜#—J˜$J˜AJ˜,šœ˜Jš ž œœœ œœœ˜GJš žœœœœœœ˜LJš žœœœœœœ˜?Jš ž œœœœœœ˜PJš žœœœœœœ˜CJš žœœœœœœ˜EJšœ œ˜Jšœœ˜9Jšœœœ˜Jšœ$œœ˜7Jšœœ$˜BJ˜J˜ šœœ˜J˜šœœ˜J˜Jšœ œ˜'Jšœ˜—Jšœ˜—J˜š˜J˜J˜Jšœ˜—Jšœ˜—Jšœ'˜-Jšœ˜J˜—šž œœ˜Jš œœœœ œ˜GJšœÏc œ˜#J˜,Jšœœœœ,˜?Jšž œœœœœœœ˜PJšžœœœœœœœ˜RJ˜"Jšœ>œ˜FJšœ œ ˜ J˜AJ˜[J˜˜ Jšœœœ˜8Jšœœ)˜4Jšœ˜—J˜Jšœœ˜Jšœ˜J˜—Jšœ˜—…— F í