REBOL [ Title: "Pointillize" Date: 13-Nov-2004/15:11:18+1:00 Name: none Version: none File: none Home: none Author: "oldes" Owner: none Rights: none Needs: none Tabs: none Usage: none Purpose: none Comment: none History: none Language: none Type: none Content: none Email: oliva.david@seznam.cz require: [rss-project 'event-filter] preprocess: true ] comment { #### RSS include: %event-filter.r #### Title: "Event filter patch" #### Author: "Gabriele Santilli, Oldes" ----} context [ no-queue: context [move: offset: none] wake-event: func [event /local no-btn] bind [ either not pop-face [ do event empty? screen-face/pane ] [ either any [pop-face = event/face within? event/offset win-offset? pop-face pop-face/size] [ no-btn: false if block? get in pop-face 'pane [ no-btn: foreach item pop-face/pane [if get in item 'action [break/return false] true] ] if any [all [event/type = 'up no-btn] event/type = 'close] [hide-popup] do event ] [ if pop-face/action [ if not find [move time] event/type [hide-popup] do event ] ] none? find pop-list pop-face ] ] in system/view 'self system/view/event-port/awake: func [port /local event events lasttype] [ events: clear [] while [event: pick port 1] [ either all [in no-queue event/type lasttype = event/type] [ change back tail events event ] [ lasttype: event/type insert tail events event ] ] foreach event events [ if wake-event event [return true] ] false ] ] comment "---- end of RSS include %event-filter.r ----" img: load #{ 47494638396120002000F700004A0201E38C44DD9243AC5516E4A251380000E6 A24ADEA450C3661BDA8E418739026B1200ECA451BC6724DA9537170201F68B61 E39B43CE8536C88224741B01BC621BC26F44620D00EAA665020401690C00D483 39D99C4AD37A32C46B23F2AB5BC974295B0100DA8C3D760D00FEC370B35D1CBA 6834551502D68A3CEA9E52F19A55CA7C32C4731BDA863CF9C26A7B1B04DC8D55 CC7B2EC54F16761600E3963AD57E2CFABB6AE18C40D28234A63700D28B35AB56 0BE49345C59267D76A38E59A52D6862CF5AD62DA8A35EBAA5CD48143CD884BEC A659C5752B833E1BC26936FFDB97E18B50DC8742BB5A0C752313942901DC8F49 7D3807D07620752101B65A14D98B4B430411D97D38EB9C5A5B0800E2B169963C 03E69A4CDC985BB65D26811602BB5A1C6C1C0B9D4301560C00FECB85F5B059D2 7E3BBE7729EC934CECC4766E1901701100C47032B36013540200933400280000 F3A4629D3B01D28D42BE6212DC9844944216903A0BF4AA49E99B4E781807B253 0F7E1A19E2924AC6692BE5AE52E6A13BD49945812700E19E4FC2662AAA4E04E3 A558E19647E4B759751A097016016C0D0AA24E0E73150C8C290D5F0500E6964A FDAD5E661100FCB56CAD4B0AED9650E294536C1408E59949E6AD5DFEAC64E09E 4A7D1B0A711405AD5421FBA15EC7782C9B4108C16F26632707DD8148BD5D1487 2F00BA691CA74E24E39A4BD17632E59E4C792D00A44C02FFD98B6F0700E8AB53 701106E79049E6924EFFE39C641900E5974CDD7833C775389B490FCC722EBA8F 5ACD8E3BE3964EC77E2FCC7D37DE994A6A131CF3BB64A3460BD686479D3F0CF0 B060F8AD6A7B200B83230B7E1F0077260888210289200BD9914EE3852ED79341 903E0097480F934C2EA84E14EA9459E191615C050EF8A7727D2D0EAF6B348955 0A8C4412F4865560140AB47B2080231BBC6E0CE7AB759C5C1FB6430DFFEFAB6B 0008D3971D650E09FEB266CB7F3FCE6F25E99940F1A358EEA354BE4D237C1409 7513067A1100CF672ADC8930CC8B53540A19E0C88A9C4F007F3710B8671DFFB4 7FB5661BFFCF7BC26024B8593921F90400000000002C00000000200020000008 FF003DC4405127C2AA41463E1880E60E120A14905A8812A36C818271DA4C10F2 0186D21E42773ADC80642B05164B55A0706998E786485554B6A0020508908318 1510A8AA50A8829716B236B0F1F44690A95025748112D102C4060F542AD04851 8DD4951A1E2A24AD40054C075D3BB65008A1A818187F60DAC408B06143830A2D F044E813805089060D4AF8D155AA9087ACBFD411C312A752D32312DAD99208A2 129639DFB69D18B34043AE01BAD635A9A00A0D8721438C00D31121828004E9DA E1D0D7A0859928701E3CB072CD9C9A2D7ED67958212280830829520890200147 0B019B08DC4050A8C5B4026EA6E4D823475A292673CE78F8854317934386E694 FFA004669E0701043689A8D0AA85045C5D202491C1C88B147A1B7E6D307E4507 23478B0040D90C2070018C00795CD1CA2934B0500235725011803B4384274A21 22DCC0443E706490C103A38482400C024023400A3CB4D146072954324824B030 E0020CA8AC11821B02E0348523EFF8238A042CD0715A02A9A4C2054E262CC141 19889041461405009005277CAC92000E137C33C1044DE40086351F6022C22102 E458C100FC6C42022D3D4439C50BF0F011CC26067C600816DDF8E00316C22002 CC211B2450471D31ACB3053EEDA481041C978013C61414503006078110F0491E 8620F2478C3A0C72A4082490904007EBDC62C914703831C51733B42A290D1160 FF110401811C70080F28E8408F0E09F0C00E0DA00C20850A7600E0841389CCA0 473CB134F2C898290461C30186B474030A2C04F0C920BE78200339F964A3C61A 2FCCF08222CAAED188067DD802CD10AEB8004D1F955CA10F2F5A886381272678 F14401055CD2CC1723CCA0C81A332CD0492CC4FC00080124F433081A57540005 06168C225B2DCCBC5280374E70F2853C0623BC80229798D18701041862CC0FB2 5031401C57B0024032FF68C38D325BDC21C9028928F20205252B22C90D024430 0801F35EF14609CE3C734B155AA46183267168428D1B6A8421093233ACA18106 0B5C208408BD6072480295F831031B18387040261F94E1820B86586347168974 FFA2811E628F7DC105F40851050F87F4A18B1CCA38A3C507581086C20E6FBC51 C009928C20CF176B5CB2C8BA8F5CA04E0B42D0730311494872471CB338C00011 A650100A086D1852042B6E2C1CC21AE83C82CE0563E0A28E1040DC60C61D5978 B2C42FA45033452E1860500E19FDD062CD231A2C92C823AF68D0C9056E9C8282 2820B8168D294B10534236175843862BAE28B1CB046D28A041088F8491C508AF BC72E3045258C21156D0822398210E2590C403EEA1844C6C400C4F78423476C0 0613A8210BDEF0C6183608000030A00D4C10C5115090820424803055A8C22F18 118D394CAB121EA0030888508B28D9C30A38B402366030810D80021491F8000A BA7E5037686C80092A680110C2E185ABB00013454042013CF4A107EC230E1338 CD0A4E940001D48D0129D0C42430110107CC22003510020E80D1857A80410E6F 90C3308240035124C01D02F0450A8CA0030364C2069B588500DAE18C1F9C4D16 2DE88304EAB0893F186212C720C2325E31031CC08001E7E045173810A30F7C20 0846585A7A0840805590E9105CE0952C62F8A10C0C801437C0430CA060845584 C618C630840D48C00152328001A9380426B880893E74A002740808003B } points: make block! 1000 get-random-outside-position: func [] [ to-pair reduce switch random 4 [ 1 [[-15 - random 15 random 320]] 2 [[335 + random 15 random 320]] 3 [[random 320 -15 - random 15]] 4 [[random 320 335 + random 15]] ] ] r: 0 c: 0 forall img [ if 255.255.255.0 <> col: img/1 [ insert tail points reduce [col 20 * get-random-outside-position 20 * (10x10 + (10 * as-pair c r))] ] c: either c = (img/size/x - 1) [r: r + 1 0] [(c + 1)] ] drawdata: make block! 1000 timeStart: 0 timeNow: 0 timeDest: 70 movePoints: func [] [ clear drawdata t: timeNow - timeStart d: timeDest - timeStart foreach [col start dest] points [ t: timeNow - timeStart c: dest - start r: (95 - 2) * t / d + 2 pos: - c * (t: t / d) * (t - 2) + start insert tail drawdata compose [fill-pen (col) circle (pos) (r)] ] insert drawdata [pen none transform 0x0 0 5E-2 5E-2 0x0] ] movePoints view layout [ origin 0x0 space 0x0 picture: box 330x330 black effect [draw drawdata] with [ rate: 0 feel: make feel [ engage: func [f a e] [ if a = 'time [ timeNow: timeNow + 1 either timeNow > timeDest [ f/rate: none ] [ movePoints s/data: timeNow / timeDest ] show [f s] ] ] ] ] s: slider 330x10 edge [effect: none size: 1x1 color: 0.0.0] [ timeNow: timeDest * face/data movePoints show picture ] ]