The Trunk: MorphicExtras-mt.289.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: MorphicExtras-mt.289.mcz

commits-2
Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk:
http://source.squeak.org/trunk/MorphicExtras-mt.289.mcz

==================== Summary ====================

Name: MorphicExtras-mt.289
Author: mt
Time: 13 April 2021, 4:57:33.587381 pm
UUID: f869cf93-ce30-b14d-bc80-f48c40ce95f4
Ancestors: MorphicExtras-nice.288

Treats Graphics-ct.422 (inbox).

This commit is part of reconstruction of Objectland (also known as "The Worlds of Squeak"). For more information, see: http://forum.world.st/The-Inbox-MorphicExtras-ct-267-mcz-td5104764.html

=============== Diff against MorphicExtras-nice.288 ===============

Item was added:
+ ----- Method: Form class>>exampleColorSees (in category '*MorphicExtras-examples') -----
+ exampleColorSees
+ "Form exampleColorSees"
+ "First column as above shows the sneaky red/yellow pirate sneaking up on the blue/peach galleon.
+ Second column shows the 1bpp made from the red/yellow/transparent - white -> ignore this, black -> test this
+ Third shows the hit area - where red touches blue - superimposed on the original scene.
+ Fourth column is the tally of hits via the old algorithm
+ Last column shows the tally of hits via the new prim"
+
+ | formA formB maskA  offset tally map intersection left top dCanvas sensitiveColor soughtColor index |
+ formA := formB := maskA := offset := tally := map := intersection :=  nil. "just to shut up the compiler when testing"
+ Project current world restoreMorphicDisplay; doOneCycle.
+
+ sensitiveColor := Color red.
+ soughtColor := Color blue.
+
+ top := 50.
+ dCanvas := FormCanvas on: Display.
+ -50 to: 80 by: 10 do:[:p|
+ offset:= p@0. "vary this to check different states"
+ left := 10.
+
+ formA := (Form extent: 100@50 depth: 32) asFormOfDepth: 16 "so we can try original forms of other depths".
+ formB := Form extent: 100@50 depth: 32.
+
+ "make a red square in the middle of the form"
+ (FormCanvas on: formA) fillRectangle: (25@25 extent: 50@5) fillStyle: sensitiveColor.
+ (FormCanvas on: formA) fillRectangle: (25@30 extent: 50@5) fillStyle: Color transparent.
+ (FormCanvas on: formA) fillRectangle: (25@35 extent: 50@50) fillStyle: Color yellow.
+ "formA displayOn: Display at: left@top rule: Form paint.
+ dCanvas frameRectangle: (left@top extent: formA extent) width:2 color: Color green.
+ left := left + 150."
+
+ "make a blue block on the right half of the form"
+ (FormCanvas on: formB) fillRectangle: (50@0 extent: 50@100) fillStyle: soughtColor.
+ (FormCanvas on: formB) fillRectangle: (60@0 extent: 10@100) fillStyle: Color palePeach.
+ "formB displayOn: Display at: left@top rule: Form paint.
+ dCanvas frameRectangle: (left@top extent: formA extent) width:2 color: Color green.
+ left := left + 150."
+
+ intersection := (formA boundingBox translateBy: offset) intersect: (formB boundingBox).
+
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150.
+
+ maskA := Form extent: intersection extent depth: 1.
+
+ map := Bitmap new: (1 bitShift: (formA depth min: 15)).
+ map at: (index := sensitiveColor indexInMap: map) put: 1.
+
+ maskA copyBits: (intersection translateBy:  offset negated) from: formA at: 0@0 colorMap: map.
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green. left := left + 150.
+
+ "intersect world pixels of the color we're looking for with sensitive pixels mask"
+ map at: index put: 0.  "clear map and reuse it"
+ map at: (soughtColor indexInMap: map) put: 1.
+
+ maskA
+ copyBits: intersection
+ from: formB at: 0@0 clippingBox: formB boundingBox
+ rule: Form and
+ fillColor: nil
+ map: map.
+
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 170.
+
+ (maskA tallyPixelValues at: 2) asString asDisplayText displayOn: Display at: left@(top +20).
+ left := left + 70.
+
+ "now try using the new primitive"
+ tally := (BitBlt
+ destForm: formB
+ sourceForm: formA
+ fillColor: nil
+ combinationRule: 3 "really ought to work with nil but prim code checks"
+ destOrigin: intersection origin
+ sourceOrigin: (offset negated max: 0@0)
+ extent: intersection extent
+ clipRect: intersection)
+ primCompareColor: ((sensitiveColor pixelValueForDepth: formA depth) ) to: ((soughtColor pixelValueForDepth: formB depth) ) test: (Form compareMatchColor bitOr: Form compareTallyFlag).
+ tally  asString asDisplayText displayOn: Display at: left@(top +20).
+ top:= top + 60]!

Item was added:
+ ----- Method: Form class>>exampleTouchTest (in category '*MorphicExtras-examples') -----
+ exampleTouchTest
+ "Form exampleTouchTest"
+ "Demonstrate the algorithm used in Scratch code to determine if a sprite's non-transparent pixels touch a
+ non-transparent pixel of the background upon which it is displayed.
+ First column shows a form with a red block in the midst of transparent area sneaking up on a form with a transparent LHS and blue RHS. The green frame shows the intersection area.
+ Second column shows in grey the part of the red that is within the intersection.
+ Third column shows in black the blue that is within the intersection.
+ Fourth column shows just the A touching B area.
+ Fifth column is the tally of hits via the old algorithm
+ Last column shows the tally of hits via the new prim"
+ |formA formB maskA maskB offset tally map intersection left top dCanvas|
+ formA := formB := maskA := maskB := offset := tally := map := intersection :=  nil. "just to shut up the compiler when testing"
+
+ Project current world restoreMorphicDisplay; doOneCycle.
+
+ top := 50.
+ dCanvas := FormCanvas on: Display.
+ -50 to: 80 by: 10 do:[:p|
+ offset:= p@0. "vary this to check different states"
+ left := 10.
+
+ formA := Form extent: 100@50 depth: 32.
+ formB := Form extent: 100@50 depth: 16.
+
+ "make a red square in the middle of the form"
+ (FormCanvas on: formA) fillRectangle: (25@25 extent: 50@5) fillStyle: Color yellow.
+ (FormCanvas on: formA) fillRectangle: (25@30 extent: 50@5) fillStyle: Color transparent.
+ (FormCanvas on: formA) fillRectangle: (25@35 extent: 50@50) fillStyle: Color red.
+ "formA displayOn: Display at: left@top rule: Form paint.
+ dCanvas frameRectangle: (left@top extent: formA extent) width:2 color: Color green.
+ left := left + 150."
+
+ "make a blue block on the right half of the form"
+ (FormCanvas on: formB) fillRectangle: (50@0 extent: 50@100) fillStyle: Color blue.
+ (FormCanvas on: formB) fillRectangle: (60@0 extent: 10@100) fillStyle: Color palePeach.
+ "formB displayOn: Display at: left@top rule: Form paint.
+ dCanvas frameRectangle: (left@top extent: formA extent) width:2 color: Color green.
+ left := left + 150."
+
+ intersection := (formA boundingBox translateBy: offset) intersect: (formB boundingBox).
+
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150.
+
+ maskA := Form extent: intersection extent depth: 2.
+ formA displayOn: maskA at: offset  - intersection origin rule: Form paint.
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150.
+
+ maskB := Form extent: intersection extent depth: 2.
+ formB displayOn: maskB at: intersection origin negated rule: Form paint.
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ maskB displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150.
+
+ map := Bitmap new: 4 withAll: 1.
+ map at: 1 put: 0.  "transparent"
+
+ maskA copyBits: maskA boundingBox from: maskA at: 0@0 colorMap: map.
+ "maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150."
+
+ maskB copyBits: maskB boundingBox from: maskB at: 0@0 colorMap: map.
+ "maskB displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150."
+
+ maskB displayOn: maskA at: 0@0 rule: Form and.
+ maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 170.
+
+ (maskA boundingBox area -( maskA tallyPixelValues at: 1)) asString asDisplayText displayOn: Display at: left@(top +20).
+ left := left + 70.
+
+ "now try using the new primitive"
+ tally := (BitBlt
+ destForm: formB
+ sourceForm: formA
+ fillColor: nil
+ combinationRule: 3 "really ought to work with nil but prim code checks"
+ destOrigin: intersection origin
+ sourceOrigin: (offset negated max: 0@0)
+ extent: intersection extent
+ clipRect: intersection)
+ primCompareColor: ((Color transparent pixelValueForDepth: formA depth) bitAnd: 16rFFFFFF) to: ((Color transparent pixelValueForDepth: formB depth) bitAnd: 16rFFFFFF) test: (Form compareNotColorANotColorB bitOr: Form compareTallyFlag).
+ tally  asString asDisplayText displayOn: Display at: left@(top +20).
+ top:= top + 60]!

Item was added:
+ ----- Method: Form class>>exampleTouchingColor (in category '*MorphicExtras-examples') -----
+ exampleTouchingColor
+ "Form exampleTouchingColor"
+ "Demonstrate the algorithm used in Scratch code to determine if a sprite's non-transparent pixels touch a
+ particular color pixel of the background upon which it is displayed.
+ First column as above shows the sneaky red/yellow pirate sneaking up on the blue/peach galleon.
+ Second column shows the 1bpp made from the red/yellow/transparent - white -> ignore this, black -> test this
+ Third shows the hit area (black) superimposed on the original scene
+ Fourth column is the tally of hits via the old algorithm
+ Last column shows the tally of hits via the new prim"
+ |formA formB maskA  offset tally map intersection left top dCanvas ignoreColor soughtColor|
+ formA := formB := maskA := offset := tally := map := intersection :=  nil. "just to shut up the compiler when testing"
+ Project current world restoreMorphicDisplay; doOneCycle.
+
+ ignoreColor := Color transparent.
+ soughtColor := Color blue.
+
+ top := 50.
+ dCanvas := FormCanvas on: Display.
+ -50 to: 80 by: 10 do:[:p|
+ offset:= p@0. "vary this to check different states"
+ left := 10.
+
+ formA := (Form extent: 100@50 depth: 32) asFormOfDepth: 16 "so we can try original forms of other depths".
+ formB := Form extent: 100@50 depth: 32.
+
+ "make a red square in the middle of the form"
+ (FormCanvas on: formA) fillRectangle: (25@25 extent: 50@5) fillStyle: Color red.
+ (FormCanvas on: formA) fillRectangle: (25@30 extent: 50@5) fillStyle: Color transparent.
+ (FormCanvas on: formA) fillRectangle: (25@35 extent: 50@50) fillStyle: Color yellow.
+ "formA displayOn: Display at: left@top rule: Form paint.
+ dCanvas frameRectangle: (left@top extent: formA extent) width:2 color: Color green.
+ left := left + 150."
+
+ "make a blue block on the right half of the form"
+ (FormCanvas on: formB) fillRectangle: (50@0 extent: 50@100) fillStyle: soughtColor.
+ (FormCanvas on: formB) fillRectangle: (60@0 extent: 10@100) fillStyle: Color palePeach.
+ "formB displayOn: Display at: left@top rule: Form paint.
+ dCanvas frameRectangle: (left@top extent: formA extent) width:2 color: Color green.
+ left := left + 150."
+
+ intersection := (formA boundingBox translateBy: offset) intersect: (formB boundingBox).
+
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 150.
+
+ maskA := Form extent: intersection extent depth: 1.
+
+ map := Bitmap new: (1 bitShift: (formA depth min: 15)).
+ map atAllPut: 1.
+ map at: ( ignoreColor indexInMap: map) put: 0.
+
+ maskA copyBits: (intersection translateBy:  offset negated) from: formA at: 0@0 colorMap: map.
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green. left := left + 150.
+
+ "intersect world pixels of the color we're looking for with sensitive pixels mask"
+ map atAllPut: 0.  "clear map and reuse it"
+ map at: (soughtColor indexInMap: map) put: 1.
+
+ maskA
+ copyBits: intersection
+ from: formB at: 0@0 clippingBox: formB boundingBox
+ rule: Form and
+ fillColor: nil
+ map: map.
+
+ formB displayOn: Display at: left@top rule: Form paint.
+ formA displayOn: Display at: (left@top) + offset rule: Form paint.
+ maskA displayOn: Display at: (left@top) + intersection origin rule: Form paint.
+ dCanvas frameRectangle: (intersection translateBy: left@top) width:2 color: Color green.
+ left := left + 170.
+
+ (maskA tallyPixelValues at: 2) asString asDisplayText displayOn: Display at: left@(top +20).
+ left := left + 70.
+
+ "now try using the new primitive"
+ tally := (BitBlt
+ destForm: formB
+ sourceForm: formA
+ fillColor: nil
+ combinationRule: 3 "really ought to work with nil but prim code checks"
+ destOrigin: intersection origin
+ sourceOrigin: (offset negated max: 0@0)
+ extent: intersection extent
+ clipRect: intersection)
+ primCompareColor: ((ignoreColor pixelValueForDepth: formA depth) bitAnd: 16rFFFFFF) to: ((soughtColor pixelValueForDepth: formB depth) bitAnd: 16rFFFFFF) test: (Form compareNotColorAMatchColorB bitOr: Form compareTallyFlag).
+ tally  asString asDisplayText displayOn: Display at: left@(top +20).
+ top:= top + 60]!

Item was added:
+ ----- Method: Form class>>squeakLogo (in category '*MorphicExtras-sprites') -----
+ squeakLogo
+
+ ^ Imports default imports
+ at: #squeakLogo
+ ifAbsentPut: [ Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes: self squeakLogoContents readStream) ]!

Item was added:
+ ----- Method: Form class>>squeakLogoContents (in category '*MorphicExtras-sprites') -----
(excessive size, no diff calculated)

Item was added:
+ ----- Method: MenuIcons class>>backIconContents (in category '*MorphicExtras-private - icons') -----
+ backIconContents
+ "Private - Method generated with the content of the file /home/dgd/back.png"
+ ^ 'iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAABF0
+ RVh0U29mdHdhcmUAU29kaXBvZGmU4xfQAAADRElEQVRIie3WW4hVVRgH8N/e+5y56aCizpnR
+ jJzUCNFqLhqEWGlQDz0mGEJBCSL1Ur1YZA9BSIZGZg9dVBoo0B5D6qGwOzVaairZiJiKZ0hs
+ 1NE5c2bm7N3DmXF2zQyO5lv+YbFZa/2/77+/y9prcxNpNFnoHi3/xUU4LtYiszX5WGC/ULsW
+ m69XMLgqo8UzEhtRlVpNJJb62Tc3TnCxnH7bBR65sra0nt8vkC9Ah9Ay7U5d2Z+jUrUaoRqx
+ Hr/qGp9gk0cFPsB0UFfFugUsybH1N7YfS7O7UTE4/u2vgDze02ijXUrRCLFmzwtswwRhwGO3
+ Wb55tcWNzQ75g7+KfNmZtqhEZoyXz2IKlutSIe+LNCnQ7A08NxRVuKHVywvXWG+lDXZ5SRs9
+ A7Qd53g3pSQlG1GboTY7PKojNh/hXBFK+s0oC85XocoOrASzJ6p9+wE7c69I8K7PfKrdgBK4
+ XYNWc+VMFgwGlkgU9Svo06OooOiksw7u3MPrhwySVmVAlTasAAummPzWg16oXWGdD+13fESe
+ ulxSZ5I7zTJHg1tNVxIr6FNQ1KlLuw7fOkJ9dTqHDwWarBJoA7lqPlqiflJO58gGuz78cJZn
+ fxya/ZQRutdQKZY1MKlifGJJzEA/A32UUs+4NDhispVcjtMRdmeU7BBag8iJM5yOmDmPYIwj
+ 2pXn5MGy2LhQl3pJF0O/2CuwBXzfS0cnR7+j9/IoUSWcPnINYuhNcRN/DnXpRFUOoFFNwKYa
+ wgJ1s2mYS1TuLedOceLAsIMwIsoSZEhC4oCBgD70xpzB9ktcGExr4PHhvLVqFPsaM02NeC2L
+ XjKVTJtVdp7vKNfufB1bznO2RLE03lhj5P5ZqBZ3SHyFnFsyrM+SFEaabqrm6CjrY6Mf79tn
+ 7cjOaDVfbA+mmRzyajUVqXpGE3g6NQ88IXZYKFISCUVioUAfetDjolOOKZbpo6HV3WK70SCL
+ F2uZ0V3eOzCFd64cm8/t8/C1hDr29dSqXuwT3AfuyjIvy66etPVT9tp2YwShWRZvYu0ouydd
+ MG8oVePFyOspjbxY3m4znMD9hm/90xJPOuzYmLZj4Oq/GENYZKqS1QKxPlsdNMqX4Sb+D/gb
+ LOgMCUjhiw4AAAAASUVORK5CYII='!

Item was added:
+ ----- Method: MenuIcons class>>forwardIconContents (in category '*MorphicExtras-private - icons') -----
+ forwardIconContents
+ "Private - Method generated with the content of the file /home/dgd/forward.png"
+ ^ 'iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAABF0
+ RVh0U29mdHdhcmUAU29kaXBvZGmU4xfQAAADXUlEQVRIie3WX2iVZRwH8M97znv2f1o2Fy4r
+ hxMvhhCeTewmJcuEbiLLP0GECoJWEIlYUBoR3QTVhRRIXffvJupiBF4oRCZukq5Na4LhlKnT
+ 6XE7c/P8ebs4O8fNlh3nVdEPHnif5/d8f9/3+33e53le/usRvyv0UknzzDXgQrmQ2IzJkt4V
+ 6BT4xVJfWKa5HFgwI7J27fIOmerQmMBOnfbeGWGrChXmoVZeSlZKjzQisEyznA4s1lhFWwMd
+ Z4tZIh0SNjk8vc03CZO2Yzcap32R6WLLIrYt5sgl3jvOudFiZlBki6O+vxVSsKTNK9iLurLJ
+ 4PkFLKy38YE1Wp5b7uT1P+hJEakV2KDJiAGHpipMSmAIdeoT7GwlGzGaJT2pjeUK49l8Aflw
+ HZtaqI57xwv22OhD33qj+2OZXYe5OFaYF/nIUTtMmB5ot0LeAbB5kSXbn9LqIRXCUksIBZOE
+ Dxl2RJ8T+ktjKy2x1RpN5lh7aY/Lr+6n71qR9EvjXtLjRijnyVKt+TVOOqtNiyc84kENQnGJ
+ Cef7XXLKgGtG9Ruc4u4B3Q7o1mKelxue9ennCYOv76fzMoENqmXxYiDpK6wD7y9ldVPZS3i7
+ mKPe0PAQ6w/etDfwTIjh0qx0mounuXEdAUFAECMekqgkrCCsJFFReA7+/twYMkx9guVz+W7C
+ +rwVIVKlWUGK/vPlSQgC5rfSuGD6fD7H6V76SvXGBPbFBJM2aCpTHhlEEQO/E+X/mhu+TO9B
+ jl3lxETNyG5dTsbdb1xgK+gaY3YdFdXkagiqCWuIVxFWEYbEYhMkUUFFWEntPYWimXHOdHO2
+ l5Fa3koVyQ5aaJteUYCYpAtoKFtdTYwd9zF/sGBtY3OBfOgcuSz5Wbw2zHgEXVilq7B0cUSa
+ jKEdNWURZiL6MqyMCkrTVxhNFZTnZ7MrzWgeesSt0ulKETr1GFviXjUqkJAVE8rLysnIqZKT
+ 0SzmR1SCfXVEIzfxV+t5e4QbEZzCY7oMTKa48+sp6TNsAetn8fi1wvY4Vssnw8Vb41c8rcuZ
+ W+EzIVyNH0r99gT9Oc6XvtavZWx2XHo6+Mwu4DY/iTx6y2hO5E1HfXA76Ex/MTbh50n930RW
+ /xMZM1VYxLZZK2/MQh2+kbuLWv/Hvyj+BJaPHpqZ0oo8AAAAAElFTkSuQmCC'!

Item was added:
+ ----- Method: MenuIcons class>>helpIconContents (in category '*MorphicExtras-private - icons') -----
+ helpIconContents
+ "Private - Method generated with the content of the file /home/dgd/help.png"
+ ^ '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
+ W2tds0/6AAAAAElFTkSuQmCC'!

Item was added:
+ ----- Method: MenuIcons class>>openIconContents (in category '*MorphicExtras-private - icons') -----
+ openIconContents
+ "Private - Method generated with the content of the file /home/dgd/open.png"
+ ^ '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
+ 0/8ClPo3sCGCJrEAAAAASUVORK5CYII='!