Class new title: Rectangle subclassof: Object fields: 'origin corner' declare: '' * t1 [Rectangle new origin: origin * t1 asRectOrigin corner: corner * t1 asRectCorner] + t1 [Rectangle new origin: origin + t1 asRectOrigin corner: corner + t1 asRectCorner] - t1 [Rectangle new origin: origin - t1 asRectOrigin corner: corner - t1 asRectCorner] / t1 [Rectangle new origin: origin / t1 asRectOrigin corner: corner / t1 asRectCorner] = t1 [origin = t1 origin and: corner = t1 corner] ALTObitsFromString: t1 mode: t2 [user croak] primitive: 53 ALTObitsIntoString: t1 mode: t2 [user croak] primitive: 53 ALTOblt: t1 mode: t2 [user croak] primitive: 53 ALTObltcomp: t1 mode: t2 [user croak] primitive: 53 ALTObrush: t1 mode: t2 color: t3 [user croak] primitive: 53 ALTOcolor: t1 mode: t2 [user croak] primitive: 53 area [self width * self height] asRectCorner [corner] asRectOrigin [origin] asRectangle bitStringLength | t1 [t1 _ corner - origin. 2 * t1 y * (t1 x + 15 / 16)] bitsFromStream: t1 | t2 t3 [t2 _ origin rect: origin + (self width  (16 min: self height)). t3 _ String new: t2 bitStringLength. while t2 maxY  corner y do [t1 into: t3. t2 bitsFromString: t3. t2 moveby: 0  16]. t2 minY < corner y  [t2 corner y_ corner y. t3 _ nil. t3 _ String new: t2 bitStringLength. t1 into: t3. t2 bitsFromString: t3]] bitsFromString: t1 [self bitsFromString: t1 mode: storing] bitsFromString: t1 mode: t2 | t3 [NoteTaker  [t3 _ BitBlt new toDisplay. t3 function_ t2. t3 sourceForm_ Form new extent: corner - origin bits: t1 offset: nil. t3 dest_ origin. t3 extent_ corner - origin. t3 source_ 0  0. t3 callBLT] self ALTObitsFromString: t1 mode: t2] bitsFromString: t1 mode: t2 clippedBy: t3 | t4 t5 t6 [NoteTaker  [t5 _ BitBlt new toDisplay window: t3. t5 function_ t2. t5 sourceForm_ Form new extent: corner - origin bits: t1 offset: nil. t5 dest_ origin. t5 extent_ corner - origin. t5 source_ 0  0. t5 callBLT] self bitStringLength  t1 length  [user notify: 'wrong bit string length'] t4 _ self intersect: user screenrect. [nil  t3  [] t4 _ t4 intersect: t3]. t6 _ BitBlt init. t6 destbase_ mem  54. t6 destraster_ user screenrect width / 16 | 2. t6 dest_ t4 origin. t6 extent_ t4 extent. t6 sourceraster_ corner x - origin x + 15 / 16. t6 source_ t4 origin - origin. t6 sourcebase_ t1. t6 copy: t2] bitsIntoString | t1 [t1 _ String new: self bitStringLength. self bitsIntoString: t1 mode: storing. t1] bitsIntoString: t1 [self bitsIntoString: t1 mode: storing] bitsIntoString: t1 mode: t2 | t3 [NoteTaker  [t3 _ BitBlt new fromDisplay. t3 function_ t2. t3 destForm_ Form new extent: corner - origin bits: t1 offset: nil. t3 dest_ 0  0. t3 extent_ corner - origin. t3 source_ origin. t3 callBLT] self ALTObitsIntoString: t1 mode: t2] bitsIntoString: t1 mode: t2 clippedBy: t3 | t4 t5 t6 [NoteTaker  [t5 _ BitBlt new fromDisplay window: t3. t5 function_ t2. t5 destForm_ Form new extent: corner - origin bits: t1 offset: nil. t5 dest_ 0  0. t5 extent_ corner - origin. t5 source_ origin. t5 callBLT] self bitStringLength  t1 length  [user notify: 'wrong bit string length'] t4 _ self intersect: user screenrect. [t3  nil  [] t4 _ t4 intersect: t3]. t6 _ BitBlt init. t6 destraster_ corner x - origin x + 15 / 16. t6 dest_ t4 origin - origin. t6 extent_ t4 extent. t6 sourcebase_ mem  54. t6 sourceraster_ user screenrect width / 16 | 2. t6 source_ t4 origin. t6 destbase_ t1. t6 copy: t2] bitsOntoStream: t1 | t2 t3 [t2 _ origin rect: origin + (self width  (16 min: self height)). t3 _ String new: t2 bitStringLength all_ 0. while t2 maxY  corner y do [t2 bitsIntoString: t3. t2 moveby: 0  16. t1 append: t3]. t2 minY < corner y  [t2 bitsIntoString: t3. t1 append: t3  (1 to: t3 length / t2 height * (corner y - t2 minY))]] blowup: t1 by: t2 | t3 t4 [t4 _ Rectangle new origin: t1 extent: self extent * t2. [(t4 has: origin) or: (t4 has: corner)  [t3 _ self bitsIntoString. t4 outline. self moveto: t4 origin. self bitsFromString: t3] t4 outline]. self blowup: t1 by: t2 spacing: 1] blowup: t1 by: t2 spacing: t3 | t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 [t4 _ self extent. t2 _ t2 asPoint. t3 _ t3 asPoint. t11 _ Rectangle new origin: t1 extent: t4 * t2. t5 _ 1  0. t9 _ t4 x. t10 _ 0  t4 y. t14 _ (t2 - t3) x. for t12 to: 2 do [t6 _ t5 * 1. t7 _ t5 * t2. t8 _ Rectangle new origin: t5 * t9 + [t12 = 1  [self origin] t1] extent: t5 + t10. t11 _ t1 + (t5 * (t2 * t9)). for t13 to: t9 do [t11 _ t11 - t7. t8 moveby: t6. t8 blt: t11 mode: storing]. t8 _ Rectangle new origin: t1 + t5 extent: t10 + (t5 * (t2 - 1)). for t13 to: t9 do [t8 clear: white. t8 moveby: t7]. t8 _ Rectangle new origin: t1 extent: t10 + (t5 * (t2 * t9 - 1)). for t13 to: t14 - 1 do [t8 blt: t1 + t5 mode: oring]. t5 _ 0  1. t9 _ t4 y. t10 _ (t2 * t4) x  0. t14 _ (t2 - t3) y]] blt: t1 mode: t2 [NoteTaker  [DisplayBLTer bltrect: self topt: t1 mode: (t2 land: 3) color: 0] self ALTOblt: t1 mode: t2] blt: t1 mode: t2 clippedBy: t3 | t4 t5 t6 t7 [NoteTaker  [t6 _ DisplayBLTer copy. t6 window: t3. t6 bltrect: self topt: t1 mode: (t2 land: 3) color: 0] t4 _ (Rectangle new origin: t1 extent: self extent) intersect: user screenrect. [nil  t3  [] t4 _ t4 intersect: t3]. t5 _ origin + t4 origin - t1. t7 _ BitBlt init toDisplay. t7 dest_ t4 origin. t7 extent_ t4 extent. t7 sourcebase_ mem  54. t7 sourceraster_ user screenrect width / 16 | 2. t7 source_ t5. t7 copy: t2] bltcomp: t1 mode: t2 [NoteTaker  [DisplayBLTer bltrect: self topt: t1 mode: 4 + (t2 land: 3) color: 0] self ALTObltcomp: t1 mode: t2] border: t1 color: t2 | t3 [t3 _ Rectangle new origin: origin - (t1  t1) corner: corner x + t1  origin y. t3 clear: t2. t3 moveto: origin x - t1  corner y. t3 clear: t2. t3 origin_ corner x  (origin y - t1). t3 clear: t2. t3 moveto: origin - (t1  t1). t3 clear: t2] bottom [corner y] boxcomp | t1 [t1 _ Rectangle new origin: origin - (2  2) corner: corner x + 2  origin y. t1 color: black mode: xoring. t1 moveto: origin x - 2  corner y. t1 color: black mode: xoring. t1 origin_ corner x  (origin y - 2). t1 color: black mode: xoring. t1 moveto: origin - (2  2). t1 color: black mode: xoring] brush: t1 mode: t2 color: t3 [NoteTaker  [DisplayBLTer bltrect: self topt: t1 mode: 8 + (t2 land: 3) color: t3] self ALTObrush: t1 mode: t2 color: t3] brush: t1 mode: t2 color: t3 clippedBy: t4 | t5 t6 t7 t8 [NoteTaker  [t7 _ DisplayBLTer copy. t7 window: t4. t7 bltrect: self topt: t1 mode: 8 + (t2 land: 3) color: t3] t5 _ (Rectangle new origin: t1 extent: self extent) intersect: user screenrect. [nil  t4  [] t5 _ t5 intersect: t4]. t6 _ origin + t5 origin - t1. t8 _ BitBlt init. t8 color_ t3. t8 destbase_ mem  54. t8 destraster_ user screenrect width / 16 | 2. t8 dest_ t5 origin. t8 extent_ t5 extent. t8 sourcebase_ mem  54. t8 sourceraster_ user screenrect width / 16 | 2. t8 source_ t6. t8 paint: t2] center [origin + corner / 2] clear [self color: background mode: storing] clear: t1 [self color: t1 mode: storing] color: t1 mode: t2 [NoteTaker  [DisplayBLTer bltrect: self topt: origin mode: 12 + (t2 land: 3) color: t1] self ALTOcolor: t1 mode: t2] comp [self color: black mode: xoring] comp: t1 [self color: t1 mode: xoring] copy [origin copy rect: corner copy] corner [corner] corner_ t1 [corner _ t1] corners | t1 [t1 _ Vector new: 4. t1  1 _ origin. t1  2 _ corner x  origin y. t1  3 _ corner. t1  4 _ origin x  corner y. t1] dragto: t1 | t2 t3 [self blt: t1 mode: storing. t2 _ t1 rect: t1 + self extent. for t3 from: (self minus: t2) do [t3 clear]. origin _ t1. corner _ t2 corner] edge: t1 [t1 = 0  [origin y] t1 = 1  [origin x] t1 = 2  [corner y] t1 = 3  [corner x] user notify: 'Invalid side'] empty [origin < corner  false] extent [corner - origin] extent_ t1 [corner _ origin + t1. t1] fillin: t1 mode: t2 | t3 t4 t5 t6 t7 t8 t9 [t3 _ Turtle init. t5 _ origin + (self width  0). t6 _ Rectangle new origin: t5 extent: self extent. t7 _ 1  0 , (1  0) , (0  1) , (0  1). t4 _ t6 bitsIntoString. self blt: t5 mode: storing. user waitbug. t3 place: user mp. t3 pendn. while user anybug do [t3 goto: user mp]. self blt: t5 mode: xoring. t6 blt: origin mode: xoring. user waitbug. while user anybug do [for t9 from: 0 to: 2 by: 2 do [for t8 to: 2 do [t6 blt: t7  (t9 + t8) + t5 mode: oring]. self blt: t5 mode: erasing]]. t6 brush: origin mode: t2 color: t1. t6 bitsFromString: t4] flash [self comp. self comp] fromuser | t1 [origin _ OriginCursor showwhile [user waitbug]. t1 _ origin. CornerCursor showwhile [while [corner _ t1. t1 _ user mpnext. t1] do [self comp. t1 _ t1 max: origin. self comp]. nil]] fromuserevenword | t1 [origin _ OriginCursor showwhile [user waitbug]. t1 _ origin. CornerCursor showwhile [while [corner _ t1. t1 _ user mpnext. t1] do [self comp. t1 _ t1 x + 15 | 16  t1 y max: origin. self comp]. nil]] growby: t1 [corner _ corner + t1] growto: t1 [corner _ t1] has: t1 [origin  t1 and t1 < corner] height [corner y - origin y] height_ t1 [corner y_ origin y + t1] include: t1 [(origin min: t1 origin) rect: (corner max: t1 corner)] inset: t1 [origin + t1 rect: corner - t1] inset: t1 and: t2 [origin + t1 rect: corner - t2] intersect: t1 [Rectangle new origin: (origin max: t1 origin) corner: (corner min: t1 corner)] intersects: t1 [(origin max: t1 origin) < (corner min: t1 corner)] isWithin: t1 [origin  t1 origin and corner  t1 corner] leftside [origin x] max: t1 [Rectangle new origin: (origin min: t1 origin) corner: (corner max: t1 corner)] maxX [corner x] maxY [corner y] minX [origin x] minY [origin y] minus: t1 | t2 t3 t4 [[origin  t1 corner and t1 origin  corner  [] self inVector]. t2 _ (Vector new: 4) asStream. [t1 origin y > origin y  [t3 _ t1 origin y. t2 next_ origin rect: corner x  t3] t3 _ origin y]. [t1 corner y < corner y  [t4 _ t1 corner y. t2 next_ origin x  t4 rect: corner] t4 _ corner y]. [t1 origin x > origin x  [t2 next_ origin x  t3 rect: t1 origin x  t4]]. [t1 corner x < corner x  [t2 next_ t1 corner x  t3 rect: corner x  t4]]. t2 contents] moveby: t1 [origin _ origin + t1. corner _ corner + t1] moveto: t1 [corner _ corner + t1 - origin. origin _ t1] nearest: t1 [((origin x max: t1 x) min: corner x)  ((origin y max: t1 y) min: corner y)] origin [origin] origin: t1 corner: t2 [origin _ t1. corner _ t2] origin: t1 extent: t2 [origin _ t1. corner _ origin + t2] origin_ t1 [origin _ t1] outline [self outline: 2] outline: t1 | t2 [t2 _ 1  1 * t1. (self inset: t2) clear: black. self clear: white] printon: t1 [t1 print: origin. t1 append: ' rect: '. t1 print: corner] reverse [self color: black mode: xoring] rightside [corner x] rotate | t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 [t1 _ self extent x. t3 _ t1  t1. t6 _ Rectangle new origin: origin extent: t3. t4 _ origin + (0  t1). t2 _ Rectangle new origin: t4 extent: t3. t5 _ t4 + (t1  0). t7 _ Rectangle new origin: t5 extent: t3. t8 _ 0  0 , (1  0) , (0  0) , (0  1) , (1  1) , (0  1) , (1  0) , (1  0) , (1  0). t9 _ 0  0 , (1  1) , (0  0) , (1  1) , (1  1) , (1  1). t11 _ t1 / 2. t2 clear: white. (Rectangle new origin: t4 extent: t11  t11) clear: black. until t11 < 1 do [for t10 to: 3 do [t7 clear: white. t2 blt: t8  t10 * t11 + t5 mode: storing. t2 blt: t8  (3 + t10) * t11 + t5 mode: oring. t6 bltcomp: t5 mode: erasing. t7 blt: t8  (6 + t10) * t11 + origin mode: xoring]. for t10 to: 3 do [t7 clear: white. t2 blt: t9  t10 * t11 + t5 mode: storing. t6 bltcomp: t5 mode: erasing. t7 blt: t9  (3 + t10) * t11 + origin mode: xoring]. t11 _ t11 / 2. t11 < 1  [] t2 blt: 0  t11 + t4 mode: erasing. t2 blt: t11  0 + t4 mode: erasing. t2 blt: t11 * 2  0 + t4 mode: oring. t2 blt: 0  (2 * t11) + t4 mode: oring]] side: t1 [t1 = 0  [origin rect: corner x  origin y] t1 = 1  [origin rect: origin x  corner y] t1 = 2  [origin x  corner y rect: corner] t1 = 3  [corner x  origin y rect: corner] user notify: 'Invalid side'] side: t1 distanceTo: t2 [t1 = 0  [t2 y - origin y] t1 = 1  [t2 x - origin x] t1 = 2  [corner y - t2 y] t1 = 3  [corner x - t2 x] user notify: 'Invalid side'] sideNearest: t1 | t2 t3 t4 t5 [t3 _ 32767. for t4 from: (0 to: 3) do [t2 _ self side: t4 distanceTo: t1. t3 > t2 abs  [t3 _ t2. t5 _ t4]]. t5] size [corner - origin] top [origin y] translate: t1 [origin _ origin + t1. corner _ corner + t1] translateto: t1 [self translate: t1 - origin] width [corner x - origin x] width_ t1 [corner x_ origin x + t1] withEdge: t1 at: t2 [t1 = 0  [origin x  t2 rect: corner] t1 = 1  [t2  origin y rect: corner] t1 = 2  [origin rect: corner x  t2] t1 = 3  [origin rect: t2  corner y] user notify: 'Invalid side'] withSide: t1 at: t2 [t1 = 0  [origin x  t2 y rect: corner] t1 = 1  [t2 x  origin y rect: corner] t1 = 2  [origin rect: corner x  t2 y] t1 = 3  [origin rect: t2 x  corner y] user notify: 'Invalid side']