'From Squeak 1.18 of December 12, 1996 on 24 January 1997 at 10:55:33 am'! !BitBltSimulation methodsFor: 'setup'! triangleBits "" | cw t x1 x2 delta1 delta2 top bottom middle p1x p1y p2x p2y p3x p3y nSteps | noSource _ true. cw _ true. "get points" (interpreterProxy fetchWordLengthOf: bitBltOop) >= (BBWarpBase+12) ifFalse: [^ interpreterProxy primitiveFail]. p1x _ interpreterProxy fetchInteger: BBWarpBase ofObject: bitBltOop. p1y _ interpreterProxy fetchInteger: BBWarpBase+1 ofObject: bitBltOop. p2x _ interpreterProxy fetchInteger: BBWarpBase+3 ofObject: bitBltOop. p2y _ interpreterProxy fetchInteger: BBWarpBase+4 ofObject: bitBltOop. p3x _ interpreterProxy fetchInteger: BBWarpBase+6 ofObject: bitBltOop. p3y _ interpreterProxy fetchInteger: BBWarpBase+7 ofObject: bitBltOop. interpreterProxy failed ifTrue: [^ false]. "ie if non-integers above" "sort points" p1y > p2y ifTrue: [cw _ cw not. t _ p1y. p1y _ p2y. p2y _ t. t _ p1x. p1x _ p2x. p2x _ t]. p1y > p3y ifTrue: [cw _ cw not. t _ p1y. p1y _ p3y. p3y _ t. t _ p1x. p1x _ p3x. p3x _ t]. p2y > p3y ifTrue: [cw _ cw not. t _ p2y. p2y _ p3y. p3y _ t. t _ p2x. p2x _ p3x. p3x _ t]. top _ p1y >> BinaryPoint. bottom _ p3y >> BinaryPoint. nSteps _ bottom - top. nSteps > 0 ifFalse: [ affectedL _ affectedR _ affectedT _ affectedB _ 0. ^false]. delta1 _ self deltaFrom: p1x to: p3x nSteps: bottom-top. middle _ p2y >> BinaryPoint. nSteps _ middle - top. nSteps <= 0 ifTrue: [nSteps _ 1]. delta2 _ self deltaFrom: p1x to: p2x nSteps: nSteps. cw ifTrue: [t _ delta1. delta1 _ delta2. delta2 _ t]. x1 _ p1x + (delta1//2). x2 _ p1x + (delta2//2). top to: middle-1 do: [:y | x1 > x2 ifTrue: [destX _ x2 >> BinaryPoint. width _ x1 >> BinaryPoint - destX. width > 0 ifTrue: [destY _ y. self clipRange. self destMaskAndPointerInit. self copyLoopNoSource]]. x1 _ x1 + delta1. x2 _ x2 + delta2]. nSteps _ bottom - middle. nSteps <= 0 ifTrue: [nSteps _ 1]. cw ifTrue: [delta1 _ self deltaFrom: p2x to: p3x nSteps: nSteps. x1 _ p2x + (delta1//2)] ifFalse: [delta2 _ self deltaFrom: p2x to: p3x nSteps: nSteps. x2 _ p2x + (delta2//2)]. middle to: bottom-1 do: [:y | x1 > x2 ifTrue: [destX _ x2 >> BinaryPoint. width _ x1 >> BinaryPoint - destX. width > 0 ifTrue: [destY _ y. self clipRange. self destMaskAndPointerInit. self copyLoopNoSource]]. x1 _ x1 + delta1. x2 _ x2 + delta2]. affectedT _ top. affectedB _ bottom. t _ p1x. p2x < t ifTrue: [t _ p2x]. p3x < t ifTrue: [t _ p3x]. affectedL _ t >> BinaryPoint. t _ p1x. p2x > t ifTrue: [t _ p2x]. p3x > t ifTrue: [t _ p3x]. affectedR _ t >> BinaryPoint. ^true! ! !Interpreter methodsFor: 'I/O primitives'! primitiveTriangleBits "Invoke the triangleBits primitive. If the destination is the display, then copy it to the screen." | rcvr | rcvr _ self stackTop. self success: (self loadBitBltFrom: rcvr). successFlag ifTrue: [ self triangleBits. self targetForm = (self splObj: TheDisplay) ifTrue: [self showDisplayBits]. ].! ! !Interpreter class methodsFor: 'initialization'! initializePrimitiveTable "Interpreter initializePrimitiveTable" "Note: This table will be used to generate a C switch statement." PrimitiveTable _ Array new: 256. self table: PrimitiveTable from: #( "Integer Primitives (0-19)" (0 primitiveFail) (1 primitiveAdd) (2 primitiveSubtract) (3 primitiveLessThan) (4 primitiveGreaterThan) (5 primitiveLessOrEqual) (6 primitiveGreaterOrEqual) (7 primitiveEqual) (8 primitiveNotEqual) (9 primitiveMultiply) (10 primitiveDivide) (11 primitiveMod) (12 primitiveDiv) (13 primitiveQuo) (14 primitiveBitAnd) (15 primitiveBitOr) (16 primitiveBitXor) (17 primitiveBitShift) (18 primitiveMakePoint) (19 primitiveFail) "LargeInteger Primitives (20-39)" "32-bit logic is aliased to Integer prims above" (20 39 primitiveFail) "Float Primitives (40-59)" (40 primitiveAsFloat) (41 primitiveFloatAdd) (42 primitiveFloatSubtract) (43 primitiveFloatLessThan) (44 primitiveFloatGreaterThan) (45 primitiveFloatLessOrEqual) (46 primitiveFloatGreaterOrEqual) (47 primitiveFloatEqual) (48 primitiveFloatNotEqual) (49 primitiveFloatMultiply) (50 primitiveFloatDivide) (51 primitiveTruncated) (52 primitiveFractionalPart) (53 primitiveExponent) (54 primitiveTimesTwoPower) (55 primitiveSquareRoot) (56 primitiveSine) (57 primitiveArctan) (58 primitiveLogN) (59 primitiveExp) "Subscript and Stream Primitives (60-67)" (60 primitiveAt) (61 primitiveAtPut) (62 primitiveSize) (63 primitiveStringAt) (64 primitiveStringAtPut) (65 primitiveNext) (66 primitiveNextPut) (67 primitiveAtEnd) "StorageManagement Primitives (68-79)" (68 primitiveObjectAt) (69 primitiveObjectAtPut) (70 primitiveNew) (71 primitiveNewWithArg) (72 primitiveFail) "Blue Book: primitiveBecome" (73 primitiveInstVarAt) (74 primitiveInstVarAtPut) (75 primitiveAsOop) (76 primitiveFail) "Blue Book: primitiveAsObject" (77 primitiveSomeInstance) (78 primitiveNextInstance) (79 primitiveNewMethod) "Control Primitives (80-89)" (80 primitiveFail) "Blue Book: primitiveBlockCopy" (81 primitiveValue) (82 primitiveValueWithArgs) (83 primitivePerform) (84 primitivePerformWithArgs) (85 primitiveSignal) (86 primitiveWait) (87 primitiveResume) (88 primitiveSuspend) (89 primitiveFlushCache) "Input/Output Primitives (90-109)" (90 primitiveMousePoint) (91 primitiveFail) "Blue Book: primitiveCursorLocPut" (92 primitiveFail) "Blue Book: primitiveCursorLink" (93 primitiveInputSemaphore) (94 primitiveFail) "Blue Book: primitiveSampleInterval" (95 primitiveInputWord) (96 primitiveCopyBits) (97 primitiveSnapshot) (98 primitiveFail) "Blue Book: primitiveTimeWordsInto" (99 primitiveFail) "Blue Book: primitiveTickWordsInto" (100 primitiveFail) "Blue Book: primitiveSignalAtTick" (101 primitiveBeCursor) (102 primitiveBeDisplay) (103 primitiveScanCharacters) (104 primitiveDrawLoop) (105 primitiveStringReplace) (106 primitiveScreenSize) (107 primitiveMouseButtons) (108 primitiveKbdNext) (109 primitiveKbdPeek) "System Primitives (110-119)" (110 primitiveEquivalent) (111 primitiveClass) (112 primitiveBytesLeft) (113 primitiveQuit) (114 primitiveExitToDebugger) (115 primitiveFail) "Blue Book: primitiveOopsLeft" (116 primitiveFail) (117 primitiveFail) (118 primitiveFail) (119 primitiveFail) "Miscellaneous Primitives (120-127)" (120 primitiveFail) (121 primitiveImageName) (122 primitiveNoop) "Blue Book: primitiveImageVolume" (123 primitiveFail) (124 primitiveLowSpaceSemaphore) (125 primitiveSignalAtBytesLeft) (126 primitiveFail) (127 primitiveFail) "AppleSmalltalk Primitives Start Here" "Apple Miscellaneous Primitives (128-149)" (128 primitiveArrayBecome) (129 primitiveSpecialObjectsOop) (130 primitiveFullGC) (131 primitiveIncrementalGC) (132 primitiveObjectPointsTo) (133 primitiveSetInterruptKey) (134 primitiveInterruptSemaphore) (135 primitiveMillisecondClock) (136 primitiveSignalAtMilliseconds) (137 primitiveSecondsClock) (138 primitiveSomeObject) (139 primitiveNextObject) (140 primitiveBeep) (141 primitiveClipboardText) (142 primitiveVMPath) (143 primitiveShortAt) (144 primitiveShortAtPut) (145 primitiveConstantFill) (146 primitiveReadJoystick) (147 primitiveWarpBits) (148 primitiveClone) (149 primitiveTriangleBits) "File Primitives (150-169)" (150 primitiveFileAtEnd) (151 primitiveFileClose) (152 primitiveFileGetPosition) (153 primitiveFileOpen) (154 primitiveFileRead) (155 primitiveFileSetPosition) (156 primitiveFileDelete) (157 primitiveFileSize) (158 primitiveFileWrite) (159 primitiveFileRename) (160 primitiveDirectoryCreate) (161 primitiveDirectoryDelimitor) (162 primitiveDirectoryLookup) (163 168 primitiveFail) (169 primitiveDirectorySetMacTypeAndCreator) "Sound Primitives (170-199)" (170 primitiveSoundStart) (171 primitiveFail) (172 primitiveSoundStop) (173 primitiveSoundAvailableSpace) (174 primitiveSoundPlaySamples) (175 primitiveSoundPlaySilence) (176 primWaveTableSoundmixSampleCountintostartingAtpan) (177 primFMSoundmixSampleCountintostartingAtpan) (178 primPluckedSoundmixSampleCountintostartingAtpan) (179 199 primitiveFail) "Unimplemented Primitives (200-249)" (200 249 primitiveFail) "VM Implementor Primitives (250-255)" (250 clearProfile) (251 dumpProfile) (252 startProfiling) (253 stopProfiling) (254 primitiveFail) (255 primitiveFail) ).! ! !WarpBlt methodsFor: 'primitives'! displayTriangle: pts | fixedPt1 | sourceX _ sourceY _ 0. destX _ destY _ 0. height _ width _ 1. fixedPt1 _ (pts at: 1) x isInteger ifTrue: [16384] ifFalse: [16384.0]. p1x _ ((pts at: 1) x * fixedPt1) asInteger. p2x _ ((pts at: 2) x * fixedPt1) asInteger. p3x _ ((pts at: 3) x * fixedPt1) asInteger. p1y _ ((pts at: 1) y * fixedPt1) asInteger. p2y _ ((pts at: 2) y * fixedPt1) asInteger. p3y _ ((pts at: 3) y * fixedPt1) asInteger. p1z _ p2z _ p3z _ 16384. "z-warp ignored for now" self triangleBits! triangleBits | fixedPtOne cw t x1 x2 delta1 delta2 top bottom middle | fixedPtOne _ 16384. "1.0 in fixed-pt representation" cw _ true. "sort points" p1y > p2y ifTrue: [cw _ cw not. t _ p1y. p1y _ p2y. p2y _ t. t _ p1x. p1x _ p2x. p2x _ t]. p1y > p3y ifTrue: [cw _ cw not. t _ p1y. p1y _ p3y. p3y _ t. t _ p1x. p1x _ p3x. p3x _ t]. p2y > p3y ifTrue: [cw _ cw not. t _ p2y. p2y _ p3y. p3y _ t. t _ p2x. p2x _ p3x. p3x _ t]. top _ p1y//fixedPtOne. bottom _ p3y//fixedPtOne. top = bottom ifTrue: [^self]. middle _ p2y//fixedPtOne. delta1 _ self deltaFrom: p1x to: p3x nSteps: bottom-top. delta2 _ self deltaFrom: p1x to: p2x nSteps: (middle-top max: 1). cw ifTrue: [t _ delta1. delta1 _ delta2. delta2 _ t]. x1 _ p1x + (delta1//2). x2 _ p1x + (delta2//2). top to: middle-1 do: [:y | destX _ x2//fixedPtOne. width _ x1//fixedPtOne - destX. width > 0 ifTrue: [destY _ y. self copyBits]. x1 _ x1 + delta1. x2 _ x2 + delta2]. cw ifTrue: [delta1 _ self deltaFrom: p2x to: p3x nSteps: (bottom-middle max: 1). x1 _ p2x + (delta1//2)] ifFalse: [delta2 _ self deltaFrom: p2x to: p3x nSteps: (bottom-middle max: 1). x2 _ p2x + (delta2//2)]. middle to: bottom-1 do: [:y | destX _ x2//fixedPtOne. width _ x1//fixedPtOne - destX. width > 0 ifTrue: [destY _ y. self copyBits]. x1 _ x1 + delta1. x2 _ x2 + delta2]. ! ! !WarpBlt class methodsFor: 'examples'! colorCircle "Display newDepth: 16" "WarpBlt colorCircle" | form | form := Form extent: 200 @ 200 depth: 16. 100.0 to: 0.0 by: -1.0 do: [:r | self colorCircle: r around: 100@100 saturation: 1 brightness: 1-(r/100) on: form. form display]! colorCircle: c "WarpBlt colorCircle: 0@200" | p0 wb rad p1 | 100 to: 0 by: -2 do: [:r | p0 := c - (0 @ r) rounded. wb := WarpBlt toForm: Display. wb combinationRule: Form paint. 2 to: 360 by: 2 do: [:deg | wb fillColor: (Color hue: deg saturation: 1 brightness: r/100). rad := deg degreesToRadians. p1 := (rad sin * r @ (0 - rad cos * r)) rounded + c. wb displayTriangle: (Array with: p0 with: p1 with: c). p0 := p1]]! colorCircle: radius around: centerPoint saturation: saturation brightness: brightness on: aForm | p0 wb rad p1 | wb := WarpBlt toForm: aForm. wb combinationRule: Form paint. p0 := centerPoint - (0 @ radius) rounded. 2.0 to: 360.0 by: 2.0 do: [:deg | wb fillColor: (Color hue: deg saturation: saturation brightness: brightness). rad := deg degreesToRadians. p1 := (rad sin * radius) rounded @ (0.0 - rad cos * radius) rounded + centerPoint. wb displayTriangle: (Array with: p0 with: p1 with: centerPoint). p0 := p1]! colorCircleBackground "Display newDepth: 16" "WarpBlt colorCircleBackground" | form | form := Form extent: 200 @ 200 depth: Display depth. form fillColor: Color gray. 100.0 to: 0.0 by: -1.0 do: [:r | self colorCircle: r around: 100@100 saturation: 1-(r/100) brightness: 1-(r/200) on: form. form display]. Preferences desktopColor: form. ScheduledControllers updateGray; restore! !