You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

KOL_ASM.inc 450KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630
  1. //------------------------------------------------------------------------------
  2. // KOL_ASM.inc ()to be inlude in KOL.pas)
  3. // v 2.80
  4. function MsgBox( const S: KOLString; Flags: DWORD ): DWORD;
  5. asm
  6. PUSH EDX
  7. PUSH EAX
  8. MOV ECX, [Applet]
  9. XOR EAX, EAX
  10. JECXZ @@1
  11. {$IFDEF SNAPMOUSE2DFLTBTN}
  12. PUSHAD
  13. XCHG EAX, ECX
  14. XOR EDX, EDX
  15. PUSH EDX
  16. PUSH EDX
  17. PUSH EDX
  18. PUSH EAX
  19. MOV EDX, offset[WndProcSnapMouse2DfltBtn]
  20. CALL TControl.AttachProc
  21. CALL TControl.Postmsg
  22. POPAD
  23. {$ENDIF}
  24. MOV EAX, [ECX].TControl.fCaption
  25. {$IFDEF SNAPMOUSE2DFLTBTN}
  26. MOV ECX, [ECX].TControl.fHandle
  27. {$ENDIF}
  28. @@1:
  29. XCHG EAX, [ESP]
  30. PUSH EAX
  31. PUSH 0
  32. {$IFDEF UNICODE_CTRLS}
  33. CALL MessageBoxW
  34. {$ELSE}
  35. CALL MessageBox
  36. {$ENDIF}
  37. {$IFDEF SNAPMOUSE2DFLTBTN}
  38. MOV ECX, [Applet]
  39. JECXZ @@2
  40. PUSH EAX
  41. XCHG EAX, ECX
  42. MOV EDX, offset[WndProcSnapMouse2DfltBtn]
  43. CALL TControl.DetachProc
  44. POP EAX
  45. @@2:
  46. {$ENDIF}
  47. end;
  48. function MakeRect( Left, Top, Right, Bottom: Integer ): TRect; stdcall;
  49. asm
  50. PUSH ESI
  51. PUSH EDI
  52. MOV EDI, @Result
  53. LEA ESI, [Left]
  54. MOVSD
  55. MOVSD
  56. MOVSD
  57. MOVSD
  58. POP EDI
  59. POP ESI
  60. end;
  61. function RectsEqual( const R1, R2: TRect ): Boolean;
  62. asm
  63. //LEA EAX, [R1]
  64. //LEA EDX, [R2]
  65. MOV ECX, size_TRect
  66. CALL CompareMem
  67. end;
  68. function PointInRect( const P: TPoint; const R: TRect ): Boolean;
  69. asm
  70. PUSH ESI
  71. MOV ECX, EAX
  72. MOV ESI, EDX
  73. LODSD
  74. CMP EAX, [ECX]
  75. JG @@fail
  76. LODSD
  77. CMP EAX, [ECX+4]
  78. JG @@fail
  79. LODSD
  80. CMP [ECX], EAX
  81. JG @@fail
  82. LODSD
  83. CMP [ECX+4], EAX
  84. @@fail: SETLE AL
  85. POP ESI
  86. end;
  87. function MakePoint( X, Y: Integer ): TPoint;
  88. asm
  89. MOV ECX, @Result
  90. MOV [ECX].TPoint.x, EAX
  91. MOV [ECX].TPoint.y, EDX
  92. end;
  93. function MakeFlags( FlgSet: PDWORD; FlgArray: array of Integer): Integer;
  94. asm
  95. PUSH EBX
  96. PUSH ESI
  97. MOV EBX, [EAX]
  98. MOV ESI, EDX
  99. XOR EDX, EDX
  100. INC ECX
  101. JZ @@exit
  102. @@loo:
  103. LODSD
  104. TEST EAX, EAX
  105. JGE @@ge
  106. NOT EAX
  107. TEST BL, 1
  108. JZ @@or
  109. DEC EBX
  110. @@ge:
  111. TEST BL, 1
  112. JZ @@nx
  113. @@or:
  114. OR EDX, EAX
  115. @@nx:
  116. SHR EBX, 1
  117. LOOP @@loo
  118. @@exit:
  119. XCHG EAX, EDX
  120. POP ESI
  121. POP EBX
  122. end;
  123. constructor TObj.Create;
  124. asm
  125. //CALL System.@ObjSetup - Generated always by compiler
  126. //JZ @@exit
  127. PUSH EAX
  128. MOV EDX, [EAX]
  129. CALL dword ptr [EDX]
  130. POP EAX
  131. @@exit:
  132. end;
  133. {$IFDEF OLD_REFCOUNT}
  134. procedure TObj.DoDestroy;
  135. asm
  136. MOV EDX, [EAX].fRefCount
  137. SAR EDX, 1
  138. JZ @@1
  139. JC @@exit
  140. DEC [EAX].fRefCount
  141. STC
  142. @@1: JC @@exit
  143. MOV EDX, [EAX]
  144. CALL dword ptr [EDX + 4]
  145. @@exit:
  146. end;
  147. {$ENDIF OLD_REFCOUNT}
  148. function TObj.RefDec: Integer;
  149. asm
  150. TEST EAX, EAX
  151. JZ @@exit
  152. {$IFDEF OLD_REFCOUNT}
  153. SUB [EAX].fRefCount, 2
  154. JGE @@exit
  155. TEST [EAX].fRefCount, 1
  156. JZ @@exit
  157. MOV EDX, [EAX]
  158. PUSH dword ptr [EDX+4]
  159. {$ELSE}
  160. SUB [EAX].fRefCount, 2
  161. JGE @@exit
  162. MOV EDX, [EAX]
  163. PUSH dword ptr [EDX+4]
  164. {$ENDIF}
  165. @@exit:
  166. end;
  167. {$IFDEF OLD_FREE}
  168. procedure TObj.Free;
  169. asm
  170. //TEST EAX,EAX
  171. JMP RefDec
  172. end;
  173. {$ENDIF OLD_FREE}
  174. {$IFNDEF CRASH_DEBUG}
  175. destructor TObj.Destroy;
  176. asm
  177. PUSH EAX
  178. CALL Final
  179. POP EAX
  180. {$IFDEF USE_NAMES}
  181. PUSH EAX
  182. XOR EDX, EDX
  183. XOR ECX, ECX
  184. CALL SetName
  185. POP EAX
  186. PUSH EAX
  187. XOR ECX, ECX
  188. XCHG ECX, [EAX].fNamedObjList
  189. XCHG EAX, ECX
  190. CALL TObj.RefDec
  191. POP EAX
  192. {$ENDIF}
  193. XOR EDX, EDX
  194. CALL System.@FreeMem
  195. //CALL System.@Dispose
  196. end;
  197. {$ENDIF}
  198. {procedure TObj.Final;
  199. asm //cmd //opd
  200. XOR ECX, ECX
  201. XCHG ECX, [EAX].fOnDestroy.TMethod.Code
  202. JECXZ @@doAutoFree
  203. PUSH EAX
  204. XCHG EDX, EAX
  205. MOV EAX, [EDX].fOnDestroy.TMethod.Data
  206. CALL ECX
  207. POP EAX
  208. @@doAutoFree:
  209. XOR ECX, ECX
  210. XCHG ECX, [EAX].fAutoFree
  211. JECXZ @@exit
  212. PUSH ESI
  213. PUSH ECX
  214. MOV ESI, [ECX].TList.fItems
  215. MOV ECX, [ECX].TList.fCount
  216. SHR ECX, 1
  217. //JZ @@eloop // should not occur! (when fAutoFree.Count = 0, it is freeing)
  218. @@freeloop:
  219. MOV EDX, [ESI+ECX*8-8]
  220. MOV EAX, [ESI+ECX*8-4]
  221. PUSH ECX
  222. CALL EDX
  223. POP ECX
  224. LOOP @@freeloop
  225. @@eloop:
  226. POP EAX
  227. CALL TObj.Free
  228. POP ESI
  229. @@exit:
  230. end;}
  231. procedure TObj.Add2AutoFree(Obj: PObj);
  232. asm //cmd //opd
  233. PUSH EBX
  234. PUSH EDX
  235. XCHG EBX, EAX
  236. MOV EAX, [EBX].fAutoFree
  237. TEST EAX, EAX
  238. JNZ @@1
  239. CALL NewList
  240. MOV [EBX].fAutoFree, EAX
  241. @@1: MOV EBX, EAX
  242. XOR EDX, EDX
  243. POP ECX
  244. CALL TList.Insert
  245. XCHG EAX, EBX
  246. XOR EDX, EDX
  247. MOV ECX, offset TObj.RefDec
  248. //XOR ECX, ECX
  249. CALL TList.Insert
  250. POP EBX
  251. end;
  252. procedure TObj.Add2AutoFreeEx( Proc: TObjectMethod );
  253. asm //cmd //opd
  254. PUSH EBX
  255. XCHG EAX, EBX
  256. MOV EAX, [EBX].fAutoFree
  257. TEST EAX, EAX
  258. JNZ @@1
  259. CALL NewList
  260. MOV [EBX].fAutoFree, EAX
  261. @@1: XOR EDX, EDX
  262. MOV ECX, [EBP+12] // Data
  263. MOV EBX, EAX
  264. CALL TList.Insert
  265. XCHG EAX, EBX
  266. XOR EDX, EDX
  267. MOV ECX, [EBP+8] // Code
  268. CALL TList.Insert
  269. POP EBX
  270. end;
  271. procedure TObj.RemoveFromAutoFree(Obj: PObj);
  272. asm
  273. PUSH EBX
  274. XCHG EBX, EAX
  275. MOV ECX, [EBX].fAutoFree
  276. JECXZ @@exit
  277. XCHG EAX, ECX
  278. PUSH EAX
  279. CALL TList.IndexOf
  280. TEST EAX, EAX
  281. POP EDX
  282. XCHG EDX, EAX
  283. JL @@exit
  284. PUSH EAX
  285. AND EDX, not 1
  286. XOR ECX, ECX
  287. MOV CL, 2
  288. CALL TList.DeleteRange
  289. POP EAX
  290. MOV ECX, [EAX].TList.fCount
  291. INC ECX
  292. LOOP @@exit
  293. LEA EAX, [EBX].fAutoFree
  294. CALL Free_And_Nil
  295. @@exit:
  296. POP EBX
  297. end;
  298. destructor TList.Destroy;
  299. asm
  300. PUSH EAX
  301. CALL TList.Clear
  302. POP EAX
  303. CALL TObj.Destroy
  304. end;
  305. {$IFDEF ASM_TLIST}
  306. procedure TList.Release;
  307. asm
  308. TEST EAX, EAX
  309. JZ @@e
  310. MOV ECX, [EAX].fCount
  311. JECXZ @@e
  312. MOV EDX, [EAX].fItems
  313. PUSH EAX
  314. @@1:
  315. MOV EAX, [EDX+ECX*4-4]
  316. TEST EAX, EAX
  317. JZ @@2
  318. PUSH EDX
  319. PUSH ECX
  320. CALL System.@FreeMem
  321. POP ECX
  322. POP EDX
  323. @@2: LOOP @@1
  324. POP EAX
  325. @@e: CALL TObj.RefDec
  326. end;
  327. {$ENDIF ASM_TLIST}
  328. procedure TList.SetCapacity( Value: Integer );
  329. asm
  330. {$IFDEF TLIST_FAST}
  331. CMP [EAX].fUseBlocks, 0
  332. JZ @@old
  333. CMP [EAX].fBlockList, 0
  334. JNZ @@just_set
  335. CMP EDX, 256
  336. JLE @@old
  337. @@just_set:
  338. MOV [EAX].fCapacity, EDX
  339. RET
  340. @@old:
  341. {$ENDIF}
  342. CMP EDX, [EAX].fCount
  343. {$IFDEF USE_CMOV}
  344. CMOVL EDX, [EAX].fCount
  345. {$ELSE}
  346. JGE @@1
  347. MOV EDX, [EAX].fCount
  348. @@1: {$ENDIF}
  349. CMP EDX, [EAX].fCapacity
  350. JE @@exit
  351. MOV [EAX].fCapacity, EDX
  352. SAL EDX, 2
  353. LEA EAX, [EAX].fItems
  354. CALL System.@ReallocMem
  355. @@exit:
  356. end;
  357. procedure TList.Clear;
  358. asm
  359. {$IFDEF TLIST_FAST}
  360. PUSH EAX
  361. MOV ECX, [EAX].fBlockList
  362. JECXZ @@1
  363. MOV EDX, [ECX].fItems
  364. MOV ECX, [ECX].fCount
  365. SHR ECX, 1
  366. JZ @@1
  367. @@0:
  368. MOV EAX, [EDX]
  369. ADD EDX, 8
  370. PUSH EDX
  371. PUSH ECX
  372. CALL TObj.RefDec
  373. POP ECX
  374. POP EDX
  375. LOOP @@0
  376. @@1:
  377. POP EAX
  378. PUSH EAX
  379. XOR EDX, EDX
  380. MOV [EAX].fLastKnownBlockIdx, EDX
  381. LEA EAX, [EAX].fBlockList
  382. CALL Free_And_Nil
  383. POP EAX
  384. {$ENDIF}
  385. PUSH [EAX].fItems
  386. XOR EDX, EDX
  387. MOV [EAX].fItems, EDX
  388. MOV [EAX].fCount, EDX
  389. MOV [EAX].fCapacity, EDX
  390. POP EAX
  391. CALL System.@FreeMem
  392. end;
  393. procedure TList.Add( Value: Pointer );
  394. asm
  395. PUSH EDX
  396. {$IFDEF TLIST_FAST}
  397. //if fUseBlocks and ((fCount >= 256) or Assigned( fBlockList )) then
  398. CMP [EAX].fUseBlocks, 0
  399. JZ @@old
  400. MOV ECX, [EAX].fBlockList
  401. CMP [EAX].fCount, 256
  402. JGE @@1
  403. JECXZ @@old
  404. @@1:
  405. PUSH EBX
  406. PUSH ESI
  407. XCHG EBX, EAX // EBX == @Self
  408. MOV ESI, ECX
  409. //if fBlockList = nil then
  410. INC ECX
  411. LOOP @@2
  412. CALL NewList
  413. XCHG ESI, EAX // ESI == fBlockList
  414. MOV [EBX].fBlockList, ESI //fBlockList := NewList;
  415. MOV [ESI].fUseBlocks, 0 //fBlockList.fUseBlocks := FALSE;
  416. XOR EDX, EDX
  417. XCHG EDX, [EBX].fItems //fItems := nil;
  418. MOV EAX, ESI
  419. CALL TList.Add //fBlockList.Add( fItems );
  420. MOV EDX, [EBX].fCount
  421. MOV EAX, ESI
  422. CALL TList.Add //fBlockList.Add( Pointer( fCount ) );
  423. @@2:
  424. //if fBlockList.fCount = 0 then
  425. MOV ECX, [ESI].fCount
  426. JECXZ @@2A
  427. //LastBlockCount := Integer( fBlockList.fItems[ fBlockList.fCount-1 ] );
  428. MOV EDX, [ESI].fItems
  429. MOV EAX, [EDX+ECX*4-4]
  430. //if LastBlockCount >= 256 then
  431. CMP EAX, 256
  432. JL @@3
  433. @@2A:
  434. MOV EAX, ESI
  435. XOR EDX, EDX
  436. CALL TList.Add //fBlockList.Add( nil );
  437. MOV EAX, ESI
  438. XOR EDX, EDX
  439. CALL TList.Add //fBlockList.Add( nil );
  440. XOR EAX, EAX //LastBlockCount := 0;
  441. @@3:
  442. PUSH EAX
  443. //LastBlockStart := fBlockList.Items[ fBlockList.fCount-2 ];
  444. MOV ECX, [ESI].fCount
  445. MOV EDX, [ESI].fItems
  446. LEA EDX, [EDX+ECX*4-8]
  447. MOV EAX, [EDX]
  448. //if LastBlockStart = nil then
  449. TEST EAX, EAX
  450. JNZ @@4
  451. //GetMem( LastBlockStart, 256 * Sizeof( Pointer ) );
  452. PUSH EDX
  453. //MOV EAX, 1024
  454. XOR EAX, EAX
  455. MOV AH, 4
  456. CALL System.@GetMem
  457. POP EDX
  458. //fBlockList.Items[ fBlockList.fCount-2 ] := LastBlockStart;
  459. MOV [EDX], EAX
  460. @@4:
  461. //fBlockList.Items[ fBlockList.fCount-1 ] := Pointer( LastBlockCount+1 );
  462. INC [EDX+4]
  463. POP ECX // ECX == LastBlockCount
  464. //inc( fCount );
  465. INC [EBX].fCount
  466. //PDWORD( Integer(LastBlockStart) + Sizeof(Pointer)*LastBlockCount )^ :=
  467. // DWORD( Value );
  468. POP ESI
  469. POP EBX
  470. POP EDX // EDX == Value
  471. MOV [EAX+ECX*4], EDX
  472. RET
  473. @@old:
  474. {$ENDIF TLIST_FAST}
  475. LEA ECX, [EAX].fCount
  476. MOV EDX, [ECX]
  477. INC dword ptr [ECX]
  478. PUSH EDX
  479. CMP EDX, [EAX].fCapacity
  480. PUSH EAX
  481. JL @@ok
  482. MOV ECX, [EAX].fAddBy
  483. TEST ECX, ECX
  484. JNZ @@add
  485. MOV ECX, EDX
  486. SHR ECX, 2
  487. INC ECX
  488. @@add:
  489. ADD EDX, ECX
  490. CALL TList.SetCapacity
  491. @@ok:
  492. POP ECX // ECX = Self
  493. POP EAX // EAX = fCount -> Result (for TList.Insert)
  494. POP EDX // EDX = Value
  495. MOV ECX, [ECX].fItems
  496. MOV [ECX + EAX*4], EDX
  497. end;
  498. {$IFDEF ASM_TLIST}
  499. procedure TList.DeleteRange(Idx, Len: Integer);
  500. asm //cmd //opd
  501. TEST ECX, ECX
  502. JLE @@exit
  503. CMP EDX, [EAX].fCount
  504. JGE @@exit
  505. PUSH EBX
  506. XCHG EBX, EAX
  507. LEA EAX, [EDX+ECX]
  508. CMP EAX, [EBX].fCount
  509. JBE @@1
  510. MOV ECX, [EBX].fCount
  511. SUB ECX, EDX
  512. @@1:
  513. MOV EAX, [EBX].fItems
  514. PUSH [EBX].fCount
  515. SUB [EBX].fCount, ECX
  516. MOV EBX, EDX
  517. LEA EDX, [EAX+EDX*4]
  518. LEA EAX, [EDX+ECX*4]
  519. ADD EBX, ECX
  520. POP ECX
  521. SUB ECX, EBX
  522. SHL ECX, 2
  523. CALL System.Move
  524. POP EBX
  525. @@exit:
  526. end;
  527. function TList.IndexOf( Value: Pointer ): Integer;
  528. asm
  529. PUSH EDI
  530. MOV EDI, [EAX].fItems
  531. MOV ECX, [EAX].fCount
  532. PUSH EDI
  533. DEC EAX // make "NZ" - EAX always <> 1
  534. MOV EAX, EDX
  535. REPNZ SCASD
  536. POP EDX
  537. {$IFDEF USE_CMOV}
  538. CMOVNZ EDI, EDX
  539. {$ELSE}
  540. JZ @@succ
  541. MOV EDI, EDX
  542. @@succ: {$ENDIF}
  543. MOV EAX, EDI
  544. STC
  545. SBB EAX, EDX
  546. SAR EAX, 2
  547. POP EDI
  548. end;
  549. procedure TList.Insert(Idx: Integer; Value: Pointer);
  550. asm
  551. PUSH ECX
  552. PUSH EAX
  553. PUSH [EAX].fCount
  554. PUSH EDX
  555. CALL TList.Add // don't matter what to add
  556. POP EDX // EDX = Idx, Eax = Count-1
  557. POP EAX
  558. SUB EAX, EDX
  559. SAL EAX, 2
  560. MOV ECX, EAX // ECX = (Count - Idx - 1) * 4
  561. POP EAX
  562. MOV EAX, [EAX].fItems
  563. LEA EAX, [EAX + EDX*4]
  564. JL @@1
  565. PUSH EAX
  566. LEA EDX, [EAX + 4]
  567. CALL System.Move
  568. POP EAX // EAX = @fItems[ Idx ]
  569. @@1:
  570. POP ECX // ECX = Value
  571. MOV [EAX], ECX
  572. end;
  573. {$ENDIF ASM_TLIST}
  574. procedure TList.MoveItem(OldIdx, NewIdx: Integer);
  575. asm
  576. CMP EDX, ECX
  577. JE @@exit
  578. CMP ECX, [EAX].fCount
  579. JGE @@exit
  580. PUSH EDI
  581. MOV EDI, [EAX].fItems
  582. PUSH dword ptr [EDI + EDX*4]
  583. PUSH ECX
  584. PUSH EAX
  585. CALL TList.Delete
  586. POP EAX
  587. POP EDX
  588. POP ECX
  589. POP EDI
  590. CALL TList.Insert
  591. @@exit:
  592. end;
  593. function TList.Last: Pointer;
  594. asm //cmd //opd
  595. MOV ECX, [EAX].fCount
  596. JECXZ @@0
  597. MOV EAX, [EAX].fItems
  598. DEC ECX
  599. MOV ECX, [EAX + ECX*4]
  600. @@0: XCHG EAX, ECX
  601. end;
  602. {$IFDEF ASM_TLIST}
  603. procedure TList.Swap(Idx1, Idx2: Integer);
  604. asm
  605. MOV EAX, [EAX].fItems
  606. PUSH dword ptr [EAX + EDX*4]
  607. PUSH ECX
  608. MOV ECX, [EAX + ECX*4]
  609. MOV [EAX + EDX*4], ECX
  610. POP ECX
  611. POP EDX
  612. MOV [EAX + ECX*4], EDX
  613. end;
  614. {$ENDIF}
  615. procedure Run( var AppletWnd: PControl );
  616. asm
  617. PUSH EBX
  618. XCHG EBX, EAX
  619. INC [AppletRunning]
  620. MOV EAX, [EBX]
  621. MOV [Applet], EAX
  622. CALL CallTControlCreateWindow
  623. JMP @@2
  624. @@1:
  625. CALL WaitMessage
  626. MOV EAX, [EBX]
  627. CALL TControl.ProcessMessages
  628. {$IFDEF USE_OnIdle}
  629. MOV EAX, [EBX]
  630. CALL [ProcessIdle]
  631. {$ENDIF}
  632. @@2:
  633. MOVZX ECX, [AppletTerminated]
  634. JECXZ @@1
  635. MOV ECX, [EBX]
  636. XCHG EAX, EBX
  637. POP EBX
  638. JECXZ @@exit
  639. CALL TerminateExecution
  640. @@exit:
  641. end;
  642. function SimpleGetCtlBrushHandle( Sender: PControl ): HBrush;
  643. asm // //
  644. {$IFDEF SMALLEST_CODE}
  645. PUSH COLOR_BTNFACE
  646. CALL GetSysColorBrush
  647. {$ELSE}
  648. @@1: MOV ECX, [EAX].TControl.fParent
  649. JECXZ @@2
  650. MOV EDX, [EAX].TControl.fColor
  651. CMP EDX, [ECX].TControl.fColor
  652. XCHG EAX, ECX
  653. JE @@1
  654. XCHG EAX, ECX
  655. @@2: PUSH EBX
  656. XCHG EBX, EAX
  657. MOV ECX, [EBX].TControl.fTmpBrush
  658. JECXZ @@3
  659. MOV EAX, [EBX].TControl.fColor
  660. CALL Color2RGB
  661. CMP EAX, [EBX].TControl.fTmpBrushColorRGB
  662. JE @@3
  663. XOR EAX, EAX
  664. XCHG [EBX].TControl.fTmpBrush, EAX
  665. PUSH EAX
  666. CALL DeleteObject
  667. @@3: MOV EAX, [EBX].TControl.fTmpBrush
  668. TEST EAX, EAX
  669. JNE @@4
  670. MOV EAX, [EBX].TControl.fColor
  671. CALL Color2RGB
  672. MOV [EBX].TControl.fTmpBrushColorRGB, EAX
  673. PUSH EAX
  674. CALL CreateSolidBrush
  675. MOV [EBX].TControl.fTmpBrush, EAX
  676. @@4: POP EBX
  677. {$ENDIF SMALLEST_CODE}
  678. end;
  679. function NewBrush: PGraphicTool;
  680. asm
  681. MOV [Global_GetCtlBrushHandle], offset NormalGetCtlBrushHandle
  682. CALL _NewGraphicTool
  683. MOV [EAX].TGraphicTool.fNewProc, offset[NewBrush]
  684. MOV [EAX].TGraphicTool.fType, gttBrush
  685. MOV [EAX].TGraphicTool.fMakeHandleProc, offset[MakeBrushHandle]
  686. MOV [EAX].TGraphicTool.fData.Color, clBtnFace
  687. end;
  688. function NewFont: PGraphicTool;
  689. const FontDtSz = sizeof( TGDIFont );
  690. asm
  691. MOV EAX, offset[DoApplyFont2Wnd]
  692. MOV [ApplyFont2Wnd_Proc], EAX
  693. CALL _NewGraphicTool
  694. MOV [EAX].TGraphicTool.fNewProc, offset[NewFont]
  695. MOV [EAX].TGraphicTool.fType, gttFont
  696. MOV [EAX].TGraphicTool.fMakeHandleProc, offset[MakeFontHandle]
  697. MOV EDX, [DefFontColor]
  698. MOV [EAX].TGraphicTool.fData.Color, EDX
  699. PUSH EAX
  700. LEA EDX, [EAX].TGraphicTool.fData.Font
  701. MOV EAX, offset[ DefFont ]
  702. XOR ECX, ECX
  703. MOV CL, FontDtSz
  704. CALL System.Move
  705. POP EAX
  706. end;
  707. function NewPen: PGraphicTool;
  708. asm
  709. CALL _NewGraphicTool
  710. MOV [EAX].TGraphicTool.fNewProc, offset[NewPen]
  711. MOV [EAX].TGraphicTool.fType, gttPen
  712. MOV [EAX].TGraphicTool.fMakeHandleProc, offset[MakePenHandle]
  713. MOV [EAX].TGraphicTool.fData.Pen.Mode, pmCopy
  714. end;
  715. function Color2RGB( Color: TColor ): TColor;
  716. asm
  717. BTR EAX, 31
  718. JNC @@exit
  719. PUSH EAX
  720. CALL GetSysColor
  721. @@exit:
  722. end;
  723. function Color2RGBQuad( Color: TColor ): TRGBQuad;
  724. asm
  725. CALL Color2RGB
  726. // code by bart:
  727. xchg ah,al // xxRRGGBB
  728. ror eax,16 // BBGGxxRR
  729. xchg ah,al // BBGGRRxx
  730. shr eax,8 // 00BBGGRR
  731. end;
  732. function Color2Color16( Color: TColor ): WORD;
  733. asm
  734. MOV EDX, EAX
  735. SHR EDX, 19
  736. AND EDX, $1F
  737. MOV ECX, EAX
  738. SHR ECX, 5
  739. AND ECX, $7E0;
  740. MOV AH, AL
  741. AND EAX, $F800
  742. OR EAX, EDX
  743. OR EAX, ECX
  744. end;
  745. function TGraphicTool.Assign(Value: PGraphicTool): PGraphicTool;
  746. const SzfData = sizeof( fData );
  747. asm // //
  748. TEST EDX, EDX
  749. JNZ @@1
  750. {$IFDEF OLD_REFCOUNT}
  751. TEST EAX, EAX
  752. JZ @@0
  753. CALL TObj.DoDestroy
  754. {$ELSE}
  755. CALL TObj.RefDec
  756. {$ENDIF}
  757. XOR EAX, EAX
  758. @@0: RET
  759. @@1: PUSH EDI
  760. MOV EDI, EDX
  761. TEST EAX, EAX
  762. JNZ @@2
  763. XCHG EAX, EDX
  764. CALL dword ptr[EAX].TGraphicTool.fNewProc
  765. @@2: CMP EAX, EDI
  766. JE @@exit
  767. PUSH EBX
  768. XCHG EBX, EAX
  769. MOV ECX, [EBX].TGraphicTool.fHandle
  770. JECXZ @@3
  771. CMP ECX, [EDI].TGraphicTool.fHandle
  772. JE @@exit1
  773. @@3:
  774. MOV EAX, EBX
  775. CALL TGraphicTool.Changed
  776. LEA EDX, [EBX].TGraphicTool.fData
  777. LEA EAX, [EDI].TGraphicTool.fData
  778. MOV ECX, SzfData
  779. CALL System.Move
  780. MOV EAX, EBX
  781. CALL TGraphicTool.Changed
  782. @@exit1:
  783. XCHG EAX, EBX
  784. POP EBX
  785. @@exit: POP EDI
  786. end;
  787. procedure TGraphicTool.Changed;
  788. asm
  789. XOR ECX, ECX
  790. XCHG ECX, [EAX].fHandle
  791. JECXZ @@exit
  792. PUSH EAX
  793. PUSH ECX
  794. CALL @@CallOnChange
  795. CALL DeleteObject
  796. POP EAX
  797. @@exit:
  798. @@CallOnChange:
  799. MOV ECX, [EAX].fOnChange.TMethod.Code
  800. JECXZ @@no_onChange
  801. PUSH EAX
  802. XCHG EDX, EAX
  803. MOV EAX, [EDX].fOnChange.TMethod.Data
  804. CALL ECX
  805. POP EAX
  806. @@no_onChange:
  807. end;
  808. destructor TGraphicTool.Destroy;
  809. asm
  810. PUSH EAX
  811. CMP [EAX].fType, gttFont
  812. JE @@0
  813. MOV ECX, [EAX].fData.Brush.Bitmap
  814. JECXZ @@0
  815. PUSH ECX
  816. CALL DeleteObject
  817. POP EAX
  818. PUSH EAX
  819. @@0:
  820. MOV ECX, [EAX].fHandle
  821. JECXZ @@1
  822. PUSH ECX
  823. CALL DeleteObject
  824. @@1:
  825. POP EAX
  826. CALL TObj.Destroy
  827. end;
  828. function TGraphicTool.ReleaseHandle: Integer;
  829. asm // //
  830. PUSH EAX
  831. CALL Changed
  832. POP EDX
  833. XOR EAX, EAX
  834. XCHG [EDX].fHandle, EAX
  835. end;
  836. procedure TGraphicTool.SetInt( const Index: Integer; Value: Integer );
  837. asm
  838. LEA EDX, [EDX+EAX].fData
  839. CMP [EDX], ECX
  840. JE @@exit
  841. MOV [EDX], ECX
  842. CALL Changed
  843. @@exit:
  844. end;
  845. function TGraphicTool.IsFontTrueType: Boolean;
  846. asm
  847. CALL GetHandle
  848. TEST EAX, EAX
  849. JZ @@exit
  850. PUSH EBX
  851. PUSH EAX // fHandle
  852. PUSH 0
  853. CALL GetDC
  854. PUSH EAX // DC
  855. MOV EBX, EAX
  856. CALL SelectObject
  857. PUSH EAX
  858. XOR ECX, ECX
  859. PUSH ECX
  860. PUSH ECX
  861. PUSH ECX
  862. PUSH ECX
  863. PUSH EBX
  864. CALL GetFontData
  865. XCHG EAX, [ESP]
  866. PUSH EAX
  867. PUSH EBX
  868. CALL SelectObject
  869. PUSH EBX
  870. PUSH 0
  871. CALL ReleaseDC
  872. POP EAX
  873. INC EAX
  874. SETNZ AL
  875. POP EBX
  876. @@exit:
  877. end;
  878. procedure TextAreaEx( Sender: PCanvas; var Sz : TSize; var Pt : TPoint );
  879. asm
  880. PUSH EBX
  881. PUSH ESI
  882. PUSH EDI
  883. PUSH EBP
  884. MOV EBP, ESP
  885. PUSH EDX // [EBP-4] = @Sz
  886. PUSH ECX // [EBP-8] = @Pt
  887. MOV EBX, EAX
  888. CALL TCanvas.GetFont
  889. MOV ESI, [EAX].TGraphicTool.fData.Font.Orientation
  890. CALL TGraphicTool.IsFontTrueType
  891. TEST AL, AL
  892. JZ @@exit
  893. MOV EDI, [EBP-8]
  894. XOR EAX, EAX
  895. STOSD
  896. STOSD
  897. TEST ESI, ESI
  898. JZ @@exit
  899. PUSH EAX // Pts[1].x
  900. PUSH EAX // Pts[1].y
  901. PUSH ESI
  902. FILD dword ptr [ESP]
  903. POP EDX
  904. FILD word ptr [@@1800]
  905. FDIV
  906. //FWAIT
  907. FLDPI
  908. FMUL
  909. //FWAIT
  910. FLD ST(0)
  911. FSINCOS
  912. FWAIT
  913. MOV ESI, [EBP-4]
  914. LODSD // Sz.cx
  915. PUSH EAX
  916. FILD dword ptr [ESP]
  917. FMUL
  918. FISTP dword ptr [ESP] // Pts[2].x
  919. FWAIT
  920. NEG EAX
  921. PUSH EAX
  922. FILD dword ptr [ESP]
  923. FMUL
  924. FISTP dword ptr [ESP] // Pts[2].y
  925. FWAIT
  926. FLDPI
  927. FLD1
  928. FLD1
  929. FADD
  930. FDIV
  931. FADD
  932. FSINCOS
  933. FWAIT
  934. LODSD
  935. NEG EAX
  936. PUSH EAX
  937. FILD dword ptr [ESP]
  938. FMUL
  939. FISTP dword ptr [ESP] // Pts[4].x
  940. FWAIT
  941. NEG EAX
  942. PUSH EAX
  943. FILD dword ptr [ESP]
  944. FMUL
  945. FISTP dword ptr [ESP] // Pts[4].y
  946. FWAIT
  947. POP ECX
  948. POP EDX
  949. PUSH EDX
  950. PUSH ECX
  951. ADD EDX, [ESP+12]
  952. ADD ECX, [ESP+8]
  953. PUSH EDX
  954. PUSH ECX
  955. MOV ESI, ESP
  956. XOR EDX, EDX // MinX
  957. XOR EDI, EDI // MinY
  958. XOR ECX, ECX
  959. MOV CL, 3
  960. @@loo1: LODSD
  961. CMP EAX, EDI
  962. JGE @@1
  963. XCHG EDI, EAX
  964. @@1: LODSD
  965. CMP EAX, EDX
  966. JGE @@2
  967. XCHG EDX, EAX
  968. @@2: LOOP @@loo1
  969. MOV ESI, [EBP-4]
  970. MOV [ESI], ECX
  971. MOV [ESI+4], ECX
  972. MOV CL, 4
  973. @@loo2:
  974. POP EBX
  975. SUB EBX, EDI
  976. CMP EBX, [ESI+4]
  977. JLE @@3
  978. MOV [ESI+4], EBX
  979. @@3:
  980. POP EAX
  981. SUB EAX, EDX
  982. CMP EAX, [ESI]
  983. JLE @@4
  984. MOV [ESI], EAX
  985. @@4:
  986. LOOP @@loo2
  987. MOV EDI, [EBP-8]
  988. STOSD
  989. XCHG EAX, EBX
  990. STOSD
  991. JMP @@exit
  992. @@1800: DW 1800
  993. @@exit:
  994. MOV ESP, EBP
  995. POP EBP
  996. POP EDI
  997. POP ESI
  998. POP EBX
  999. end;
  1000. procedure TGraphicTool.SetFontOrientation(Value: Integer);
  1001. asm
  1002. MOV byte ptr [GlobalGraphics_UseFontOrient], 1
  1003. MOV [GlobalCanvas_OnTextArea], offset[TextAreaEx]
  1004. PUSH EAX
  1005. XCHG EAX, EDX
  1006. MOV ECX, 3600
  1007. CDQ
  1008. IDIV ECX // EDX = Value mod 3600
  1009. POP EAX
  1010. MOV [EAX].fData.Font.Escapement, EDX
  1011. MOV ECX, EDX
  1012. XOR EDX, EDX
  1013. MOV DL, go_FontOrientation
  1014. CALL SetInt
  1015. end;
  1016. function TGraphicTool.GetFontStyle: TFontStyle;
  1017. asm
  1018. MOV EDX, dword ptr [EAX].fData.Font.Italic
  1019. AND EDX, $010101
  1020. MOV EAX, [EAX].fData.Font.Weight
  1021. CMP EAX, 700
  1022. SETGE AL //AL:1 = fsBold
  1023. ADD EDX, EDX
  1024. OR EAX, EDX //AL:2 = fsItalic
  1025. SHR EDX, 7
  1026. OR EAX, EDX //AL:3 = fsUnderline
  1027. SHR EDX, 7
  1028. OR EAX, EDX //AL:4 = fsStrikeOut
  1029. end;
  1030. procedure TGraphicTool.SetFontStyle(const Value: TFontStyle);
  1031. asm
  1032. PUSH EDI
  1033. MOV EDI, EAX
  1034. PUSH EDX
  1035. CALL GetFontStyle
  1036. POP EDX
  1037. CMP AL, DL
  1038. JE @@exit
  1039. PUSH EDI
  1040. LEA EDI, [EDI].fData.Font.Weight
  1041. MOV ECX, [EDI]
  1042. SHR EDX, 1
  1043. JNC @@1
  1044. CMP ECX, 700
  1045. JGE @@2
  1046. MOV ECX, 700
  1047. JMP @@2
  1048. @@1: CMP ECX, 700
  1049. JL @@2
  1050. XOR ECX, ECX
  1051. @@2: XCHG EAX, ECX
  1052. STOSD // change Weight
  1053. SHR EDX, 1
  1054. SETC AL
  1055. STOSB // change Italic
  1056. SHR EDX, 1
  1057. SETC AL
  1058. STOSB // change Underline
  1059. SHR EDX, 1
  1060. SETC AL
  1061. STOSB // change StrikeOut
  1062. POP EAX
  1063. CALL Changed
  1064. @@exit: POP EDI
  1065. end;
  1066. function TGraphicTool.GetHandle: THandle;
  1067. const DataSz = sizeof( TGDIToolData );
  1068. asm
  1069. PUSH EBX
  1070. @@start:
  1071. XCHG EBX, EAX
  1072. MOV ECX, [EBX].fHandle
  1073. JECXZ @@1
  1074. MOV EAX, [EBX].fData.Color
  1075. CALL Color2RGB
  1076. CMP EAX, [EBX].fColorRGB
  1077. JE @@1
  1078. MOV EAX, EBX
  1079. CALL ReleaseHandle
  1080. PUSH EAX
  1081. CALL DeleteObject
  1082. @@1: MOV ECX, [EBX].fHandle
  1083. INC ECX
  1084. LOOP @@exit
  1085. MOV ECX, [EBX].fParentGDITool
  1086. JECXZ @@2
  1087. LEA EDX, [ECX].fData
  1088. LEA EAX, [EBX].fData
  1089. MOV ECX, DataSz
  1090. CALL CompareMem
  1091. TEST AL, AL
  1092. MOV EAX, [EBX].fParentGDITool
  1093. JNZ @@start
  1094. @@2: MOV EAX, [EBX].fData.Color
  1095. CALL Color2RGB
  1096. MOV [EBX].fColorRGB, EAX
  1097. XCHG EAX, EBX
  1098. CALL dword ptr [EAX].fMakeHandleProc
  1099. XCHG ECX, EAX
  1100. @@exit: XCHG EAX, ECX
  1101. POP EBX
  1102. end;
  1103. function MakeBrushHandle( Self_: PGraphicTool ): THandle;
  1104. asm
  1105. PUSH EBX
  1106. XCHG EBX, EAX
  1107. MOV EAX, [EBX].TGraphicTool.fHandle
  1108. TEST EAX, EAX
  1109. JNZ @@exit
  1110. MOV EAX, [EBX].TGraphicTool.fData.Color
  1111. CALL Color2RGB // EAX = ColorRef
  1112. XOR EDX, EDX
  1113. MOV ECX, [EBX].TGraphicTool.fData.Brush.Bitmap
  1114. PUSH ECX
  1115. JECXZ @@1
  1116. MOV DL, BS_PATTERN
  1117. JMP @@2
  1118. @@1:
  1119. MOV CL, [EBX].TGraphicTool.fData.Brush.Style
  1120. MOV DL, CL
  1121. SUB CL, 2
  1122. JL @@2
  1123. XCHG ECX, [ESP]
  1124. MOV EAX, [EBX].TGraphicTool.fData.Brush.LineColor
  1125. CALL Color2RGB
  1126. XOR EDX, EDX
  1127. MOV DL, BS_HATCHED
  1128. @@2: PUSH EAX
  1129. PUSH EDX
  1130. PUSH ESP
  1131. CALL CreateBrushIndirect
  1132. MOV [EBX].TGraphicTool.fHandle, EAX
  1133. ADD ESP, 12
  1134. @@exit:
  1135. POP EBX
  1136. end;
  1137. {$IFDEF ASM_UNICODE}
  1138. {$IFNDEF AUTO_REPLACE_CLEARTYPE}
  1139. function MakeFontHandle( Self_: PGraphicTool ): THandle;
  1140. asm
  1141. XCHG EDX, EAX
  1142. MOV EAX, [EDX].TGraphicTool.fHandle
  1143. TEST EAX, EAX
  1144. JNZ @@exit
  1145. PUSH EDX
  1146. LEA ECX, [EDX].TGraphicTool.fData.Font
  1147. PUSH ECX
  1148. CALL CreateFontIndirect
  1149. POP EDX
  1150. MOV [EDX].TGraphicTool.fHandle, EAX
  1151. @@exit:
  1152. end;
  1153. {$ENDIF AUTO_REPLACE_CLEARTYPE}
  1154. {$ENDIF ASM_UNICODE}
  1155. function MakePenHandle( Self_: PGraphicTool ): THandle;
  1156. asm
  1157. PUSH EBX
  1158. MOV EBX, EAX
  1159. MOV EAX, [EBX].TGraphicTool.fHandle
  1160. TEST EAX, EAX
  1161. JNZ @@exit
  1162. MOV EAX, [EBX].TGraphicTool.fData.Color
  1163. CALL Color2RGB
  1164. PUSH EAX
  1165. PUSH EAX
  1166. PUSH [EBX].TGraphicTool.fData.Pen.Width
  1167. MOVZX EAX, [EBX].TGraphicTool.fData.Pen.Style
  1168. PUSH EAX
  1169. PUSH ESP
  1170. CALL CreatePenIndirect
  1171. MOV [EBX].TGraphicTool.fHandle, EAX
  1172. ADD ESP, 16
  1173. @@exit:
  1174. POP EBX
  1175. end;
  1176. function MakeGeometricPenHandle( Self_: PGraphicTool ): THandle;
  1177. asm
  1178. MOV ECX, [EAX].TGraphicTool.fHandle
  1179. INC ECX
  1180. LOOP @@exit
  1181. PUSH EBX
  1182. XCHG EBX, EAX
  1183. MOV EAX, [EBX].TGraphicTool.fData.Color
  1184. CALL Color2RGB // EAX = Color2RGB( fColor )
  1185. CDQ // EDX = lbHatch (0)
  1186. MOV ECX, [EBX].TGraphicTool.fData.Pen.BrushBitmap
  1187. JECXZ @@no_brush_bitmap
  1188. XCHG EDX, ECX // lbHatch = fPenBrushBitmap
  1189. MOV CL, BS_PATTERN // = 3
  1190. JMP @@create_pen
  1191. @@no_brush_bitmap:
  1192. MOVZX ECX, [EBX].TGraphicTool.fData.Pen.BrushStyle
  1193. CMP CL, 1
  1194. JLE @@create_pen
  1195. MOV EDX, ECX
  1196. MOV CL, 2
  1197. SUB EDX, ECX
  1198. @@create_pen:
  1199. PUSH EDX
  1200. PUSH EAX
  1201. PUSH ECX
  1202. MOV ECX, ESP
  1203. CDQ
  1204. PUSH EDX
  1205. PUSH EDX
  1206. PUSH ECX
  1207. PUSH [EBX].TGraphicTool.fData.Pen.Width
  1208. MOVZX ECX, [EBX].TGraphicTool.fData.Pen.Join
  1209. SHL ECX, 12
  1210. MOVZX EDX, [EBX].TGraphicTool.fData.Pen.EndCap
  1211. SHL EDX, 8
  1212. OR EDX, ECX
  1213. OR DL, byte ptr [EBX].TGraphicTool.fData.Pen.Style
  1214. OR EDX, PS_GEOMETRIC
  1215. PUSH EDX
  1216. CALL ExtCreatePen
  1217. POP ECX
  1218. POP ECX
  1219. POP ECX
  1220. MOV [EBX].TGraphicTool.fHandle, EAX
  1221. POP EBX
  1222. RET
  1223. @@exit:
  1224. XCHG EAX, ECX
  1225. end;
  1226. function TCanvas.Assign(SrcCanvas: PCanvas): Boolean;
  1227. asm
  1228. PUSH EBX
  1229. PUSH ESI
  1230. XCHG EBX, EAX
  1231. MOV ESI, EDX
  1232. MOV EAX, [EBX].fFont
  1233. MOV EDX, [ESI].fFont
  1234. CALL TGraphicTool.Assign
  1235. MOV [EBX].fFont, EAX
  1236. MOV EAX, [EBX].fBrush
  1237. MOV EDX, [ESI].fBrush
  1238. CALL TGraphicTool.Assign
  1239. MOV [EBX].fBrush, EAX
  1240. MOV EAX, [EBX].fPen
  1241. MOV EDX, [ESI].fPen
  1242. CALL TGraphicTool.Assign
  1243. MOV [EBX].fPen, EAX
  1244. CALL AssignChangeEvents
  1245. MOV ECX, [EBX].fFont
  1246. OR ECX, [EBX].fBrush
  1247. OR ECX, [EBX].fPen
  1248. SETNZ AL
  1249. MOV EDX, [ESI].fPenPos.x
  1250. MOV ECX, [ESI].fPenPos.y
  1251. CMP EDX, [EBX].fPenPos.x
  1252. JNE @@chg_penpos
  1253. CMP ECX, [EBX].fPenPos.y
  1254. JE @@1
  1255. @@chg_penpos:
  1256. MOV AL, 1
  1257. MOV [EBX].fPenPos.x, EDX
  1258. MOV [EBX].fPenPos.y, ECX
  1259. @@1:
  1260. MOV EDX, [ESI].fCopyMode
  1261. CMP EDX, [EBX].fCopyMode
  1262. JE @@2
  1263. MOV [EBX].fCopyMode, EDX
  1264. MOV AL, 1
  1265. @@2:
  1266. POP ESI
  1267. POP EBX
  1268. end;
  1269. procedure TCanvas.CreateBrush;
  1270. asm
  1271. PUSH EBX
  1272. MOV EBX, EAX
  1273. MOV ECX, [EAX].fBrush
  1274. JECXZ @@chk_owner
  1275. MOV EAX, ECX
  1276. CALL TGraphicTool.GetHandle
  1277. PUSH EAX
  1278. MOV EAX, EBX
  1279. CALL AssignChangeEvents
  1280. MOV EAX, EBX
  1281. CALL TCanvas.GetHandle
  1282. PUSH EAX
  1283. CALL SelectObject
  1284. MOV EDX, [EBX].TCanvas.fBrush
  1285. CMP [EDX].TGraphicTool.fData.Brush.Style, bsSolid
  1286. MOV EAX, [EDX].TGraphicTool.fData.Color
  1287. @@0:
  1288. MOV EBX, [EBX].TCanvas.fHandle
  1289. MOV ECX, offset[Color2RGB]
  1290. JNZ @@1
  1291. PUSH OPAQUE
  1292. PUSH EBX
  1293. CALL ECX //Color2RGB
  1294. PUSH EAX
  1295. PUSH EBX
  1296. JMP @@2
  1297. @@1:
  1298. PUSH TRANSPARENT
  1299. PUSH EBX
  1300. CALL ECX //Color2RGB
  1301. NOT EAX
  1302. PUSH EAX
  1303. PUSH EBX
  1304. @@2:
  1305. CALL SetBkColor
  1306. CALL SetBkMode
  1307. @@exit:
  1308. POP EBX
  1309. RET
  1310. @@chk_owner:
  1311. MOV ECX, [EBX].fOwnerControl
  1312. JECXZ @@exit
  1313. MOV EAX, [ECX].TControl.fColor
  1314. XOR ECX, ECX
  1315. JMP @@0
  1316. end;
  1317. procedure TCanvas.CreateFont;
  1318. asm
  1319. PUSH EBX
  1320. MOV EBX, EAX
  1321. MOV ECX, [EAX].TCanvas.fFont
  1322. JECXZ @@chk_owner
  1323. MOV EAX, [ECX].TGraphicTool.fData.Color
  1324. PUSH ECX
  1325. CALL Color2RGB
  1326. XCHG EAX, [ESP]
  1327. CALL TGraphicTool.GetHandle
  1328. PUSH EAX
  1329. MOV EAX, EBX
  1330. CALL AssignChangeEvents;
  1331. MOV EAX, EBX
  1332. CALL TCanvas.GetHandle
  1333. PUSH EAX
  1334. MOV EBX, EAX
  1335. CALL SelectObject
  1336. @@set_txcolor:
  1337. PUSH EBX
  1338. CALL SetTextColor
  1339. @@exit:
  1340. POP EBX
  1341. RET
  1342. @@chk_owner:
  1343. MOV ECX, [EBX].fOwnerControl
  1344. JECXZ @@exit
  1345. MOV EBX, [EBX].fHandle
  1346. MOV EAX, [ECX].TControl.fTextColor
  1347. CALL Color2RGB
  1348. PUSH EAX
  1349. JMP @@set_txcolor
  1350. end;
  1351. procedure TCanvas.CreatePen;
  1352. asm
  1353. MOV ECX, [EAX].TCanvas.fPen
  1354. JECXZ @@exit
  1355. PUSH EBX
  1356. MOV EBX, EAX
  1357. MOV DL, [ECX].TGraphicTool.fData.Pen.Mode
  1358. MOVZX EDX, DL
  1359. INC EDX
  1360. PUSH EDX
  1361. MOV EAX, ECX
  1362. CALL TGraphicTool.GetHandle
  1363. PUSH EAX
  1364. MOV EAX, EBX
  1365. CALL AssignChangeEvents
  1366. MOV EAX, EBX
  1367. CALL TCanvas.GetHandle
  1368. PUSH EAX
  1369. MOV EBX, EAX
  1370. CALL SelectObject
  1371. PUSH EBX
  1372. CALL SetROP2
  1373. POP EBX
  1374. @@exit:
  1375. end;
  1376. procedure TCanvas.DeselectHandles;
  1377. asm
  1378. PUSH EBX
  1379. PUSH ESI
  1380. PUSH EDI
  1381. LEA EBX, [EAX].TCanvas.fState
  1382. //CALL TCanvas.GetHandle
  1383. MOV EAX, [EAX].TCanvas.fHandle
  1384. TEST EAX, EAX
  1385. JZ @@exit
  1386. MOVZX EDX, byte ptr[EBX]
  1387. AND DL, PenValid or BrushValid or FontValid
  1388. JZ @@exit
  1389. PUSH EAX
  1390. LEA EDI, [Stock]
  1391. MOV ECX, [EDI]
  1392. INC ECX
  1393. LOOP @@1
  1394. MOV ESI, offset[ GetStockObject ]
  1395. PUSH BLACK_PEN
  1396. CALL ESI
  1397. STOSD
  1398. PUSH HOLLOW_BRUSH
  1399. CALL ESI
  1400. STOSD
  1401. PUSH SYSTEM_FONT
  1402. CALL ESI
  1403. STOSD
  1404. @@1:
  1405. LEA ESI, [Stock]
  1406. POP EDX
  1407. LODSD
  1408. PUSH EAX
  1409. PUSH EDX
  1410. LODSD
  1411. PUSH EAX
  1412. PUSH EDX
  1413. LODSD
  1414. PUSH EAX
  1415. PUSH EDX
  1416. MOV ESI, offset[ SelectObject ]
  1417. CALL ESI
  1418. CALL ESI
  1419. CALL ESI
  1420. AND byte ptr [EBX], not( PenValid or BrushValid or FontValid )
  1421. @@exit:
  1422. POP EDI
  1423. POP ESI
  1424. POP EBX
  1425. end;
  1426. function TCanvas.RequiredState(ReqState: DWORD): HDC; stdcall;
  1427. asm
  1428. PUSH EBX
  1429. PUSH ESI
  1430. MOV EBX, ReqState
  1431. MOV ESI, [EBP+8] //Self
  1432. MOV EAX, ESI
  1433. TEST BL, ChangingCanvas
  1434. JZ @@1
  1435. CALL Changing
  1436. @@1: AND BL, 0Fh
  1437. TEST BL, HandleValid
  1438. JZ @@2
  1439. CALL TCanvas.GetHandle
  1440. TEST EAX, EAX
  1441. JZ @@ret_0
  1442. @@2:
  1443. MOV AL, [ESI].TCanvas.fState
  1444. NOT EAX
  1445. AND BL, AL
  1446. JZ @@ret_handle
  1447. TEST BL, FontValid
  1448. JZ @@3
  1449. MOV EAX, ESI
  1450. CALL CreateFont
  1451. @@3: TEST BL, PenValid
  1452. JZ @@5
  1453. MOV EAX, ESI
  1454. CALL CreatePen
  1455. MOV ECX, [ESI].TCanvas.fPen
  1456. JCXZ @@5
  1457. MOV AL, [ECX].TGraphicTool.fData.Pen.Style
  1458. DEC AL
  1459. {$IFDEF PARANOIA} DB $2C, 3 {$ELSE} SUB AL, 3 {$ENDIF}
  1460. JB @@6
  1461. @@5: TEST BL, BrushValid
  1462. JZ @@7
  1463. @@6: MOV EAX, ESI
  1464. CALL CreateBrush
  1465. @@7: OR [ESI].TCanvas.fState, BL
  1466. @@ret_handle:
  1467. MOV EAX, [ESI].TCanvas.fHandle
  1468. @@ret_0:
  1469. POP ESI
  1470. POP EBX
  1471. end;
  1472. procedure TCanvas.SetHandle(Value: HDC);
  1473. asm
  1474. PUSH EBX
  1475. MOV EBX, EAX
  1476. MOV ECX, [EBX].fHandle
  1477. CMP ECX, EDX
  1478. JZ @@exit
  1479. JECXZ @@chk_val
  1480. PUSH EDX
  1481. PUSH ECX
  1482. CALL DeselectHandles
  1483. POP EDX
  1484. MOV ECX, [EBX].fOwnerControl
  1485. JECXZ @@chk_Release
  1486. CMP [ECX].TControl.fPaintDC, EDX
  1487. JE @@clr_Handle
  1488. @@chk_Release:
  1489. PUSH EDX
  1490. CMP [EBX].fOnGetHandle.TMethod.Code, offset[TControl.DC2Canvas]
  1491. JNE @@deldc
  1492. PUSH [ECX].TControl.fHandle
  1493. CALL ReleaseDC
  1494. JMP @@clr_Handle
  1495. @@deldc:
  1496. CALL DeleteDC
  1497. @@clr_Handle:
  1498. XOR ECX, ECX
  1499. MOV [EBX].TCanvas.fHandle, ECX
  1500. MOV [EBX].TCanvas.fIsPaintDC, CL
  1501. AND [EBX].TCanvas.fState, not HandleValid
  1502. POP EDX
  1503. @@chk_val:
  1504. TEST EDX, EDX
  1505. JZ @@exit
  1506. OR [EBX].TCanvas.fState, HandleValid
  1507. MOV [EBX].TCanvas.fHandle, EDX
  1508. LEA EDX, [EBX].TCanvas.fPenPos
  1509. MOV EAX, EBX
  1510. CALL SetPenPos
  1511. @@exit: POP EBX
  1512. end;
  1513. procedure TCanvas.SetPenPos(const Value: TPoint);
  1514. asm
  1515. MOV ECX, [EDX].TPoint.y
  1516. MOV EDX, [EDX].TPoint.x
  1517. MOV [EAX].fPenPos.x, EDX
  1518. MOV [EAX].fPenPos.y, ECX
  1519. CALL MoveTo
  1520. end;
  1521. procedure TCanvas.Changing;
  1522. asm
  1523. PUSHAD
  1524. MOV ECX, [EAX].fOnChange.TMethod.Code
  1525. JECXZ @@exit
  1526. XCHG EDX, EAX
  1527. MOV EAX, [EDX].fOnChange.TMethod.Data
  1528. CALL ECX
  1529. @@exit:
  1530. POPAD
  1531. end;
  1532. procedure TCanvas.Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); stdcall;
  1533. asm
  1534. PUSH ESI
  1535. PUSH HandleValid or PenValid or ChangingCanvas
  1536. PUSH dword ptr [EBP+8]
  1537. CALL RequiredState
  1538. MOV EDX, EAX
  1539. LEA ESI, [Y4]
  1540. STD
  1541. XOR ECX, ECX
  1542. MOV CL, 8
  1543. @@1:
  1544. LODSD
  1545. PUSH EAX
  1546. LOOP @@1
  1547. CLD
  1548. PUSH EDX //Canvas.fHandle
  1549. CALL Windows.Arc
  1550. POP ESI
  1551. end;
  1552. procedure TCanvas.Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); stdcall;
  1553. asm
  1554. PUSH HandleValid or PenValid or BrushValid or ChangingCanvas
  1555. PUSH dword ptr [EBP + 8]
  1556. CALL RequiredState
  1557. MOV EDX, EAX
  1558. PUSH ESI
  1559. LEA ESI, [Y4]
  1560. STD
  1561. XOR ECX, ECX
  1562. MOV CL, 8
  1563. @@1:
  1564. LODSD
  1565. PUSH EAX
  1566. LOOP @@1
  1567. CLD
  1568. PUSH EDX //Canvas.fHandle
  1569. CALL Windows.Chord
  1570. POP ESI
  1571. end;
  1572. procedure TCanvas.CopyRect(const DstRect: TRect; SrcCanvas: PCanvas;
  1573. const SrcRect: TRect);
  1574. asm
  1575. PUSH ESI
  1576. PUSH EDI
  1577. PUSH [EAX].fCopyMode
  1578. PUSH EDX
  1579. PUSH HandleValid or BrushValid
  1580. PUSH ECX
  1581. PUSH HandleValid or FontValid or BrushValid or ChangingCanvas
  1582. PUSH EAX
  1583. MOV ESI, offset[ RequiredState ]
  1584. CALL ESI
  1585. MOV EDI, EAX // EDI = @Self.fHandle
  1586. CALL ESI
  1587. MOV EDX, EAX // EDX = SrcCanvas.fHandle
  1588. POP ECX // ECX = @DstRect
  1589. MOV ESI, [SrcRect]
  1590. MOV EAX, [ESI].TRect.Bottom
  1591. SUB EAX, [ESI].TRect.Top
  1592. PUSH EAX
  1593. MOV EAX, [ESI].TRect.Right
  1594. SUB EAX, [ESI].TRect.Left
  1595. PUSH EAX
  1596. PUSH [ESI].TRect.Top
  1597. LODSD
  1598. PUSH EAX
  1599. PUSH EDX
  1600. MOV EAX, [ECX].TRect.Bottom
  1601. MOV EDX, [ECX].TRect.Top
  1602. SUB EAX, EDX
  1603. PUSH EAX
  1604. MOV EAX, [ECX].TRect.Right
  1605. MOV ESI, [ECX].TRect.Left
  1606. SUB EAX, ESI
  1607. PUSH EAX
  1608. PUSH EDX
  1609. PUSH ESI
  1610. PUSH EDI
  1611. CALL StretchBlt
  1612. POP EDI
  1613. POP ESI
  1614. end;
  1615. procedure TCanvas.DrawFocusRect({$IFNDEF FPC}const{$ENDIF} Rect: TRect);
  1616. asm
  1617. PUSH EDX
  1618. PUSH HandleValid or BrushValid or FontValid or ChangingCanvas
  1619. PUSH EAX
  1620. CALL RequiredState
  1621. PUSH EAX
  1622. CALL Windows.DrawFocusRect
  1623. end;
  1624. procedure TCanvas.Ellipse(X1, Y1, X2, Y2: Integer);
  1625. asm
  1626. PUSH [Y2]
  1627. PUSH [X2]
  1628. PUSH ECX
  1629. PUSH EDX
  1630. PUSH HandleValid or PenValid or BrushValid or ChangingCanvas
  1631. PUSH EAX
  1632. CALL RequiredState
  1633. PUSH EAX
  1634. CALL Windows.Ellipse
  1635. end;
  1636. procedure TCanvas.FillRect({$IFNDEF FPC}const{$ENDIF} Rect: TRect);
  1637. asm
  1638. PUSH EBX
  1639. XCHG EBX, EAX
  1640. PUSH EDX
  1641. PUSH HandleValid or BrushValid or ChangingCanvas
  1642. PUSH EBX
  1643. CALL RequiredState
  1644. MOV ECX, [EBX].fBrush
  1645. JECXZ @@chk_ctl
  1646. @@fill_with_Brush:
  1647. XCHG EAX, ECX
  1648. CALL TGraphicTool.GetHandle
  1649. POP EDX
  1650. PUSH EAX
  1651. JMP @@fin
  1652. @@chk_ctl:
  1653. MOV ECX, [EBX].fOwnerControl
  1654. JECXZ @@dflt_fill
  1655. XCHG EAX, ECX
  1656. MOV ECX, [EAX].TControl.fBrush
  1657. INC ECX
  1658. LOOP @@fill_with_Brush
  1659. MOV EAX, [EAX].TControl.fColor
  1660. CALL Color2RGB
  1661. PUSH EAX
  1662. CALL CreateSolidBrush
  1663. POP EDX
  1664. PUSH EAX
  1665. PUSH EAX
  1666. PUSH EDX
  1667. PUSH [EBX].fHandle
  1668. CALL Windows.FillRect
  1669. CALL DeleteObject
  1670. POP EBX
  1671. RET
  1672. @@dflt_fill:
  1673. POP EDX
  1674. PUSH COLOR_WINDOW + 1
  1675. @@fin:
  1676. PUSH EDX
  1677. PUSH [EBX].fHandle
  1678. CALL Windows.FillRect
  1679. POP EBX
  1680. end;
  1681. procedure TCanvas.FillRgn(const Rgn: HRgn);
  1682. asm
  1683. PUSH EBX
  1684. XCHG EBX, EAX
  1685. PUSH EDX
  1686. PUSH HandleValid or BrushValid or ChangingCanvas
  1687. PUSH EBX
  1688. CALL RequiredState
  1689. MOV ECX, [EBX].TCanvas.fBrush
  1690. JECXZ @@1
  1691. @@fill_rgn_using_Brush:
  1692. XCHG EAX, ECX
  1693. CALL TGraphicTool.GetHandle
  1694. POP EDX
  1695. PUSH EAX
  1696. PUSH EDX
  1697. PUSH [EBX].fHandle
  1698. CALL Windows.FillRgn
  1699. JMP @@fin
  1700. @@1: MOV ECX, [EBX].TCanvas.fOwnerControl
  1701. MOV EAX, -1 // clWhite
  1702. JECXZ @@2
  1703. XCHG EAX, ECX
  1704. MOV ECX, [EAX].TControl.fBrush
  1705. INC ECX
  1706. LOOP @@fill_rgn_using_Brush
  1707. MOV EAX, [EAX].TControl.fColor
  1708. @@2:
  1709. CALL Color2RGB
  1710. PUSH EAX
  1711. CALL CreateSolidBrush // EAX = Br
  1712. POP EDX // Rgn
  1713. PUSH EAX //-------------------//
  1714. PUSH EAX // Br
  1715. PUSH EDX // Rgn
  1716. PUSH [EBX].FHandle // fHandle
  1717. CALL Windows.FillRgn
  1718. CALL DeleteObject
  1719. @@fin:
  1720. POP EBX
  1721. end;
  1722. procedure TCanvas.FloodFill(X, Y: Integer; Color: TColor;
  1723. FillStyle: TFillStyle);
  1724. asm
  1725. PUSH EBX
  1726. MOV EBX, EAX
  1727. MOVZX EAX, [FillStyle]
  1728. TEST EAX, EAX
  1729. MOV EAX, FLOODFILLSURFACE // = 1
  1730. JZ @@1
  1731. //MOV EAX, FLOODFILLBORDER // = 0
  1732. DEC EAX
  1733. @@1:
  1734. PUSH EAX
  1735. PUSH [Color]
  1736. PUSH ECX
  1737. PUSH EDX
  1738. PUSH HandleValid or BrushValid or ChangingCanvas
  1739. PUSH EBX
  1740. CALL RequiredState
  1741. PUSH EAX
  1742. CALL Windows.ExtFloodFill
  1743. POP EBX
  1744. end;
  1745. procedure TCanvas.FrameRect({$IFNDEF FPC}const{$ENDIF} Rect: TRect);
  1746. asm
  1747. PUSH EBX
  1748. XCHG EBX, EAX
  1749. PUSH EDX
  1750. MOV ECX, [EBX].TCanvas.fBrush
  1751. JECXZ @@1
  1752. PUSH [ECX].TGraphicTool.fData.Color
  1753. JMP @@cr_br
  1754. @@1: MOV ECX, [EBX].TCanvas.fOwnerControl
  1755. JECXZ @@2
  1756. PUSH [ECX].TControl.fColor
  1757. JMP @@cr_br
  1758. @@2: PUSH clWhite
  1759. @@cr_br:POP EAX // @Rect
  1760. CALL Color2RGB
  1761. PUSH EAX
  1762. CALL CreateSolidBrush
  1763. POP EDX
  1764. PUSH EAX
  1765. PUSH EAX
  1766. PUSH EDX
  1767. PUSH HandleValid or ChangingCanvas
  1768. PUSH EBX
  1769. CALL RequiredState
  1770. PUSH EAX
  1771. CALL Windows.FrameRect
  1772. CALL DeleteObject
  1773. POP EBX
  1774. end;
  1775. procedure TCanvas.LineTo(X, Y: Integer);
  1776. asm
  1777. PUSH ECX
  1778. PUSH EDX
  1779. PUSH HandleValid or PenValid or BrushValid or ChangingCanvas
  1780. PUSH EAX
  1781. CALL RequiredState
  1782. PUSH EAX //Canvas.fHandle
  1783. CALL Windows.LineTo
  1784. end;
  1785. procedure TCanvas.MoveTo(X, Y: Integer);
  1786. asm
  1787. PUSH 0
  1788. PUSH ECX
  1789. PUSH EDX
  1790. PUSH HandleValid
  1791. PUSH EAX
  1792. CALL RequiredState
  1793. PUSH EAX //Canvas.fHandle
  1794. CALL Windows.MoveToEx
  1795. end;
  1796. procedure TCanvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); stdcall;
  1797. asm
  1798. PUSH HandleValid or PenValid or BrushValid or ChangingCanvas
  1799. PUSH dword ptr [EBP + 8]
  1800. CALL RequiredState
  1801. MOV EDX, EAX
  1802. PUSH ESI
  1803. LEA ESI, [Y4]
  1804. STD
  1805. XOR ECX, ECX
  1806. MOV CL, 8
  1807. @@1:
  1808. LODSD
  1809. PUSH EAX
  1810. LOOP @@1
  1811. CLD
  1812. PUSH EDX //Canvas.fHandle
  1813. CALL Windows.Pie
  1814. POP ESI
  1815. end;
  1816. procedure TCanvas.Polygon(const Points: array of TPoint);
  1817. asm
  1818. INC ECX
  1819. PUSH ECX
  1820. PUSH EDX
  1821. PUSH HandleValid or PenValid or BrushValid or ChangingCanvas
  1822. PUSH EAX
  1823. CALL RequiredState
  1824. PUSH EAX
  1825. CALL Windows.Polygon
  1826. end;
  1827. procedure TCanvas.Polyline(const Points: array of TPoint);
  1828. asm
  1829. INC ECX
  1830. PUSH ECX
  1831. PUSH EDX
  1832. PUSH HandleValid or PenValid or BrushValid or ChangingCanvas
  1833. PUSH EAX
  1834. CALL RequiredState
  1835. PUSH EAX
  1836. CALL Windows.Polyline
  1837. end;
  1838. procedure TCanvas.Rectangle(X1, Y1, X2, Y2: Integer);
  1839. asm
  1840. PUSH [Y2]
  1841. PUSH [X2]
  1842. PUSH ECX
  1843. PUSH EDX
  1844. PUSH HandleValid or BrushValid or PenValid or ChangingCanvas
  1845. PUSH EAX
  1846. CALL RequiredState
  1847. PUSH EAX
  1848. CALL Windows.Rectangle
  1849. end;
  1850. procedure TCanvas.RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);
  1851. asm
  1852. PUSH [Y3]
  1853. PUSH [X3]
  1854. PUSH [Y2]
  1855. PUSH [X2]
  1856. PUSH ECX
  1857. PUSH EDX
  1858. PUSH HandleValid or BrushValid or PenValid or ChangingCanvas
  1859. PUSH EAX
  1860. CALL RequiredState
  1861. PUSH EAX
  1862. CALL Windows.RoundRect
  1863. end;
  1864. procedure TCanvas.TextArea(const Text: String; var Sz: TSize;
  1865. var P0: TPoint);
  1866. asm
  1867. PUSH EBX
  1868. MOV EBX, EAX
  1869. PUSH ECX
  1870. CALL TextExtent
  1871. POP EDX
  1872. MOV ECX, [P0]
  1873. XOR EAX, EAX
  1874. MOV [ECX].TPoint.x, EAX
  1875. MOV [ECX].TPoint.y, EAX
  1876. CMP [GlobalCanvas_OnTextArea], EAX
  1877. JZ @@exit
  1878. MOV EAX, EBX
  1879. CALL [GlobalCanvas_OnTextArea]
  1880. @@exit:
  1881. POP EBX
  1882. end;
  1883. function TCanvas.TextExtent(const Text: string): TSize;
  1884. asm
  1885. PUSH EBX
  1886. PUSH ESI
  1887. MOV EBX, EAX
  1888. PUSH ECX // prepare @Result
  1889. MOV EAX, EDX
  1890. CALL System.@LStrLen
  1891. PUSH EAX // prepare Length(Text)
  1892. CALL EDX2PChar
  1893. PUSH EDX // prepare PChar(Text)
  1894. PUSH HandleValid or FontValid
  1895. PUSH EBX
  1896. CALL RequiredState
  1897. XCHG ESI, EAX
  1898. TEST ESI, ESI // ESI = fHandle before
  1899. JNZ @@1
  1900. PUSH ESI
  1901. CALL CreateCompatibleDC
  1902. MOV EDX, EBX
  1903. XCHG EAX, EDX // EAX := @Self; EDX := DC
  1904. CALL SetHandle
  1905. //****************************************************** // Added By M.Gerasimov
  1906. CMP [EBX].TCanvas.fIsPaintDC, 1
  1907. JZ @@2
  1908. XOR ESI,ESI
  1909. @@2:
  1910. //******************************************************
  1911. @@1:
  1912. PUSH HandleValid or FontValid
  1913. PUSH EBX
  1914. CALL RequiredState
  1915. PUSH EAX // prepare DC
  1916. CALL Windows.GetTextExtentPoint32
  1917. TEST ESI, ESI
  1918. JNZ @@exit
  1919. XOR EDX, EDX
  1920. XCHG EAX, EBX
  1921. CALL SetHandle
  1922. @@exit:
  1923. POP ESI
  1924. POP EBX
  1925. end;
  1926. procedure TCanvas.TextOut(X, Y: Integer; const Text: String); stdcall;
  1927. asm
  1928. PUSH EBX
  1929. MOV EBX, [EBP+8]
  1930. MOV EAX, [Text]
  1931. PUSH EAX
  1932. CALL System.@LStrLen
  1933. XCHG EAX, [ESP] // prepare Length(Text)
  1934. //CALL System.@LStrToPChar // string does not need to be null-terminated !
  1935. PUSH EAX // prepare PChar(Text)
  1936. PUSH [Y] // prepare Y
  1937. PUSH [X] // prepare X
  1938. PUSH HandleValid or FontValid or BrushValid or ChangingCanvas
  1939. PUSH EBX
  1940. CALL RequiredState
  1941. PUSH EAX // prepare fHandle
  1942. CALL Windows.TextOut
  1943. POP EBX
  1944. end;
  1945. procedure TCanvas.TextRect(const Rect: TRect; X, Y: Integer; const Text: string);
  1946. asm
  1947. PUSH EBX
  1948. XCHG EBX, EAX
  1949. PUSH 0 // prepare 0
  1950. PUSH EDX
  1951. PUSH ECX
  1952. MOV EAX, [Text]
  1953. PUSH EAX
  1954. CALL System.@LStrLen
  1955. POP ECX // ECX = @Text[1]
  1956. POP EDX // EDX = X
  1957. XCHG EAX, [ESP] // prepare Length(Text), EAX = @Rect
  1958. PUSH ECX // prepare PChar(Text)
  1959. PUSH EAX // prepare @Rect
  1960. XOR EAX, EAX
  1961. MOV AL, ETO_CLIPPED // = 4
  1962. MOV ECX, [EBX].fBrush
  1963. JECXZ @@opaque
  1964. CMP [ECX].TGraphicTool.fData.Brush.Style, bsClear
  1965. JZ @@txtout
  1966. @@opaque:
  1967. DB $0C, ETO_OPAQUE //OR AL, ETO_OPAQUE
  1968. @@txtout:
  1969. PUSH EAX // prepare Options
  1970. PUSH [Y] // prepare Y
  1971. PUSH EDX // prepare X
  1972. PUSH HandleValid or FontValid or BrushValid or ChangingCanvas
  1973. PUSH EBX
  1974. CALL RequiredState // EAX = fHandle
  1975. PUSH EAX // prepare fHandle
  1976. CALL Windows.ExtTextOut
  1977. POP EBX
  1978. end;
  1979. function TCanvas.GetBrush: PGraphicTool;
  1980. asm
  1981. MOV ECX, [EAX].fBrush
  1982. INC ECX
  1983. LOOP @@exit
  1984. PUSH EAX
  1985. CALL NewBrush
  1986. POP EDX
  1987. PUSH EAX
  1988. MOV [EDX].fBrush, EAX
  1989. MOV [EAX].TGraphicTool.fOnChange.TMethod.Code, Offset[TCanvas.ObjectChanged]
  1990. MOV [EAX].TGraphicTool.fOnChange.TMethod.Data, EDX
  1991. MOV ECX, [EDX].fOwnerControl
  1992. JECXZ @@1
  1993. PUSH [ECX].TControl.fBrush
  1994. MOV ECX, [ECX].TControl.fColor
  1995. MOV [EAX].TGraphicTool.fData.Color, ECX
  1996. POP EDX
  1997. TEST EDX, EDX
  1998. JZ @@1
  1999. CALL TGraphicTool.Assign
  2000. @@1: POP ECX
  2001. @@exit: XCHG EAX, ECX
  2002. end;
  2003. function TCanvas.GetFont: PGraphicTool;
  2004. asm
  2005. MOV ECX, [EAX].TCanvas.fFont
  2006. INC ECX
  2007. LOOP @@exit
  2008. PUSH EAX
  2009. CALL NewFont
  2010. POP EDX
  2011. PUSH EAX
  2012. MOV [EDX].TCanvas.fFont, EAX
  2013. MOV [EAX].TGraphicTool.fOnChange.TMethod.Code, Offset[TCanvas.ObjectChanged]
  2014. MOV [EAX].TGraphicTool.fOnChange.TMethod.Data, EDX
  2015. MOV ECX, [EDX].fOwnerControl
  2016. JECXZ @@1
  2017. PUSH [ECX].TControl.fFont
  2018. MOV ECX, [ECX].TControl.fTextColor
  2019. MOV [EAX].TGraphicTool.fData.Color, ECX
  2020. POP EDX
  2021. TEST EDX, EDX
  2022. JZ @@1
  2023. CALL TGraphicTool.Assign
  2024. @@1: POP ECX
  2025. @@exit: MOV EAX, ECX
  2026. end;
  2027. function TCanvas.GetPen: PGraphicTool;
  2028. asm
  2029. MOV ECX, [EAX].TCanvas.fPen
  2030. INC ECX
  2031. LOOP @@exit
  2032. PUSH EAX
  2033. CALL NewPen
  2034. POP EDX
  2035. MOV [EDX].fPen, EAX
  2036. PUSH EAX
  2037. MOV EAX, EDX
  2038. CALL AssignChangeEvents
  2039. POP ECX
  2040. @@exit: MOV EAX, ECX
  2041. end;
  2042. function TCanvas.GetHandle: HDC;
  2043. asm
  2044. CMP word ptr[EAX].fOnGetHandle.TMethod.Code+2, 0
  2045. MOV EDX, EAX
  2046. MOV EAX, [EDX].fHandle
  2047. JZ @@exit
  2048. MOV EAX, [EDX].fOnGetHandle.TMethod.Data
  2049. PUSH EDX
  2050. CALL [EDX].fOnGetHandle.TMethod.Code
  2051. XCHG EAX, [ESP]
  2052. POP EDX
  2053. PUSH EDX
  2054. CALL SetHandle
  2055. POP EAX
  2056. @@exit:
  2057. end;
  2058. procedure TCanvas.AssignChangeEvents;
  2059. asm
  2060. PUSH ESI
  2061. LEA ESI, [EAX].fBrush
  2062. MOV CL, 3
  2063. MOV EDX, EAX
  2064. @@1: LODSD
  2065. TEST EAX, EAX
  2066. JZ @@nxt
  2067. MOV [EAX].TGraphicTool.fOnChange.TMethod.Data, EDX
  2068. MOV [EAX].TGraphicTool.fOnChange.TMethod.Code, offset[ ObjectChanged ]
  2069. @@nxt: DEC CL
  2070. JNZ @@1
  2071. POP ESI
  2072. end;
  2073. function Mul64i( const X: I64; Mul: Integer ): I64;
  2074. asm //cmd //opd
  2075. TEST EDX, EDX
  2076. PUSHFD
  2077. JGE @@1
  2078. NEG EDX
  2079. @@1: PUSH ECX
  2080. CALL Mul64EDX
  2081. POP EAX
  2082. POPFD
  2083. JGE @@2
  2084. MOV EDX, EAX
  2085. CALL Neg64
  2086. @@2:
  2087. end;
  2088. function Div64i( const X: I64; D: Integer ): I64;
  2089. asm //cmd //opd
  2090. PUSH EBX
  2091. XOR EBX, EBX
  2092. PUSH ESI
  2093. XCHG ESI, EAX
  2094. LODSD
  2095. MOV [ECX], EAX
  2096. LODSD
  2097. MOV [ECX+4], EAX
  2098. MOV ESI, ECX
  2099. PUSH EDX
  2100. XCHG EAX, ECX
  2101. CALL Sgn64
  2102. TEST EAX, EAX
  2103. JGE @@1
  2104. INC EBX
  2105. MOV EAX, ESI
  2106. MOV EDX, ESI
  2107. CALL Neg64
  2108. @@1: POP EDX
  2109. TEST EDX, EDX
  2110. JGE @@2
  2111. XOR EBX, 1
  2112. NEG EDX
  2113. @@2: MOV EAX, ESI
  2114. MOV ECX, ESI
  2115. CALL Div64EDX
  2116. DEC EBX
  2117. JNZ @@3
  2118. MOV EDX, ESI
  2119. XCHG EAX, ESI
  2120. CALL Neg64
  2121. @@3: POP ESI
  2122. POP EBX
  2123. end;
  2124. function Int2Hex( Value : DWord; Digits : Integer ) : String;
  2125. asm // EAX = Value
  2126. // EDX = Digits
  2127. // ECX = @Result
  2128. PUSH 0
  2129. ADD ESP, -0Ch
  2130. PUSH EDI
  2131. PUSH ECX
  2132. LEA EDI, [ESP+8+0Fh] // EBX := @Buf[ 15 ]
  2133. {$IFDEF SMALLEST_CODE}
  2134. {$ELSE}
  2135. AND EDX, $F
  2136. {$ENDIF}
  2137. @@loop: DEC EDI
  2138. DEC EDX
  2139. PUSH EAX
  2140. {$IFDEF PARANOIA} DB $24, $0F {$ELSE} AND AL, 0Fh {$ENDIF}
  2141. {$IFDEF oldcode}
  2142. {$IFDEF PARANOIA} DB $3C, 9 {$ELSE} CMP AL, 9 {$ENDIF}
  2143. JA @@10
  2144. {$IFDEF PARANOIA} DB $04, 30h-41h+0Ah {$ELSE} ADD AL,30h-41h+0Ah {$ENDIF}
  2145. @@10:
  2146. {$IFDEF PARANOIA} DB $04, 41h-0Ah {$ELSE} ADD AL,41h-0Ah {$ENDIF}
  2147. {$ELSE newcode}
  2148. AAM
  2149. DB $D5, $11 //AAD
  2150. ADD AL, $30
  2151. {$ENDIF newcode}
  2152. //MOV byte ptr [EDI], AL
  2153. STOSB
  2154. DEC EDI
  2155. POP EAX
  2156. SHR EAX, 4
  2157. JNZ @@loop
  2158. TEST EDX, EDX
  2159. JG @@loop
  2160. POP EAX // EAX = @Result
  2161. MOV EDX, EDI // EDX = @resulting string
  2162. CALL System.@LStrFromPChar
  2163. POP EDI
  2164. ADD ESP, 10h
  2165. {== by KSer - to test it only.
  2166. function Int2Hex( Value : DWord; Digits : Integer ) : shortString;
  2167. asm
  2168. MOV [ECX], DL
  2169. XADD EDX, ECX
  2170. @@loop1:
  2171. PUSH EAX
  2172. db $24, $0F // and al,$0F
  2173. AAM
  2174. DB $D5, $11 // AAD
  2175. db $04, $30 // add al,$30
  2176. MOV [EDX], AL
  2177. POP EAX
  2178. SHR EAX, 4
  2179. DEC EDX
  2180. LOOP @@loop1
  2181. }
  2182. end;
  2183. function Hex2Int( const Value : String) : Integer;
  2184. asm
  2185. CALL EAX2PChar
  2186. PUSH ESI
  2187. XCHG ESI, EAX
  2188. XOR EDX, EDX
  2189. TEST ESI, ESI
  2190. JE @@exit
  2191. LODSB
  2192. {$IFDEF PARANOIA} DB $3C, '$' {$ELSE} CMP AL, '$' {$ENDIF}
  2193. JNE @@1
  2194. @@0: LODSB
  2195. @@1: TEST AL, AL
  2196. JE @@exit
  2197. {$IFDEF PARANOIA} DB $2C, '0' {$ELSE} SUB AL, '0' {$ENDIF}
  2198. {$IFDEF PARANOIA} DB $3C, 9 {$ELSE} CMP AL, '9' - '0' {$ENDIF}
  2199. JBE @@3
  2200. {$IFDEF PARANOIA} DB $2C, $11 {$ELSE} SUB AL, 'A' - '0' {$ENDIF}
  2201. {$IFDEF PARANOIA} DB $3C, 5 {$ELSE} CMP AL, 'F' - 'A' {$ENDIF}
  2202. JBE @@2
  2203. {$IFDEF PARANOIA} DB $2C, 32 {$ELSE} SUB AL, 32 {$ENDIF}
  2204. {$IFDEF PARANOIA} DB $3C, 5 {$ELSE} CMP AL, 'F' - 'A' {$ENDIF}
  2205. JA @@exit
  2206. @@2:
  2207. {$IFDEF PARANOIA} DB $04, 0Ah {$ELSE} ADD AL, 0Ah {$ENDIF}
  2208. @@3:
  2209. SHL EDX, 4
  2210. ADD DL, AL
  2211. JMP @@0
  2212. @@exit: XCHG EAX, EDX
  2213. POP ESI
  2214. end;
  2215. function cHex2Int( const Value : String) : Integer;
  2216. asm
  2217. TEST EAX, EAX
  2218. JZ @@exit
  2219. CMP word ptr [EAX], '0x'
  2220. JZ @@skip_2_chars
  2221. CMP word ptr [EAX], '0X'
  2222. JNZ @@2Hex2Int
  2223. @@skip_2_chars:
  2224. INC EAX
  2225. INC EAX
  2226. @@2Hex2Int:
  2227. JMP Hex2Int
  2228. @@exit:
  2229. end;
  2230. function Int2Str( Value : Integer ) : String;
  2231. asm
  2232. XOR ECX, ECX
  2233. PUSH ECX
  2234. ADD ESP, -0Ch
  2235. PUSH EBX
  2236. LEA EBX, [ESP + 15 + 4]
  2237. PUSH EDX
  2238. CMP EAX, ECX
  2239. PUSHFD
  2240. JGE @@1
  2241. NEG EAX
  2242. @@1:
  2243. MOV CL, 10
  2244. @@2:
  2245. DEC EBX
  2246. XOR EDX, EDX
  2247. DIV ECX
  2248. ADD DL, 30h
  2249. MOV [EBX], DL
  2250. TEST EAX, EAX
  2251. JNZ @@2
  2252. POPFD
  2253. JGE @@3
  2254. DEC EBX
  2255. MOV byte ptr [EBX], '-'
  2256. @@3:
  2257. POP EAX
  2258. MOV EDX, EBX
  2259. CALL System.@LStrFromPChar
  2260. POP EBX
  2261. ADD ESP, 10h
  2262. end;
  2263. function Int2Ths( I : Integer ) : String;
  2264. asm
  2265. PUSH EBP
  2266. MOV EBP, ESP
  2267. PUSH EAX
  2268. PUSH EDX
  2269. CALL Int2Str
  2270. POP EDX
  2271. POP EAX
  2272. TEST EAX, EAX
  2273. JGE @@0
  2274. NEG EAX
  2275. @@0:
  2276. CMP EAX, 1000
  2277. JL @@Exit
  2278. PUSH EDX
  2279. MOV EAX, [EDX]
  2280. PUSH EAX
  2281. CALL System.@LStrLen // EAX = Length(Result)
  2282. POP EDX
  2283. PUSH EDX // EDX = @Result[ 1 ]
  2284. XOR ECX, ECX
  2285. @@1:
  2286. ROL ECX, 8
  2287. DEC EAX
  2288. MOV CL, [EDX+EAX]
  2289. JZ @@fin
  2290. CMP ECX, 300000h
  2291. JL @@1
  2292. PUSH ECX
  2293. XOR ECX, ECX
  2294. MOV CL, [ThsSeparator]
  2295. JMP @@1
  2296. @@fin: CMP CL, '-'
  2297. JNE @@fin1
  2298. CMP CH, [ThsSeparator]
  2299. JNE @@fin1
  2300. MOV CH, 0 // this corrects -,ddd,...
  2301. @@fin1: CMP ECX, 01000000h
  2302. JGE @@fin2
  2303. INC EAX
  2304. ROL ECX, 8
  2305. JMP @@fin1
  2306. @@fin2: PUSH ECX
  2307. LEA EDX, [ESP+EAX]
  2308. MOV EAX, [EBP-4]
  2309. CALL System.@LStrFromPChar
  2310. @@Exit:
  2311. MOV ESP, EBP
  2312. POP EBP
  2313. end;
  2314. function Int2Digs( Value, Digits : Integer ) : String;
  2315. asm
  2316. PUSH EBP
  2317. MOV EBP, ESP
  2318. PUSH EDX // [EBP-4] = Digits
  2319. PUSH ECX
  2320. MOV EDX, ECX
  2321. CALL Int2Str
  2322. POP ECX
  2323. PUSH ECX // [EBP-8] = @Result
  2324. MOV EAX, [ECX]
  2325. PUSH EAX
  2326. CALL System.@LStrLen
  2327. POP EDX // EDX = @Result[1]
  2328. MOV ECX, EAX // ECX = Length( Result )
  2329. ADD EAX, EAX
  2330. SUB ESP, EAX
  2331. MOV EAX, ESP
  2332. PUSHAD
  2333. CALL StrCopy
  2334. POPAD
  2335. MOV EDX, EAX
  2336. ADD ESP, -100
  2337. CMP byte ptr [EDX], '-'
  2338. PUSHFD
  2339. JNE @@1
  2340. INC EDX
  2341. @@1:
  2342. MOV EAX, [EBP-4] // EAX = Digits
  2343. CMP ECX, EAX
  2344. JGE @@2
  2345. DEC EDX
  2346. MOV byte ptr [EDX], '0'
  2347. INC ECX
  2348. JMP @@1
  2349. @@2:
  2350. POPFD
  2351. JNE @@3
  2352. DEC EDX
  2353. MOV byte ptr [EDX], '-'
  2354. @@3:
  2355. MOV EAX, [EBP-8]
  2356. CALL System.@LStrFromPChar
  2357. MOV ESP, EBP
  2358. POP EBP
  2359. end;
  2360. function Num2Bytes( Value : Double ) : String;
  2361. asm
  2362. PUSH EBX
  2363. PUSH ESI
  2364. PUSH EDI
  2365. MOV EBX, ESP
  2366. MOV ESI, EAX
  2367. MOV ECX, 4
  2368. MOV EDX, 'TGMk'
  2369. @@1:
  2370. FLD [Value]
  2371. @@10:
  2372. FICOM dword ptr [@@1024]
  2373. FSTSW AX
  2374. SAHF
  2375. JB @@2
  2376. FIDIV dword ptr [@@1024]
  2377. FST [Value]
  2378. WAIT
  2379. TEST DL, 20h
  2380. JE @@ror
  2381. AND DL, not 20h
  2382. JMP @@nxt
  2383. @@1024: DD 1024
  2384. @@100: DD 100
  2385. @@ror:
  2386. ROR EDX, 8
  2387. @@nxt:
  2388. LOOP @@10
  2389. @@2:
  2390. TEST DL, 20h
  2391. JZ @@3
  2392. MOV DL, 0
  2393. @@3: MOV DH, 0
  2394. PUSH DX
  2395. MOV EDI, ESP
  2396. FLD ST(0)
  2397. CALL System.@TRUNC
  2398. {$IFDEF _D2orD3}
  2399. PUSH 0
  2400. {$ELSE}
  2401. PUSH EDX
  2402. {$ENDIF}
  2403. PUSH EAX
  2404. FILD qword ptr [ESP]
  2405. POP EDX
  2406. POP EDX
  2407. MOV EDX, ESI
  2408. CALL Int2Str
  2409. FSUBP ST(1), ST
  2410. FIMUL dword ptr [@@100]
  2411. CALL System.@TRUNC
  2412. TEST EAX, EAX
  2413. JZ @@4
  2414. XOR ECX, ECX
  2415. MOV CL, 0Ah
  2416. CDQ
  2417. IDIV ECX
  2418. TEST EDX, EDX
  2419. JZ @@5
  2420. MOV AH, DL
  2421. SHL EAX, 16
  2422. ADD EAX, '00. '
  2423. PUSH EAX
  2424. MOV EDI, ESP
  2425. INC EDI
  2426. JMP @@4
  2427. @@5: SHL EAX, 8
  2428. ADD AX, '0.'
  2429. PUSH AX
  2430. MOV EDI, ESP
  2431. @@4:
  2432. MOV EAX, [ESI]
  2433. CALL System.@LStrLen
  2434. ADD ESP, -100
  2435. SUB EDI, EAX
  2436. PUSH ESI
  2437. PUSH EDI
  2438. MOV ESI, [ESI]
  2439. MOV ECX, EAX
  2440. REP MOVSB
  2441. POP EDX
  2442. POP EAX
  2443. CALL System.@LStrFromPChar
  2444. MOV ESP, EBX
  2445. POP EDI
  2446. POP ESI
  2447. POP EBX
  2448. end;
  2449. function S2Int( S: PChar ): Integer;
  2450. asm
  2451. XCHG EDX, EAX
  2452. XOR EAX, EAX
  2453. TEST EDX, EDX
  2454. JZ @@exit
  2455. XOR ECX, ECX
  2456. MOV CL, [EDX]
  2457. INC EDX
  2458. CMP CL, '-'
  2459. PUSHFD
  2460. JE @@0
  2461. @@1: CMP CL, '+'
  2462. JNE @@2
  2463. @@0: MOV CL, [EDX]
  2464. INC EDX
  2465. @@2: SUB CL, '0'
  2466. CMP CL, '9'-'0'
  2467. JA @@fin
  2468. LEA EAX, [EAX+EAX*4] //
  2469. LEA EAX, [ECX+EAX*2] //
  2470. JMP @@0
  2471. @@fin: POPFD
  2472. JNE @@exit
  2473. NEG EAX
  2474. @@exit:
  2475. end;
  2476. function Str2Int(const Value : String) : Integer;
  2477. asm
  2478. CALL EAX2PChar
  2479. CALL S2Int
  2480. end;
  2481. {$IFDEF ASM_UNICODE}
  2482. function TrimLeft(const S: string): string;
  2483. asm
  2484. XCHG EAX, EDX
  2485. CALL EDX2PChar
  2486. DEC EDX
  2487. @@1: INC EDX
  2488. MOVZX ECX, byte ptr [EDX]
  2489. JECXZ @@fin
  2490. CMP CL, ' '
  2491. JBE @@1
  2492. @@fin:
  2493. CALL System.@LStrFromPChar
  2494. end;
  2495. function TrimRight(const S: string): string;
  2496. asm
  2497. PUSH EDX
  2498. PUSH EAX
  2499. PUSH EAX
  2500. CALL System.@LStrLen
  2501. XCHG EAX, [ESP]
  2502. CALL EAX2PChar
  2503. POP ECX
  2504. INC ECX
  2505. @@1: DEC ECX
  2506. MOV DL, [EAX+ECX]
  2507. JL @@fin
  2508. CMP DL, ' '
  2509. JBE @@1
  2510. @@fin:
  2511. INC ECX
  2512. POP EAX
  2513. XOR EDX, EDX
  2514. INC EDX
  2515. CALL System.@LStrCopy
  2516. end;
  2517. function Trim( const S : string): string;
  2518. asm
  2519. PUSH EDX
  2520. CALL TrimRight
  2521. POP EDX
  2522. MOV EAX, [EDX]
  2523. CALL TrimLeft
  2524. end;
  2525. {$ENDIF ASM_UNICODE}
  2526. function LowerCase(const S: string): string;
  2527. asm
  2528. PUSH ESI
  2529. XCHG EAX, EDX
  2530. PUSH EAX
  2531. CALL System.@LStrAsg
  2532. POP EAX
  2533. CALL UniqueString
  2534. PUSH EAX
  2535. CALL System.@LStrLen
  2536. POP ESI
  2537. XCHG ECX, EAX
  2538. JECXZ @@exit
  2539. @@go:
  2540. LODSB
  2541. {$IFDEF PARANOIA} DB $2C, 'A' {$ELSE} SUB AL, 'A' {$ENDIF}
  2542. {$IFDEF PARANOIA} DB $3C, 26 {$ELSE} CMP AL, 'Z'-'A'+1 {$ENDIF}
  2543. JNB @@1
  2544. ADD byte ptr [ESI - 1], 20h
  2545. @@1:
  2546. LOOP @@go
  2547. @@exit:
  2548. POP ESI
  2549. end;
  2550. function UpperCase(const S: string): string;
  2551. asm
  2552. PUSH ESI
  2553. XCHG EAX, EDX
  2554. PUSH EAX
  2555. CALL System.@LStrAsg
  2556. POP EAX
  2557. CALL UniqueString
  2558. PUSH EAX
  2559. CALL System.@LStrLen
  2560. POP ESI
  2561. XCHG ECX, EAX
  2562. JECXZ @@exit
  2563. @@go:
  2564. LODSB
  2565. {$IFDEF PARANOIA} DB $2C, 'a' {$ELSE} SUB AL, 'a' {$ENDIF}
  2566. {$IFDEF PARANOIA} DB $3C, $1A {$ELSE} CMP AL, 'z'-'a'+1 {$ENDIF}
  2567. JNB @@1
  2568. SUB byte ptr [ESI - 1], 20h
  2569. @@1:
  2570. LOOP @@go
  2571. @@exit:
  2572. POP ESI
  2573. end;
  2574. {$IFDEF ASM_UNICODE}
  2575. function CopyEnd( const S : String; Idx : Integer ) : String;
  2576. asm
  2577. PUSH ECX
  2578. PUSH EAX
  2579. PUSH EDX
  2580. CALL System.@LStrLen
  2581. POP EDX
  2582. TEST EDX, EDX
  2583. JG @@1
  2584. XOR EDX, EDX
  2585. INC EDX
  2586. @@1:
  2587. SUB EAX, EDX
  2588. MOV ECX, EAX
  2589. POP EAX
  2590. JGE @@ret_end
  2591. POP EAX
  2592. JL System.@LStrClr
  2593. @@ret_end:
  2594. INC ECX
  2595. CALL System.@LStrCopy
  2596. end;
  2597. {$ENDIF}
  2598. {$IFDEF ASM_UNICODE}
  2599. function CopyTail( const S : String; Len : Integer ) : String;
  2600. asm
  2601. PUSH ECX
  2602. PUSH EAX
  2603. PUSH EDX
  2604. CALL System.@LStrLen
  2605. POP ECX
  2606. CMP ECX, EAX
  2607. {$IFDEF USE_CMOV}
  2608. CMOVG ECX, EAX
  2609. {$ELSE}
  2610. JLE @@1
  2611. MOV ECX, EAX
  2612. @@1: {$ENDIF}
  2613. MOV EDX, EAX
  2614. SUB EDX, ECX
  2615. INC EDX
  2616. POP EAX
  2617. CALL System.@LStrCopy
  2618. end;
  2619. {$ENDIF}
  2620. {$IFDEF ASM_UNICODE}
  2621. procedure DeleteTail( var S : String; Len : Integer );
  2622. asm
  2623. PUSH EAX
  2624. PUSH EDX
  2625. MOV EAX, [EAX]
  2626. CALL System.@LStrLen
  2627. POP ECX
  2628. CMP ECX, EAX
  2629. {$IFDEF USE_CMOV}
  2630. CMOVG ECX, EAX
  2631. {$ELSE}
  2632. JLE @@1
  2633. MOV ECX, EAX
  2634. @@1: {$ENDIF}
  2635. MOV EDX, EAX
  2636. SUB EDX, ECX
  2637. INC EDX
  2638. POP EAX
  2639. CALL System.@LStrDelete
  2640. end;
  2641. {$ENDIF}
  2642. function IndexOfChar( const S : String; Chr : Char ) : Integer;
  2643. asm
  2644. CALL EAX2PChar
  2645. PUSH EAX
  2646. CALL StrScan
  2647. POP EDX
  2648. TEST EAX, EAX
  2649. JE @@exit__1
  2650. SUB EAX, EDX
  2651. INC EAX
  2652. RET
  2653. @@exit__1:
  2654. DEC EAX
  2655. end;
  2656. function IndexOfCharsMin( const S, Chars : String ) : Integer;
  2657. asm
  2658. PUSH ESI
  2659. PUSH EAX
  2660. CALL EDX2PChar
  2661. MOV ESI, EDX
  2662. XOR ECX, ECX
  2663. DEC ECX
  2664. @@1: LODSB
  2665. TEST AL, AL
  2666. JZ @@exit
  2667. XCHG EDX, EAX
  2668. POP EAX
  2669. PUSH EAX
  2670. PUSH ECX
  2671. CALL IndexOfChar
  2672. POP ECX
  2673. TEST EAX, EAX
  2674. JLE @@1
  2675. TEST ECX, ECX
  2676. JLE @@2
  2677. CMP EAX, ECX
  2678. JGE @@1
  2679. @@2:
  2680. @@exit: XCHG EAX, ECX
  2681. JL @@1
  2682. POP ECX
  2683. POP ESI
  2684. end;
  2685. function IndexOfStr( const S, Sub : String ) : Integer;
  2686. asm
  2687. PUSH EBX
  2688. PUSH ESI
  2689. PUSH EDI
  2690. PUSH EAX
  2691. MOV EAX, EDX
  2692. PUSH EDX
  2693. CALL System.@LStrLen
  2694. MOV EDI, EAX
  2695. POP EAX
  2696. //CALL System.@LStrToPChar
  2697. CALL EAX2PChar
  2698. MOV BL, [EAX]
  2699. XCHG EAX, [ESP]
  2700. //CALL System.@LStrToPChar
  2701. CALL EAX2PChar
  2702. MOV ESI, EAX
  2703. DEC EAX
  2704. @@1: INC EAX
  2705. MOV DL, BL
  2706. CALL StrScan
  2707. TEST EAX, EAX
  2708. JE @@exit__1
  2709. POP EDX
  2710. PUSH EDX
  2711. MOV ECX, EDI
  2712. PUSH EAX
  2713. CALL StrLComp
  2714. POP EAX
  2715. JNE @@1
  2716. SUB EAX, ESI
  2717. INC EAX
  2718. JMP @@exit
  2719. @@exit__1:
  2720. DEC EAX
  2721. @@exit:
  2722. POP EDX
  2723. POP EDI
  2724. POP ESI
  2725. POP EBX
  2726. end;
  2727. function AllocMem( Size : Integer ) : Pointer;
  2728. asm //cmd //opd
  2729. TEST EAX, EAX
  2730. JZ @@exit
  2731. PUSH EAX
  2732. CALL System.@GetMem
  2733. POP EDX
  2734. PUSH EAX
  2735. MOV CL, 0
  2736. CALL System.@FillChar
  2737. POP EAX
  2738. @@exit:
  2739. end;
  2740. function StrPCopy(Dest: PChar; const Source: string): PChar;
  2741. asm
  2742. PUSH EAX
  2743. MOV EAX, EDX
  2744. CALL System.@LStrLen
  2745. MOV ECX, EAX
  2746. POP EAX
  2747. CALL EDX2PChar
  2748. CALL StrLCopy
  2749. end;
  2750. function StrEq( const S1, S2 : String ) : Boolean;
  2751. asm
  2752. TEST EDX, EDX
  2753. JNZ @@1
  2754. @@0: CMP EAX, EDX
  2755. JMP @@exit
  2756. @@1: TEST EAX, EAX
  2757. JZ @@0
  2758. MOV ECX, [EAX-4]
  2759. CMP ECX, [EDX-4]
  2760. JNE @@exit
  2761. PUSH EAX
  2762. PUSH EDX
  2763. PUSH 0
  2764. MOV EDX, ESP
  2765. CALL LowerCase
  2766. PUSH 0
  2767. MOV EAX, [ESP + 8]
  2768. MOV EDX, ESP
  2769. CALL LowerCase
  2770. POP EAX
  2771. POP EDX
  2772. PUSH EDX
  2773. PUSH EAX
  2774. CALL System.@LStrCmp
  2775. MOV EAX, ESP
  2776. PUSHFD
  2777. XOR EDX, EDX
  2778. MOV DL, 2
  2779. CALL System.@LStrArrayClr
  2780. POPFD
  2781. POP EDX
  2782. POP EDX
  2783. POP EDX
  2784. POP EDX
  2785. @@exit:
  2786. SETZ AL
  2787. end;
  2788. function AnsiEq( const S1, S2 : String ) : Boolean;
  2789. asm
  2790. CALL AnsiCompareStrNoCase
  2791. TEST EAX, EAX
  2792. SETZ AL
  2793. end;
  2794. function StrIn(const S: String; const A: array of String): Boolean;
  2795. asm
  2796. @@1:
  2797. TEST ECX, ECX
  2798. JL @@ret_0
  2799. PUSH EDX
  2800. MOV EDX, [EDX+ECX*4]
  2801. DEC ECX
  2802. PUSH ECX
  2803. PUSH EAX
  2804. CALL StrEq
  2805. DEC AL
  2806. POP EAX
  2807. POP ECX
  2808. POP EDX
  2809. JNZ @@1
  2810. MOV AL, 1
  2811. RET
  2812. @@ret_0:XOR EAX, EAX
  2813. end;
  2814. {$IFDEF ASM_UNICODE}
  2815. function _StrSatisfy( S, Mask : PKOLChar ) : Boolean;
  2816. asm
  2817. TEST EAX, EAX
  2818. JZ @@exit
  2819. XCHG ECX, EAX
  2820. // EDX <- Mask
  2821. // ECX <- S
  2822. XOR EAX, EAX
  2823. MOV AL, '*'
  2824. @@rest_satisfy:
  2825. PUSH ECX
  2826. PUSH EDX
  2827. @@nx_char:
  2828. MOV AH, [EDX]
  2829. OR AH, [ECX]
  2830. JZ @@fin //@@ret_true
  2831. MOV AH, 0
  2832. CMP word ptr [EDX], AX //'*'
  2833. JE @@fin //@@ret_true
  2834. CMP byte ptr [ECX], AH
  2835. JNE @@10
  2836. DEC EDX
  2837. @@1:
  2838. INC EDX
  2839. CMP byte ptr [EDX], AL //'*'
  2840. JE @@1
  2841. CMP byte ptr [EDX], AH
  2842. SETZ AL
  2843. JMP @@fin
  2844. @@10: CMP byte ptr [EDX], AH
  2845. JE @@ret_false
  2846. CMP byte ptr [EDX], '?'
  2847. JNE @@11
  2848. @@go_nx_char:
  2849. INC ECX
  2850. INC EDX
  2851. JMP @@nx_char
  2852. @@11:
  2853. CMP byte ptr [EDX], AL //'*'
  2854. JNE @@20
  2855. INC EDX
  2856. @@12: CMP byte ptr [ECX], AH
  2857. JE @@ret_false
  2858. CALL @@rest_satisfy
  2859. TEST AL, AL
  2860. JNE @@fin
  2861. MOV AL, '*'
  2862. INC ECX
  2863. JMP @@12
  2864. @@20: MOV AH, [EDX]
  2865. XOR AH, [ECX]
  2866. JE @@go_nx_char
  2867. @@ret_false:
  2868. XOR EAX, EAX
  2869. @@fin:
  2870. POP EDX
  2871. POP ECX
  2872. @@exit:
  2873. end;
  2874. {$ENDIF}
  2875. {$IFDEF ASM_UNICODE}
  2876. function StrSatisfy( const S, Mask: String ): Boolean;
  2877. asm
  2878. PUSH ESI
  2879. XCHG ESI, EAX
  2880. PUSH 0
  2881. XCHG EAX, EDX
  2882. CALL EAX2PChar
  2883. MOV EDX, ESP
  2884. CMP byte ptr [EAX], 0
  2885. JZ @@0
  2886. CALL AnsiLowerCase
  2887. @@0:
  2888. XCHG EAX, ESI
  2889. PUSH 0
  2890. CALL EAX2PChar
  2891. MOV EDX, ESP
  2892. CMP byte ptr [EAX], 0
  2893. JZ @@1
  2894. CALL AnsiLowerCase
  2895. @@1:
  2896. POP EAX
  2897. POP EDX
  2898. PUSH EDX
  2899. PUSH EAX
  2900. CALL _StrSatisfy
  2901. XCHG ESI, EAX
  2902. CALL RemoveStr
  2903. CALL RemoveStr
  2904. XCHG EAX, ESI
  2905. POP ESI
  2906. end;
  2907. {$ENDIF}
  2908. {$IFDEF ASM_UNICODE}
  2909. function _2StrSatisfy( S, Mask: PChar ): Boolean;
  2910. asm // //
  2911. PUSH EBX
  2912. XCHG EBX, EAX
  2913. PUSH 0
  2914. MOV EAX, ESP
  2915. CALL System.@LStrFromPChar
  2916. PUSH 0
  2917. MOV EAX, ESP
  2918. MOV EDX, EBX
  2919. CALL System.@LStrFromPChar
  2920. POP EAX
  2921. POP EDX
  2922. PUSH EDX
  2923. PUSH EAX
  2924. CALL StrSatisfy
  2925. XCHG EBX, EAX
  2926. CALL RemoveStr
  2927. CALL RemoveStr
  2928. XCHG EAX, EBX
  2929. POP EBX
  2930. end;
  2931. {$ENDIF}
  2932. procedure NormalizeUnixText( var S: String );
  2933. asm //cmd //opd
  2934. CMP dword ptr [EAX], 0
  2935. JZ @@exit
  2936. PUSH EBX
  2937. PUSH EDI
  2938. MOV EBX, EAX
  2939. CALL UniqueString
  2940. MOV EDI, [EBX]
  2941. @@1: MOV EAX, EDI
  2942. CALL System.@LStrLen
  2943. XCHG ECX, EAX
  2944. MOV AX, $0D0A
  2945. CMP byte ptr [EDI], AL
  2946. JNE @@loo
  2947. MOV byte ptr [EDI], AH
  2948. @@loo:
  2949. TEST ECX, ECX
  2950. JZ @@fin
  2951. @@loo1:
  2952. REPNZ SCASB
  2953. JNZ @@fin
  2954. CMP byte ptr [EDI-2], AH
  2955. JE @@loo
  2956. MOV byte ptr [EDI-1], AH
  2957. JNE @@loo1
  2958. @@fin: POP EDI
  2959. POP EBX
  2960. @@exit:
  2961. end;
  2962. {$IFDEF ASM_UNICODE}
  2963. function __DelimiterLast( Str: PChar; Delimiters: PChar ): PChar;
  2964. asm
  2965. PUSH ESI
  2966. CALL EAX2PChar
  2967. MOV ESI, EDX
  2968. MOV EDX, EAX
  2969. @@tolast:
  2970. CMP byte ptr [EAX], 0
  2971. JZ @@next1
  2972. INC EAX
  2973. JMP @@tolast
  2974. @@next1:
  2975. PUSH EAX
  2976. @@next:
  2977. LODSB
  2978. TEST AL, AL
  2979. JZ @@exit
  2980. PUSH EDX
  2981. XCHG EDX, EAX
  2982. CALL StrRScan
  2983. POP EDX
  2984. TEST EAX, EAX
  2985. JZ @@next
  2986. POP ECX
  2987. CMP byte ptr [ECX], 0
  2988. JZ @@next1
  2989. CMP EAX, ECX
  2990. JG @@next1
  2991. PUSH ECX
  2992. JLE @@next
  2993. @@exit: POP EAX
  2994. POP ESI
  2995. end;
  2996. function DelimiterLast( const Str, Delimiters: String ): Integer;
  2997. asm
  2998. CALL EAX2PChar
  2999. CALL EDX2PChar
  3000. PUSH EAX
  3001. CALL __DelimiterLast
  3002. POP EDX
  3003. SUB EAX, EDX
  3004. INC EAX
  3005. end;
  3006. {$ENDIF ASM_UNICODE}
  3007. {$IFDEF ASM_UNICODE}
  3008. function Format( const fmt: KOLString; params: array of const ): String;
  3009. asm
  3010. PUSH ESI
  3011. PUSH EDI
  3012. PUSH EBX
  3013. MOV EBX, ESP
  3014. ADD ESP, -2048
  3015. MOV ESI, ESP
  3016. INC ECX
  3017. JZ @@2
  3018. @@1:
  3019. MOV EDI, [EDX + ECX*8 - 8]
  3020. PUSH EDI
  3021. LOOP @@1
  3022. @@2:
  3023. PUSH ESP
  3024. PUSH EAX
  3025. PUSH ESI
  3026. CALL wvsprintf
  3027. MOV EDX, ESI
  3028. MOV EAX, @Result
  3029. CALL System.@LStrFromPChar
  3030. MOV ESP, EBX
  3031. POP EBX
  3032. POP EDI
  3033. POP ESI
  3034. end;
  3035. {$ENDIF ASM_UNICODE}
  3036. function FileCreate( const FileName: KOLString; OpenFlags: DWord): THandle;
  3037. asm
  3038. XOR ECX, ECX
  3039. PUSH ECX
  3040. MOV ECX, EDX
  3041. SHR ECX, 16
  3042. AND CX, $1FFF
  3043. JNZ @@1
  3044. MOV CL, FILE_ATTRIBUTE_NORMAL
  3045. @@1: PUSH ECX
  3046. MOV CL, DH
  3047. PUSH ECX // CreationMode
  3048. PUSH 0
  3049. MOV CL, DL
  3050. PUSH ECX // ShareMode
  3051. MOV DX, 0
  3052. PUSH EDX // AccessMode
  3053. //CALL System.@LStrToPChar // FileName must not be ''
  3054. PUSH EAX
  3055. CALL CreateFile
  3056. end;
  3057. function FileClose( Handle: THandle): Boolean;
  3058. asm
  3059. PUSH EAX
  3060. CALL CloseHandle
  3061. TEST EAX, EAX
  3062. SETNZ AL
  3063. end;
  3064. {$IFNDEF FILE_EXISTS_EX}
  3065. {$IFDEF ASM_UNICODE}
  3066. function FileExists( const FileName : KOLString ) : Boolean;
  3067. const size_TWin32FindData = sizeof( {$IFDEF UNICODE_CTRLS} TWin32FindDataW {$ELSE} TWin32FindDataA {$ENDIF} );
  3068. asm
  3069. CALL EAX2PChar
  3070. PUSH EAX
  3071. CALL GetFileAttributes
  3072. INC EAX
  3073. JZ @@exit
  3074. DEC EAX
  3075. {$IFDEF PARANOIA} DB $24, FILE_ATTRIBUTE_DIRECTORY {$ELSE} AND AL, FILE_ATTRIBUTE_DIRECTORY {$ENDIF}
  3076. SETZ AL
  3077. @@exit:
  3078. end;
  3079. {$ENDIF ASM_UNICODE}
  3080. {$ENDIF FILE_EXISTS_EX}
  3081. function FileSeek( Handle: THandle; MoveTo: integer; MoveMethod: TMoveMethod): DWord;
  3082. asm
  3083. MOVZX ECX, CL
  3084. PUSH ECX
  3085. PUSH 0
  3086. PUSH EDX
  3087. PUSH EAX
  3088. CALL SetFilePointer
  3089. end;
  3090. function FileRead( Handle: THandle; var Buffer; Count: DWord): DWord;
  3091. asm
  3092. PUSH EBP
  3093. PUSH 0
  3094. MOV EBP, ESP
  3095. PUSH 0
  3096. PUSH EBP
  3097. PUSH ECX
  3098. PUSH EDX
  3099. PUSH EAX
  3100. CALL ReadFile
  3101. TEST EAX, EAX
  3102. POP EAX
  3103. JNZ @@exit
  3104. XOR EAX, EAX
  3105. @@exit:
  3106. POP EBP
  3107. end;
  3108. function File2Str( Handle: THandle): String;
  3109. asm
  3110. PUSH EDX
  3111. TEST EAX, EAX
  3112. JZ @@exit // return ''
  3113. PUSH EBX
  3114. MOV EBX, EAX // EBX = Handle
  3115. XOR EDX, EDX
  3116. XOR ECX, ECX
  3117. INC ECX
  3118. CALL FileSeek
  3119. PUSH EAX // Pos
  3120. PUSH 0
  3121. PUSH EBX
  3122. CALL GetFileSize
  3123. POP EDX
  3124. SUB EAX, EDX // EAX = Size - Pos
  3125. JZ @@exitEBX
  3126. PUSH EAX
  3127. CALL System.@GetMem
  3128. XCHG EAX, EBX
  3129. MOV EDX, EBX
  3130. POP ECX
  3131. PUSH ECX
  3132. CALL FileRead
  3133. POP ECX
  3134. MOV EDX, EBX
  3135. POP EBX
  3136. POP EAX
  3137. PUSH EDX
  3138. {$IFDEF _D2}
  3139. CALL _LStrFromPCharLen
  3140. {$ELSE}
  3141. CALL System.@LStrFromPCharLen
  3142. {$ENDIF}
  3143. JMP @@freebuf
  3144. @@exitEBX:
  3145. POP EBX
  3146. @@exit:
  3147. XCHG EDX, EAX
  3148. POP EAX // @Result
  3149. PUSH EDX
  3150. CALL System.@LStrFromPChar
  3151. @@freebuf:
  3152. POP EAX
  3153. TEST EAX, EAX
  3154. JZ @@fin
  3155. CALL System.@FreeMem
  3156. @@fin:
  3157. end;
  3158. function FileWrite( Handle: THandle; const Buffer; Count: DWord): DWord;
  3159. asm
  3160. PUSH EBP
  3161. PUSH EBP
  3162. MOV EBP, ESP
  3163. PUSH 0
  3164. PUSH EBP
  3165. PUSH ECX
  3166. PUSH EDX
  3167. PUSH EAX
  3168. CALL WriteFile
  3169. TEST EAX, EAX
  3170. POP EAX
  3171. JNZ @@exit
  3172. XOR EAX, EAX
  3173. @@exit:
  3174. POP EBP
  3175. end;
  3176. function FileEOF( Handle: THandle ) : Boolean;
  3177. asm
  3178. PUSH EAX
  3179. PUSH 0
  3180. PUSH EAX
  3181. CALL GetFileSize
  3182. XCHG EAX, [ESP]
  3183. MOV CL, spCurrent
  3184. XOR EDX, EDX
  3185. CALL FileSeek
  3186. POP EDX
  3187. CMP EAX, EDX
  3188. SETGE AL
  3189. end;
  3190. function CompareSystemTime( const D1, D2 : TSystemTime) : Integer; assembler;
  3191. asm
  3192. PUSH ESI
  3193. PUSH EBX
  3194. MOV ESI, EAX
  3195. XOR EAX, EAX
  3196. XOR ECX, ECX
  3197. MOV CL, 8 // 8 words: wYear, wMonth,..., wMilliseconds
  3198. @@loo:
  3199. LODSW
  3200. MOV BX, [EDX]
  3201. INC EDX
  3202. INC EDX
  3203. CMP CL, 6
  3204. JE @@cont // skip compare DayOfWeek
  3205. SUB AX, BX
  3206. JNE @@calc
  3207. @@cont:
  3208. LOOP @@loo
  3209. JMP @@exit
  3210. @@calc:
  3211. SBB EAX, EAX
  3212. {$IFDEF PARANOIA} DB $0C, 1 {$ELSE} OR AL, 1 {$ENDIF}
  3213. @@exit:
  3214. POP EBX
  3215. POP ESI
  3216. end;
  3217. function DirectoryExists( const Name: KOLString): Boolean;
  3218. asm
  3219. PUSH EBX
  3220. //CALL System.@LStrToPChar // Name must not be ''
  3221. PUSH EAX
  3222. PUSH SEM_NOOPENFILEERRORBOX or SEM_FAILCRITICALERRORS
  3223. CALL SetErrorMode
  3224. XCHG EBX, EAX
  3225. CALL GetFileAttributes
  3226. INC EAX
  3227. JZ @@exit
  3228. DEC EAX
  3229. {$IFDEF PARANOIA} DB $24, FILE_ATTRIBUTE_DIRECTORY {$ELSE} AND AL, FILE_ATTRIBUTE_DIRECTORY {$ENDIF}
  3230. SETNZ AL
  3231. @@exit:
  3232. XCHG EAX, EBX
  3233. PUSH EAX
  3234. CALL SetErrorMode
  3235. XCHG EAX, EBX
  3236. POP EBX
  3237. end;
  3238. {$IFDEF ASM_UNICODE}
  3239. function ExtractFileName( const Path : String ) : String;
  3240. asm
  3241. PUSH EDX
  3242. PUSH EAX
  3243. MOV EDX, [DirDelimiters]
  3244. CALL __DelimiterLast
  3245. POP EDX
  3246. CMP byte ptr [EAX], 0
  3247. JZ @@1
  3248. XCHG EDX, EAX
  3249. INC EDX
  3250. @@1: POP EAX
  3251. CALL System.@LStrFromPChar
  3252. end;
  3253. {$ENDIF ASM_UNICODE}
  3254. {$IFDEF ASM_UNICODE}
  3255. function GetStartDir : String;
  3256. asm
  3257. PUSH EBX
  3258. MOV EBX, EAX
  3259. XOR EAX, EAX
  3260. MOV AH, 2
  3261. SUB ESP, EAX
  3262. MOV EDX, ESP
  3263. PUSH EAX
  3264. PUSH EDX
  3265. PUSH 0
  3266. CALL GetModuleFileName
  3267. LEA EDX, [ESP + EAX]
  3268. @@1: DEC EDX
  3269. CMP byte ptr [EDX], '\'
  3270. JNZ @@1
  3271. INC EDX
  3272. MOV byte ptr [EDX], 0
  3273. MOV EAX, EBX
  3274. MOV EDX, ESP
  3275. CALL System.@LStrFromPChar
  3276. ADD ESP, 200h
  3277. POP EBX
  3278. end;
  3279. {$ENDIF}
  3280. procedure TDirList.Clear;
  3281. asm
  3282. XOR ECX, ECX
  3283. XCHG ECX, [EAX].fList
  3284. JECXZ @@exit
  3285. XCHG EAX, ECX
  3286. CALL TList.Release
  3287. @@exit:
  3288. end;
  3289. destructor TDirList.Destroy;
  3290. asm
  3291. PUSH EBX
  3292. MOV EBX, EAX
  3293. CALL Clear
  3294. LEA EAX, [EBX].FPath
  3295. {$IFDEF UNICODE_CTRLS}
  3296. CALL System.@WStrClr
  3297. {$ELSE}
  3298. CALL System.@LStrClr
  3299. {$ENDIF}
  3300. XCHG EAX, EBX
  3301. CALL TObj.Destroy
  3302. POP EBX
  3303. end;
  3304. {$IFDEF ASM_UNICODE}
  3305. function FindFilter( const Filter: String): String;
  3306. asm
  3307. XCHG EAX, EDX
  3308. PUSH EAX
  3309. CALL System.@LStrAsg
  3310. POP EAX
  3311. CMP dword ptr [EAX], 0
  3312. JNE @@exit
  3313. LEA EDX, @@mask_all
  3314. JE System.@LStrFromPChar
  3315. @@mask_all: DB '*.*',0
  3316. @@exit:
  3317. end;
  3318. {$ENDIF ASM_UNICODE}
  3319. function TDirList.GetCount: Integer;
  3320. asm
  3321. MOV EAX, [EAX].fList
  3322. TEST EAX, EAX
  3323. {$IFDEF USE_CMOV}
  3324. CMOVNZ EAX, [EAX].TList.fCount
  3325. {$ELSE}
  3326. JZ @@exit
  3327. MOV EAX, [EAX].TList.fCount
  3328. @@exit: {$ENDIF}
  3329. end;
  3330. {$IFDEF ASM_UNICODE}
  3331. function TDirList.GetNames(Idx: Integer): string;
  3332. asm
  3333. MOV EAX, [EAX].fList
  3334. MOV EAX, [EAX].TList.fItems
  3335. MOV EDX, [EAX + EDX*4]
  3336. ADD EDX, offset TWin32FindData.cFileName //
  3337. MOV EAX, ECX
  3338. CALL System.@LStrFromPChar
  3339. end;
  3340. {$ENDIF}
  3341. {$IFDEF ASM_UNICODE}
  3342. procedure TDirList.ScanDirectoryEx(const DirPath, Filters: String;
  3343. Attr: DWord);
  3344. asm
  3345. PUSH EBX
  3346. MOV EBX, EAX
  3347. PUSHAD
  3348. LEA EAX, [EBX].fFilters
  3349. CALL Free_And_Nil
  3350. CALL NewStrList
  3351. MOV [EBX].fFilters, EAX
  3352. POPAD
  3353. PUSHAD
  3354. PUSH 0
  3355. MOV EAX, ESP
  3356. MOV EDX, ECX
  3357. CALL System.@LStrLAsg
  3358. @@1: MOV ECX, [ESP]
  3359. JECXZ @@2
  3360. MOV EAX, ESP
  3361. MOV EDX, offset[@@semicolon]
  3362. PUSH 0
  3363. MOV ECX, ESP
  3364. CALL Parse
  3365. MOV EAX, [ESP]
  3366. MOV EDX, ESP
  3367. CALL Trim
  3368. POP EDX
  3369. PUSH EDX
  3370. TEST EDX, EDX
  3371. JZ @@filt_added
  3372. MOV EAX, [EBX].fFilters
  3373. CALL TStrList.Add
  3374. @@filt_added:
  3375. CALL RemoveStr
  3376. JMP @@1
  3377. // ';' string literal
  3378. DD -1, 1
  3379. @@semicolon:
  3380. DB ';',0
  3381. @@2: POP ECX
  3382. POPAD
  3383. XOR ECX, ECX
  3384. PUSH [Attr]
  3385. CALL ScanDirectory
  3386. POP EBX
  3387. @@exit:
  3388. end;
  3389. {$ENDIF ASM_UNICODE}
  3390. procedure SwapDirItems( const Data : PSortDirData; const e1, e2 : DWORD );
  3391. asm
  3392. MOV EAX, [EAX].TSortDirData.Dir
  3393. MOV EAX, [EAX].TDirList.fList
  3394. MOV EAX, [EAX].TList.fItems
  3395. LEA EDX, [EAX+EDX*4]
  3396. LEA ECX, [EAX+ECX*4]
  3397. MOV EAX, [EDX]
  3398. XCHG EAX, [ECX]
  3399. MOV [EDX], EAX
  3400. end;
  3401. procedure TDirList.Sort(Rules: array of TSortDirRules);
  3402. const high_DefSortDirRules = High( DefSortDirRules );
  3403. asm
  3404. PUSH EBX
  3405. PUSH ESI
  3406. XOR EBX,EBX
  3407. CMP [EAX].fList, EBX
  3408. JE @@exit
  3409. PUSH EAX // prepare Dir = @Self
  3410. XOR EAX, EAX
  3411. PUSH EAX
  3412. PUSH EAX
  3413. PUSH EAX
  3414. MOV ESI, ESP
  3415. INC ECX // ECX = High(Rules)
  3416. JZ @@2
  3417. @@1: MOV AH, [EDX] // AH = Rules[ I ]
  3418. INC EDX
  3419. CALL @@add_rule
  3420. LOOP @@1
  3421. @@2: LEA EDX, [DefSortDirRules]
  3422. MOV CL, high_DefSortDirRules + 1
  3423. @@21: MOV AH, [EDX]
  3424. INC EDX
  3425. CALL @@add_rule
  3426. LOOP @@21
  3427. PUSH BX // prepare FoldersFirst(BL), CaseSensitive(BH)
  3428. MOV EBX, [ESP].TSortDirData.Dir
  3429. MOV EAX, ESP
  3430. PUSH offset[SwapDirItems]
  3431. MOV ECX, offset[CompareDirItems]
  3432. MOV EDX, [EBX].fList
  3433. MOV EDX, [EDX].TList.fCount
  3434. CALL SortData
  3435. ADD ESP, 18
  3436. JMP @@exit
  3437. @@add_rule:
  3438. PUSH ESI
  3439. PUSH ECX
  3440. MOV CL, 11
  3441. @@a1: LODSB
  3442. TEST AL, AL
  3443. JZ @@a2
  3444. CMP AL, AH
  3445. JE @@a3
  3446. LOOP @@a1
  3447. @@a2: DEC ESI
  3448. MOV [ESI], AH
  3449. CMP AH, sdrFoldersFirst
  3450. JNE @@a4
  3451. INC BL
  3452. @@a4: CMP AH, sdrCaseSensitive
  3453. JNE @@a3
  3454. INC BH
  3455. @@a3: POP ECX
  3456. POP ESI
  3457. RET
  3458. @@exit:
  3459. POP ESI
  3460. POP EBX
  3461. end;
  3462. destructor TThread.Destroy;
  3463. asm
  3464. PUSH EBX
  3465. MOV EBX, EAX
  3466. CALL RefInc
  3467. MOV EAX, EBX
  3468. CMP [EBX].FTerminated, 0
  3469. JNZ @@1
  3470. CALL Terminate
  3471. MOV EAX, EBX
  3472. CALL WaitFor
  3473. @@1: MOV ECX, [EBX].FHandle
  3474. JECXZ @@2
  3475. PUSH ECX
  3476. CALL CloseHandle
  3477. @@2: POP EAX
  3478. XCHG EBX, EAX
  3479. JMP TObj.Destroy
  3480. end;
  3481. function TStream.GetSize: DWord;
  3482. asm
  3483. CALL [EAX].fMethods.fGetSiz
  3484. end;
  3485. procedure TStream.SetSize(NewSize: DWord);
  3486. asm
  3487. CALL [EAX].fMethods.fSetSiz
  3488. end;
  3489. function TStream.Read(var Buffer; Count: DWord): DWord;
  3490. asm
  3491. CALL [EAX].fMethods.fRead
  3492. end;
  3493. function TStream.Write(var Buffer; Count: DWord): DWord;
  3494. asm
  3495. CALL [EAX].fMethods.fWrite
  3496. end;
  3497. function TStream.Seek(MoveTo: integer; MoveMethod: TMoveMethod): DWord;
  3498. asm
  3499. CALL [EAX].fMethods.fSeek
  3500. end;
  3501. destructor TStream.Destroy;
  3502. asm
  3503. PUSH EAX
  3504. PUSH [EAX].fData.fThread
  3505. CALL [EAX].fMethods.fClose
  3506. POP EAX
  3507. CALL TObj.RefDec
  3508. POP EAX
  3509. CALL TObj.Destroy
  3510. end;
  3511. function WriteFileStreamEOF( Strm: PStream; var Buffer; Count: DWORD ): DWORD;
  3512. asm
  3513. PUSH EBX
  3514. PUSH [EAX].TStream.fData.fHandle
  3515. CALL WriteFileStream
  3516. XCHG EBX, EAX
  3517. CALL SetEndOfFile
  3518. XCHG EAX, EBX
  3519. POP EBX
  3520. end;
  3521. function SeekMemStream( Strm: PStream; MoveTo: Integer; MoveFrom: TMoveMethod ): DWORD;
  3522. asm
  3523. PUSH EBX
  3524. MOV EBX, EDX
  3525. AND ECX, $FF
  3526. LOOP @@not_from_cur
  3527. ADD EBX, [EAX].TStream.fData.fPosition
  3528. @@not_from_cur:
  3529. LOOP @@not_from_end
  3530. ADD EBX, [EAX].TStream.fData.fSize
  3531. @@not_from_end:
  3532. CMP EBX, [EAX].TStream.fData.fSize
  3533. JLE @@space_ok
  3534. PUSH EAX
  3535. MOV EDX, EBX
  3536. CALL TStream.SetSize
  3537. POP EAX
  3538. @@space_ok:
  3539. XCHG EAX, EBX
  3540. MOV [EBX].TStream.fData.fPosition, EAX
  3541. POP EBX
  3542. end;
  3543. procedure SetSizeMemStream( Strm: PStream; NewSize: DWORD );
  3544. asm
  3545. push ebx
  3546. push edx
  3547. xchg ebx, eax
  3548. cmp [ebx].TStream.fData.fCapacity, edx
  3549. jae @@mem_ok
  3550. {$IFDEF OLD_MEMSTREAMS_SETSIZE}
  3551. or edx, [CapacityMask]
  3552. inc edx
  3553. {$ENDIF}
  3554. mov [ebx].TStream.fData.fCapacity, edx
  3555. mov ecx, [ebx].TStream.fMemory
  3556. jecxz @@getmem
  3557. lea eax, [ebx].TStream.fMemory
  3558. call System.@ReallocMem
  3559. jmp @@setmem
  3560. @@getmem:
  3561. or ecx, edx
  3562. jz @@mem_ok
  3563. xchg eax, ecx
  3564. call System.@GetMem
  3565. @@setmem:
  3566. mov [ebx].TStream.fMemory, eax
  3567. @@mem_ok:
  3568. pop ecx // NewSize
  3569. inc ecx
  3570. loop @@set_new_sz
  3571. xor eax, eax
  3572. mov [ebx].TStream.fData.fCapacity, eax
  3573. xchg eax, [ebx].TStream.fMemory
  3574. call System.@FreeMem
  3575. xor ecx, ecx
  3576. @@set_new_sz:
  3577. mov [ebx].TStream.fData.fSize, ecx
  3578. cmp [ebx].TStream.fData.fPosition, ecx
  3579. jb @@exit
  3580. mov [ebx].TStream.fData.fPosition, ecx
  3581. @@exit:
  3582. pop ebx
  3583. end;
  3584. function ReadMemStream( Strm: PStream; var Buffer; Count: DWORD ): DWORD;
  3585. asm
  3586. PUSH EBX
  3587. XCHG EBX, EAX
  3588. MOV EAX, [EBX].TStream.fData.fPosition
  3589. ADD EAX, ECX
  3590. CMP EAX, [EBX].TStream.fData.fSize
  3591. JLE @@count_ok
  3592. MOV ECX, [EBX].TStream.fData.fSize
  3593. SUB ECX, [EBX].TStream.fData.fPosition
  3594. @@count_ok:
  3595. PUSH ECX
  3596. MOV EAX, [EBX].TStream.fMemory
  3597. ADD EAX, [EBX].TStream.fData.fPosition
  3598. CALL System.Move
  3599. POP EAX
  3600. ADD [EBX].TStream.fData.fPosition, EAX
  3601. POP EBX
  3602. end;
  3603. function WriteMemStream( Strm: PStream; var Buffer; Count: DWORD ): DWORD;
  3604. asm
  3605. PUSH EBX
  3606. XCHG EBX, EAX
  3607. MOV EAX, [EBX].TStream.fData.fPosition
  3608. ADD EAX, ECX
  3609. CMP EAX, [EBX].TStream.fData.fSize
  3610. PUSH EDX
  3611. PUSH ECX
  3612. JLE @@count_ok
  3613. XCHG EDX, EAX
  3614. MOV EAX, EBX
  3615. CALL TStream.SetSize
  3616. @@count_ok:
  3617. POP ECX
  3618. POP EAX
  3619. MOV EDX, [EBX].TStream.fMemory
  3620. ADD EDX, [EBX].TStream.fData.fPosition
  3621. PUSH ECX
  3622. CALL System.Move
  3623. POP EAX
  3624. ADD [EBX].TStream.fData.fPosition, EAX
  3625. POP EBX
  3626. end;
  3627. procedure CloseMemStream( Strm: PStream );
  3628. asm
  3629. MOV ECX, [EAX].TStream.fMemory
  3630. JECXZ @@exit
  3631. XCHG EAX, ECX
  3632. CALL System.@FreeMem
  3633. @@exit:
  3634. end;
  3635. function NewReadFileStream( const FileName: KOLString ): PStream;
  3636. asm
  3637. PUSH EBX
  3638. XCHG EBX, EAX
  3639. MOV EAX, offset[BaseFileMethods]
  3640. CALL _NewStream
  3641. MOV EDX, [ReadFileStreamProc]
  3642. MOV [EAX].TStream.fMethods.fRead, EDX
  3643. XCHG EBX, EAX
  3644. MOV EDX, ofOpenRead or ofOpenExisting or ofShareDenyWrite
  3645. CALL FileCreate
  3646. MOV [EBX].TStream.fData.fHandle, EAX
  3647. XCHG EAX, EBX
  3648. POP EBX
  3649. end;
  3650. function NewWriteFileStream( const FileName: KOLString ): PStream;
  3651. asm
  3652. PUSH EBX
  3653. XCHG EBX, EAX
  3654. MOV EAX, offset[BaseFileMethods]
  3655. CALL _NewStream
  3656. MOV [EAX].TStream.fMethods.fWrite, offset[WriteFileStreamEOF]
  3657. MOV [EAX].TStream.fMethods.fSetSiz, offset[SetSizeFileStream]
  3658. XCHG EBX, EAX
  3659. MOV EDX, ofOpenWrite or ofCreateAlways or ofShareDenyWrite
  3660. CALL FileCreate
  3661. MOV [EBX].TStream.fData.fHandle, EAX
  3662. XCHG EAX, EBX
  3663. POP EBX
  3664. end;
  3665. function WriteExMemoryStream( Strm: PStream; var Buffer; Count: DWORD ): DWORD;
  3666. asm
  3667. PUSH EBX
  3668. XCHG EBX, EAX
  3669. MOV EAX, [EBX].TStream.fData.fSize
  3670. SUB EAX, [EBX].TStream.fData.fPosition
  3671. CMP EAX, ECX
  3672. JGE @@1
  3673. XCHG ECX, EAX
  3674. @@1:
  3675. PUSH EDX
  3676. PUSH ECX
  3677. JLE @@count_ok
  3678. XCHG EDX, EAX
  3679. MOV EAX, EBX
  3680. CALL TStream.SetSize
  3681. @@count_ok:
  3682. POP ECX
  3683. POP EAX
  3684. MOV EDX, [EBX].TStream.fMemory
  3685. ADD EDX, [EBX].TStream.fData.fPosition
  3686. PUSH ECX
  3687. CALL System.Move
  3688. POP EAX
  3689. ADD [EBX].TStream.fData.fPosition, EAX
  3690. POP EBX
  3691. end;
  3692. {$IFDEF ASM_UNICODE}
  3693. function Resource2Stream( DestStrm : PStream; Inst : HInst;
  3694. ResName : PChar; ResType : PChar ): Integer;
  3695. asm
  3696. PUSH EBX
  3697. PUSH ESI
  3698. MOV EBX, EDX // EBX = Inst
  3699. PUSH EAX // DestStrm
  3700. PUSH ResType
  3701. PUSH ECX
  3702. PUSH EDX
  3703. CALL FindResource
  3704. TEST EAX, EAX
  3705. JZ @@exit0
  3706. PUSH EAX
  3707. PUSH EBX
  3708. PUSH EAX
  3709. PUSH EBX
  3710. CALL SizeofResource
  3711. XCHG EBX, EAX
  3712. CALL LoadResource
  3713. TEST EAX, EAX
  3714. JZ @@exit0
  3715. XCHG ESI, EAX
  3716. PUSH ESI
  3717. CALL GlobalLock
  3718. TEST EAX, EAX
  3719. JNZ @@P_ok
  3720. CALL GetLastError
  3721. CMP EAX, ERROR_INVALID_HANDLE
  3722. JNZ @@exit_00
  3723. MOV EAX, ESI
  3724. @@P_ok:
  3725. XCHG EDX, EAX
  3726. POP EAX // DestStrm
  3727. PUSH EDX
  3728. MOV ECX, EBX
  3729. CALL TStream.Write
  3730. //EAX = Result (length of written data)
  3731. XCHG EBX, EAX
  3732. POP EAX
  3733. CMP ESI, EAX
  3734. JE @@not_unlock
  3735. PUSH ESI
  3736. CALL GlobalUnlock
  3737. @@not_unlock:
  3738. XCHG EAX, EBX
  3739. JMP @@exit
  3740. @@exit_00:
  3741. XOR EAX, EAX
  3742. @@exit0:
  3743. POP ECX
  3744. @@exit:
  3745. POP ESI
  3746. POP EBX
  3747. end;
  3748. {$ENDIF ASM_UNICODE}
  3749. destructor TIniFile.Destroy;
  3750. asm //cmd //opd
  3751. PUSH EAX
  3752. LEA EDX, [EAX].fFileName
  3753. PUSH EDX
  3754. LEA EAX, [EAX].fSection
  3755. {$IFDEF UNICODE_CTRLS}
  3756. CALL System.@WStrClr
  3757. {$ELSE}
  3758. CALL System.@LStrClr
  3759. {$ENDIF}
  3760. POP EAX
  3761. {$IFDEF UNICODE_CTRLS}
  3762. CALL System.@WStrClr
  3763. {$ELSE}
  3764. CALL System.@LStrClr
  3765. {$ENDIF}
  3766. POP EAX
  3767. CALL TObj.Destroy
  3768. end;
  3769. procedure _FillStrList; // Ýòà ÷àñòü êîäà îáùàÿ äëÿ äâóõ ñëåäóþùèõ ïðîöåäóð
  3770. asm
  3771. ///////////////////////////////
  3772. OR EAX,0
  3773. JE @@EXIT //ERROR
  3774. // LEA EAX,[EAX-IniBufferSize]
  3775. // JE @@EXIT
  3776. // âîçìîæíà íåõâàòêà Áóôåðà... â ïðèíöèïå íå îøèáêà :)
  3777. // âîçâðàùàåì ÷òî âëåçëî...
  3778. //////////////////////////////
  3779. @@LOOP:
  3780. LEA EAX,[ESI+4]
  3781. CALL StrLen
  3782. MOV [ESI],EAX
  3783. LEA EDX,[ESI+4]
  3784. INC EAX
  3785. ADD ESI,EAX
  3786. MOV EAX,EDI
  3787. CALL TStrList.ADD
  3788. CMP byte ptr [ESI+4],0
  3789. JNE @@LOOP
  3790. @@EXIT:
  3791. POP EAX
  3792. CALL System.@FreeMem
  3793. POP ECX
  3794. POP EBX
  3795. POP EDI
  3796. POP ESI
  3797. end;
  3798. //[procedure TIniFile.GetSectionNames]
  3799. {$IFDEF ASM_UNICODE}
  3800. procedure TIniFile.GetSectionNames(Names: PStrList);
  3801. asm
  3802. PUSH ESI
  3803. PUSH EDI
  3804. PUSH EBX
  3805. PUSH ECX
  3806. MOV EBX,EAX
  3807. MOV EAX, IniBufferStrSize
  3808. MOV EDI,EDX
  3809. CALL System.@GetMem
  3810. MOV ESI,EAX
  3811. PUSH EAX
  3812. PUSH [EBX].fFileName
  3813. MOV EAX,IniBufferSize
  3814. PUSH EAX
  3815. LEA EAX,[ESI+4]
  3816. PUSH EAX
  3817. CALL GetPrivateProfileSectionNames
  3818. JMP _FillStrList
  3819. end;
  3820. {$ENDIF ASM_UNICODE}
  3821. //[procedure TIniFile.SectionData]
  3822. {$IFDEF ASM_UNICODE}
  3823. procedure TIniFile.SectionData(Names: PStrList);
  3824. asm
  3825. PUSH ESI
  3826. PUSH EDI
  3827. PUSH EBX
  3828. PUSH ECX
  3829. MOV EBX,EAX
  3830. MOV EAX, IniBufferStrSize
  3831. MOV EDI,EDX
  3832. CALL System.@GetMem
  3833. MOV ESI,EAX
  3834. PUSH EAX
  3835. OR [EBX].fMode,0
  3836. JNE @@DOWrite
  3837. PUSH [EBX].fFileName
  3838. MOV EAX,IniBufferSize
  3839. PUSH EAX
  3840. LEA EAX,[ESI+4]
  3841. PUSH EAX
  3842. PUSH [EBX].fSection
  3843. CALL GetPrivateProfileSection
  3844. JMP _FillStrList
  3845. @@DOWrite:
  3846. PUSH EBX
  3847. PUSH ESI
  3848. PUSH EDX
  3849. PUSH EBP
  3850. MOV EDX,0
  3851. MOV EBP,[EDI].TStrList.fCount
  3852. MOV EBX,IniBufferSize-2 // îñòàâèì ìåñòî äëÿ #0#0
  3853. {ECM+++>} OR EBP,EBP // otherwise GetPChars when StrList.Count = 0 crashed
  3854. @@LOOP:
  3855. JE @@ENDLOOP
  3856. OR EBX,EBX
  3857. JE @@ENDLOOP
  3858. PUSH EDX
  3859. MOV EAX,EDI
  3860. CALL TStrList.GetPChars
  3861. PUSH EAX
  3862. CALL StrLen
  3863. POP EAX
  3864. XOR ECX,-1
  3865. MOV EDX,ESI
  3866. SUB EBX,ECX
  3867. JA @@L1
  3868. ADD ECX,EBX
  3869. XOR EBX,EBX
  3870. @@L1:
  3871. ADD ESI,ECX
  3872. CALL MOVE
  3873. @@L2:
  3874. POP EDX
  3875. INC EDX
  3876. DEC EBP
  3877. JMP @@LOOP
  3878. @@ENDLOOP:
  3879. MOV WORD PTR [ESI],0
  3880. POP EBP
  3881. POP EDX
  3882. POP ESI
  3883. POP EBX
  3884. ///////////////////////////////////
  3885. MOV EAX,EBX // íîäî î÷èùàòü
  3886. CALL ClearSection
  3887. //////////////////////////////////
  3888. PUSH [EBX].fFileName
  3889. PUSH ESI
  3890. PUSH [EBX].fSection
  3891. CALL WritePrivateProfileSection
  3892. POP EAX
  3893. CALL System.@FreeMem
  3894. POP ECX
  3895. POP EBX
  3896. POP EDI
  3897. POP ESI
  3898. end;
  3899. {$ENDIF ASM_UNICODE}
  3900. function MakeAccelerator( fVirt: Byte; Key: Word ): TMenuAccelerator;
  3901. asm
  3902. MOVZX EAX, AL
  3903. PUSH EAX
  3904. MOV [ESP+1], DX
  3905. POP EAX
  3906. end;
  3907. function _NewTControl( AParent: PControl ): PControl;
  3908. begin
  3909. New( Result, CreateParented( AParent ) );
  3910. end;
  3911. //[END _NewTControl]
  3912. //[function _NewWindowed]
  3913. function _NewWindowed( AParent: PControl; ControlClassName: PKOLChar; Ctl3D: Boolean ): PControl;
  3914. asm
  3915. PUSH EBX
  3916. PUSH ESI
  3917. PUSH EDI
  3918. PUSH ECX // Ctl3D
  3919. PUSH EDX // ControlClassName
  3920. MOV ESI, EAX // ESI = AParent
  3921. CALL _NewTControl
  3922. XCHG EBX, EAX // EBX = Result
  3923. POP [EBX].TControl.fControlClassName
  3924. //INC [EBX].TControl.fWindowed // incremented in TControl.Init
  3925. POP EDX // DL = parameter Ctl3D
  3926. TEST ESI, ESI
  3927. JZ @@no_parent
  3928. LEA ESI, [ESI].TControl.fWndProcResizeFlicks
  3929. LEA EDI, [EBX].TControl.fWndProcResizeFlicks
  3930. MOVSD // fWndProcResizeFlicks
  3931. MOVSD // fGotoControl
  3932. LODSB // fCtl3Dchild
  3933. STOSB
  3934. DEC AL
  3935. LODSB // fCtl3D
  3936. JZ @@passed3D
  3937. XOR EDX, EDX
  3938. @@passed3D:
  3939. XCHG EAX, EDX
  3940. STOSB // fCtl3D
  3941. MOVSD // fTextColor
  3942. MOVSD // fColor
  3943. {$IFDEF SMALLEST_CODE}
  3944. {$IFDEF SMALLEST_CODE_PARENTFONT}
  3945. LODSD
  3946. XCHG EDX, EAX
  3947. XOR EAX, EAX
  3948. CALL TGraphicTool.Assign
  3949. STOSD // fFont
  3950. {$ELSE}
  3951. LODSD
  3952. XOR EAX, EAX
  3953. STOSD // fFont = nil
  3954. {$ENDIF}
  3955. {$ELSE}
  3956. LODSD
  3957. XCHG EDX, EAX
  3958. XOR EAX, EAX
  3959. PUSH EDX
  3960. CALL TGraphicTool.Assign
  3961. STOSD // fFont
  3962. POP EDX
  3963. XCHG ECX, EAX
  3964. JECXZ @@no_font
  3965. MOV [ECX].TGraphicTool.fParentGDITool, EDX
  3966. MOV [ECX].TGraphicTool.fOnChange.TMethod.Code, offset[TControl.FontChanged]
  3967. MOV [ECX].TGraphicTool.fOnChange.TMethod.Data, EBX
  3968. MOV EAX, EBX
  3969. MOV EDX, ECX
  3970. CALL TControl.FontChanged
  3971. {$IFDEF USE_AUTOFREE4CONTROLS}
  3972. MOV EAX, EBX
  3973. MOV EDX, [EBX].TControl.fFont
  3974. CALL TControl.Add2AutoFree
  3975. {$ENDIF}
  3976. @@no_font:
  3977. {$ENDIF}
  3978. {$IFDEF SMALLEST_CODE}
  3979. LODSD
  3980. XOR EAX, EAX
  3981. STOSD
  3982. {$ELSE}
  3983. LODSD
  3984. XCHG EDX, EAX
  3985. XOR EAX, EAX
  3986. PUSH EDX
  3987. CALL TGraphicTool.Assign
  3988. STOSD // fBrush
  3989. POP EDX
  3990. XCHG ECX, EAX
  3991. JECXZ @@no_brush
  3992. MOV [ECX].TGraphicTool.fParentGDITool, EDX
  3993. MOV [ECX].TGraphicTool.fOnChange.TMethod.Code, offset[TControl.BrushChanged]
  3994. MOV [ECX].TGraphicTool.fOnChange.TMethod.Data, EBX
  3995. MOV EAX, EBX
  3996. MOV EDX, ECX
  3997. CALL TControl.BrushChanged
  3998. {$IFDEF USE_AUTOFREE4CONTROLS}
  3999. MOV EAX, EBX
  4000. MOV EDX, [EBX].TControl.fBrush
  4001. CALL TControl.Add2AutoFree
  4002. {$ENDIF}
  4003. @@no_brush:
  4004. {$ENDIF}
  4005. //skip fCanvas
  4006. LODSD
  4007. ADD EDI, 4
  4008. LODSD
  4009. STOSD // fMargin
  4010. @@no_parent:
  4011. XCHG EAX, EBX
  4012. POP EDI
  4013. POP ESI
  4014. POP EBX
  4015. end;
  4016. function NewForm( AParent: PControl; const Caption: KOLString ): PControl;
  4017. const FormClass: array[ 0..4 ] of KOLChar = ( 'F', 'o', 'r', 'm', #0 );
  4018. asm
  4019. PUSH EBX
  4020. PUSH EDX
  4021. MOV EDX, offset[FormClass]
  4022. MOV CL, 1
  4023. CALL _NewWindowed
  4024. MOV EBX, EAX
  4025. OR byte ptr [EBX].TControl.fClsStyle, CS_DBLCLKS
  4026. MOV EDX, offset[WndProcForm]
  4027. CALL TControl.AttachProc
  4028. MOV EDX, offset[WndProcDoEraseBkgnd]
  4029. MOV EAX, EBX
  4030. CALL TControl.AttachProc
  4031. POP EDX
  4032. INC [EBX].TControl.fSizeGrip
  4033. MOV EAX, EBX
  4034. CALL TControl.SetCaption
  4035. DEC WORD PTR [EBX].TControl.fIsForm
  4036. XCHG EAX, EBX
  4037. POP EBX
  4038. end;
  4039. function NewApplet( const Caption: KOLString ): PControl;
  4040. const AppClass: array[ 0..3 ] of KOLChar = ( 'A', 'p', 'p', #0 );
  4041. asm
  4042. XOR ECX, ECX
  4043. INC ECX
  4044. MOV [AppButtonUsed], CL
  4045. PUSH EAX
  4046. MOV EDX, offset[AppClass]
  4047. XOR EAX, EAX
  4048. CALL _NewWindowed
  4049. INC [EAX].TControl.FIsApplet
  4050. MOV word ptr [EAX].TControl.fStyle + 2, $90CA //WS_VISIBLE or WS_SYSMENU or WS_POPUP or WS_MINIMIZEBOX or WS_CAPTION
  4051. MOV byte ptr [EAX].TControl.fExStyle + 2, WS_EX_APPWINDOW shr 16 // WS_EX_APPWINDOW = $40000
  4052. CALL @@newapp1
  4053. PUSH ESI // BODY of CreateAppButton here
  4054. PUSH 0
  4055. PUSH [EAX].TControl.fHandle
  4056. CALL GetSystemMenu
  4057. MOV ESI, offset[DeleteMenu]
  4058. XCHG ECX, EAX
  4059. MOV EAX, SC_MAXIMIZE
  4060. CDQ
  4061. PUSH EDX
  4062. PUSH EAX
  4063. PUSH ECX
  4064. PUSH EDX
  4065. {$IFDEF PARANOIA} DB $2C, $20 {$ELSE} SUB AL, $20 {$ENDIF} // SC_MOVE
  4066. PUSH EAX
  4067. PUSH ECX
  4068. PUSH EDX
  4069. {$IFDEF PARANOIA} DB $2C, $10 {$ELSE} SUB AL, $10 {$ENDIF} // SC_SIZE
  4070. PUSH EAX
  4071. PUSH ECX
  4072. PUSH 1 // MF_GRAYED or MF_BYCOMMAND
  4073. MOV AX, SC_RESTORE
  4074. PUSH EAX
  4075. PUSH ECX
  4076. CALL EnableMenuItem
  4077. CALL ESI
  4078. CALL ESI
  4079. CALL ESI
  4080. POP ESI
  4081. @@ret_false:
  4082. XOR EAX, EAX
  4083. RET
  4084. @@chk_CLOSE:
  4085. CMP word ptr [EDX].TMsg.message, WM_SYSCOMMAND
  4086. JNZ @@ret_false
  4087. MOV EDX, dword ptr [EDX].TMsg.wParam
  4088. AND DX, $FFF0
  4089. CMP DX, SC_CLOSE
  4090. JNZ @@ret_false
  4091. PUSH ECX
  4092. MOV ECX, [EAX].TControl.fChildren
  4093. JECXZ @@ret_false1
  4094. XCHG EAX, ECX
  4095. MOV ECX, [EAX].TList.fCount
  4096. JECXZ @@ret_false1
  4097. MOV EAX, [EAX].TList.fItems
  4098. MOV ECX, dword ptr [EAX]
  4099. JECXZ @@ret_false1
  4100. XCHG EAX, ECX
  4101. PUSH EAX
  4102. CALL TControl.IsMainWindow
  4103. TEST EAX, EAX
  4104. POP EAX
  4105. JZ @@ret_false1
  4106. CALL TControl.Close
  4107. POP ECX
  4108. XOR EAX, EAX
  4109. MOV dword ptr [ECX], EAX
  4110. INC EAX
  4111. RET
  4112. @@ret_false1:
  4113. POP ECX
  4114. JMP @@ret_false
  4115. @@newapp1:
  4116. //MOV [EAX].TControl.FCreateWndExt, offset[CreateAppButton]
  4117. POP [EAX].TControl.FCreateWndExt
  4118. PUSH EAX
  4119. CALL @@newapp2
  4120. // BODY of WndProcApp here:
  4121. CMP word ptr [EDX].TMsg.message, WM_SETFOCUS
  4122. JNZ @@chk_CLOSE
  4123. MOV ECX, [EAX].TControl.FCurrentControl
  4124. JECXZ @@ret_false
  4125. XCHG EAX, ECX
  4126. PUSH EAX
  4127. CALL CallTControlCreateWindow
  4128. POP EAX
  4129. PUSH [EAX].TControl.fHandle
  4130. CALL SetFocus
  4131. MOV AL, 1
  4132. RET
  4133. @@newapp2:
  4134. POP EDX
  4135. CALL TControl.AttachProc
  4136. POP EAX
  4137. POP EDX
  4138. PUSH EAX
  4139. CALL TControl.SetCaption
  4140. POP EAX
  4141. end;
  4142. {$IFDEF ASM_UNICODE}
  4143. function _NewControl( AParent: PControl; ControlClassName: PKOLChar;
  4144. Style: DWORD; Ctl3D: Boolean; Actions: PCommandActions ): PControl;
  4145. const szActions = sizeof(TCommandActions);
  4146. asm
  4147. PUSH EBX
  4148. PUSH EAX // push AParent
  4149. PUSH ECX // push Style
  4150. MOVZX ECX, Ctl3D
  4151. CALL _NewWindowed
  4152. XCHG EBX, EAX
  4153. INC [EBX].TControl.fIsControl
  4154. INC [EBX].TControl.fVerticalAlign
  4155. MOV EAX, Actions
  4156. TEST EAX, EAX
  4157. JZ @@noActions
  4158. LEA EDX, [EBX].TControl.fCommandActions
  4159. XOR ECX, ECX
  4160. MOV CL, szActions
  4161. CALL System.Move
  4162. @@noActions:
  4163. POP EDX // pop Style
  4164. OR EDX, WS_CLIPSIBLINGS or WS_CLIPCHILDREN
  4165. MOV byte ptr [EBX].TControl.fLookTabKeys, $0F
  4166. CMP [EBX].TControl.fCtl3D, 0
  4167. JZ @@noCtl3D
  4168. AND EDX, not WS_BORDER
  4169. OR byte ptr [EBX].TControl.fExStyle + 1, WS_EX_CLIENTEDGE shr 8
  4170. @@noCtl3D:
  4171. MOV [EBX].TControl.fStyle, EDX
  4172. TEST EDX, WS_VISIBLE
  4173. SETNZ AL
  4174. MOV [EBX].TControl.fVisible, AL
  4175. TEST EDX, WS_TABSTOP
  4176. POP ECX // pop AParent
  4177. PUSHFD
  4178. JECXZ @@noParent
  4179. PUSH ESI
  4180. PUSH EDI
  4181. LEA ESI, [ECX].TControl.fMargin
  4182. LEA EDI, [EBX].TControl.fBoundsRect
  4183. LODSD
  4184. {$IFNDEF SMALLEST_CODE}
  4185. PUSH EAX
  4186. ADD EAX, [ESI+24] // AParent.fClientLeft
  4187. {$ENDIF}
  4188. STOSD // fBoundsRect.Left
  4189. {$IFNDEF SMALLEST_CODE}
  4190. POP EAX
  4191. PUSH EAX
  4192. ADD EAX, [ESI+16] // AParent.fClientTop
  4193. {$ENDIF}
  4194. STOSD // fBoundsRect.Top
  4195. {$IFNDEF SMALLEST_CODE}
  4196. XCHG EDX, EAX
  4197. POP EAX
  4198. {$ENDIF}
  4199. ADD EAX, 64
  4200. STOSD // fBoundsRect.Right
  4201. {$IFNDEF SMALLEST_CODE}
  4202. XCHG EAX, EDX
  4203. ADD EAX, 64
  4204. {$ENDIF}
  4205. STOSD // fBoundsRect.Bottom}
  4206. POP EDI
  4207. POP ESI
  4208. MOV EAX, [ECX].TControl.fCursor
  4209. MOV [EBX].TControl.fCursor, EAX
  4210. XCHG EAX, ECX
  4211. CALL TControl.ParentForm
  4212. XCHG ECX, EAX
  4213. JECXZ @@noParent
  4214. INC [ECX].TControl.fTabOrder
  4215. MOV EDX, [ECX].TControl.fTabOrder
  4216. MOV [EBX].TControl.fTabOrder, EDX
  4217. @@noParent:
  4218. POPFD
  4219. JZ @@noTabStop
  4220. INC [EBX].TControl.fTabstop
  4221. JECXZ @@noTabstop
  4222. XCHG EAX, ECX
  4223. MOV ECX, [EAX].TControl.FCurrentControl
  4224. INC ECX
  4225. LOOP @@noTabStop
  4226. MOV [EAX].TControl.FCurrentControl, EBX
  4227. @@noTabStop:
  4228. MOVZX EDX, [CtlIdCount]
  4229. INC [CtlIdCount]
  4230. MOV [EBX].TControl.fMenu, EDX
  4231. MOV EDX, offset[WndProcCtrl]
  4232. MOV EAX, EBX
  4233. CALL TControl.AttachProc
  4234. XCHG EAX, EBX
  4235. POP EBX
  4236. end;
  4237. {$ENDIF ASM_UNICODE}
  4238. function NewButton( AParent: PControl; const Caption: KOLString ): PControl;
  4239. const szActions = sizeof(TCommandActions);
  4240. asm
  4241. PUSH EBX
  4242. PUSH EDX
  4243. PUSH 0
  4244. PUSH offset[ButtonActions]
  4245. MOV EDX, offset[ButtonClass]
  4246. MOV ECX, WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or WS_TABSTOP or BS_NOTIFY
  4247. CALL _NewControl
  4248. XCHG EBX, EAX
  4249. INC [EBX].TControl.fIgnoreDefault
  4250. //MOV [EBX].TControl.FCtl3D, 1
  4251. MOV EDX, [EBX].TControl.fBoundsRect.Top
  4252. ADD EDX, 22
  4253. MOV [EBX].TControl.fBoundsRect.Bottom, EDX
  4254. MOV [EBX].TControl.fTextAlign, taCenter
  4255. INC [EBX].TControl.fIsButton
  4256. POP EDX
  4257. MOV EAX, EBX
  4258. CALL TControl.SetCaption
  4259. {$IFNDEF SMALLEST_CODE}
  4260. {$IFNDEF BUTTON_DBLCLICK}
  4261. MOV EAX, EBX
  4262. MOV EDX, offset[WndProcBtnDblClkAsClk]
  4263. CALL TControl.AttachProc
  4264. {$ENDIF}
  4265. {$ENDIF SMALLEST_CODE}
  4266. {$IFDEF ALL_BUTTONS_RESPOND_TO_ENTER}
  4267. MOV EAX, EBX
  4268. MOV EDX, offset[WndProcBtnReturnClick]
  4269. CALL TControl.AttachProc
  4270. {$ENDIF}
  4271. XCHG EAX, EBX
  4272. POP EBX
  4273. {$IFDEF GRAPHCTL_XPSTYLES}
  4274. PUSH EDX
  4275. MOV DL, [EAX].TControl.fTransparent
  4276. MOV [EAX].TControl.fClassicTransparent, DL
  4277. POP EDX
  4278. PUSH EDX
  4279. PUSH EAX
  4280. CALL Attach_WM_THEMECHANGED
  4281. POP EAX
  4282. POP EDX
  4283. PUSH EDX
  4284. PUSH EAX
  4285. CALL XP_Themes_For_BitBtn
  4286. POP EAX
  4287. POP EDX
  4288. {$ENDIF}
  4289. end;
  4290. function WndProc_DrawItem( Sender: PControl; var Msg: TMsg; var Rslt: Integer )
  4291. : Boolean;
  4292. asm //cmd //opd
  4293. CMP word ptr [EDX].TMsg.message, WM_DRAWITEM
  4294. JNZ @@ret_false
  4295. MOV EAX, [EDX].TMsg.lParam
  4296. MOV ECX, [EAX].TDrawItemStruct.hwndItem
  4297. JECXZ @@ret_false
  4298. PUSH EDX
  4299. {$IFDEF USE_PROP}
  4300. PUSH offset[ID_SELF]
  4301. PUSH ECX
  4302. CALL GetProp
  4303. {$ELSE}
  4304. PUSH GWL_USERDATA
  4305. PUSH ECX
  4306. CALL GetWindowLong
  4307. {$ENDIF}
  4308. POP EDX
  4309. TEST EAX, EAX
  4310. JZ @@ret_false
  4311. PUSH [EDX].TMsg.lParam
  4312. PUSH [EDX].TMsg.wParam
  4313. PUSH CN_DRAWITEM
  4314. PUSH EAX
  4315. CALL TControl.Perform
  4316. MOV AL, 1
  4317. RET
  4318. @@ret_false:
  4319. XOR EAX, EAX
  4320. end;
  4321. function NewBitBtn( AParent: PControl; const Caption: KOLString;
  4322. Options: TBitBtnOptions; Layout: TGlyphLayout; GlyphBitmap: HBitmap; GlyphCount: Integer ): PControl;
  4323. const szBitmapInfo = sizeof(TBitmapInfo);
  4324. asm
  4325. PUSH EBX
  4326. PUSH EDX
  4327. PUSH ECX
  4328. PUSH 0
  4329. PUSH offset[ButtonActions]
  4330. MOV EDX, offset[ButtonClass]
  4331. MOV ECX, WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_OWNERDRAW or BS_NOTIFY
  4332. CALL _NewControl
  4333. XCHG EBX, EAX
  4334. INC [EBX].TControl.fIgnoreDefault
  4335. INC [EBX].TControl.fIsButton
  4336. INC [EBX].TControl.fIsBitBtn
  4337. MOV byte ptr [EBX].TControl.fCommandActions.aAutoSzX, 8
  4338. MOV byte ptr [EBX].TControl.fCommandActions.aAutoSzY, 8
  4339. POP EAX
  4340. MOV [EBX].TControl.fBitBtnOptions, AL
  4341. MOVZX EDX, Layout
  4342. MOV [EBX].TControl.fGlyphLayout, DL
  4343. MOV ECX, GlyphBitmap
  4344. MOV [EBX].TControl.fGlyphBitmap, ECX
  4345. MOV EDX, [EBX].TControl.fBoundsRect.Top
  4346. ADD EDX, 22
  4347. MOV [EBX].TControl.fBoundsRect.Bottom, EDX
  4348. TEST ECX, ECX
  4349. JZ @@noGlyphWH
  4350. {$IFDEF PARANOIA} DB $A8, 01 {$ELSE} TEST AL, bboImageList {$ENDIF}
  4351. JZ @@getBmpWH
  4352. PUSH EAX
  4353. MOV EAX, ESP
  4354. PUSH EAX
  4355. MOV EDX, ESP
  4356. PUSH EAX
  4357. PUSH EDX
  4358. PUSH ECX
  4359. CALL ImageList_GetIconSize
  4360. POP EAX
  4361. POP EDX
  4362. MOV ECX, GlyphCount
  4363. JMP @@WHready
  4364. @@getBmpWH:
  4365. ADD ESP, -szBitmapInfo
  4366. PUSH ESP
  4367. PUSH szBitmapInfo
  4368. PUSH ECX
  4369. CALL GetObject
  4370. XCHG ECX, EAX
  4371. POP EAX
  4372. POP EAX
  4373. POP EDX
  4374. ADD ESP, szBitmapInfo-12
  4375. TEST ECX, ECX
  4376. JZ @@noGlyphWH
  4377. MOV ECX, GlyphCount
  4378. INC ECX
  4379. LOOP @@GlyphCountOK
  4380. PUSH EAX
  4381. PUSH EDX
  4382. XCHG EDX, ECX
  4383. DIV ECX
  4384. XCHG ECX, EAX
  4385. POP EDX
  4386. POP EAX
  4387. @@GlyphCountOK:
  4388. CMP ECX, 1
  4389. JLE @@WHReady
  4390. PUSH EDX
  4391. CDQ
  4392. IDIV ECX
  4393. POP EDX
  4394. @@WHReady:
  4395. MOV [EBX].TControl.fGlyphWidth, EAX
  4396. MOV [EBX].TControl.fGlyphHeight, EDX
  4397. MOV [EBX].TControl.fGlyphCount, ECX
  4398. POP ECX // ECX = @ Caption[ 1 ]
  4399. PUSH ECX
  4400. PUSH EDX
  4401. PUSH EAX
  4402. TEST EAX, EAX
  4403. JLE @@noWidthResize
  4404. JECXZ @@addWLeft
  4405. CMP [Layout], glyphOver
  4406. JE @@addWLeft
  4407. MOVZX ECX, byte ptr[ECX]
  4408. JECXZ @@addWLeft
  4409. // else
  4410. CMP [Layout], glyphLeft
  4411. JZ @@addWRight
  4412. CMP [Layout], glyphRight
  4413. JNZ @@noWidthResize
  4414. @@addWRight:
  4415. ADD [EBX].TControl.fBoundsRect.Right, EAX
  4416. ADD [EBX].TControl.fCommandActions.aAutoSzX, AX
  4417. JMP @@noWidthResize
  4418. @@addWLeft:
  4419. // then
  4420. ADD EAX, [EBX].TControl.fBoundsRect.Left
  4421. MOV [EBX].TControl.fBoundsRect.Right, EAX
  4422. MOV byte ptr [EBX].TControl.fCommandActions.aAutoSzX, 0
  4423. @@noWidthResize:
  4424. TEST EDX, EDX
  4425. JLE @@noHeightResize
  4426. CMP [Layout], glyphTop
  4427. JE @@addHBottom
  4428. CMP [Layout], glyphBottom
  4429. JNE @@addHTop
  4430. @@addHBottom:
  4431. ADD [EBX].TControl.fBoundsRect.Bottom, EDX
  4432. ADD [EBX].TControl.fCommandActions.aAutoSzY, DX
  4433. JMP @@noHeightResize
  4434. @@addHTop:
  4435. ADD EDX, [EBX].TControl.fBoundsRect.Top
  4436. MOV [EBX].TControl.fBoundsRect.Bottom, EDX
  4437. MOV [EBX].TControl.fCommandActions.aAutoSzY, 0
  4438. @@noHeightResize:
  4439. POP ECX
  4440. POP EAX
  4441. CDQ
  4442. MOV DL, 4
  4443. TEST [EBX].TControl.fBitBtnOptions, 2 //1 shl bboNoBorder
  4444. JNZ @@noBorderResize
  4445. JECXZ @@noBorderWinc
  4446. ADD [EBX].TControl.fBoundsRect.Right, EDX
  4447. CMP [EBX].TControl.fCommandActions.aAutoSzX, 0
  4448. JZ @@noBorderWinc
  4449. ADD [EBX].TControl.fCommandActions.aAutoSzX, DX
  4450. @@noBorderWinc:
  4451. TEST EAX, EAX
  4452. JLE @@noBorderResize
  4453. ADD [EBX].TControl.fBoundsRect.Bottom, EDX
  4454. CMP [EBX].TControl.fCommandActions.aAutoSzY, 0
  4455. JZ @@noBorderResize
  4456. ADD [EBX].TControl.fCommandActions.aAutoSzY, DX
  4457. @@noBorderResize:
  4458. @@noGlyphWH:
  4459. MOV ECX, [EBX].TControl.fParent
  4460. JECXZ @@notAttach2Parent
  4461. XCHG EAX, ECX
  4462. MOV EDX, offset[WndProc_DrawItem]
  4463. CALL TControl.AttachProc
  4464. @@notAttach2Parent:
  4465. MOV EAX, EBX
  4466. MOV EDX, offset[WndProcBitBtn]
  4467. CALL TControl.AttachProc
  4468. MOV EAX, EBX
  4469. POP EDX
  4470. CALL TControl.SetCaption
  4471. MOV [EBX].TControl.fTextAlign, taCenter
  4472. {$IFDEF ALL_BUTTONS_RESPOND_TO_ENTER}
  4473. MOV EAX, EBX
  4474. MOV EDX, offset[WndProcBtnReturnClick]
  4475. CALL TControl.AttachProc
  4476. {$ENDIF}
  4477. XCHG EAX, EBX
  4478. POP EBX
  4479. {$IFDEF GRAPHCTL_XPSTYLES}
  4480. PUSH EDX
  4481. MOV DL, [EAX].TControl.fTransparent
  4482. MOV [EAX].TControl.fClassicTransparent, DL
  4483. POP EDX
  4484. PUSH EDX
  4485. PUSH EAX
  4486. CALL Attach_WM_THEMECHANGED
  4487. POP EAX
  4488. POP EDX
  4489. PUSH EDX
  4490. PUSH EAX
  4491. CALL XP_Themes_For_BitBtn
  4492. POP EAX
  4493. POP EDX
  4494. {$ENDIF}
  4495. end;
  4496. function NewCheckbox( AParent: PControl; const Caption: KOLString ): PControl;
  4497. asm
  4498. CALL NewButton
  4499. MOV EDX, [EAX].TControl.fBoundsRect.Left
  4500. ADD EDX, 72
  4501. MOV [EAX].TControl.fBoundsRect.Right, EDX
  4502. MOV [EAX].TControl.fStyle, WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX or WS_TABSTOP or BS_NOTIFY
  4503. MOV [EAX].TControl.fCommandActions.aAutoSzX, 24
  4504. MOV [EAX].TControl.fIgnoreDefault, 0
  4505. {$IFDEF GRAPHCTL_XPSTYLES}
  4506. PUSH EDX
  4507. MOV DL, [EAX].TControl.fTransparent
  4508. MOV [EAX].TControl.fClassicTransparent, DL
  4509. POP EDX
  4510. PUSH EDX
  4511. PUSH EAX
  4512. CALL Attach_WM_THEMECHANGED
  4513. POP EAX
  4514. POP EDX
  4515. PUSH EDX
  4516. PUSH EAX
  4517. CALL XP_Themes_For_CheckBox
  4518. POP EAX
  4519. POP EDX
  4520. {$ENDIF}
  4521. end;
  4522. procedure ClickRadio( Sender:PObj );
  4523. asm
  4524. MOV ECX, [EAX].TControl.fParent
  4525. JECXZ @@exit
  4526. PUSH [EAX].TControl.fMenu
  4527. PUSH [ECX].TControl.fRadioLast
  4528. PUSH [ECX].TControl.fRadio1st
  4529. PUSH [ECX].TControl.fHandle
  4530. CALL CheckRadioButton
  4531. @@exit:
  4532. end;
  4533. function NewRadiobox( AParent: PControl; const Caption: KOLString ): PControl;
  4534. const
  4535. RadioboxStyles = WS_VISIBLE or WS_CHILD or BS_RADIOBUTTON or
  4536. WS_TABSTOP or WS_GROUP or BS_NOTIFY;
  4537. asm
  4538. PUSH EBX
  4539. PUSH EAX
  4540. CALL NewCheckbox
  4541. XCHG EBX, EAX
  4542. MOV [EBX].TControl.fStyle, RadioboxStyles
  4543. MOV [EBX].TControl.fControlClick, offset[ClickRadio]
  4544. POP ECX
  4545. JECXZ @@exit
  4546. MOV EDX, [EBX].TControl.fMenu
  4547. MOV [ECX].TControl.fRadioLast, EDX
  4548. MOV EAX, [ECX].TControl.fRadio1st
  4549. TEST EAX, EAX
  4550. JNZ @@exit
  4551. MOV [ECX].TControl.fRadio1st, EDX
  4552. MOV EAX, EBX
  4553. CALL TControl.SetRadioChecked
  4554. @@exit: XCHG EAX, EBX
  4555. POP EBX
  4556. {$IFDEF GRAPHCTL_XPSTYLES}
  4557. PUSH EDX
  4558. MOV DL, [EAX].TControl.fTransparent
  4559. MOV [EAX].TControl.fClassicTransparent, DL
  4560. POP EDX
  4561. PUSH EDX
  4562. PUSH EAX
  4563. CALL Attach_WM_THEMECHANGED
  4564. POP EAX
  4565. POP EDX
  4566. PUSH EDX
  4567. PUSH EAX
  4568. CALL XP_Themes_For_RadioBox
  4569. POP EAX
  4570. POP EDX
  4571. {$ENDIF}
  4572. end;
  4573. {$IFDEF ASM_UNICODE}
  4574. function NewLabel( AParent: PControl; const Caption: KOLString ): PControl;
  4575. asm
  4576. PUSH EDX
  4577. PUSH 0
  4578. PUSH offset[LabelActions]
  4579. MOV ECX, WS_VISIBLE or WS_CHILD or SS_LEFTNOWORDWRAP or SS_NOPREFIX or SS_NOTIFY
  4580. MOV EDX, offset[StaticClass]
  4581. CALL _NewControl
  4582. INC [EAX].TControl.fIsStaticControl
  4583. INC [EAX].TControl.fSizeRedraw
  4584. MOV EDX, [EAX].TControl.fBoundsRect.Top
  4585. ADD EDX, 22
  4586. MOV [EAX].TControl.fBoundsRect.Bottom, EDX
  4587. POP EDX
  4588. PUSH EAX
  4589. CALL TControl.SetCaption
  4590. POP EAX
  4591. {$IFDEF GRAPHCTL_XPSTYLES}
  4592. PUSH EDX
  4593. MOV DL, [EAX].TControl.fTransparent
  4594. MOV [EAX].TControl.fClassicTransparent, DL
  4595. POP EDX
  4596. PUSH EDX
  4597. PUSH EAX
  4598. CALL Attach_WM_THEMECHANGED
  4599. POP EAX
  4600. POP EDX
  4601. PUSH EDX
  4602. PUSH EAX
  4603. CALL XP_Themes_For_Label
  4604. POP EAX
  4605. POP EDX
  4606. {$ENDIF}
  4607. end;
  4608. {$ENDIF ASM_UNICODE}
  4609. function NewWordWrapLabel( AParent: PControl; const Caption: KOLString ): PControl;
  4610. asm
  4611. CALL NewLabel
  4612. MOV EDX, [EAX].TControl.fBoundsRect.Top
  4613. ADD EDX, 44
  4614. MOV [EAX].TControl.fBoundsRect.Bottom, EDX
  4615. INC [EAX].TControl.fWordWrap
  4616. AND byte ptr [EAX].TControl.fStyle, not SS_LEFTNOWORDWRAP
  4617. end;
  4618. function NewLabelEffect( AParent: PControl; const Caption: KOLString; ShadowDeep: Integer ): PControl;
  4619. asm
  4620. PUSH EBX
  4621. PUSH ECX
  4622. PUSH EDX
  4623. XOR EDX, EDX
  4624. CALL NewLabel
  4625. MOV EBX, EAX
  4626. DEC [EBX].TControl.fIsStaticControl // ñíîâà 0 !
  4627. MOV EDX, offset[WndProcLabelEffect]
  4628. CALL TControl.AttachProc
  4629. POP EDX
  4630. MOV EAX, EBX
  4631. CALL TControl.SetCaption
  4632. MOV EDX, offset[WndProcDoEraseBkgnd]
  4633. MOV EAX,EBX
  4634. CALL TControl.AttachProc
  4635. MOV [EBX].TControl.fTextAlign, taCenter
  4636. MOV [EBX].TControl.fTextColor, clWindowText
  4637. POP [EBX].TControl.fShadowDeep
  4638. INC [EBX].TControl.fIgnoreWndCaption
  4639. ADD [EBX].TControl.fBoundsRect.Bottom, 40 - 22
  4640. MOV [EBX].TControl.fColor2, clNone
  4641. XCHG EAX, EBX
  4642. POP EBX
  4643. end;
  4644. function WndProcDoEraseBkgnd( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  4645. asm // //
  4646. CMP word ptr [EDX].TMsg.message, WM_ERASEBKGND
  4647. JNE @@ret_false
  4648. MOV byte ptr [ECX], 1
  4649. PUSH EBX
  4650. PUSH EDI
  4651. MOV EBX, EAX
  4652. MOV EDI, [EDX].TMsg.wParam
  4653. {$IFDEF SMALLEST_CODE}
  4654. {$ELSE}
  4655. CALL TControl.CreateChildWindows
  4656. CMP [EBX].TControl.fTransparent, 0
  4657. JNE @@exit
  4658. {$ENDIF}
  4659. {$IFDEF SMALLEST_CODE}
  4660. {$ELSE}
  4661. PUSH OPAQUE
  4662. PUSH EDI
  4663. CALL SetBkMode
  4664. MOV EAX, [EBX].TControl.fColor
  4665. CALL Color2RGB
  4666. PUSH EAX
  4667. PUSH EDI
  4668. CALL SetBkColor
  4669. XOR EAX, EAX
  4670. PUSH EAX
  4671. PUSH EAX
  4672. PUSH EAX
  4673. PUSH EDI
  4674. CALL SetBrushOrgEx
  4675. {$ENDIF}
  4676. SUB ESP, 16
  4677. PUSH ESP
  4678. PUSH [EBX].TControl.fHandle
  4679. CALL GetClientRect
  4680. MOV EAX, EBX
  4681. CALL dword ptr[Global_GetCtlBrushHandle]
  4682. MOV EDX, ESP
  4683. PUSH EAX
  4684. PUSH EDX
  4685. PUSH EDI
  4686. CALL Windows.FillRect
  4687. ADD ESP, 16
  4688. @@exit: POP EDI
  4689. POP EBX
  4690. @@ret_false:
  4691. XOR EAX, EAX
  4692. end;
  4693. {$IFDEF ASM_UNICODE}
  4694. function NewGroupbox( AParent: PControl; const Caption: KOLString ): PControl;
  4695. asm
  4696. PUSH EDX
  4697. PUSH 0
  4698. PUSH offset[ButtonActions]
  4699. MOV EDX, offset[ButtonClass]
  4700. MOV ECX, WS_VISIBLE or WS_CHILD or BS_GROUPBOX or WS_CLIPCHILDREN or WS_CLIPSIBLINGS
  4701. CALL _NewControl
  4702. OR [EAX].TControl.fExStyle, WS_EX_CONTROLPARENT
  4703. MOV EDX, [EAX].TControl.fBoundsRect.Left
  4704. ADD EDX, 100
  4705. MOV [EAX].TControl.fBoundsRect.Right, EDX
  4706. MOV EDX, [EAX].TControl.fBoundsRect.Top
  4707. ADD EDX, 100
  4708. MOV [EAX].TControl.fBoundsRect.Bottom, EDX
  4709. MOV [EAX].TControl.fClientTop, 22
  4710. XOR EDX, EDX
  4711. MOV [EAX].TControl.fTabstop, DL
  4712. MOV DL, 2
  4713. ADD [EAX].TControl.fClientBottom, EDX
  4714. ADD [EAX].TControl.fClientLeft, EDX
  4715. ADD [EAX].TControl.fClientRight, EDX
  4716. POP EDX
  4717. PUSH EAX
  4718. CALL TControl.SetCaption
  4719. POP EAX
  4720. PUSH EAX
  4721. INC [EAX].TControl.fIsGroupBox
  4722. MOV EDX, offset[WndProcDoEraseBkgnd]
  4723. CALL TControl.AttachProc
  4724. POP EAX
  4725. {$IFDEF GRAPHCTL_XPSTYLES}
  4726. PUSH EDX
  4727. MOV DL, [EAX].TControl.fTransparent
  4728. MOV [EAX].TControl.fClassicTransparent, DL
  4729. POP EDX
  4730. PUSH EDX
  4731. PUSH EAX
  4732. CALL Attach_WM_THEMECHANGED
  4733. POP EAX
  4734. POP EDX
  4735. PUSH EDX
  4736. PUSH EAX
  4737. CALL XP_Themes_For_GroupBox
  4738. POP EAX
  4739. POP EDX
  4740. {$ENDIF}
  4741. end;
  4742. {$ENDIF ASM_UNICODE}
  4743. {$IFDEF ASM_UNICODE}
  4744. function NewPanel( AParent: PControl; EdgeStyle: TEdgeStyle ): PControl;
  4745. const CreateStyle = WS_VISIBLE or WS_CHILD or SS_LEFTNOWORDWRAP or
  4746. SS_NOPREFIX or SS_NOTIFY;
  4747. asm
  4748. {$IFDEF GRAPHCTL_XPSTYLES}
  4749. MOVZX EDX, EdgeStyle
  4750. PUSH EDX
  4751. {$ENDIF}
  4752. PUSH EDX
  4753. MOV EDX, offset[StaticClass]
  4754. MOV ECX, CreateStyle
  4755. PUSH 0
  4756. PUSH offset[LabelActions]
  4757. CALL _NewControl
  4758. ADD [EAX].TControl.fBoundsRect.Right, 100-64
  4759. ADD [EAX].TControl.fBoundsRect.Bottom, 100-64
  4760. OR byte ptr [EAX].TControl.fExStyle+2, 1
  4761. POP ECX
  4762. CMP CL, 1
  4763. JG @@exit
  4764. JE @@sunken
  4765. OR byte ptr [EAX].TControl.fStyle+2, $40
  4766. {$IFDEF GRAPHCTL_XPSTYLES}
  4767. JMP @@visual
  4768. {$ELSE}
  4769. RET
  4770. {$ENDIF}
  4771. @@sunken:
  4772. OR byte ptr [EAX].TControl.fStyle+1, $10
  4773. @@exit:
  4774. {$IFDEF GRAPHCTL_XPSTYLES}
  4775. @@visual:
  4776. CMP AppTheming, TRUE
  4777. JNE @@es_none_
  4778. CMP CL, 1
  4779. JG @@es_none_
  4780. JE @@not_sunken
  4781. AND byte ptr [EAX].TControl.fStyle+2, $00
  4782. JNE @@es_none_
  4783. @@not_sunken:
  4784. AND byte ptr [EAX].TControl.fStyle+1, $00
  4785. @@es_none_:
  4786. PUSH EBX
  4787. MOV BL, [EAX].TControl.fTransparent
  4788. MOV [EAX].TControl.fClassicTransparent, BL
  4789. POP EBX
  4790. POP EDX
  4791. PUSH EAX
  4792. PUSH EDX
  4793. CALL TControl.SetEdgeStyle
  4794. POP EDX
  4795. POP EAX
  4796. PUSH EDX
  4797. PUSH EAX
  4798. CALL Attach_WM_THEMECHANGED
  4799. POP EAX
  4800. POP EDX
  4801. PUSH EDX
  4802. PUSH EAX
  4803. CALL XP_Themes_For_Panel
  4804. POP EAX
  4805. POP EDX
  4806. {$ENDIF}
  4807. end;
  4808. {$ENDIF ASM_UNICODE}
  4809. function WndProcSplitter( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  4810. asm
  4811. CMP word ptr [EDX].TMsg.message, WM_NCHITTEST
  4812. JNE @@noWM_NCHITTEST
  4813. PUSH ECX
  4814. PUSH [EDX].TMsg.lParam
  4815. PUSH [EDX].TMsg.wParam
  4816. PUSH [EDX].TMsg.message
  4817. PUSH [EAX].TControl.fHandle
  4818. CALL DefWindowProc
  4819. TEST EAX, EAX
  4820. JLE @@htReady
  4821. XOR EAX, EAX
  4822. INC EAX
  4823. @@htReady:
  4824. POP ECX
  4825. MOV [ECX], EAX
  4826. MOV AL, 1
  4827. RET
  4828. @@noWM_NCHITTEST:
  4829. PUSH EBX
  4830. XCHG EBX, EAX
  4831. CMP word ptr [EDX].TMsg.message, WM_MOUSEMOVE
  4832. JNE @@noWM_MOUSEMOVE
  4833. PUSH [EBX].TControl.fCursor
  4834. CALL Windows.SetCursor
  4835. XOR EDX, EDX
  4836. {$IFDEF USE_ASM_DODRAG}
  4837. CALL @@DoDrag
  4838. {$ELSE}
  4839. MOV EAX, EBX
  4840. CALL DoDrag
  4841. {$ENDIF}
  4842. POP EBX
  4843. RET
  4844. {$IFDEF USE_ASM_DODRAG}
  4845. @@DoDrag:
  4846. PUSHAD
  4847. MOVZX EDI, DL // EDI = 1 if Cancel, 0 otherwise
  4848. CMP [EBX].TControl.fDragging, 0
  4849. JZ @@e_DoDrag
  4850. MOV EAX, [EBX].TControl.fParent
  4851. MOV EAX, [EAX].TControl.fChildren
  4852. PUSH EAX
  4853. MOV EDX, EBX
  4854. CALL TList.IndexOf
  4855. POP EDX // EDX = Self_.fParent.fChildren:PList
  4856. MOV EBP, EBX // Prev := Self_;
  4857. TEST EAX, EAX
  4858. JLE @@noPrev
  4859. MOV EDX, [EDX].TList.fItems
  4860. MOV EBP, [EDX+EAX*4-4] // Prev = Self_.fParent.fChildren.fItems[I-1]
  4861. PUSH EBP // push Prev
  4862. @@noPrev:
  4863. PUSH EDX
  4864. PUSH EDX
  4865. PUSH ESP
  4866. CALL GetCursorPos
  4867. DEC EDI
  4868. JNZ @@noCancel
  4869. POP EDX
  4870. POP EDX
  4871. PUSH [EBX].TControl.fSplitStartPos.y
  4872. PUSH [EBX].TControl.fSplitStartPos.x
  4873. @@noCancel:
  4874. OR EDI, -1
  4875. MOV CL, [EBX].TControl.fAlign
  4876. MOV AL, 1
  4877. SHL EAX, CL
  4878. {$IFDEF PARANOIA} DB $A8, chkRight or chkBott {$ELSE} TEST AL, chkRight or chkBott {$ENDIF} //fAlign in [ caRight, caBottom ] ?
  4879. JNZ @@mReady
  4880. INC EDI
  4881. INC EDI
  4882. @@mReady:
  4883. MOV EDX, [EBX].TControl.fParent
  4884. MOV EBP, [EDX].TControl.fMargin
  4885. NEG EBP
  4886. {$IFDEF PARANOIA} DB $A8, chkTop or chkBott {$ELSE} TEST AL, chkTop or chkBott {$ENDIF} // fAlign in [ caTop, caBottom ] ?
  4887. XCHG EAX, EDX
  4888. JZ @@noTopBottom
  4889. CALL TControl.GetClientHeight
  4890. XCHG EDX, EAX
  4891. POP EAX
  4892. POP ESI // MousePos.y
  4893. MOV EAX, ESI
  4894. PUSH EDX // Self_.fParent.ClientHeight
  4895. SUB EAX, [EBX].TControl.fSplitStartPos.y
  4896. IMUL EAX, EDI
  4897. ADD EAX, [EBX].TControl.fSplitStartSize // EAX = NewSize1
  4898. POP EDX
  4899. SUB EDX, EAX
  4900. SUB EDX, [EBX].TControl.fBoundsRect.Bottom
  4901. ADD EDX, [EBX].TControl.fBoundsRect.Top
  4902. LEA EDX, [EDX+EBP*4]
  4903. MOV ECX, [EBX].TControl.fSecondControl
  4904. JECXZ @@noSecondControl
  4905. MOV EDX, [ECX].TControl.fBoundsRect.Bottom
  4906. SUB EDX, [ECX].TControl.fBoundsRect.Top
  4907. CMP [ECX].TControl.fAlign, caClient
  4908. JNZ @@noSecondControl
  4909. PUSH EAX
  4910. MOV EAX, [EBX].TControl.fSplitStartPos.y
  4911. SUB EAX, ESI
  4912. IMUL EAX, EDI
  4913. ADD EAX, [EBX].TControl.fSplitStartPos2.y
  4914. LEA EDX, [EAX+EBP*4]
  4915. POP EAX
  4916. @@noSecondControl:
  4917. JMP @@newSizesReady
  4918. @@noTopBottom:
  4919. CALL TControl.GetClientWidth
  4920. XCHG EDX, EAX
  4921. POP ESI // MousePos.x
  4922. POP ECX
  4923. MOV EAX, ESI
  4924. PUSH EDX // Self_.fParent.ClientWidth
  4925. SUB EAX, [EBX].TControl.fSplitStartPos.x
  4926. IMUL EAX, EDI
  4927. ADD EAX, [EBX].TControl.fSplitStartSize // EAX = NewSize1
  4928. POP EDX
  4929. SUB EDX, EAX
  4930. SUB EDX, [EBX].TControl.fBoundsRect.Right
  4931. ADD EDX, [EBX].TControl.fBoundsRect.Left
  4932. LEA EDX, [EDX+EBP*4]
  4933. MOV ECX, [EBX].TControl.fSecondControl
  4934. JECXZ @@newSizesReady
  4935. MOV EDX, [ECX].TControl.fBoundsRect.Right
  4936. SUB EDX, [ECX].TControl.fBoundsRect.Left
  4937. CMP [ECX].TControl.fAlign, caClient
  4938. JNZ @@noSecondControl
  4939. PUSH EAX
  4940. MOV EAX, [EBX].TControl.fSplitStartPos.x
  4941. SUB EAX, ESI
  4942. IMUL EAX, EDI
  4943. ADD EAX, [EBX].TControl.fSplitStartPos2.x
  4944. LEA EDX, [EAX+EBP*4]
  4945. POP EAX
  4946. @@newSizesReady:
  4947. MOV ECX, [EBX].TControl.fSplitMinSize1
  4948. SUB ECX, EAX
  4949. JLE @@noCheckMinSize1
  4950. SUB EDX, ECX
  4951. ADD EAX, ECX
  4952. @@noCheckMinSize1:
  4953. MOV ECX, [EBX].TControl.fSplitMinSize2
  4954. SUB ECX, EDX
  4955. JLE @@noCheckMinSize2
  4956. SUB EAX, ECX
  4957. ADD EDX, ECX
  4958. @@noCheckMinSize2:
  4959. MOV ECX, [EBX].TControl.fOnSplit.TMethod.Code
  4960. JECXZ @@noOnSplit
  4961. PUSHAD
  4962. PUSH EDX
  4963. MOV ESI, ECX
  4964. XCHG ECX, EAX
  4965. MOV EDX, EBX
  4966. MOV EAX, [EBX].TControl.fOnSplit.TMethod.Data
  4967. CALL ESI
  4968. TEST AL, AL
  4969. POPAD
  4970. JZ @@e_DoDrag
  4971. @@noOnSplit:
  4972. XCHG ESI, EAX // NewSize1 -> ESI
  4973. POP EBP
  4974. ADD ESP, -16
  4975. MOV EAX, EBP
  4976. MOV EDX, ESP
  4977. CALL TControl.GetBoundsRect
  4978. MOVZX ECX, [EBX].TControl.fAlign
  4979. LOOP @@noPrev_caLeft
  4980. ADD ESI, [ESP].TRect.Left
  4981. MOV [ESP].TRect.Right, ESI
  4982. @@noPrev_caLeft:
  4983. LOOP @@noPrev_caTop
  4984. ADD ESI, [ESP].TRect.Top
  4985. MOV [ESP].TRect.Bottom, ESI
  4986. @@noPrev_caTop:
  4987. LOOP @@noPrev_caRight
  4988. MOV EAX, [ESP].TRect.Right
  4989. SUB EAX, ESI
  4990. MOV [ESP].TRect.Left, EAX
  4991. @@noPrev_caRight:
  4992. LOOP @@noPrev_caBottom
  4993. MOV EAX, [ESP].TRect.Bottom
  4994. SUB EAX, ESI
  4995. MOV [ESP].TRect.Top, EAX
  4996. @@noPrev_caBottom:
  4997. MOV EAX, EBP
  4998. MOV EDX, ESP
  4999. CALL TControl.SetBoundsRect
  5000. ADD ESP, 16
  5001. {$IFDEF OLD_ALIGN}
  5002. MOV EAX, [EBX].TControl.fParent
  5003. {$ELSE NEW_ALIGN}
  5004. MOV EAX, EBX
  5005. {$ENDIF}
  5006. CALL dword ptr[Global_Align]
  5007. @@e_DoDrag:
  5008. POPAD
  5009. RET
  5010. {$ENDIF USE_ASM_DODRAG}
  5011. @@noWM_MOUSEMOVE:
  5012. CMP word ptr [EDX].TMsg.message, WM_LBUTTONDOWN
  5013. JNE @@noWM_LBUTTONDOWN
  5014. MOV ECX, [EBX].TControl.fParent
  5015. TEST ECX, ECX
  5016. JZ @@noWM_LBUTTONDOWN
  5017. MOV EAX, [ECX].TControl.fChildren
  5018. PUSH EAX
  5019. MOV EDX, EBX
  5020. CALL TList.IndexOf
  5021. POP ECX
  5022. MOV EDX, EBX
  5023. TEST EAX, EAX
  5024. JLE @@noParent1
  5025. MOV ECX, [ECX].TList.fItems
  5026. MOV EDX, [ECX+EAX*4-4]
  5027. @@noParent1:
  5028. MOV CL, [EBX].TControl.fAlign
  5029. MOV AL, 1
  5030. SHL EAX, CL
  5031. {$IFDEF PARANOIA} DB $A8, chkTop or chkBott {$ELSE} TEST AL, chkTop or chkBott {$ENDIF} // fAlign in [caTop,caBottom] ?
  5032. XCHG EAX, EDX
  5033. JZ @@no_caTop_caBottom
  5034. CALL TControl.GetHeight
  5035. JMP @@caTop_caBottom
  5036. @@no_caTop_caBottom:
  5037. CALL TControl.GetWidth
  5038. @@caTop_caBottom:
  5039. MOV [EBX].TControl.fSplitStartSize, EAX
  5040. MOV ECX, [EBX].TControl.fSecondControl
  5041. JECXZ @@noSecondControl1
  5042. XCHG EAX, ECX
  5043. PUSH EAX
  5044. CALL TControl.GetWidth
  5045. MOV [EBX].TControl.fSplitStartPos2.x, EAX
  5046. POP EAX
  5047. CALL TControl.GetHeight
  5048. MOV [EBX].TControl.fSplitStartPos2.y, EAX
  5049. @@noSecondControl1:
  5050. PUSH [EBX].TControl.fHandle
  5051. CALL SetCapture
  5052. OR [EBX].TControl.fDragging, 1
  5053. PUSH 0
  5054. PUSH 100
  5055. PUSH $7B
  5056. PUSH [EBX].TControl.fHandle
  5057. CALL SetTimer
  5058. LEA EAX, [EBX].TControl.fSplitStartPos
  5059. PUSH EAX
  5060. CALL GetCursorPos
  5061. JMP @@exit
  5062. @@noWM_LBUTTONDOWN:
  5063. CMP word ptr [EDX].TMsg.message, WM_LBUTTONUP
  5064. JNE @@noWM_LBUTTONUP
  5065. XOR EDX, EDX
  5066. {$IFDEF USE_ASM_DODRAG}
  5067. CALL @@DoDrag
  5068. {$ELSE}
  5069. MOV EAX, EBX
  5070. CALL DoDrag
  5071. {$ENDIF}
  5072. JMP @@killtimer
  5073. @@noWM_LBUTTONUP:
  5074. CMP word ptr[EDX].TMsg.message, WM_TIMER
  5075. JNE @@exit
  5076. CMP [EBX].TControl.fDragging, 0
  5077. JE @@exit
  5078. PUSH VK_ESCAPE
  5079. CALL GetAsyncKeyState
  5080. TEST EAX, EAX
  5081. JGE @@exit
  5082. MOV DL, 1
  5083. {$IFDEF USE_ASM_DODRAG}
  5084. CALL @@DoDrag
  5085. {$ELSE}
  5086. MOV EAX, EBX
  5087. CALL DoDrag
  5088. {$ENDIF}
  5089. @@killtimer:
  5090. MOV [EBX].TControl.fDragging, 0
  5091. PUSH $7B
  5092. PUSH [EBX].TControl.fHandle
  5093. CALL KillTimer
  5094. CALL ReleaseCapture
  5095. @@exit:
  5096. POP EBX
  5097. XOR EAX, EAX
  5098. end;
  5099. function NewSplitterEx( AParent: PControl; MinSizePrev, MinSizeNext: Integer;
  5100. EdgeStyle: TEdgeStyle ): PControl;
  5101. const int_IDC_SIZEWE = integer( IDC_SIZEWE );
  5102. asm
  5103. PUSH EBX
  5104. PUSH EAX // AParent
  5105. PUSH ECX // MinSizePrev
  5106. PUSH EDX // MinSizeNext
  5107. MOV DL, EdgeStyle
  5108. CALL NewPanel
  5109. XCHG EBX, EAX
  5110. POP [EBX].TControl.fSplitMinSize1
  5111. POP [EBX].TControl.fSplitMinSize2
  5112. INC [EBX].TControl.fIsSplitter
  5113. XOR EDX, EDX
  5114. MOV DL, 4
  5115. MOV EAX, [EBX].TControl.fBoundsRect.Left
  5116. ADD EAX, EDX
  5117. MOV [EBX].TControl.fBoundsRect.Right, EAX
  5118. ADD EDX, [EBX].TControl.fBoundsRect.Top
  5119. MOV [EBX].TControl.fBoundsRect.Bottom, EDX
  5120. POP ECX // ECX = AParent
  5121. JECXZ @@noParent2
  5122. MOV EAX, [ECX].TControl.fChildren
  5123. MOV ECX, [EAX].TList.fCount
  5124. CMP ECX, 1
  5125. JLE @@noParent2
  5126. MOV EAX, [EAX].TList.fItems
  5127. MOV EAX, [EAX+ECX*4-8]
  5128. MOV CL, [EAX].TControl.fAlign
  5129. PUSH ECX
  5130. MOV AL, 1
  5131. SHL EAX, CL
  5132. {$IFDEF PARANOIA} DB $A8, chkTop or chkBott {$ELSE} TEST AL, chkTop or chkBott {$ENDIF}
  5133. MOV EAX, int_IDC_SIZEWE
  5134. JZ @@TopBottom
  5135. INC EAX
  5136. @@TopBottom:
  5137. PUSH EAX
  5138. PUSH 0
  5139. CALL LoadCursor
  5140. MOV [EBX].TControl.fCursor, EAX
  5141. POP EDX
  5142. MOV EAX, EBX
  5143. CALL TControl.SetAlign
  5144. @@noParent2:
  5145. MOV EAX, EBX
  5146. MOV EDX, offset[WndProcSplitter]
  5147. CALL TControl.AttachProc
  5148. XCHG EAX, EBX
  5149. POP EBX
  5150. {$IFDEF GRAPHCTL_XPSTYLES}
  5151. PUSH EDX
  5152. MOV DL, [EAX].TControl.fTransparent
  5153. MOV [EAX].TControl.fClassicTransparent, DL
  5154. POP EDX
  5155. PUSH EDX
  5156. PUSH EAX
  5157. CALL Attach_WM_THEMECHANGED
  5158. POP EAX
  5159. POP EDX
  5160. PUSH EDX
  5161. PUSH EAX
  5162. CALL XP_Themes_For_Splitter
  5163. POP EAX
  5164. POP EDX
  5165. {$ENDIF}
  5166. end;
  5167. function NewGradientPanel( AParent: PControl; Color1, Color2: TColor ): PControl;
  5168. asm
  5169. PUSH ECX
  5170. PUSH EDX
  5171. XOR EDX, EDX
  5172. CALL NewLabel
  5173. PUSH EAX
  5174. MOV EDX, offset[WndProcGradient]
  5175. CALL TControl.AttachProc
  5176. POP EAX
  5177. POP [EAX].TControl.fColor1
  5178. POP [EAX].TControl.fColor2
  5179. ADD [EAX].TControl.fBoundsRect.Right, 40-64
  5180. ADD [EAX].TControl.fBoundsRect.Bottom, 40 - 22
  5181. end;
  5182. function NewGradientPanelEx( AParent: PControl; Color1, Color2: TColor;
  5183. Style: TGradientStyle; Layout: TGradientLayout ): PControl;
  5184. asm
  5185. PUSH ECX
  5186. PUSH EDX
  5187. XOR EDX, EDX
  5188. CALL NewLabel
  5189. PUSH EAX
  5190. MOV EDX, offset[WndProcGradientEx]
  5191. CALL TControl.AttachProc
  5192. POP EAX
  5193. POP [EAX].TControl.fColor1
  5194. POP [EAX].TControl.fColor2
  5195. ADD [EAX].TControl.fBoundsRect.Right, 40-100
  5196. ADD [EAX].TControl.fBoundsRect.Bottom, 40 - 22
  5197. MOV DL, Style
  5198. MOV [EAX].TControl.fGradientStyle, DL
  5199. MOV DL, Layout
  5200. MOV [EAX].TControl.fGradientLayout, DL
  5201. end;
  5202. const EditClass: array[0..4] of KOLChar = ( 'E','D','I','T',#0 );
  5203. function NewEditbox( AParent: PControl; Options: TEditOptions ) : PControl;
  5204. const int_IDC_IBEAM = integer( IDC_IBEAM );
  5205. const WS_flags = integer( WS_VISIBLE or WS_CHILD or WS_TABSTOP or WS_BORDER );
  5206. const WS_clear = integer( not(WS_VSCROLL or WS_HSCROLL) );
  5207. asm
  5208. PUSH EBX
  5209. XCHG EBX, EAX // EBX=AParent
  5210. PUSH EDX
  5211. MOV EAX, ESP
  5212. XOR ECX, ECX
  5213. MOV CL, 11
  5214. MOV EDX, offset [EditFlags]
  5215. CALL MakeFlags
  5216. XCHG ECX, EAX // ECX = Flags
  5217. POP EAX // Options
  5218. PUSH EAX
  5219. {$IFDEF PARANOIA} DB $A8, 8 {$ELSE} TEST AL, 8 {$ENDIF}
  5220. JNZ @@1
  5221. AND ECX, WS_clear
  5222. @@1: OR ECX, WS_flags
  5223. PUSH 1
  5224. PUSH offset [EditActions]
  5225. MOV EDX, offset [EditClass]
  5226. XCHG EAX, EBX
  5227. CALL _NewControl
  5228. XCHG EBX, EAX
  5229. LEA ECX, [EBX].TControl.fBoundsRect
  5230. MOV EDX, [ECX].TRect.Left
  5231. ADD EDX, 100
  5232. MOV [ECX].TRect.Right, EDX
  5233. MOV EDX, [ECX].TRect.Top
  5234. ADD EDX, 22
  5235. MOV [ECX].TRect.Bottom, EDX
  5236. POP EAX // Options
  5237. {$IFDEF PARANOIA} DB $A8, 8 {$ELSE} TEST AL, 8 {$ENDIF}
  5238. MOV DL, $0D
  5239. JZ @@2
  5240. ADD [ECX].TRect.Right, 100
  5241. ADD [ECX].TRect.Bottom, 200 - 22
  5242. MOV DL, 1
  5243. INC [EBX].TControl.fIgnoreDefault
  5244. @@2:
  5245. TEST AH, 4
  5246. JZ @@3
  5247. AND DL, $FE
  5248. @@3: MOV [EBX].TControl.fLookTabKeys, DL
  5249. XCHG EAX, EBX
  5250. POP EBX
  5251. end;
  5252. {$IFDEF ASM_UNICODE}
  5253. const ListBoxClass : array[ 0..7 ] of Char = ( 'L','I','S','T','B','O','X',#0 );
  5254. function NewListbox( AParent: PControl; Options: TListOptions ): PControl;
  5255. asm
  5256. PUSH EAX
  5257. PUSH EDX
  5258. MOV EAX, ESP
  5259. MOV EDX, offset[ListFlags]
  5260. XOR ECX, ECX
  5261. MOV CL, 11
  5262. CALL MakeFlags
  5263. POP EDX
  5264. OR EAX, WS_VISIBLE or WS_CHILD or WS_TABSTOP or WS_BORDER or WS_VSCROLL or LBS_NOTIFY
  5265. XCHG ECX, EAX
  5266. POP EAX
  5267. PUSH 1
  5268. PUSH offset[ListActions]
  5269. MOV EDX, offset[ListBoxClass]
  5270. CALL _NewControl
  5271. ADD [EAX].TControl.fBoundsRect.Right, 100
  5272. ADD [EAX].TControl.fBoundsRect.Bottom, 200-64
  5273. MOV [EAX].TControl.fColor, clWindow
  5274. MOV [EAX].TControl.fLookTabKeys, 3
  5275. end;
  5276. {$ENDIF ASM_UNICODE}
  5277. {$IFNDEF USE_DROPDOWNCOUNT}
  5278. procedure ComboboxDropDown( Sender: PObj );
  5279. asm
  5280. PUSH EBX
  5281. PUSH ESI
  5282. MOV EBX, EAX
  5283. CALL TControl.GetItemsCount
  5284. CMP EAX, 1
  5285. JGE @@1
  5286. MOV AL, 1
  5287. @@1: CMP EAX, 8
  5288. JLE @@2
  5289. XOR EAX, EAX
  5290. MOV AL, 8
  5291. @@2: XOR ESI, ESI
  5292. PUSH SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_NOREDRAW or SWP_SHOWWINDOW
  5293. PUSH ESI
  5294. PUSH ESI
  5295. PUSH SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_NOREDRAW or SWP_HIDEWINDOW
  5296. PUSH EAX
  5297. MOV EAX, EBX
  5298. CALL TControl.GetHeight
  5299. POP ECX
  5300. INC ECX
  5301. IMUL ECX
  5302. INC EAX
  5303. INC EAX
  5304. PUSH EAX
  5305. MOV EAX, EBX
  5306. CALL TControl.GetWidth
  5307. PUSH EAX
  5308. INC ESI
  5309. @@3: XOR EDX, EDX
  5310. PUSH EDX
  5311. PUSH EDX
  5312. PUSH EDX
  5313. PUSH [EBX].TControl.fHandle
  5314. CALL SetWindowPos
  5315. DEC ESI
  5316. JZ @@3
  5317. MOV ECX, [EBX].TControl.fOnDropDown.TMethod.Code
  5318. JECXZ @@exit
  5319. MOV EAX, [EBX].TControl.fOnDropDown.TMethod.Data
  5320. MOV EDX, EBX
  5321. CALL ECX
  5322. @@exit: POP ESI
  5323. POP EBX
  5324. end;
  5325. {$ENDIF}
  5326. {$IFDEF ASM_UNICODE}
  5327. procedure CreateComboboxWnd( Combo: PControl );
  5328. //const PrevProcStr: PChar = 'PREV_PROC'; //************ Remarked By M.Gerasimov
  5329. asm
  5330. PUSH EDI
  5331. PUSH EBX
  5332. XCHG EBX, EAX
  5333. PUSH GW_CHILD
  5334. PUSH [EBX].TControl.fHandle
  5335. @@getwindow:
  5336. CALL GetWindow
  5337. TEST EAX, EAX
  5338. JZ @@fin
  5339. PUSH offset[WndFuncCombo]
  5340. PUSH GWL_WNDPROC
  5341. PUSH EAX
  5342. XCHG EDI, EAX
  5343. CALL SetWindowLong
  5344. PUSH EAX
  5345. PUSH offset [ID_PREVPROC] //
  5346. PUSH EDI
  5347. CALL SetProp
  5348. @@2getnext:
  5349. PUSH GW_HWNDNEXT
  5350. PUSH EDI
  5351. JMP @@getwindow
  5352. @@fin: POP EBX
  5353. POP EDI
  5354. end;
  5355. {$ENDIF ASM_UNICODE}
  5356. const ComboboxClass: array[0..8] of KOLChar = ('C','O','M','B','O','B','O','X',#0 );
  5357. function NewCombobox( AParent: PControl; Options: TComboOptions ): PControl;
  5358. asm
  5359. PUSH EDX
  5360. PUSH EAX
  5361. PUSH EDX
  5362. MOV EAX, ESP
  5363. MOV EDX, offset[ComboFlags]
  5364. XOR ECX, ECX
  5365. MOV CL, 10
  5366. CALL MakeFlags
  5367. POP EDX
  5368. XCHG ECX, EAX
  5369. POP EAX
  5370. PUSH 1
  5371. PUSH offset[ComboActions]
  5372. MOV EDX, offset[ComboboxClass]
  5373. OR ECX, WS_VISIBLE or WS_CHILD or WS_VSCROLL or CBS_HASSTRINGS or WS_TABSTOP
  5374. TEST ECX, CBS_SIMPLE
  5375. JNZ @@O
  5376. OR ECX, CBS_DROPDOWN
  5377. @@O:
  5378. CALL _NewControl
  5379. MOV [EAX].TControl.fCreateWndExt, offset[CreateComboboxWnd]
  5380. MOV [EAX].TControl.fDropDownProc, offset[ComboboxDropDown]
  5381. OR byte ptr [EAX].TControl.fClsStyle, CS_DBLCLKS
  5382. ADD [EAX].TControl.fBoundsRect.Right, 100-64
  5383. ADD [EAX].TControl.fBoundsRect.Bottom, 22-64
  5384. MOV CL, 1
  5385. POP EDX
  5386. TEST DL, 1
  5387. JZ @@exit
  5388. MOV CL, 3
  5389. @@exit:
  5390. MOV [EAX].TControl.fLookTabKeys, CL
  5391. PUSH EAX
  5392. MOV EDX, offset[ WndProcCombo ]
  5393. CALL TControl.AttachProc
  5394. POP EAX
  5395. end;
  5396. function WndProcResize(Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  5397. asm
  5398. PUSH ESI
  5399. CMP word ptr [EDX].TMsg.message, WM_SIZE
  5400. JNZ @@exit
  5401. MOV ESI, [EAX].TControl.fChildren
  5402. MOV ECX, [ESI].TList.fCount
  5403. JECXZ @@exit
  5404. MOV ESI, [ESI].TList.fItems
  5405. @@loo: PUSH ECX
  5406. LODSD
  5407. PUSH EAX
  5408. PUSH EAX
  5409. PUSH CM_SIZE
  5410. PUSH EAX
  5411. CALL TControl.Perform
  5412. POP ECX
  5413. LOOP @@loo
  5414. @@exit: XOR EAX, EAX
  5415. POP ESI
  5416. end;
  5417. function WndProcParentResize( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  5418. asm
  5419. CMP word ptr [EDX].TMsg.message, CM_SIZE
  5420. JNZ @@exit
  5421. PUSH 0
  5422. PUSH 0
  5423. PUSH WM_SIZE
  5424. PUSH EAX
  5425. CALL TControl.Perform
  5426. @@exit: XOR EAX, EAX
  5427. end;
  5428. function NewProgressbar( AParent: PControl ): PControl;
  5429. asm
  5430. PUSH 1
  5431. PUSH 0
  5432. MOV EDX, offset[Progress_class]
  5433. MOV ECX, WS_CHILD or WS_VISIBLE
  5434. CALL _NewCommonControl
  5435. LEA EDX, [EAX].TControl.fBoundsRect
  5436. MOV ECX, [EDX].TRect.Left
  5437. ADD ECX, 300
  5438. MOV [EDX].TRect.Right, ECX
  5439. MOV ECX, [EDX].TRect.Top
  5440. ADD ECX, 20
  5441. MOV [EDX].TRect.Bottom, ECX
  5442. XOR EDX, EDX
  5443. MOV [EAX].TControl.fMenu, EDX
  5444. MOV [EAX].TControl.fTextColor, clHighlight
  5445. MOV [EAX].TControl.fCommandActions.aSetBkColor, PBM_SETBKCOLOR
  5446. end;
  5447. function NewProgressbarEx( AParent: PControl; Options: TProgressbarOptions ): PControl;
  5448. asm
  5449. PUSH EDX
  5450. CALL NewProgressbar
  5451. POP ECX
  5452. XOR EDX, EDX
  5453. SHR ECX, 1
  5454. JNC @@notVert
  5455. MOV DL, 4
  5456. @@notVert:
  5457. SHR ECX, 1
  5458. JNC @@notSmooth
  5459. INC EDX
  5460. @@notSmooth:
  5461. OR [EAX].TControl.fStyle, EDX
  5462. end;
  5463. function WndProcNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  5464. asm
  5465. CMP word ptr [EDX].TMsg.message, WM_NOTIFY
  5466. JNE @@ret_false
  5467. PUSH ECX
  5468. PUSH EDX
  5469. MOV ECX, [EDX].TMsg.lParam
  5470. {$IFDEF USE_PROP}
  5471. PUSH offset[ID_SELF]
  5472. PUSH [ECX].TNMHdr.hwndFrom
  5473. CALL GetProp
  5474. {$ELSE}
  5475. PUSH GWL_USERDATA
  5476. PUSH [ECX].TNMHdr.hwndFrom
  5477. CALL GetWindowLong
  5478. {$ENDIF}
  5479. POP EDX
  5480. TEST EAX, EAX
  5481. JZ @@ret_false_ECX
  5482. MOV ECX, [EAX].TControl.fHandle
  5483. MOV [EDX].TMsg.hwnd, ECX
  5484. POP ECX
  5485. JMP TControl.EnumDynHandlers
  5486. @@ret_false_ECX:
  5487. POP ECX
  5488. @@ret_false:
  5489. XOR EAX, EAX
  5490. end;
  5491. function WndProcCommonNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  5492. asm
  5493. CMP word ptr [EDX].TMsg.message, WM_NOTIFY
  5494. JNE @@ret_false
  5495. PUSH EBX
  5496. MOV EBX, [EDX].TMsg.lParam
  5497. MOV EDX, [EBX].TNMHdr.code
  5498. @@chk_nm_click:
  5499. XOR ECX, ECX
  5500. CMP EDX, NM_CLICK
  5501. JZ @@click
  5502. CMP EDX, NM_RCLICK
  5503. JNE @@chk_killfocus
  5504. INC ECX
  5505. @@click:
  5506. MOV [EAX].TControl.fRightClick, CL
  5507. MOV ECX, [EAX].TControl.fOnClick.TMethod.Code
  5508. JECXZ @@fin_false
  5509. MOV EDX, [EAX].TControl.fOnClick.TMethod.Data
  5510. JMP @@fin_event
  5511. @@fin_false:
  5512. POP EBX
  5513. @@ret_false:
  5514. XOR EAX, EAX
  5515. RET
  5516. @@chk_killfocus:
  5517. CMP EDX, NM_KILLFOCUS
  5518. JNE @@chk_setfocus
  5519. MOV ECX, [EAX].TControl.fOnLeave.TMethod.Code
  5520. JECXZ @@fin_false
  5521. MOV EDX, [EAX].TControl.fOnLeave.TMethod.Data
  5522. JMP @@fin_event
  5523. @@chk_setfocus:
  5524. CMP EDX, NM_RETURN
  5525. JE @@set_focus
  5526. CMP EDX, NM_SETFOCUS
  5527. JNE @@fin_false
  5528. @@set_focus:
  5529. MOV ECX, [EAX].TControl.fOnEnter.TMethod.Code
  5530. JECXZ @@fin_false
  5531. MOV EDX, [EAX].TControl.fOnEnter.TMethod.Data
  5532. @@fin_event:
  5533. XCHG EAX, EDX
  5534. CALL ECX
  5535. POP EBX
  5536. MOV AL, 1
  5537. end;
  5538. procedure ApplyImageLists2Control( Sender: PControl );
  5539. asm
  5540. PUSHAD
  5541. XCHG ESI, EAX
  5542. MOVZX ECX, [ESI].TControl.fCommandActions.aSetImgList
  5543. JECXZ @@fin
  5544. MOV EBP, ECX
  5545. XOR EBX, EBX
  5546. MOV BL, 32
  5547. XOR EDI, EDI
  5548. @@loo:
  5549. MOV EAX, ESI
  5550. MOV EDX, EBX
  5551. CALL TControl.GetImgListIdx
  5552. TEST EAX, EAX
  5553. JZ @@nx
  5554. CALL TImageList.GetHandle
  5555. PUSH EAX
  5556. PUSH EDI
  5557. PUSH EBP
  5558. PUSH ESI
  5559. CALL TControl.Perform
  5560. @@nx:
  5561. INC EDI
  5562. SHR EBX, 1
  5563. JZ @@fin
  5564. CMP BL, 16
  5565. JGE @@loo
  5566. XOR EBX, EBX
  5567. JMP @@loo
  5568. @@fin:
  5569. POPAD
  5570. end;
  5571. procedure ApplyImageLists2ListView( Sender: PControl );
  5572. asm
  5573. PUSHAD
  5574. XCHG ESI, EAX
  5575. PUSH dword ptr [ESI].TControl.fLVOptions
  5576. MOV EAX, ESP
  5577. MOV EDX, offset[ListViewFlags]
  5578. XOR ECX, ECX
  5579. MOV CL, 25
  5580. CALL MakeFlags
  5581. POP ECX
  5582. PUSH ECX
  5583. MOV EDX, [ESI].TControl.fStyle
  5584. //AND DH, 3
  5585. AND DX, not $403F
  5586. OR EDX, EAX
  5587. MOVZX EAX, [ESI].TControl.fLVStyle
  5588. OR EDX, [EAX*4 + offset ListViewStyles]
  5589. MOV EAX, ESI
  5590. CALL TControl.SetStyle
  5591. MOV EAX, ESP
  5592. MOV EDX, offset[ListViewExFlags]
  5593. XOR ECX, ECX
  5594. MOV CL, 23
  5595. CALL MakeFlags
  5596. POP EDX
  5597. PUSH EAX
  5598. PUSH $3FFF
  5599. PUSH LVM_SETEXTENDEDLISTVIEWSTYLE
  5600. PUSH ESI
  5601. CALL TControl.Perform
  5602. POPAD
  5603. CALL ApplyImageLists2Control
  5604. end;
  5605. function NewListView( AParent: PControl; Style: TListViewStyle; Options: TListViewOptions;
  5606. ImageListSmall, ImageListNormal, ImageListState: PImageList ): PControl;
  5607. asm
  5608. PUSH EDX
  5609. PUSH ECX
  5610. MOVZX EDX, DL
  5611. MOV ECX, [EDX*4 + offset ListViewStyles]
  5612. OR ECX, LVS_SHAREIMAGELISTS or WS_CHILD or WS_VISIBLE or WS_TABSTOP
  5613. MOV EDX, offset[WC_LISTVIEW]
  5614. PUSH 1
  5615. PUSH offset[ListViewActions]
  5616. CALL _NewCommonControl
  5617. MOV EDX, ESP
  5618. PUSH EAX
  5619. XCHG EAX, EDX
  5620. MOV EDX, offset ListViewFlags
  5621. XOR ECX, ECX
  5622. MOV CL, 25
  5623. CALL MakeFlags
  5624. XCHG EDX, EAX
  5625. POP EAX
  5626. MOV ECX, [EAX].TControl.fStyle
  5627. AND ECX, not LVS_TYPESTYLEMASK
  5628. OR EDX, ECX
  5629. MOV [EAX].TControl.fStyle, EDX
  5630. POP [EAX].TControl.fLVOptions
  5631. POP EDX
  5632. MOV [EAX].TControl.fLVStyle, DL
  5633. MOV [EAX].TControl.fCreateWndExt, offset[ApplyImageLists2ListView]
  5634. ADD [EAX].TControl.fBoundsRect.Right, 200-64
  5635. ADD [EAX].TControl.fBoundsRect.Bottom, 150-64
  5636. MOV ECX, [ImageListState]
  5637. XOR EDX, EDX
  5638. PUSHAD
  5639. CALL TControl.SetImgListIdx
  5640. POPAD
  5641. MOV ECX, [ImageListSmall]
  5642. MOV DL, 16
  5643. PUSHAD
  5644. CALL TControl.SetImgListIdx
  5645. POPAD
  5646. MOV ECX, [ImageListNormal]
  5647. ADD EDX, EDX
  5648. PUSH EAX
  5649. CALL TControl.SetImgListIdx
  5650. POP EAX
  5651. MOV [EAX].TControl.fLVTextBkColor, clWindow
  5652. XOR EDX, EDX
  5653. INC EDX
  5654. MOV [EAX].TControl.fLookTabKeys, DL
  5655. end;
  5656. {$IFDEF ASM_UNICODE}
  5657. function WndProcTreeView( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  5658. asm //cmd //opd
  5659. CMP word ptr [EDX].TMsg.message, WM_NOTIFY
  5660. JNZ @@ret_false
  5661. PUSH EBX
  5662. XCHG EBX, EAX
  5663. MOV EDX, [EDX].TMsg.lParam
  5664. LEA EAX, [EBX].TControl.fOnTVBeginDrag
  5665. CMP word ptr [EDX].TNMTreeView.hdr.code, NM_RCLICK
  5666. JNE @@chk_TVN_BEGINDRAG
  5667. PUSH ECX
  5668. PUSH ECX
  5669. PUSH ESP
  5670. CALL GetCursorPos
  5671. MOV EAX, EBX
  5672. MOV EDX, ESP
  5673. MOV ECX, EDX
  5674. CALL TControl.Screen2Client
  5675. POP EAX
  5676. AND EAX, $FFFF
  5677. POP EDX
  5678. SHL EDX, 16
  5679. OR EAX, EDX
  5680. PUSH EAX
  5681. CALL GetShiftState
  5682. PUSH EAX
  5683. PUSH WM_RBUTTONUP
  5684. PUSH [EBX].TControl.fHandle
  5685. CALL PostMessage
  5686. JMP @@2fin_false1
  5687. @@chk_TVN_BEGINDRAG:
  5688. {$IFDEF UNICODE_CTRLS}
  5689. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINDRAGW
  5690. JZ @@event_drag
  5691. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINRDRAGW
  5692. JZ @@event_drag
  5693. {$ENDIF UNICODE_CTRLS}
  5694. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINDRAG
  5695. JZ @@event_drag
  5696. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINRDRAG
  5697. JNZ @@chk_BEGINLABELEDIT
  5698. @@event_drag:
  5699. MOV EDX, [EDX].TNMTreeView.itemNew.hItem
  5700. @@event_call:
  5701. MOV ECX, [EAX].TMethod.Code
  5702. JECXZ @@2fin_false1
  5703. MOV EAX, [EAX].TMethod.Data
  5704. XCHG EBX, ECX
  5705. XCHG EDX, ECX
  5706. CALL EBX
  5707. @@2fin_false1: JMP @@fin_false
  5708. @@chk_BEGINLABELEDIT:
  5709. LEA EAX, [EBX].TControl.fOnTVBeginEdit
  5710. {$IFDEF UNICODE_CTRLS}
  5711. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDITW
  5712. JZ @@beginlabeledit
  5713. {$ENDIF UNICODE_CTRLS}
  5714. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDIT
  5715. JNZ @@chk_ITEMEXPANDED //@@chk_DELETEITEM
  5716. @@beginlabeledit:
  5717. CMP [EBX].TControl.fDragging, 0
  5718. JZ @@allow_LABELEDIT
  5719. XOR EAX, EAX
  5720. INC EAX
  5721. MOV [ECX], EAX
  5722. JMP @@ret_true
  5723. @@allow_LABELEDIT:
  5724. PUSH ECX // @Rslt
  5725. MOV ECX, [EAX].TMethod.Code
  5726. JECXZ @@2fin_false1
  5727. PUSH EBX
  5728. XCHG EBX, ECX
  5729. MOV EDX, [EDX].TTVDispInfo.item.hItem
  5730. XCHG EDX, ECX
  5731. MOV EAX, [EAX].TMethod.Data
  5732. CALL EBX
  5733. TEST AL, AL
  5734. SETZ AL // Rslt := not event result;
  5735. POP EBX
  5736. JZ @@ret_EAX
  5737. INC [EBX].TControl.fEditing
  5738. JMP @@ret_EAX
  5739. @@call_EBX:
  5740. CALL EBX
  5741. @@2fin_false:
  5742. JMP @@fin_false
  5743. @@chk_ITEMEXPANDED:
  5744. LEA EAX, [EBX].TControl.fOnTVExpanded
  5745. {$IFDEF UNICODE_CTRLS}
  5746. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDEDW
  5747. JZ @@itemexpanded
  5748. {$ENDIF UNICODE_CTRLS}
  5749. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDED
  5750. JNZ @@chk_SELCHANGING
  5751. @@itemexpanded:
  5752. MOV ECX, [EAX].TMethod.Code
  5753. JECXZ @@2fin_false
  5754. CMP [EDX].TNMTreeView.action, TVE_EXPAND
  5755. PUSH ECX
  5756. SETZ CL
  5757. XCHG ECX, [ESP]
  5758. JMP @@event_drag
  5759. @@chk_SELCHANGING:
  5760. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_SELCHANGING
  5761. JNE @@chk_ITEMEXPANDING
  5762. XCHG EAX, ECX
  5763. MOV ECX, [EBX].TControl.fOnTVSelChanging.TMethod.Code
  5764. @@2fin_false2:
  5765. JECXZ @@2fin_false
  5766. PUSH EAX //@Rslt
  5767. PUSH [EDX].TNMTreeView.itemNew.hItem
  5768. XCHG ECX, EBX //EBX=OnTVSelChanging.Code ECX=Sender
  5769. XCHG ECX, EDX //EDX=Sender ECX=Msg
  5770. MOV ECX, [ECX].TNMTreeView.itemOld.hItem
  5771. MOV EAX, [EDX].TControl.fOnTVSelChanging.TMethod.Data
  5772. CALL EBX
  5773. XOR AL, 1
  5774. MOVZX EAX, AL
  5775. JMP @@ret_EAX
  5776. @@chk_ITEMEXPANDING:
  5777. {$IFDEF UNICODE_CTRLS}
  5778. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDINGW
  5779. JZ @@itemexpanding
  5780. {$ENDIF UNICODE_CTRLS}
  5781. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDING
  5782. JNE @@chk_ENDLABELEDIT
  5783. @@itemexpanding:
  5784. XCHG EAX, ECX
  5785. MOV ECX, [EBX].TControl.fOnTVExpanding.TMethod.Code
  5786. JECXZ @@2fin_false2
  5787. PUSH EAX // @Rslt
  5788. CMP [EDX].TNMTreeView.action, TVE_EXPAND
  5789. PUSH ECX
  5790. SETZ CL
  5791. XCHG ECX, [ESP]
  5792. XCHG ECX, EBX //EBX=OnTVExpanding.Code ECX=Seneder
  5793. XCHG EDX, ECX //ECX=Msg EDX=Sender
  5794. MOV ECX, [ECX].TNMTreeView.itemNew.hItem //ECX=Item
  5795. MOV EAX, [EDX].TControl.fOnTVExpanding.TMethod.Data //EAX=object
  5796. @@111:
  5797. CALL EBX
  5798. @@ret_EAX:
  5799. POP EDX //EDX=@Rslt
  5800. MOVZX EAX, AL
  5801. NEG EAX
  5802. MOV [EDX], EAX
  5803. @@ret_true:
  5804. MOV AL, 1
  5805. POP EBX
  5806. RET
  5807. @@chk_ENDLABELEDIT:
  5808. {$IFDEF UNICODE_CTRLS}
  5809. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ENDLABELEDITW
  5810. JZ @@endlabeledit
  5811. {$ENDIF UNICODE_CTRLS}
  5812. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ENDLABELEDIT
  5813. JNZ @@chk_SELCHANGED
  5814. @@endlabeledit:
  5815. MOV [EBX].TControl.fEditing, 0
  5816. XCHG EAX, ECX
  5817. MOV ECX, [EBX].TControl.fOnTVEndEdit.TMethod.Code
  5818. JECXZ @@ret_1
  5819. PUSH EAX
  5820. PUSH EBX
  5821. PUSH 0
  5822. XCHG EDX, EBX
  5823. MOV EAX, [EBX].TTVDispInfo.item.pszText
  5824. PUSH EDX
  5825. PUSH ECX
  5826. XCHG EAX, EDX
  5827. {$IFDEF UNICODE_CTRLS}
  5828. CMP [EBX].TNMTreeView.hdr.code, TVN_ENDLABELEDITW
  5829. JNZ @@endlabeleditA
  5830. CALL TControl.TVGetItemTextW
  5831. JMP @@NewTxt_ready
  5832. @@endlabeleditA:
  5833. {$ENDIF UNICODE_CTRLS}
  5834. TEST EDX, EDX
  5835. JNZ @@prepare_NewTxt
  5836. // NewTxt := [EDX].TControl.TVItemText[ hItem ]
  5837. LEA ECX, [ESP + 8]
  5838. MOV EDX, [EBX].TTVDispInfo.item.hItem
  5839. CALL TControl.TVGetItemText
  5840. JMP @@NewTxt_ready
  5841. @@prepare_NewTxt:
  5842. LEA EAX, [ESP+8]
  5843. CALL System.@LStrFromPChar
  5844. @@NewTxt_ready:
  5845. POP ECX
  5846. POP EDX
  5847. POP EAX
  5848. PUSH EAX
  5849. PUSH EAX
  5850. MOV EAX, [EDX].TControl.fOnTVEndEdit.TMethod.Data
  5851. MOV EBX, [EBX].TTVDispInfo.item.hItem
  5852. XCHG ECX, EBX
  5853. CALL EBX
  5854. XCHG EBX, EAX
  5855. CALL RemoveStr
  5856. XCHG EAX, EBX
  5857. POP EBX
  5858. JMP @@ret_EAX
  5859. @@ret_1:
  5860. INC ECX
  5861. MOV [EAX], ECX
  5862. JMP @@ret_true
  5863. @@chk_SELCHANGED:
  5864. {$IFDEF UNICODE_CTRLS}
  5865. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_SELCHANGEDW
  5866. JZ @@selchanged
  5867. {$ENDIF UNICODE_CTRLS}
  5868. CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_SELCHANGED
  5869. JNZ @@fin_false
  5870. @@selchanged:
  5871. XCHG EAX, EBX
  5872. CALL TControl.DoSelChange
  5873. @@fin_false:
  5874. POP EBX
  5875. @@ret_false:
  5876. XOR EAX, EAX
  5877. end;
  5878. {$ENDIF ASM_UNICODE}
  5879. function NewTreeView( AParent: PControl; Options: TTreeViewOptions;
  5880. ImgListNormal, ImgListState: PImageList ): PControl;
  5881. asm //cmd //opd
  5882. PUSH EBX
  5883. PUSH ECX
  5884. PUSH EAX
  5885. PUSH EDX
  5886. MOV EAX, ESP
  5887. MOV EDX, offset[TreeViewFlags]
  5888. XOR ECX, ECX
  5889. MOV CL, 13
  5890. CALL MakeFlags
  5891. POP EDX
  5892. OR EAX, WS_VISIBLE or WS_CHILD or WS_TABSTOP
  5893. XCHG ECX, EAX
  5894. POP EAX
  5895. MOV EDX, offset[WC_TREEVIEW]
  5896. PUSH 1
  5897. PUSH offset[TreeViewActions]
  5898. CALL _NewCommonControl
  5899. MOV EBX, EAX
  5900. MOV [EBX].TControl.fCreateWndExt, offset[ApplyImageLists2Control]
  5901. MOV [EBX].TControl.fColor, clWindow
  5902. MOV EDX, offset[WndProcTreeView]
  5903. CALL TControl.AttachProc
  5904. ADD [EBX].TControl.fBoundsRect.Right, 150-64
  5905. ADD [EBX].TControl.fBoundsRect.Bottom, 200-64
  5906. MOV EAX, EBX
  5907. XOR EDX, EDX
  5908. MOV DL, 32
  5909. POP ECX // ImageListNormal
  5910. CALL TControl.SetImgListIdx
  5911. MOV EAX, EBX
  5912. XOR EDX, EDX
  5913. MOV ECX, [ImgListState]
  5914. CALL TControl.SetImgListIdx
  5915. MOV byte ptr [EBX].TControl.fLookTabKeys, 1
  5916. XCHG EAX, EBX
  5917. POP EBX
  5918. end;
  5919. function WndProcTabControl( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  5920. asm //cmd //opd
  5921. {$IFDEF OLD_ALIGN}
  5922. PUSH EBP
  5923. PUSH EBX
  5924. PUSH ESI
  5925. PUSH EDI
  5926. MOV EBX, EAX
  5927. CMP word ptr [EDX].TMsg.message, WM_NOTIFY
  5928. JNZ @@chk_WM_SIZE
  5929. MOV EDX, [EDX].TMsg.lParam
  5930. //!!!
  5931. CMP word ptr [EDX].TNMHdr.code, TCN_SELCHANGING
  5932. JNZ @@chk_TCN_SELCHANGE
  5933. CALL TControl.GetCurIndex
  5934. MOV [EBX].TControl.fCurIndex, EAX
  5935. JMP @@ret_false
  5936. @@chk_TCN_SELCHANGE:
  5937. CMP word ptr [EDX].TNMHdr.code, TCN_SELCHANGE
  5938. JNZ @@ret_false
  5939. CALL TControl.GetCurIndex
  5940. XCHG EDI, EAX
  5941. CMP EDI, [EBX].TControl.fCurIndex
  5942. PUSHFD // WasActive = ZF
  5943. MOV [EBX].TControl.FCurIndex, EDI
  5944. MOV EAX, EBX
  5945. CALL TControl.GetItemsCount
  5946. XCHG ESI, EAX // ESI := Self_.Count
  5947. @@loo: DEC ESI
  5948. JS @@e_loo
  5949. MOV EDX, ESI
  5950. MOV EAX, EBX
  5951. CALL TControl.GetPages
  5952. CMP ESI, EDI
  5953. PUSH EAX
  5954. SETZ DL
  5955. CALL TControl.SetVisible
  5956. POP EAX
  5957. CMP ESI, EDI
  5958. JNE @@nx_loo
  5959. CALL TControl.BringToFront
  5960. @@nx_loo:
  5961. JMP @@loo
  5962. @@e_loo:
  5963. POPFD
  5964. JZ @@ret_false
  5965. MOV ECX, [EBX].TControl.fOnSelChange.TMethod.Code
  5966. JECXZ @@ret_false
  5967. MOV EDX, EBX
  5968. MOV EAX, [EBX].TControl.fOnSelChange.TMethod.Data
  5969. CALL ECX
  5970. JMP @@ret_false
  5971. @@chk_WM_SIZE:
  5972. CMP word ptr [EDX].TMsg.message, WM_SIZE
  5973. JNE @@ret_false
  5974. ADD ESP, -16
  5975. PUSH ESP
  5976. PUSH [EBX].TControl.fHandle
  5977. CALL Windows.GetClientRect
  5978. PUSH ESP
  5979. PUSH 0
  5980. PUSH TCM_ADJUSTRECT
  5981. PUSH EBX
  5982. CALL TControl.Perform
  5983. MOV EAX, EBX
  5984. CALL TControl.GetItemsCount
  5985. XCHG ESI, EAX
  5986. @@loo2:
  5987. DEC ESI
  5988. JS @@e_loo2
  5989. MOV EDX, ESI
  5990. MOV EAX, EBX
  5991. CALL TControl.GetPages
  5992. MOV EDX, ESP
  5993. CALL TControl.SetBoundsRect
  5994. JMP @@loo2
  5995. @@e_loo2:
  5996. ADD ESP, 16
  5997. @@ret_false:
  5998. XOR EAX, EAX
  5999. POP EDI
  6000. POP ESI
  6001. POP EBX
  6002. POP EBP
  6003. {$ELSE NEW_ALIGN}
  6004. PUSH EBX
  6005. MOV EBX, EAX
  6006. CMP word ptr [EDX].TMsg.message, WM_NOTIFY
  6007. JNZ @@chk_WM_SIZE
  6008. MOV EDX, [EDX].TMsg.lParam
  6009. CMP word ptr [EDX].TNMHdr.code, TCN_SELCHANGING
  6010. JNZ @@chk_TCN_SELCHANGE
  6011. CALL TControl.GetCurIndex
  6012. MOV [EBX].TControl.fCurIndex, EAX
  6013. JMP @@ret_false
  6014. @@chk_TCN_SELCHANGE:
  6015. CMP word ptr [EDX].TNMHdr.code, TCN_SELCHANGE
  6016. JNZ @@ret_false
  6017. CALL TControl.GetCurIndex
  6018. MOV EDX, [EBX].TControl.fCurIndex
  6019. MOV [EBX].TControl.fCurIndex, EAX
  6020. CMP EAX, EDX
  6021. PUSHFD // WasActive = ZF
  6022. BT EDX,31
  6023. JBE @@00
  6024. MOV EAX, EBX
  6025. CALL TControl.GetPages
  6026. XOR EDX,EDX
  6027. CALL TControl.SetVisible
  6028. @@00:
  6029. MOV EDX, [EBX].TControl.fCurIndex
  6030. MOV EAX, EBX
  6031. CALL TControl.GetPages
  6032. MOV DL,1
  6033. PUSH EAX
  6034. CALL TControl.SetVisible
  6035. POP EAX
  6036. CALL TControl.BringToFront
  6037. POPFD
  6038. JZ @@ret_false
  6039. MOV ECX, [EBX].TControl.fOnSelChange.TMethod.Code
  6040. JECXZ @@ret_false
  6041. MOV EDX, EBX
  6042. MOV EAX, [EBX].TControl.fOnSelChange.TMethod.Data
  6043. CALL ECX
  6044. JMP @@ret_false
  6045. @@chk_WM_SIZE:
  6046. CMP word ptr [EDX].TMsg.message, WM_SIZE
  6047. JNE @@ret_false
  6048. SUB ESP, 10h
  6049. PUSH ESP
  6050. PUSH [EBX].TControl.fHandle
  6051. CALL Windows.GetClientRect
  6052. MOV EAX,[ESP].TRect.Right
  6053. MOV [EBX].TControl.fClientRight,EAX
  6054. MOV EAX,[ESP].TRect.Bottom
  6055. MOV [EBX].TControl.fClientBottom,EAX
  6056. PUSH ESP
  6057. PUSH 0
  6058. PUSH TCM_ADJUSTRECT
  6059. PUSH EBX
  6060. CALL TControl.Perform
  6061. POP EAX
  6062. MOV [EBX].TControl.fClientLeft,EAX
  6063. POP EAX
  6064. MOV [EBX].TControl.fClientTop,EAX
  6065. POP EAX
  6066. SUB [EBX].TControl.fClientRight,EAX
  6067. POP EAX
  6068. SUB [EBX].TControl.fClientBottom,EAX
  6069. @@ret_false:
  6070. XOR EAX, EAX
  6071. POP EBX
  6072. {$ENDIF}
  6073. end;
  6074. {$IFDEF ASM_UNICODE}
  6075. function NewTabControl( AParent: PControl; const Tabs: array of KOLString; Options: TTabControlOptions;
  6076. ImgList: PImageList; ImgList1stIdx: Integer ): PControl;
  6077. const lenf=high(TabControlFlags); //+++
  6078. asm //cmd //opd
  6079. PUSH EBX
  6080. PUSH ESI
  6081. PUSH EDI
  6082. XCHG EBX, EAX
  6083. PUSH EDX
  6084. PUSH ECX
  6085. LEA EAX, [Options]
  6086. MOV EDX, offset[TabControlFlags]
  6087. XOR ECX, ECX
  6088. MOV CL, lenf
  6089. CALL MakeFlags
  6090. TEST byte ptr [Options], 4
  6091. JZ @@0
  6092. OR EAX, WS_TABSTOP or TCS_FOCUSONBUTTONDOWN
  6093. @@0: OR EAX, WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_VISIBLE
  6094. XCHG ECX, EAX
  6095. XCHG EAX, EBX
  6096. MOV EDX, offset[WC_TABCONTROL]
  6097. PUSH 1
  6098. PUSH offset[TabControlActions]
  6099. CALL _NewCommonControl
  6100. MOV EBX, EAX
  6101. TEST [Options], 2 shl (tcoBorder - 1)
  6102. JNZ @@borderfixed
  6103. AND [EBX].TControl.fExStyle, not WS_EX_CLIENTEDGE
  6104. @@borderfixed:
  6105. MOV EDX, offset[WndProcTabControl]
  6106. CALL TControl.AttachProc
  6107. ADD [EBX].TControl.fBoundsRect.Right, 100-64
  6108. ADD [EBX].TControl.fBoundsRect.Bottom, 100-64
  6109. MOV ECX, [ImgList]
  6110. JECXZ @@2
  6111. XCHG EAX, ECX
  6112. CALL TImageList.GetHandle
  6113. PUSH EAX
  6114. PUSH 0
  6115. PUSH TCM_SETIMAGELIST
  6116. PUSH EBX
  6117. CALL TControl.Perform
  6118. @@2:
  6119. POP EDI // EDI = High(Tabs)
  6120. POP ESI // ESI = Tabs
  6121. XOR EDX, EDX // EDX := 0 (=I)
  6122. MOV EAX, [ImgList1stIdx] //(=II)
  6123. @@loop:
  6124. CMP EDX, EDI
  6125. JG @@e_loop
  6126. PUSH EAX
  6127. PUSH EDX
  6128. PUSH EAX
  6129. LODSD
  6130. XCHG ECX, EAX
  6131. MOV EAX, EBX
  6132. CALL TControl.TC_Insert
  6133. POP EDX
  6134. POP EAX
  6135. INC EAX
  6136. INC EDX
  6137. JMP @@loop
  6138. @@e_loop:
  6139. MOV byte ptr [EBX].TControl.fLookTabKeys, 1
  6140. XCHG EAX, EBX
  6141. POP EDI
  6142. POP ESI
  6143. POP EBX
  6144. end;
  6145. {$ENDIF}
  6146. {$IFNDEF OLD_ALIGN}
  6147. function NewTabEmpty( AParent: PControl; Options: TTabControlOptions;
  6148. ImgList: PImageList ): PControl;
  6149. const lenf=high(TabControlFlags); //+++
  6150. asm //cmd //opd
  6151. PUSH EBX
  6152. MOV EBX, EAX
  6153. PUSH ECX
  6154. PUSH EDX
  6155. MOV EAX, ESP
  6156. MOV EDX, offset[TabControlFlags]
  6157. XOR ECX, ECX
  6158. MOV CL, lenf
  6159. CALL MakeFlags
  6160. TEST byte ptr [ESP], 4
  6161. JZ @@0
  6162. OR EAX, WS_TABSTOP or TCS_FOCUSONBUTTONDOWN
  6163. @@0: OR EAX, WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_VISIBLE
  6164. XCHG ECX, EAX
  6165. XCHG EAX, EBX
  6166. MOV EDX, offset[WC_TABCONTROL]
  6167. PUSH 1
  6168. PUSH offset[TabControlActions]
  6169. CALL _NewCommonControl
  6170. MOV EBX, EAX
  6171. POP ECX //Options
  6172. TEST ECX, 2 shl (tcoBorder - 1)
  6173. JNZ @@borderfixed
  6174. AND [EBX].TControl.fExStyle, not WS_EX_CLIENTEDGE
  6175. @@borderfixed:
  6176. MOV EDX, offset[WndProcTabControl]
  6177. CALL TControl.AttachProc
  6178. ADD [EBX].TControl.fBoundsRect.Right, 100-64
  6179. ADD [EBX].TControl.fBoundsRect.Bottom, 100-64
  6180. POP ECX //ImgList
  6181. JECXZ @@2
  6182. XCHG EAX, ECX
  6183. CALL TImageList.GetHandle
  6184. PUSH EAX
  6185. PUSH 0
  6186. PUSH TCM_SETIMAGELIST
  6187. PUSH EBX
  6188. CALL TControl.Perform
  6189. @@2:
  6190. MOV byte ptr [EBX].TControl.fLookTabKeys, 1
  6191. XCHG EAX, EBX
  6192. POP EBX
  6193. end;
  6194. {$ENDIF}
  6195. {$IFDEF ASM_UNICODE}
  6196. function NewToolbar( AParent: PControl; Align: TControlAlign; Options: TToolbarOptions;
  6197. Bitmap: HBitmap; const Buttons: array of PKOLChar;
  6198. const BtnImgIdxArray: array of Integer ) : PControl;
  6199. const szTBButton = Sizeof( TTBButton );
  6200. Option3DBorder = 1 shl Ord( tbo3DBorder );
  6201. asm //cmd //opd
  6202. PUSH EDI
  6203. MOVZX EDX, DL
  6204. PUSH EDX // Align
  6205. PUSH EAX // AParent
  6206. XOR EAX, EAX
  6207. TEST CL, Option3DBorder
  6208. SETNZ AL
  6209. PUSH EAX
  6210. PUSH ECX // Options
  6211. MOV AL, ICC_BAR_CLASSES
  6212. CALL DoInitCommonControls
  6213. MOV EAX, ESP
  6214. MOV EDX, offset[ToolbarOptions]
  6215. XOR ECX, ECX
  6216. MOV CL, 6
  6217. CALL MakeFlags
  6218. POP EDX
  6219. PUSH 0
  6220. XCHG ECX, EAX // ECX = MakeFlags(...)
  6221. MOV EDI, ECX
  6222. MOV EAX, [ESP+8] // EAX = AParent
  6223. MOV EDX, [ESP+12] // EDX = Align
  6224. OR ECX, [EDX*4+offset ToolbarAligns]
  6225. OR ECX, WS_CHILD or WS_VISIBLE or TBSTYLE_TOOLTIPS
  6226. MOV EDX, offset[ TOOLBARCLASSNAME ]
  6227. CALL _NewCommonControl
  6228. MOV [EAX].TControl.fCommandActions.aClear, offset[ClearToolbar]
  6229. MOV [EAX].TControl.fCommandActions.aGetCount, TB_BUTTONCOUNT
  6230. INC [EAX].TControl.fIsButton
  6231. INC [EAX].TControl.fIgnoreDefault
  6232. POP EDX // pop AParent
  6233. POP EDX // EDX = Align
  6234. PUSH EDX
  6235. TEST EDX, EDX
  6236. JE @@zero_bounds
  6237. ADD [EAX].TControl.fBoundsRect.Bottom, 26-64
  6238. ADD [EAX].TControl.fBoundsRect.Right, 1000-64
  6239. JMP @@bounds_ready
  6240. @@zero_bounds:
  6241. MOV [EAX].TControl.fBoundsRect.Left, EDX
  6242. MOV [EAX].TControl.fBoundsRect.Top, EDX
  6243. MOV [EAX].TControl.fBoundsRect.Right, EDX
  6244. MOV [EAX].TControl.fBoundsRect.Bottom, EDX
  6245. @@bounds_ready:
  6246. PUSH EBX
  6247. PUSH ESI
  6248. XCHG EBX, EAX
  6249. MOV ESI, offset[TControl.Perform]
  6250. PUSH 0
  6251. PUSH 0
  6252. PUSH TB_GETEXTENDEDSTYLE
  6253. PUSH EBX
  6254. CALL ESI
  6255. OR EAX, TBSTYLE_EX_DRAWDDARROWS
  6256. PUSH EAX
  6257. PUSH 0
  6258. PUSH TB_SETEXTENDEDSTYLE
  6259. PUSH EBX
  6260. CALL ESI
  6261. MOV EDX, offset[WndProcToolbarCtrl]
  6262. MOV EAX, EBX
  6263. CALL TControl.AttachProc
  6264. MOV EDX, offset[WndProcDoEraseBkgnd]
  6265. MOV EAX, EBX
  6266. CALL TControl.AttachProc
  6267. PUSH 0
  6268. PUSH szTBButton
  6269. PUSH TB_BUTTONSTRUCTSIZE
  6270. PUSH EBX
  6271. CALL ESI
  6272. PUSH 0
  6273. PUSH [EBX].TControl.fMargin
  6274. PUSH TB_SETINDENT
  6275. PUSH EBX
  6276. CALL ESI
  6277. MOV EAX, [ESP+8] // Align
  6278. {$IFDEF PARANOIA} DB $2C, 1 {$ELSE} SUB AL, 1 {$ENDIF}
  6279. JL @@bounds_correct
  6280. JE @@corr_right
  6281. {$IFDEF PARANOIA} DB $2C, 2 {$ELSE} SUB AL, 2 {$ENDIF}
  6282. JNE @@corr_bottom
  6283. @@corr_right:
  6284. MOV EDX, [EBX].TControl.fBoundsRect.Left
  6285. ADD EDX, 24
  6286. MOV [EBX].TControl.fBoundsRect.Right, EDX
  6287. JMP @@bounds_correct
  6288. @@corr_bottom:
  6289. MOV EDX, [EBX].TControl.fBoundsRect.Top
  6290. ADD EDX, 22
  6291. MOV [EBX].TControl.fBoundsrect.Bottom, EDX
  6292. @@bounds_correct:
  6293. MOV EDX, [Bitmap]
  6294. TEST EDX, EDX
  6295. JZ @@bitmap_added
  6296. MOV EAX, EBX
  6297. CALL TControl.TBAddBitmap
  6298. @@bitmap_added:
  6299. PUSH dword ptr [BtnImgIdxArray]
  6300. PUSH dword ptr [BtnImgIdxArray-4]
  6301. MOV ECX, [Buttons-4]
  6302. MOV EDX, [Buttons]
  6303. MOV EAX, EBX
  6304. CALL TControl.TBAddButtons
  6305. PUSH 0
  6306. PUSH 0
  6307. PUSH WM_SIZE
  6308. PUSH EBX
  6309. CALL ESI
  6310. // ---
  6311. {+|ecm|}
  6312. // ---
  6313. MOV EDX,EDI
  6314. OR EDX,[EBX].TControl.FStyle
  6315. MOV EAX,EBX
  6316. CALL TControl.SetStyle
  6317. // ---
  6318. {/+|ecm|}
  6319. // ---
  6320. XCHG EAX, EBX
  6321. MOV byte ptr [EAX].TControl.fLookTabKeys, 1 shl tkTab
  6322. POP ESI
  6323. POP EBX
  6324. POP EDX
  6325. POP EDI
  6326. end;
  6327. {$ENDIF ASM_UNICODE}
  6328. {$IFNDEF NOT_USE_RICHEDIT}
  6329. function WndProc_RE_LinkNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  6330. asm
  6331. CMP word ptr [EDX].TMsg.message, WM_NOTIFY
  6332. JNE @@ret_false
  6333. MOV EDX, [EDX].TMsg.lParam
  6334. CMP [EDX].TNMHdr.code, EN_LINK
  6335. JNE @@ret_false
  6336. PUSH EBX
  6337. PUSH EDX
  6338. XCHG EBX, EAX
  6339. XOR EAX, EAX
  6340. MOV [ECX], EAX
  6341. {$IFDEF UNICODE_CTRLS}
  6342. ADD ESP, -2040
  6343. {$ELSE}
  6344. ADD ESP, -1020
  6345. {$ENDIF}
  6346. PUSH EAX
  6347. PUSH ESP
  6348. PUSH [EDX].TENLink.chrg.cpMax
  6349. PUSH [EDX].TENLink.chrg.cpMin
  6350. PUSH ESP
  6351. PUSH 0
  6352. PUSH EM_GETTEXTRANGE
  6353. PUSH EBX
  6354. CALL TControl.Perform
  6355. LEA EAX, [EBX].TControl.fREUrl
  6356. POP EDX
  6357. POP ECX
  6358. DEC EDX
  6359. CMP ECX, EDX
  6360. POP ECX
  6361. MOV EDX, ESP
  6362. JLE @@1
  6363. CMP byte ptr [EDX+1], 0
  6364. JNZ @@1
  6365. // ñèñòåìà âåðíóëà òåêñò êàê unicode
  6366. {$IFDEF UNICODE_CTRLS}
  6367. CALL System.@WStrFromPWChar
  6368. {$ELSE not UNICODE_CTRLS}
  6369. {$IFDEF _D2}
  6370. CALL LStrFromPWChar
  6371. {$ELSE}
  6372. CALL System.@LStrFromPWChar
  6373. {$ENDIF}
  6374. {$ENDIF UNICODE_CTRLS}
  6375. JMP @@2
  6376. @@1:
  6377. // ñèñòåìà âåðíóëà òåêñò êàê îáû÷íóþ ñòðîêó
  6378. {$IFDEF UNICODE_CTRLS}
  6379. CALL System.@WStrFromPChar
  6380. {$ELSE not UNICODE_CTRLS}
  6381. CALL System.@LStrFromPChar
  6382. {$ENDIF UNICODE_CTRLS}
  6383. @@2:
  6384. {$IFDEF UNICODE_CTRLS}
  6385. ADD ESP, 2044
  6386. {$ELSE not UNICODE_CTRLS}
  6387. ADD ESP, 1024
  6388. {$ENDIF UNICODE_CTRLS}
  6389. POP EDX
  6390. MOV ECX, [EDX].TENLink.msg
  6391. LEA EAX, [EBX].TControl.fOnREOverURL
  6392. CMP ECX, WM_MOUSEMOVE
  6393. JE @@Url_event
  6394. LEA EAX, [EBX].TControl.fOnREUrlClick
  6395. CMP ECX, WM_LBUTTONDOWN
  6396. JE @@Url_Event
  6397. CMP ECX, WM_RBUTTONDOWN
  6398. JNE @@after_Url_event
  6399. @@Url_event:
  6400. MOV ECX, [EAX].TMethod.Code
  6401. JECXZ @@after_Url_event
  6402. MOV EDX, EBX
  6403. MOV EAX, [EAX].TMethod.Data
  6404. CALL ECX
  6405. @@after_Url_event:
  6406. POP EBX
  6407. MOV AL, 1
  6408. RET
  6409. @@ret_false:
  6410. XOR EAX, EAX
  6411. end;
  6412. {$IFDEF ASM_UNICODE}
  6413. function NewRichEdit1( AParent: PControl; Options: TEditOptions ): PControl;
  6414. const
  6415. RichNamesCount = High( RichEditLibnames ) + 1;
  6416. asm
  6417. PUSH EDX
  6418. MOV ECX, [FRichEditModule]
  6419. INC ECX
  6420. LOOP @@loaded
  6421. PUSHAD
  6422. {$IFNDEF SMALLEST_CODE}
  6423. {$IFNDEF SMALLER_CODE}
  6424. PUSH SEM_NOOPENFILEERRORBOX or SEM_FAILCRITICALERRORS
  6425. CALL SetErrorMode
  6426. PUSH EAX
  6427. {$ENDIF}
  6428. {$ENDIF}
  6429. @@search_richedit:
  6430. MOV BX, RichNamesCount + $400
  6431. LEA ESI, [RichEditLibNames]
  6432. LEA EDI, [RichEditClasses]
  6433. CMP [RichEditIdx], 0
  6434. JZ @@loo
  6435. LEA ESI, [ESI+(RichNamesCount-1)*4]
  6436. LEA EDI, [EDI+(RichNamesCount-1)*4]
  6437. NEG BH
  6438. @@loo:
  6439. MOV ECX, [EDI]
  6440. MOV [RichEditClass], ECX
  6441. MOVSX ECX, BH
  6442. ADD EDI, ECX
  6443. MOV EAX, [ESI]
  6444. ADD ESI, ECX
  6445. PUSH EAX
  6446. CALL LoadLibrary
  6447. CMP EAX, HINSTANCE_ERROR
  6448. JG @@break
  6449. DEC BL
  6450. JNZ @@loo
  6451. JMP @@fault
  6452. @@break:
  6453. MOV [FRichEditModule], EAX
  6454. @@fault:
  6455. {$IFNDEF SMALLEST_CODE}
  6456. {$IFNDEF SMALLER_CODE}
  6457. CALL SetErrorMode
  6458. {$ENDIF}
  6459. {$ENDIF}
  6460. POPAD
  6461. @@loaded:
  6462. PUSH EAX
  6463. PUSH EDX
  6464. MOV EAX, ESP
  6465. MOV EDX, offset[RichEditFlags]
  6466. XOR ECX, ECX
  6467. MOV CL, 10
  6468. CALL MakeFlags
  6469. XCHG ECX, EAX
  6470. POP EDX
  6471. POP EAX
  6472. PUSH 1
  6473. PUSH offset[RichEditActions]
  6474. MOV EDX, [RichEditClass]
  6475. OR ECX, WS_VISIBLE or WS_CHILD or WS_TABSTOP or WS_BORDER or ES_MULTILINE
  6476. CALL _NewCommonControl
  6477. INC [EAX].TControl.fIgnoreDefault
  6478. POP EDX
  6479. TEST DH, 4 // is eoWantTab in Options ?
  6480. SETZ DL
  6481. MOV [EAX].TControl.fLookTabKeys, DL
  6482. PUSH EBX
  6483. MOV EBX, EAX
  6484. MOV EDX, offset[WndProcRichEditNotify]
  6485. CALL TControl.AttachProc
  6486. MOV [EBX].TControl.fDoubleBuffered, 0
  6487. INC [EBX].TControl.fCannotDoubleBuf
  6488. ADD [EBX].TControl.fBoundsRect.Right, 100-64
  6489. ADD [EBX].TControl.fBoundsRect.Bottom, 200-64
  6490. PUSH ENM_CHANGE or ENM_SELCHANGE or ENM_REQUESTRESIZE or ENM_PROTECTED or $04000000
  6491. PUSH 0
  6492. PUSH EM_SETEVENTMASK
  6493. PUSH EBX
  6494. CALL TControl.Perform
  6495. MOV EAX, clWindow
  6496. MOV [EBX].TControl.fColor, EAX
  6497. CALL Color2RGB
  6498. PUSH EAX
  6499. PUSH 0
  6500. PUSH EM_SETBKGNDCOLOR
  6501. PUSH EBX
  6502. CALL TControl.Perform
  6503. {$IFDEF RICHEDIT_XPBORDER}
  6504. MOV EDX, offset[WndProc_RichEditXPBorder]
  6505. MOV EAX, EBX
  6506. CALL TControl.AttachProc
  6507. {$ENDIF RICHEDIT_XPBORDER}
  6508. XCHG EAX, EBX
  6509. POP EBX
  6510. end;
  6511. {$ENDIF ASM_UNICODE}
  6512. {$ENDIF NOT_USE_RICHEDIT}
  6513. function OleInit: Boolean;
  6514. asm
  6515. MOV ECX, [OleInitCount]
  6516. INC ECX
  6517. LOOP @@init1
  6518. PUSH ECX
  6519. CALL OleInitialize
  6520. TEST EAX, EAX
  6521. MOV AL, 0
  6522. JNZ @@exit
  6523. @@init1:
  6524. INC [OleInitCount]
  6525. MOV AL, 1
  6526. @@exit:
  6527. end;
  6528. procedure OleUnInit;
  6529. asm
  6530. MOV ECX, [OleInitCount]
  6531. JECXZ @@exit
  6532. DEC [OleInitCount]
  6533. JNZ @@exit
  6534. CALL OleUninitialize
  6535. @@exit:
  6536. end;
  6537. procedure TControl.Init;
  6538. const
  6539. IniStyle = WS_VISIBLE or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or
  6540. WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or
  6541. WS_BORDER or WS_THICKFRAME;
  6542. asm //cmd //opd
  6543. PUSH EBX
  6544. PUSH EDI
  6545. MOV EBX, EAX
  6546. {$IFDEF _D2orD3}
  6547. CALL TObj.Init // for now, TObj.Init do nothing for Delphi 4 and higher
  6548. {$ENDIF}
  6549. {$IFDEF USE_GRAPHCTLS}
  6550. MOV [EBX].fDoInvalidate.TMethod.Code, offset[TControl.InvalidateWindowed]
  6551. MOV [EBX].fDoInvalidate.TMethod.Data, EBX
  6552. {$ENDIF}
  6553. MOV EAX, offset WndProcDummy
  6554. LEA EDI, [EBX].fPass2DefProc
  6555. STOSD // fPass2DefProc := WndProcDummy
  6556. STOSD // fOnDynHandlers := WndProcDummy
  6557. STOSD // fWndProcKeybd := WndProcDummy
  6558. STOSD // fControlClick := WndProcDummy - similar to DefWindowProc
  6559. STOSD // fAutoSize := WndProcDummy - similar to DefWindowProc
  6560. LEA EDI, [EBX].fWndProcResizeFlicks
  6561. STOSD
  6562. MOV [EBX].fWndFunc, offset WndFunc
  6563. MOV EDX, offset ClearText
  6564. MOV [EBX].fCommandActions.aClear, EDX
  6565. INC [EBX].fWindowed
  6566. MOV [EBX].fColor, clBtnFace
  6567. MOV [EBX].fTextColor, clWindowText and $FF
  6568. MOV byte ptr [EBX].fMargin, 2
  6569. INC dword ptr [EBX].fCtl3Dchild
  6570. {$IFDEF SMALLEST_CODE}
  6571. {$ELSE}
  6572. INC dword ptr [EBX].fCtl3D // anyway assigned in _NewWindowed
  6573. DEC byte ptr [EBX].fAlphaBlend // has no effect until AlphaBlend changed
  6574. {$ENDIF}
  6575. MOV byte ptr[EBX].fClsStyle, CS_OWNDC
  6576. MOV [EBX].fStyle, IniStyle
  6577. INC dword ptr[EBX].fExStyle+2
  6578. DEC WORD PTR [EBX].fEnabled
  6579. LEA EDI, [EBX].fDynHandlers
  6580. MOV EBX, offset[NewList]
  6581. CALL EBX
  6582. STOSD
  6583. CALL EBX
  6584. STOSD
  6585. POP EDI
  6586. POP EBX
  6587. end;
  6588. procedure CallTControlInit( Ctl: PControl );
  6589. begin
  6590. Ctl.Init;
  6591. end;
  6592. //[END CallTControlInit]
  6593. //[procedure TControl.InitParented]
  6594. procedure TControl.InitParented( AParent: PControl );
  6595. const IStyle = WS_VISIBLE or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or
  6596. WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or
  6597. WS_BORDER or WS_THICKFRAME;
  6598. IExStyle = WS_EX_CONTROLPARENT;
  6599. IClsStyle = CS_OWNDC;
  6600. int_IDC_ARROW = integer( IDC_ARROW );
  6601. asm
  6602. PUSH EAX
  6603. PUSH EDX
  6604. //CALL CallTControlInit
  6605. mov EDX, [EAX]
  6606. call dword ptr [EDX]
  6607. POP EDX
  6608. POP EAX
  6609. TEST EDX, EDX
  6610. JZ @@0
  6611. MOV ECX, [EDX].fColor
  6612. MOV [EAX].fColor, ECX
  6613. @@0:
  6614. CALL SetParent
  6615. end;
  6616. destructor TControl.Destroy;
  6617. asm
  6618. PUSH EBX
  6619. PUSH ESI
  6620. MOV EBX, EAX
  6621. CALL TControl.ParentForm
  6622. XCHG ECX, EAX
  6623. JECXZ @@cur_ctl_removed
  6624. MOV EDX, EBX
  6625. XOR EDX, [ECX].TControl.fCurrentControl
  6626. JNE @@cur_ctl_removed
  6627. MOV [ECX].TControl.fCurrentControl, EDX
  6628. @@cur_ctl_removed:
  6629. MOV ECX, [EBX].fHandle
  6630. JECXZ @@wndhidden
  6631. PUSH SW_HIDE
  6632. PUSH ECX
  6633. CALL ShowWindow
  6634. @@wndhidden:
  6635. MOV EAX, EBX
  6636. CALL Final
  6637. {$IFDEF USE_AUTOFREE4CHILDREN}
  6638. {$ELSE}
  6639. MOV EAX, EBX
  6640. CALL DestroyChildren
  6641. {$ENDIF}
  6642. XOR ECX, ECX
  6643. CMP [EBX].fDestroying, CL
  6644. JNZ @@destroyed
  6645. INC [EBX].fDestroying
  6646. {$IFDEF USE_AUTOFREE4CONTROLS}
  6647. XOR EAX, EAX
  6648. XCHG EAX, [EBX].fCanvas
  6649. CALL TObj.RefDec
  6650. {$ELSE}
  6651. PUSH EBX
  6652. LEA ESI, [EBX].fFont
  6653. MOV BL, 3
  6654. @@free_font_brush_canvas:
  6655. XOR ECX, ECX
  6656. XCHG ECX, [ESI]
  6657. LODSD
  6658. XCHG EAX, ECX
  6659. CALL TObj.RefDec
  6660. DEC BL
  6661. JNZ @@free_font_brush_canvas
  6662. POP EBX
  6663. {$ENDIF}
  6664. MOV EAX, [EBX].fCustomObj
  6665. CALL TObj.RefDec
  6666. MOV EAX, [EBX].fHandle
  6667. TEST EAX, EAX
  6668. JZ @@free_fields
  6669. {$IFNDEF USE_AUTOFREE4CONTROLS}
  6670. {$IFNDEF NEW_MENU_ACCELL}
  6671. XOR ECX, ECX
  6672. XCHG ECX, [EBX].fAccelTable
  6673. JECXZ @@accelTable_destroyed
  6674. PUSH ECX
  6675. CALL DestroyAcceleratorTable
  6676. @@accelTable_destroyed:
  6677. {$ENDIF}
  6678. MOV EAX, [EBX].fMenuObj
  6679. CALL TObj.RefDec
  6680. @@destroy_img_list:
  6681. XOR EAX, EAX
  6682. XCHG EAX, [EBX].fImageList
  6683. TEST EAX, EAX
  6684. JZ @@img_list_destroyed
  6685. CALL TObj.RefDec
  6686. JMP @@destroy_img_list
  6687. @@img_list_destroyed:
  6688. {$ENDIF}
  6689. MOV ECX, [EBX].fIcon
  6690. JECXZ @@icoremoved
  6691. INC ECX
  6692. JZ @@icoremoved
  6693. CMP [EBX].fIconShared, 0
  6694. JNZ @@icoremoved
  6695. DEC ECX
  6696. PUSH ECX
  6697. CALL DestroyIcon
  6698. @@icoremoved:
  6699. PUSH [EBX].fHandle
  6700. CALL IsWindow
  6701. TEST EAX, EAX
  6702. JZ @@destroy2
  6703. {$IFDEF USE_PROP}
  6704. PUSH offset[ID_SELF] //* Remarked By M.Gerasimov
  6705. PUSH [EBX].fHandle //* unremarked to prevent problems with progress bar
  6706. CALL RemoveProp
  6707. {$ELSE}
  6708. PUSH 0
  6709. PUSH GWL_USERDATA
  6710. PUSH [EBX].fHandle
  6711. CALL SetWindowLong
  6712. {$ENDIF}
  6713. CMP [EBX].fNCDestroyed, 0
  6714. JNZ @@destroy2
  6715. //CMP [EBX].fIsForm, 0
  6716. //JZ @@destroy2
  6717. PUSH [EBX].fHandle
  6718. CALL DestroyWindow
  6719. @@destroy2:
  6720. XOR EAX, EAX
  6721. MOV [EBX].fHandle, EAX
  6722. @@free_fields:
  6723. PUSH 0
  6724. MOVZX ECX, [EBX].fCtlClsNameChg
  6725. JECXZ @@notFreeCtlClsName
  6726. PUSH [EBX].fControlClassName
  6727. @@notFreeCtlClsName:
  6728. LEA ESI, [EBX].fCustomData
  6729. MOV DL, 2
  6730. @@chkFreeLoop:
  6731. LODSD
  6732. XCHG ECX, EAX
  6733. JECXZ @@notFree1
  6734. PUSH ECX
  6735. @@notFree1:
  6736. DEC DL
  6737. JNZ @@chkFreeLoop
  6738. @@FreeFieldsLoop:
  6739. POP ECX
  6740. JECXZ @@endFreeFieldsLoop
  6741. XCHG EAX, ECX
  6742. CALL System.@FreeMem
  6743. JMP @@FreeFieldsLoop
  6744. @@endFreeFieldsLoop:
  6745. XOR ECX, ECX
  6746. XCHG ECX, [EBX].fTmpBrush
  6747. JECXZ @@tmpBrush_deleted
  6748. PUSH ECX
  6749. CALL DeleteObject
  6750. @@tmpBrush_deleted:
  6751. MOV ECX, [EBX].fParent
  6752. JECXZ @@removed_from_parent
  6753. CMP [ECX].fCurrentControl, EBX
  6754. JNE @@removefromParent
  6755. XOR EAX, EAX
  6756. MOV [ECX].fCurrentControl, EAX
  6757. @@removefromParent:
  6758. {$IFDEF USE_AUTOFREE4CHILDREN}
  6759. PUSH ECX
  6760. {$ENDIF}
  6761. MOV EAX, [ECX].fChildren
  6762. MOV EDX, EBX
  6763. CALL TList.Remove
  6764. {$IFDEF USE_AUTOFREE4CHILDREN}
  6765. POP EAX
  6766. MOV EDX, EBX
  6767. CALL TControl.RemoveFromAutoFree
  6768. {$ENDIF}
  6769. @@removed_from_parent:
  6770. {$IFDEF USE_AUTOFREE4CONTROLS}
  6771. LEA ESI, [EBX].fDynHandlers
  6772. LODSD
  6773. CALL TObj.RefDec
  6774. LODSD // fChildren
  6775. CALL TObj.RefDec
  6776. {$ELSE}
  6777. PUSH EBX
  6778. LEA ESI, [EBX].fDynHandlers
  6779. MOV BL, 5
  6780. @@freeloo:
  6781. LODSD
  6782. CALL TObj.RefDec
  6783. DEC BL
  6784. JNZ @@freeloo
  6785. POP EBX
  6786. {$ENDIF}
  6787. LEA EAX, [EBX].fCaption
  6788. {$IFDEF UNICODE_CTRLS}
  6789. CALL System.@WStrClr
  6790. {$ELSE}
  6791. CALL System.@LStrClr
  6792. {$ENDIF}
  6793. XCHG EAX, EBX
  6794. CALL TObj.Destroy
  6795. @@destroyed:
  6796. POP ESI
  6797. POP EBX
  6798. end;
  6799. procedure TControl.SetEnabled( Value: Boolean );
  6800. asm
  6801. PUSH EBX
  6802. MOV EBX, EAX
  6803. MOVZX EDX, DL
  6804. PUSH EDX
  6805. CALL GetEnabled
  6806. POP EDX
  6807. CMP AL, DL
  6808. JZ @@exit
  6809. MOV [EBX].fEnabled, DL
  6810. TEST EDX, EDX
  6811. JNZ @@andnot
  6812. OR byte ptr [EBX].fStyle + 3, 8
  6813. JMP @@1
  6814. @@andnot:
  6815. AND byte ptr [EBX].fStyle + 3, $F7
  6816. @@1:
  6817. MOV ECX, [EBX].fHandle
  6818. JECXZ @@2
  6819. PUSH EDX
  6820. PUSH ECX
  6821. CALL EnableWindow
  6822. @@2:
  6823. XCHG EAX, EBX
  6824. CALL Invalidate
  6825. @@exit:
  6826. POP EBX
  6827. end;
  6828. function TControl.GetParentWindow: HWnd;
  6829. asm
  6830. MOV EAX, [EAX].fParent
  6831. TEST EAX, EAX
  6832. JNZ TControl.GetWindowHandle
  6833. end;
  6834. {$IFDEF ASM_UNICODE}
  6835. function TControl.GetWindowHandle: HWnd;
  6836. asm
  6837. MOV ECX, [EAX].fHandle
  6838. JECXZ @@1
  6839. XCHG EAX, ECX
  6840. RET
  6841. @@1:
  6842. PUSH EBX
  6843. MOV EBX, EAX
  6844. CMP [EBX].fCreateVisible, 0
  6845. JNZ @@2
  6846. XOR EDX, EDX
  6847. CALL TControl.Set_Visible
  6848. MOV EAX, EBX
  6849. CALL CallTControlCreateWindow
  6850. { This is a call to Pascal piece of code, which
  6851. calls virtual method TControl.CreateWindow }
  6852. INC [EBX].fCreateHidden
  6853. JMP @@0
  6854. @@2: CALL CallTControlCreateWindow
  6855. @@0: MOV EAX, [EBX].fHandle
  6856. POP EBX
  6857. end;
  6858. {$ENDIF ASM_UNICODE}
  6859. {$IFDEF ASM_UNICODE}
  6860. function TControl.CreateWindow: Boolean;
  6861. const
  6862. CS_OFF = CS_OWNDC or CS_CLASSDC or CS_PARENTDC or CS_GLOBALCLASS;
  6863. CS_ON = 0; //CS_VREDRAW or CS_HREDRAW;
  6864. szWndClass = sizeof( TWndClass );
  6865. int_IDC_ARROW = integer( IDC_ARROW );
  6866. asm
  6867. PUSH EBX
  6868. XCHG EBX, EAX
  6869. {$IFDEF DEBUG_CREATEWINDOW}
  6870. MOV EAX, EBX
  6871. CALL Debug_CreateWindow1
  6872. {$ENDIF}
  6873. MOV ECX, [EBX].fParent
  6874. JECXZ @@chk_handle
  6875. XCHG EAX, ECX
  6876. CALL GetWindowHandle
  6877. TEST EAX, EAX
  6878. JZ @@ret_0
  6879. @@chk_handle:
  6880. MOV ECX, [EBX].fHandle
  6881. JECXZ @@prepare_Params
  6882. MOV DL, 0
  6883. MOV EAX, EBX
  6884. CMP [EBX].fCreateHidden, DL
  6885. JZ @@create_children
  6886. CALL CreateChildWindows
  6887. MOV EAX, EBX
  6888. MOV DL, 1
  6889. CALL Set_Visible
  6890. MOV [EBX].fCreateHidden, 0
  6891. JMP @@ret_true
  6892. @@create_children:
  6893. CALL CreateChildWindows
  6894. @@ret_true:
  6895. MOV AL, 1
  6896. @@ret_0:
  6897. POP EBX
  6898. RET
  6899. @@prepare_params:
  6900. {$IFDEF USE_GRAPHCTLS}
  6901. MOV AL, [EBX].fWindowed
  6902. CMP AL, 0
  6903. JZ @@ret_0
  6904. {$ENDIF}
  6905. PUSH EBP
  6906. MOV EBP, ESP
  6907. PUSH ECX // Params.WindowClass.lpszClassName := nil
  6908. PUSH ECX // Params.WindowClass.lpszMenuName := nil
  6909. PUSH ECX // Params.WindowClass.hbrBackground := 0
  6910. PUSH int_IDC_ARROW
  6911. PUSH ECX
  6912. CALL LoadCursor
  6913. PUSH EAX // Params.WindowClass.hCursor := LoadCursor( 0, IDC_ARROW )
  6914. XOR ECX, ECX
  6915. PUSH ECX // Params.WindowClass.hIcon := 0
  6916. PUSH [hInstance]// Params.WindowClass.hInstance := hInstance
  6917. PUSH ECX // Params.WindowClass.cbWndExtra := 0
  6918. PUSH ECX // Params.WindowClass.cbClsExtra := 0
  6919. PUSH [EBX].fDefWndProc // Params.WindowClass.lpfnWndProc := fDefWndProc
  6920. PUSH [EBX].fClsStyle // Params.WindowClass.style := fStyle
  6921. ADD ESP, -64
  6922. PUSH ECX
  6923. MOV EAX, EBX
  6924. MOV EDX, ESP
  6925. CALL get_ClassName
  6926. POP EDX
  6927. MOV EAX, ESP
  6928. PUSH EDX
  6929. //CALL StrPCopy // StrPCopy( Params.WinClsNamBuf, ClassName )
  6930. CALL StrCopy
  6931. CALL RemoveStr
  6932. PUSH 0 // Params.Param := nil
  6933. PUSH [hInstance] // Params.Inst := hInstance
  6934. PUSH [EBX].fMenu // Params.Menu := fMenu
  6935. MOV DL, 1
  6936. MOV EAX, EBX
  6937. CALL GetParentWnd
  6938. PUSH EAX // Params.WndParent := GetParentWnd( True )
  6939. MOV ECX, CW_USEDEFAULT
  6940. MOV EAX, [EBX].fBoundsRect.Bottom
  6941. MOV EDX, [EBX].fBoundsRect.Top
  6942. SUB EAX, EDX
  6943. JNZ @@1
  6944. MOV EAX, ECX
  6945. @@1: PUSH EAX // Params.Height := Height | CW_UseDefault
  6946. MOV EAX, [EBX].fBoundsRect.Right
  6947. SUB EAX, [EBX].fBoundsRect.Left
  6948. {$IFDEF USE_CMOV}
  6949. CMOVZ EAX, ECX
  6950. {$ELSE}
  6951. JNZ @@2
  6952. MOV EAX, ECX
  6953. @@2: {$ENDIF}
  6954. PUSH EAX // Params.Width := Width | CW_UseDefault
  6955. MOV EAX, [EBX].fBoundsRect.Left
  6956. CMP [EBX].fIsControl, CL
  6957. JNZ @@3
  6958. TEST byte ptr [EBX].fChangedPosSz, 3
  6959. JNZ @@3
  6960. MOV EDX, ECX
  6961. XCHG EAX, ECX
  6962. @@3: PUSH EDX // Params.Y := Top | CW_UseDefault
  6963. PUSH EAX // Params.X := Left | CW_UseDefault
  6964. PUSH [EBX].fStyle // Params.Style := fStyle
  6965. PUSH [EBX].fCaption // Params.Caption := fCaption
  6966. LEA EAX, [ESP+40]
  6967. PUSH EAX // Params.WinClassName := @Params.WinClsNamBuf
  6968. PUSH [EBX].fExStyle // Params.ExStyle := fExStyle
  6969. MOV ECX, [EBX].fControlClassName
  6970. JECXZ @@registerClass
  6971. LEA EAX, [ESP].TCreateWndParams.WindowClass
  6972. PUSH EAX // @Params.WindowClass
  6973. PUSH ECX // fControlClassName
  6974. PUSH [hInstance] // hInstance
  6975. CALL GetClassInfo
  6976. MOV EAX, [ESP].TCreateWndParams.Inst
  6977. MOV [ESP].TCreateWndParams.WindowClass.hInstance, EAX
  6978. AND [ESP].TCreateWndParams.WindowClass.style, not CS_OFF
  6979. @@registerClass:
  6980. CMP [EBX].fDefWndProc, 0
  6981. JNE @@fDefWndProc_ready
  6982. MOV EAX, [ESP].TCreateWndParams.WindowClass.lpfnWndProc
  6983. MOV [EBX].fDefWndProc, EAX
  6984. @@fDefWndProc_ready:
  6985. MOV ECX, [ESP].TCreateWndParams.WndParent
  6986. INC ECX
  6987. LOOP @@registerClass1
  6988. TEST byte ptr [ESP].TCreateWndParams.Style+3, $40
  6989. XCHG EAX, ECX
  6990. JNZ @@fin
  6991. @@registerClass1:
  6992. MOV EAX, [ESP].TCreateWndParams.WinClassName
  6993. MOV EDX, [ESP].TCreateWndParams.WindowClass.hInstance
  6994. ADD ESP, -szWndClass
  6995. PUSH ESP
  6996. PUSH EAX
  6997. PUSH EDX
  6998. CALL GetClassInfo
  6999. ADD ESP, szWndClass
  7000. TEST EAX, EAX
  7001. JNZ @@registered
  7002. MOV EAX, [ESP].TCreateWndParams.WinClassName
  7003. MOV [ESP].TCreateWndParams.WindowClass.lpszClassName, EAX
  7004. MOV [ESP].TCreateWndParams.WindowClass.lpfnWndProc, offset WndFunc
  7005. LEA EAX, [ESP].TCreateWndParams.WindowClass
  7006. PUSH EAX
  7007. CALL RegisterClass
  7008. TEST EAX, EAX
  7009. JZ @@fin
  7010. @@registered:
  7011. MOV [CreatingWindow], EBX
  7012. {$IFDEF DEBUG_CREATEWINDOW}
  7013. MOV EAX, EBX
  7014. MOV EDX, ESP
  7015. CALL Debug_CreateWindow2
  7016. {$ENDIF}
  7017. CALL CreateWindowEx
  7018. MOV [EBX].fHandle, EAX
  7019. TEST EAX, EAX
  7020. JZ @@fin
  7021. PUSH EAX
  7022. {$IFDEF USE_PROP}
  7023. PUSH offset ID_SELF
  7024. {$ELSE}
  7025. PUSH GWL_USERDATA
  7026. {$ENDIF}
  7027. PUSH EAX
  7028. PUSH 0
  7029. PUSH $10002 //UIS_CLEAR or (UISF_HIDEFOCUS shl 16)
  7030. PUSH $0128 //WM_UPDATEUISTATE
  7031. PUSH EAX
  7032. CALL SendMessage
  7033. {$IFDEF USE_PROP}
  7034. CALL GetProp
  7035. {$ELSE}
  7036. CALL GetWindowLong
  7037. {$ENDIF}
  7038. XCHG ECX, EAX
  7039. POP EAX
  7040. INC ECX
  7041. LOOP @@propSet
  7042. MOV [CreatingWindow], ECX
  7043. PUSH EBX
  7044. {$IFDEF USE_PROP}
  7045. PUSH offset ID_SELF
  7046. PUSH EAX
  7047. CALL SetProp
  7048. {$ELSE}
  7049. PUSH GWL_USERDATA
  7050. PUSH EAX
  7051. CALL SetWindowLong
  7052. {$ENDIF}
  7053. @@propSet:
  7054. {$IFDEF SMALLEST_CODE}
  7055. {$ELSE}
  7056. CMP [EBX].fIsControl, 0
  7057. JNZ @@iconSet
  7058. MOV EAX, EBX
  7059. CALL GetIcon
  7060. PUSH EAX
  7061. PUSH 1
  7062. PUSH WM_SETICON
  7063. PUSH EBX
  7064. CALL Perform
  7065. @@iconSet:
  7066. {$ENDIF}
  7067. MOV ECX, [EBX].fCreateWndExt
  7068. JECXZ @@dblbufcreate
  7069. MOV EAX, EBX
  7070. CALL ECX
  7071. @@dblbufcreate:
  7072. @@applyfont:
  7073. MOV EAX, EBX
  7074. CALL ApplyFont2Wnd
  7075. MOV EAX, EBX
  7076. CALL ApplyFont2Wnd
  7077. XCHG EAX, EBX
  7078. CALL CreateChildWindows
  7079. MOV AL, 1
  7080. @@fin:
  7081. MOV ESP, EBP
  7082. POP EBP
  7083. @@ret_false:
  7084. POP EBX
  7085. end;
  7086. {$ENDIF ASM_UNICODE}
  7087. function WndProcMouse(Self_: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
  7088. asm
  7089. PUSH EBX
  7090. PUSH ESI
  7091. XCHG EBX, EAX
  7092. XOR ECX, ECX // Rslt not used. ECX <= Result = 0
  7093. MOV EAX, [EDX].TMsg.message
  7094. SUB AH, WM_MOUSEFIRST shr 8
  7095. CMP EAX, $20A - WM_MOUSEFIRST //WM_MOUSELAST - WM_MOUSEFIRST
  7096. JA @@exit
  7097. PUSH dword ptr [EDX].TMsg.lParam // prepare X, Y
  7098. PUSHAD
  7099. PUSH VK_MENU
  7100. CALL GetKeyState
  7101. ADD EAX, EAX
  7102. POPAD
  7103. XCHG EAX, EDX
  7104. MOV EAX, [EAX].TMsg.wParam
  7105. JNC @@noset_MKALT
  7106. {$IFDEF PARANOIA} DB $0C, MK_ALT {$ELSE} OR AL, MK_ALT {$ENDIF}
  7107. @@noset_MKALT:
  7108. PUSH EAX // prepare Shift
  7109. LEA ESI, [EBX].TControl.fOnMouseDown
  7110. CALL dword ptr [EDX*4 + @@jump_table]
  7111. @@call_evnt:
  7112. PUSH ECX // prepare Button, StopHandling
  7113. MOV ECX, ESP // ECX = @MouseData
  7114. CMP word ptr [ESI].TMethod.Code+2, 0
  7115. JZ @@after_call
  7116. MOV EDX, EBX // EDX = Self_
  7117. MOV EAX, [ESI].TMethod.Data // EAX = Target_
  7118. CALL dword ptr [ESI].TMethod.Code
  7119. @@after_call:
  7120. POP ECX
  7121. POP EDX
  7122. POP EDX
  7123. MOV CL, CH // Result := StopHandling
  7124. @@exit:
  7125. XCHG EAX, ECX
  7126. POP ESI
  7127. POP EBX
  7128. RET
  7129. @@jump_table:
  7130. DD Offset[@@MMove],Offset[@@LDown],Offset[@@LUp],Offset[@@LDblClk]
  7131. DD Offset[@@RDown],Offset[@@RUp],Offset[@@RDblClk]
  7132. DD Offset[@@MDown],Offset[@@MUp],Offset[@@MDblClk],Offset[@@MWheel]
  7133. @@MDown: INC ECX
  7134. @@RDown: INC ECX
  7135. @@LDown: INC ECX
  7136. RET
  7137. @@MUp: INC ECX
  7138. @@RUp: INC ECX
  7139. @@LUp: INC ECX
  7140. LODSD
  7141. LODSD
  7142. RET
  7143. @@MMove: LEA ESI, [EBX].TControl.fOnMouseMove
  7144. RET
  7145. @@MDblClk: INC ECX
  7146. @@RDblClk: INC ECX
  7147. @@LDblClk: INC ECX
  7148. LEA ESI, [EBX].TControl.fOnMouseDblClk
  7149. RET
  7150. @@MWheel:LEA ESI, [EBX].TControl.fOnMouseWheel
  7151. end;
  7152. {$IFDEF ASM_UNICODE}
  7153. function WndProcKeybd( Self_: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
  7154. asm
  7155. PUSH EBX
  7156. MOV ECX, [EDX].TMsg.message
  7157. SUB CX, $100
  7158. CMP ECX, 5
  7159. JA @@fin_false
  7160. XCHG EBX, EAX // EBX = @Self
  7161. XCHG EAX, ECX // EAX = message - WM_KEYFIRST
  7162. LEA ECX, [EBX].TControl.fOnKeyUp
  7163. JZ @@event
  7164. {$IFDEF PARANOIA} DB $34, 1 {$ELSE} XOR AL, 1 {$ENDIF}
  7165. JZ @@event
  7166. LEA ECX, [EBX].TControl.fOnKeyDown
  7167. {$IFDEF PARANOIA} DB $34, 1 {$ELSE} XOR AL, 1 {$ENDIF}
  7168. JZ @@event
  7169. {$IFDEF PARANOIA} DB $34, 4 {$ELSE} XOR AL, 4 {$ENDIF}
  7170. JZ @@event
  7171. LEA ECX, [EBX].TControl.fOnChar
  7172. {$IFDEF PARANOIA} DB $34, 6 {$ELSE} XOR AL, 2 xor 4 {$ENDIF}
  7173. JZ @@event
  7174. {$IFDEF PARANOIA} DB $34, 4 {$ELSE} XOR AL, 6 xor 2 {$ENDIF}
  7175. JNZ @@fin_false
  7176. @@event:
  7177. CMP word ptr [ECX].TMethod.Code+2, 0
  7178. JZ @@fin_false
  7179. PUSH EDX
  7180. PUSH ECX
  7181. LEA ECX, [EDX].TMsg.wParam
  7182. PUSH ECX
  7183. CALL GetShiftState
  7184. POP ECX // @wParam
  7185. XCHG EAX, [ESP] // ShiftState; EAX=@event
  7186. MOV EDX, EBX // @Self
  7187. MOV EBX, [EAX].TMethod.Code
  7188. MOV EAX, [EAX].TMethod.Data
  7189. CALL EBX
  7190. POP EDX
  7191. MOV ECX, [EDX].TMsg.wParam
  7192. JECXZ @@fin_true
  7193. @@fin_false:
  7194. XOR EAX, EAX
  7195. POP EBX
  7196. RET
  7197. @@fin_true:
  7198. MOV AL, 1
  7199. POP EBX
  7200. end;
  7201. {$ENDIF ASM_UNICODE}
  7202. {$IFNDEF USE_GRAPHCTLS}
  7203. {$IFNDEF NEW_MODAL}
  7204. function TControl.WndProc( var Msg: TMsg ): Integer;
  7205. asm //cmd //opd
  7206. PUSH EBX
  7207. PUSH ESI
  7208. PUSH EDI
  7209. XCHG ESI, EAX
  7210. MOV EDI, EDX
  7211. XOR EAX, EAX
  7212. CMP EAX, [EDX].TMsg.hWnd
  7213. JE @@1
  7214. CMP EAX, [ESI].TControl.fHandle
  7215. JNE @@1
  7216. {$IFDEF USE_GRAPHCTLS}
  7217. CMP [ESI].TControl.fWindowed, AL
  7218. JNE @@1
  7219. {$ENDIF}
  7220. MOV EAX, [EDX].TMsg.hWnd
  7221. MOV [ESI].TControl.fHandle, EAX
  7222. @@1:
  7223. XOR eax, eax
  7224. CMP [AppletRunning], 0
  7225. JZ @@dyn2
  7226. MOV ECX, [Applet]
  7227. JECXZ @@dyn2
  7228. CMP ECX, ESI
  7229. JE @@dyn2
  7230. CALL @@onmess
  7231. @@dyn2: MOV ECX, ESI
  7232. CALL @@onmess
  7233. MOV EBX, [ESI].TControl.fOnDynHandlers
  7234. MOV EAX, ESI
  7235. CALL @@callonmes
  7236. @@flicksproc:
  7237. MOV EAX, ESI
  7238. MOV EDX, EDI
  7239. PUSH 0
  7240. MOV ECX, ESP
  7241. CALL dword ptr [ESI].TControl.fWndProcResizeFlicks
  7242. TEST AL, AL
  7243. POP EAX
  7244. JNZ @@pass2defproc
  7245. MOVZX EAX, word ptr [EDI].TMsg.message
  7246. CMP EAX, WM_CLOSE
  7247. JNZ @@chk_WM_DESTROY
  7248. CMP ESI, [Applet]
  7249. JZ @@postquit
  7250. MOV EAX, ESI
  7251. CALL IsMainWindow
  7252. TEST AL, AL
  7253. JZ @@calldef
  7254. @@postquit:
  7255. PUSH 0
  7256. CALL PostQuitMessage
  7257. JMP @@calldef
  7258. //********************************************************** Added By M.Gerasimov
  7259. @@chk_WM_DESTROY:
  7260. CMP AX, WM_DESTROY
  7261. JNE @@chk_WM_NCDESTROY
  7262. MOV [ESI].TControl.fBeginDestroying, AL
  7263. JMP @@calldef
  7264. //**********************************************************
  7265. @@chk_WM_NCDESTROY:
  7266. //CMP word ptr [EDI].TMsg.message, WM_NCDESTROY
  7267. CMP AX, WM_NCDESTROY
  7268. JNE @@chk_WM_SIZE // @@chk_CM_RELEASE
  7269. //********************************************************** Added By M.Gerasimov
  7270. {$IFDEF USE_PROP}
  7271. PUSH offset[ID_SELF]
  7272. PUSH [ESI].fHandle
  7273. CALL RemoveProp
  7274. {$ENDIF}
  7275. //**********************************************************
  7276. @@return0:
  7277. XOR EAX, EAX
  7278. JMP @@exit // WM_NCDESTROY and CM_RELEASE
  7279. // is not a subject to pass it
  7280. // to fPass2DefProc
  7281. @@onmess:
  7282. MOV EAX, [ECX].TControl.fOnMessage.TMethod.Data
  7283. MOV EBX, [ECX].TControl.fOnMessage.TMethod.Code
  7284. @@callonmes:
  7285. TEST EBX, EBX
  7286. JNZ @@onmess1 // @@dynmes1
  7287. @@2onmessret:
  7288. RET
  7289. @@onmess1:
  7290. PUSH 0
  7291. MOV EDX, EDI
  7292. MOV ECX, ESP
  7293. CALL EBX
  7294. TEST AL, AL
  7295. POP EAX
  7296. JZ @@2onmessret
  7297. POP EDX // pop retaddr
  7298. JMP @@pass2defproc
  7299. @@chk_WM_SIZE:
  7300. CMP AX, WM_SIZE
  7301. JNE @@chk_WM_SYSCOMMAND //@@chk_WM_SHOWWINDOW
  7302. MOV EDX, EDI
  7303. MOV EAX, ESI
  7304. CALL TControl.CallDefWndProc
  7305. PUSH EAX
  7306. MOV ECX, [EDI].TMsg.wParam
  7307. MOV [ESI].TControl.fWindowState, CL
  7308. {$IFDEF OLD_ALIGN}
  7309. CMP [ESI].TControl.fIsForm, 0
  7310. JNZ @@doGlobalAlignSelf
  7311. MOV EAX, [ESI].TControl.fParent
  7312. CALL dword ptr [Global_Align]
  7313. @@doGlobalAlignSelf:
  7314. {$ENDIF}
  7315. XCHG EAX, ESI
  7316. CALL dword ptr [Global_Align]
  7317. JMP @@popeax_exit // fPass2DefProc not needed, CallDefWndProc already called
  7318. @@chk_WM_SYSCOMMAND:
  7319. CMP AX, WM_SYSCOMMAND
  7320. JNE @@chk_WM_SETFOCUS
  7321. MOV EAX, [EDI].TMsg.wParam
  7322. {$IFDEF PARANOIA} DB $24, $F0 {$ELSE} AND AL, $F0 {$ENDIF}
  7323. CMP AX, SC_MINIMIZE
  7324. JNE @@calldef
  7325. MOV EAX, ESI
  7326. CALL TControl.IsMainWindow
  7327. TEST AL, AL
  7328. JZ @@calldef
  7329. CMP ESI, [Applet]
  7330. JE @@calldef
  7331. PUSH 0
  7332. PUSH SC_MINIMIZE
  7333. PUSH WM_SYSCOMMAND
  7334. MOV EAX, [Applet]
  7335. PUSH [EAX].TControl.fHandle
  7336. CALL PostMessage
  7337. @@ret_0:
  7338. JMP @@0pass2defproc
  7339. @@chk_WM_SETFOCUS:
  7340. CMP AX, WM_SETFOCUS
  7341. JNE @@chk_WM_CTLCOLOR //@@chk_WM_SETCURSOR
  7342. MOV EAX, ESI
  7343. CALL TControl.DoSetFocus
  7344. TEST AL, AL
  7345. JZ @@0pass2defproc
  7346. INC [ESI].TControl.fClickDisabled
  7347. MOV EAX, ESI
  7348. MOV EDX, EDI
  7349. CALL TControl.CallDefWndProc
  7350. DEC [ESI].TControl.fClickDisabled
  7351. JMP @@exit
  7352. @@chk_WM_CTLCOLOR:
  7353. MOV EDX, EAX
  7354. SUB DX, WM_CTLCOLORMSGBOX
  7355. CMP DX, WM_CTLCOLORSTATIC-WM_CTLCOLORMSGBOX
  7356. JA @@chk_WM_COMMAND
  7357. PUSH [EDI].TMsg.lParam
  7358. PUSH [EDI].TMsg.wParam
  7359. ADD AX, CN_BASE //+WM_CTLCOLORMSGBOX
  7360. PUSH EAX
  7361. PUSH [EDI].TMsg.lParam
  7362. CALL SendMessage
  7363. JMP @@pass2defproc
  7364. @@chk_WM_COMMAND:
  7365. //CMP word ptr [EDI].TMsg.message, WM_COMMAND
  7366. CMP AX, WM_COMMAND
  7367. JNE @@chk_WM_KEY
  7368. {$IFDEF USE_PROP}
  7369. PUSH offset[ID_SELF]
  7370. PUSH [EDI].TMsg.lParam
  7371. CALL GetProp
  7372. {$ELSE}
  7373. PUSH GWL_USERDATA
  7374. PUSH [EDI].TMsg.lParam
  7375. CALL GetWindowLong
  7376. {$ENDIF}
  7377. TEST EAX, EAX
  7378. JZ @@calldef
  7379. PUSH [EDI].TMsg.lParam
  7380. PUSH [EDI].TMsg.wParam
  7381. PUSH CM_COMMAND
  7382. PUSH [EDI].TMsg.lParam
  7383. CALL SendMessage
  7384. JMP @@pass2defproc
  7385. @@chk_WM_KEY:
  7386. MOV EDX, EAX
  7387. SUB DX, WM_KEYFIRST
  7388. CMP DX, WM_KEYLAST-WM_KEYFIRST
  7389. JA @@calldef //@@chk_CM_EXECPROC
  7390. {$IFDEF KEY_PREVIEW}
  7391. CMP [ESI].TControl.fKeyPreviewing, 0
  7392. {JE @@nokeypreview1
  7393. CMP AX, WM_KEYDOWN
  7394. JE @@in_focus
  7395. @@nokeypreview1:}
  7396. JNE @@in_focus
  7397. {$ENDIF KEY_PREVIEW}
  7398. CALL GetFocus
  7399. CMP EAX, [ESI].TControl.fFocusHandle
  7400. JE @@in_focus
  7401. CMP EAX, [ESI].TControl.fHandle
  7402. JE @@in_focus
  7403. {$IFDEF USE_GRAPHCTLS}
  7404. CMP [ESI].fWindowed, 0
  7405. JE @@0pass2defproc
  7406. {$ENDIF}
  7407. @@in_focus:
  7408. {$IFDEF KEY_PREVIEW}
  7409. MOV [ESI].TControl.fKeyPreviewing, 0
  7410. {$ENDIF KEY_PREVIEW}
  7411. PUSH EAX
  7412. MOV ECX, ESP
  7413. MOV EDX, EDI
  7414. MOV EAX, ESI
  7415. CALL dword ptr [fGlobalProcKeybd]
  7416. TEST AL, AL
  7417. JNZ @@to_exit
  7418. MOV ECX, ESP
  7419. MOV EDX, EDI
  7420. MOV EAX, ESI
  7421. CALL [ESI].fWndProcKeybd
  7422. TEST AL, AL
  7423. @@to_exit:
  7424. POP EAX
  7425. JNZ @@pass2defproc
  7426. PUSH VK_CONTROL
  7427. CALL GetKeyState
  7428. XCHG EBX, EAX
  7429. PUSH VK_MENU
  7430. CALL GetKeyState
  7431. OR EAX, EBX
  7432. JS @@calldef
  7433. CMP word ptr [EDI].TMsg.message, WM_CHAR
  7434. JNE @@to_fGotoControl
  7435. CMP byte ptr [EDI].TMsg.wParam, 9
  7436. JE @@clear_wParam
  7437. JMP @@calldef
  7438. @@to_fGotoControl:
  7439. MOV EAX, ESI
  7440. CALL TControl.ParentForm
  7441. TEST EAX, EAX
  7442. JZ @@calldef
  7443. MOV ECX, [EAX].fGotoControl
  7444. JECXZ @@calldef
  7445. MOV EBX, ECX
  7446. CMP [EDI].TMsg.message, WM_KEYDOWN
  7447. SETNE CL
  7448. CMP [EDI].TMsg.message, WM_SYSKEYDOWN
  7449. SETNE CH
  7450. AND CL, CH
  7451. MOV EDX, [EDI].TMsg.wParam
  7452. MOV EAX, ESI
  7453. CALL EBX
  7454. TEST AL, AL
  7455. JZ @@calldef
  7456. @@clear_wParam:
  7457. XOR EAX, EAX
  7458. MOV [EDI].TMsg.wParam, EAX
  7459. JMP @@pass2defproc
  7460. @@calldef:
  7461. XCHG EAX, ESI
  7462. MOV EDX, EDI
  7463. CALL TControl.CallDefWndProc
  7464. JMP @@exit
  7465. @@0pass2defproc:
  7466. XOR EAX, EAX
  7467. @@pass2defproc:
  7468. PUSH EAX
  7469. @@1pass2defproc:
  7470. CMP [AppletTerminated], 0 //
  7471. JNZ @@popeax_exit // uncommented 25-Oct-2003
  7472. CMP [ESI].fNCDestroyed, 0 //
  7473. JNZ @@popeax_exit //
  7474. MOV ECX, ESP
  7475. XCHG EAX, ESI
  7476. MOV EDX, EDI
  7477. CALL dword ptr[EAX].fPass2DefProc
  7478. @@popeax_exit:
  7479. POP EAX
  7480. @@exit:
  7481. POP EDI
  7482. POP ESI
  7483. POP EBX
  7484. end;
  7485. {$ENDIF no NEW_MODAL}
  7486. {$ENDIF no USE_GRAPHCTLS}
  7487. procedure TControl.SetClsStyle( Value: DWord );
  7488. asm //cmd //opd
  7489. CMP EDX, [EAX].TControl.fClsStyle
  7490. JE @@exit
  7491. MOV [EAX].TControl.fClsStyle, EDX
  7492. MOV ECX, [EAX].TControl.fHandle
  7493. JECXZ @@exit
  7494. PUSH EDX
  7495. PUSH GCL_STYLE
  7496. PUSH ECX
  7497. CALL SetClassLong
  7498. @@exit:
  7499. end;
  7500. procedure TControl.SetStyle( Value: DWord );
  7501. const SWP_FLAGS = SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or
  7502. SWP_NOZORDER or SWP_FRAMECHANGED;
  7503. asm
  7504. CMP EDX, [EAX].fStyle
  7505. JZ @@exit
  7506. MOV [EAX].fStyle, EDX
  7507. MOV ECX, [EAX].fHandle
  7508. JECXZ @@exit
  7509. PUSH EAX
  7510. PUSH SWP_FLAGS
  7511. XOR EAX, EAX
  7512. PUSH EAX
  7513. PUSH EAX
  7514. PUSH EAX
  7515. PUSH EAX
  7516. PUSH EAX
  7517. PUSH ECX
  7518. PUSH EDX
  7519. PUSH GWL_STYLE
  7520. PUSH ECX
  7521. CALL SetWindowLong
  7522. CALL SetWindowPos
  7523. POP EAX
  7524. CALL Invalidate
  7525. @@exit:
  7526. end;
  7527. procedure TControl.SetExStyle( Value: DWord );
  7528. const SWP_FLAGS = SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or
  7529. SWP_NOZORDER or SWP_FRAMECHANGED;
  7530. asm
  7531. CMP EDX, [EAX].fExStyle
  7532. JZ @@exit
  7533. MOV [EAX].fExStyle, EDX
  7534. MOV ECX, [EAX].fHandle
  7535. JECXZ @@exit
  7536. PUSH EAX
  7537. PUSH SWP_FLAGS
  7538. XOR EAX, EAX
  7539. PUSH EAX
  7540. PUSH EAX
  7541. PUSH EAX
  7542. PUSH EAX
  7543. PUSH EAX
  7544. PUSH ECX
  7545. PUSH EDX
  7546. PUSH GWL_EXSTYLE
  7547. PUSH ECX
  7548. CALL SetWindowLong
  7549. CALL SetWindowPos
  7550. POP EAX
  7551. CALL Invalidate
  7552. @@exit:
  7553. end;
  7554. procedure TControl.SetCursor( Value: HCursor );
  7555. asm //cmd //opd
  7556. PUSH EBX
  7557. MOV EBX, EAX
  7558. PUSH EDX
  7559. LEA EDX, WndProcSetCursor
  7560. CALL TControl.AttachProc
  7561. POP EDX
  7562. CMP EDX, [EBX].TControl.fCursor
  7563. JE @@exit
  7564. MOV [EBX].TControl.fCursor, EDX
  7565. MOV ECX, [EBX].TControl.fHandle
  7566. JECXZ @@exit
  7567. TEST EDX, EDX //YS
  7568. JE @@exit //YS
  7569. MOV ECX, [ScreenCursor]
  7570. INC ECX
  7571. LOOP @@exit
  7572. PUSH EDX
  7573. PUSH EAX
  7574. PUSH EAX
  7575. PUSH ESP
  7576. CALL GetCursorPos
  7577. MOV EDX, ESP
  7578. MOV ECX, EDX
  7579. MOV EAX, EBX
  7580. CALL Screen2Client
  7581. ADD ESP, -16
  7582. MOV EDX, ESP
  7583. MOV EAX, EBX
  7584. CALL TControl.ClientRect
  7585. MOV EDX, ESP
  7586. LEA EAX, [ESP+16]
  7587. CALL PointInRect
  7588. ADD ESP, 24
  7589. TEST AL, AL
  7590. JZ @@fin
  7591. CALL Windows.SetCursor
  7592. PUSH EAX
  7593. @@fin: POP EAX
  7594. @@exit:
  7595. POP EBX
  7596. end;
  7597. procedure TControl.SetIcon( Value: HIcon );
  7598. asm //cmd //opd
  7599. CMP EDX, [EAX].TControl.fIcon
  7600. JE @@exit
  7601. MOV [EAX].TControl.fIcon, EDX
  7602. INC EDX
  7603. JZ @@1
  7604. DEC EDX
  7605. @@1:
  7606. PUSH EDX
  7607. PUSH 1 //ICON_BIG
  7608. PUSH WM_SETICON
  7609. PUSH EAX
  7610. CALL Perform
  7611. TEST EAX, EAX
  7612. JZ @@exit
  7613. PUSH EAX
  7614. CALL DestroyIcon
  7615. @@exit:
  7616. end;
  7617. procedure TControl.SetMenu( Value: HMenu );
  7618. asm
  7619. PUSH EBX
  7620. XCHG EBX, EAX
  7621. CMP [EBX].fMenu, EDX
  7622. JZ @@exit
  7623. PUSH EDX
  7624. MOV ECX, [EBX].fMenuObj
  7625. JECXZ @@no_free_menuctl
  7626. {$IFDEF USE_AUTOFREE4CONTROLS}
  7627. PUSH EDX
  7628. MOV EAX, EBX
  7629. CALL TControl.RemoveFromAutoFree
  7630. POP EAX
  7631. {$ELSE}
  7632. XCHG EAX, EDX
  7633. {$ENDIF}
  7634. CALL TObj.RefDec
  7635. @@no_free_menuctl:
  7636. MOV ECX, [EBX].fMenu
  7637. JECXZ @@no_destroy
  7638. PUSH ECX
  7639. CALL DestroyMenu
  7640. @@no_destroy:
  7641. POP EDX
  7642. MOV [EBX].fMenu, EDX
  7643. MOV ECX, [EBX].fHandle
  7644. JECXZ @@exit
  7645. PUSH EDX
  7646. PUSH ECX
  7647. CALL Windows.SetMenu
  7648. @@exit:
  7649. POP EBX
  7650. end;
  7651. procedure TControl.DoAutoSize;
  7652. asm
  7653. MOV ECX, [EAX].fAutoSize
  7654. JECXZ @@exit
  7655. PUSH ECX
  7656. @@exit:
  7657. end;
  7658. procedure TControl.SetCaption( const Value: KOLString );
  7659. asm
  7660. PUSH EBX
  7661. XCHG EBX, EAX
  7662. LEA EAX, [EBX].fCaption
  7663. {$IFDEF UNICODE_CTRLS}
  7664. CALL System.@WStrAsg
  7665. {$ELSE}
  7666. CALL System.@LStrAsg
  7667. {$ENDIF}
  7668. MOV ECX, [EBX].fHandle
  7669. JECXZ @@0
  7670. PUSH [EBX].TControl.fCaption
  7671. PUSH 0
  7672. PUSH WM_SETTEXT
  7673. PUSH ECX
  7674. {$IFDEF UNICODE_CTRLS}
  7675. CALL SendMessageW
  7676. {$ELSE}
  7677. CALL SendMessage
  7678. {$ENDIF}
  7679. @@0:
  7680. MOVZX ECX, byte ptr [EBX].fIsStaticControl
  7681. LOOP @@1
  7682. MOV EAX, EBX
  7683. CALL Invalidate
  7684. @@1:
  7685. XCHG EAX, EBX
  7686. @@exit: POP EBX
  7687. PUSH [EAX].fAutoSize
  7688. @@exit_2:
  7689. end;
  7690. function TControl.GetVisible: Boolean;
  7691. asm
  7692. MOV ECX, [EAX].fHandle
  7693. JECXZ @@check_fStyle
  7694. PUSH EAX
  7695. PUSH ECX
  7696. CALL IsWindowVisible
  7697. TEST EAX, EAX
  7698. POP EAX
  7699. JMP @@checked // Z if not visible
  7700. @@check_fStyle:
  7701. TEST byte ptr [EAX].fStyle+3, 10h // WS_VISIBLE shr 3
  7702. @@checked:
  7703. SETNZ DL
  7704. MOV [EAX].fVisible, DL
  7705. XCHG EAX, EDX
  7706. end;
  7707. function TControl.Get_Visible: Boolean;
  7708. asm // //
  7709. MOV ECX, [EAX].fHandle
  7710. JECXZ @@ret_fVisible
  7711. CMP [EAX].fIsControl, 0
  7712. JNZ @@ret_fVisible
  7713. PUSH EAX
  7714. PUSH ECX
  7715. CALL IsWindowVisible
  7716. XCHG EDX, EAX
  7717. POP EAX
  7718. MOV [EAX].fVisible, DL
  7719. @@ret_fVisible:
  7720. MOVZX EAX, [EAX].fVisible
  7721. end;
  7722. procedure TControl.Set_Visible( Value: Boolean );
  7723. const wsVisible = $10;
  7724. asm
  7725. {$IFDEF OLD_ALIGN}
  7726. PUSH EBX
  7727. PUSH ESI
  7728. //MOV ESI, EAX
  7729. XCHG ESI, EAX
  7730. MOVZX EBX, DL
  7731. {CALL Get_Visible
  7732. CMP AL, BL
  7733. JE @@reset_fCreateHidden}
  7734. MOV AL, byte ptr [ESI].fStyle + 3
  7735. TEST EBX, EBX
  7736. JZ @@reset_WS_VISIBLE
  7737. OR AL, wsVisible
  7738. PUSH SW_SHOW
  7739. JMP @@store_Visible
  7740. @@reset_WS_VISIBLE:
  7741. AND AL, not wsVisible
  7742. PUSH SW_HIDE
  7743. @@store_Visible:
  7744. MOV byte ptr [ESI].fStyle + 3, AL
  7745. MOV [ESI].fVisible, BL
  7746. MOV ECX, [ESI].fHandle
  7747. JECXZ @@after_showwindow
  7748. PUSH ECX
  7749. CALL ShowWindow
  7750. PUSH ECX
  7751. @@after_showwindow:
  7752. POP ECX
  7753. MOV EAX, [ESI].fParent
  7754. CALL dword ptr [Global_Align]
  7755. @@chk_align_Self:
  7756. TEST EBX, EBX
  7757. JZ @@reset_fCreateHidden
  7758. MOV EAX, ESI
  7759. CALL dword ptr [Global_Align]
  7760. @@reset_fCreateHidden:
  7761. MOV ECX, [ESI].fHandle
  7762. JECXZ @@exit
  7763. TEST BL, BL
  7764. JNZ @@exit
  7765. MOV [ESI].fCreateHidden, BL { +++ }
  7766. @@exit:
  7767. POP ESI
  7768. POP EBX
  7769. {$ELSE NEW_ALIGN}
  7770. AND byte ptr [EAX].fStyle + 3, not wsVisible
  7771. TEST DL,DL
  7772. JZ @@0
  7773. OR byte ptr [EAX].fStyle + 3, wsVisible
  7774. @@0:
  7775. MOV [EAX].fVisible, DL
  7776. MOV ECX, [EAX].fHandle
  7777. JECXZ @@exit
  7778. PUSH EAX
  7779. JZ @@1
  7780. CALL dword ptr [Global_Align]
  7781. POP EAX
  7782. PUSH SW_SHOW
  7783. PUSH [EAX].fHandle
  7784. CALL ShowWindow
  7785. @@exit:
  7786. RET
  7787. @@1:
  7788. MOV [EAX].fCreateHidden, DL
  7789. PUSH SW_HIDE
  7790. PUSH ECX
  7791. CALL ShowWindow
  7792. POP EAX
  7793. CALL dword ptr [Global_Align]
  7794. {$ENDIF}
  7795. end;
  7796. function TControl.GetBoundsRect: TRect;
  7797. asm
  7798. PUSH ESI
  7799. PUSH EDI
  7800. LEA ESI, [EAX].fBoundsRect
  7801. MOV EDI, EDX
  7802. PUSH EDX
  7803. MOVSD
  7804. MOVSD
  7805. MOVSD
  7806. MOVSD
  7807. POP EDI
  7808. XCHG ESI, EAX
  7809. MOV ECX, [ESI].fHandle
  7810. JECXZ @@exit
  7811. PUSH EDI
  7812. PUSH ECX
  7813. CALL GetWindowRect
  7814. MOV AL, [ESI].fIsMDIChild
  7815. OR AL, [ESI].fIsControl
  7816. JZ @@storeBounds
  7817. @@chk_Parent:
  7818. MOV EAX, [ESI].fParent
  7819. TEST EAX, EAX
  7820. JZ @@exit
  7821. XOR EDX, EDX
  7822. PUSH EDX
  7823. PUSH EDX
  7824. MOV ECX, ESP
  7825. PUSH EDX
  7826. PUSH EDX
  7827. MOV EDX, ESP
  7828. CALL TControl.Client2Screen
  7829. POP EAX
  7830. POP EAX
  7831. POP EAX
  7832. NEG EAX
  7833. POP ECX
  7834. NEG ECX
  7835. PUSH ECX
  7836. PUSH EAX
  7837. PUSH EDI
  7838. CALL OffsetRect
  7839. @@storeBounds:
  7840. XCHG ESI, EDI
  7841. LEA EDI, [EDI].fBoundsRect
  7842. MOVSD
  7843. MOVSD
  7844. MOVSD
  7845. MOVSD
  7846. @@exit:
  7847. POP EDI
  7848. POP ESI
  7849. end;
  7850. procedure HelpGetBoundsRect;
  7851. asm
  7852. POP ECX
  7853. ADD ESP, - size_TRect
  7854. MOV EDX, ESP
  7855. PUSH ECX
  7856. PUSH EAX
  7857. CALL TControl.GetBoundsRect
  7858. POP EAX
  7859. end;
  7860. procedure TControl.SetBoundsRect( const Value: TRect );
  7861. const swp_flags = SWP_NOZORDER or SWP_NOACTIVATE;
  7862. asm
  7863. PUSH EDI
  7864. MOV EDI, EAX
  7865. PUSH ESI
  7866. MOV ESI, EDX
  7867. CALL HelpGetBoundsRect
  7868. MOV EAX, ESI
  7869. MOV EDX, ESP
  7870. CALL RectsEqual
  7871. TEST AL, AL
  7872. JNZ @@exit
  7873. POP EDX // left
  7874. POP ECX // top
  7875. POP EAX // right
  7876. PUSH EAX
  7877. PUSH ECX
  7878. PUSH EDX
  7879. SUB EAX, EDX // EAX = width
  7880. CMP EDX, [ESI].TRect.Left
  7881. MOV DL, 0
  7882. JE @@1
  7883. INC EDX
  7884. @@1: CMP ECX, [ESI].TRect.Top
  7885. JE @@2
  7886. OR DL, 2
  7887. @@2: OR [EDI].fChangedPosSz, DL
  7888. PUSH EAX // W saved
  7889. MOV EAX, [EDI].fBoundsRect.Bottom
  7890. SUB EAX, ECX
  7891. PUSH EAX // H saved
  7892. PUSH EDI // @Self saved
  7893. {$IFDEF USE_GRAPHCTLS}
  7894. CMP [EDI].fWindowed, 0
  7895. JNZ @@invalid1
  7896. MOV EAX, EDI
  7897. CALL TControl.InvalidateNonWindowed
  7898. @@invalid1:
  7899. {$ENDIF}
  7900. LEA EDI, [EDI].fBoundsRect
  7901. MOVSD
  7902. MOVSD
  7903. MOVSD
  7904. MOVSD
  7905. MOV ESI, EDI
  7906. POP EDI // @ Self restored
  7907. MOV ECX, [EDI].fHandle
  7908. JECXZ @@fin
  7909. STD
  7910. PUSH swp_flags
  7911. LODSD
  7912. LODSD
  7913. XCHG EDX, EAX // EDX = bottom
  7914. LODSD
  7915. XCHG ECX, EAX // ECX = right
  7916. LODSD
  7917. SUB EDX, EAX // EAX = bottom - top
  7918. PUSH EDX // push HEIGHT
  7919. XCHG EDX, EAX // EDX = top
  7920. LODSD // EAX = left
  7921. CLD
  7922. SUB ECX, EAX
  7923. PUSH ECX // push WIDTH
  7924. PUSH EDX // push TOP
  7925. PUSH EAX // push LEFT
  7926. PUSH 0
  7927. PUSH [EDI].fHandle
  7928. CALL SetWindowPos
  7929. @@fin:
  7930. POP EDX // H restored
  7931. POP EAX // W restored
  7932. CMP [EDI].fSizeRedraw, 0
  7933. JE @@exit
  7934. @@invalid2:
  7935. XCHG EAX, EDI
  7936. CALL Invalidate
  7937. @@exit:
  7938. ADD ESP, size_TRect
  7939. POP ESI
  7940. POP EDI
  7941. end;
  7942. procedure TControl.SetWindowState( Value: TWindowState );
  7943. asm //cmd //opd
  7944. CMP [EAX].TControl.fWindowState, DL
  7945. JE @@exit
  7946. MOV [EAX].TControl.fWindowState, DL
  7947. XCHG EAX, EDX
  7948. CBW
  7949. CWDE
  7950. MOV AL, byte ptr [WindowStateShowCommands+EAX]
  7951. PUSH EAX
  7952. XCHG EAX, EDX
  7953. CALL TControl.GetWindowHandle
  7954. PUSH EAX
  7955. CALL ShowWindow
  7956. @@exit:
  7957. end;
  7958. procedure TControl.Show;
  7959. asm
  7960. PUSH EBX
  7961. MOV EBX, EAX
  7962. CALL CreateWindow
  7963. MOV DL, 1
  7964. MOV EAX, EBX
  7965. CALL SetVisible
  7966. PUSH [EBX].fHandle
  7967. CALL SetForegroundWindow
  7968. XCHG EAX, EBX
  7969. CALL DoSetFocus
  7970. POP EBX
  7971. end;
  7972. function TControl.Client2Screen( const P: TPoint ): TPoint;
  7973. asm
  7974. PUSH ESI
  7975. PUSH EDI
  7976. MOV ESI, EDX
  7977. MOV EDI, ECX
  7978. MOVSD
  7979. MOVSD
  7980. PUSH ECX
  7981. MOV ECX, [EAX].fHandle
  7982. JECXZ @@exit
  7983. PUSH ECX
  7984. CALL ClientToScreen
  7985. PUSH ECX
  7986. @@exit: POP ECX
  7987. POP EDI
  7988. POP ESI
  7989. end;
  7990. function TControl.Screen2Client( const P: TPoint ): TPoint;
  7991. asm
  7992. PUSH ESI
  7993. PUSH EDI
  7994. MOV ESI, EDX
  7995. MOV EDI, ECX
  7996. MOVSD
  7997. MOVSD
  7998. PUSH ECX
  7999. MOV ECX, [EAX].fHandle
  8000. JECXZ @@exit
  8001. PUSH ECX
  8002. CALL ScreenToClient
  8003. PUSH ECX
  8004. @@exit: POP ECX
  8005. POP EDI
  8006. POP ESI
  8007. end;
  8008. function TControl.ClientRect: TRect;
  8009. asm
  8010. PUSH ESI
  8011. XCHG ESI, EAX
  8012. PUSH EDX
  8013. PUSH EDX // prepare 'dest' for GetClientRect
  8014. LEA EAX, [ESI].fBoundsRect
  8015. XOR ECX, ECX
  8016. MOV CL, size_TRect
  8017. CALL System.Move
  8018. MOV EAX, ESI
  8019. CALL TControl.GetWindowHandle
  8020. XCHG ECX, EAX
  8021. JECXZ @@exit
  8022. PUSH ECX // prepare 'handle' for GetClientRect
  8023. CALL GetClientRect
  8024. PUSH EDX
  8025. @@exit: POP EDX
  8026. POP EDX // EDX = @Result
  8027. LEA ESI, [ESI].fClientTop
  8028. LODSD
  8029. ADD [EDX].TRect.Top, EAX
  8030. LODSD
  8031. SUB [EDX].TRect.Bottom, EAX
  8032. LODSD
  8033. ADD [EDX].TRect.Left, EAX
  8034. LODSD
  8035. SUB [EDX].TRect.Right, EAX
  8036. POP ESI
  8037. end;
  8038. procedure TControl.Invalidate;
  8039. asm
  8040. {$IFDEF USE_GRAPHCTLS}
  8041. PUSH dword ptr [EAX].TControl.fDoInvalidate
  8042. {$ELSE}
  8043. MOV ECX, [EAX].fHandle
  8044. JECXZ @@exit
  8045. PUSH $FF
  8046. PUSH 0
  8047. PUSH ECX
  8048. CALL InvalidateRect
  8049. @@exit:
  8050. {$ENDIF}
  8051. end;
  8052. {$IFDEF USE_GRAPHCTLS}
  8053. procedure TControl.InvalidateWindowed;
  8054. asm
  8055. MOV ECX, [EAX].fHandle
  8056. JECXZ @@exit
  8057. PUSH $FF
  8058. PUSH 0
  8059. PUSH ECX
  8060. CALL InvalidateRect
  8061. @@exit:
  8062. end;
  8063. {$ENDIF USE_GRAPHCTLS}
  8064. //{$IFDEF ASM_UNICODE}
  8065. function TControl.GetIcon: HIcon;
  8066. asm
  8067. PUSH EBX
  8068. XCHG EBX, EAX
  8069. MOV EAX, [EBX].fIcon
  8070. INC EAX
  8071. JZ @@exit
  8072. DEC EAX
  8073. JNZ @@exit
  8074. MOV ECX, [Applet]
  8075. JECXZ @@load
  8076. CMP ECX, EBX
  8077. JZ @@load
  8078. XCHG EAX, ECX
  8079. CALL TControl.GetIcon
  8080. TEST EAX, EAX
  8081. JZ @@exit
  8082. XOR EDX, EDX
  8083. PUSH EDX
  8084. PUSH EDX
  8085. PUSH EDX
  8086. INC EDX // IMAGE_ICON = 1
  8087. PUSH EDX
  8088. PUSH EAX
  8089. CALL CopyImage
  8090. JMP @@store_fIcon
  8091. @@main_icon:
  8092. {$IFDEF CUSTOM_APPICON}
  8093. {$I CusomAppIconRsrcName_ASM.inc} // create such file with DB 'your icon rsrc name'
  8094. {$ELSE}
  8095. {$IFDEF UNICODE_CTRLS}
  8096. DB 'M',0,'A',0,'I',0,'N',0,'I',0,'C',0,'O',0,'N',0,0
  8097. {$ELSE}
  8098. DB 'MAINICON'
  8099. {$ENDIF}
  8100. {$ENDIF}
  8101. DB 0
  8102. @@load:
  8103. PUSH offset @@main_icon
  8104. PUSH [hInstance]
  8105. CALL LoadIcon
  8106. @@store_fIcon:
  8107. MOV [EBX].fIcon, EAX
  8108. @@exit:
  8109. POP EBX
  8110. end;
  8111. //{$ENDIF ASM_UNICODE}
  8112. function TControl.CallDefWndProc(var Msg: TMsg): Integer;
  8113. asm
  8114. PUSH [EDX].TMsg.lParam
  8115. PUSH [EDX].TMsg.wParam
  8116. PUSH [EDX].TMsg.message
  8117. MOV ECX, [EAX].fDefWndProc
  8118. JECXZ @@defwindowproc
  8119. PUSH [EAX].fHandle
  8120. PUSH ECX
  8121. CALL CallWindowProc
  8122. RET
  8123. @@defwindowproc:
  8124. PUSH [EDX].TMsg.hwnd
  8125. {$IFDEF UNICODE_CTRLS}
  8126. CALL DefWindowProcW
  8127. {$ELSE}
  8128. CALL DefWindowProc
  8129. {$ENDIF}
  8130. end;
  8131. function TControl.GetWindowState: TWindowState;
  8132. asm //cmd //opd
  8133. PUSH EBX
  8134. PUSH ESI
  8135. XCHG ESI, EAX
  8136. MOVZX EBX, [ESI].TControl.fWindowState
  8137. MOV ECX, [ESI].TControl.fHandle
  8138. JECXZ @@ret_EBX
  8139. MOV BL, 2
  8140. MOV ESI, ECX
  8141. PUSH ESI
  8142. CALL IsZoomed
  8143. TEST EAX, EAX
  8144. JNZ @@ret_EBX
  8145. DEC EBX
  8146. PUSH ESI
  8147. CALL IsIconic
  8148. TEST EAX, EAX
  8149. JNZ @@ret_EBX
  8150. DEC EBX
  8151. @@ret_EBX:
  8152. XCHG EAX, EBX
  8153. POP ESI
  8154. POP EBX
  8155. end;
  8156. function TControl.DoSetFocus: Boolean;
  8157. asm
  8158. PUSH ESI
  8159. MOV ESI, EAX
  8160. CALL GetEnabled
  8161. {AND AL, [ESI].fTabstop
  8162. JNZ @@1
  8163. TEST byte ptr [ESI+2].TControl.fStyle, 1 //(WS_TABSTOP shr 16)}
  8164. MOV DL, [ESI].TControl.fTabstop
  8165. AND DL, byte ptr [ESI+2].TControl.fStyle
  8166. OR EAX, EDX
  8167. AND EAX, 1
  8168. JZ @@exit
  8169. //@@1:
  8170. INC [ESI].TControl.fClickDisabled
  8171. PUSH [ESI].fHandle
  8172. CALL SetFocus
  8173. DEC [ESI].TControl.fClickDisabled
  8174. MOV AL, 1
  8175. @@exit:
  8176. POP ESI
  8177. end;
  8178. function TControl.GetEnabled: Boolean;
  8179. asm
  8180. MOV ECX, [EAX].fHandle
  8181. JECXZ @@get_field
  8182. PUSH ECX
  8183. CALL IsWindowEnabled
  8184. RET
  8185. @@get_field:
  8186. TEST byte ptr [EAX].fStyle + 3, 8 //WS_DISABLED shr 3
  8187. SETZ AL
  8188. end;
  8189. function TControl.IsMainWindow: Boolean;
  8190. asm XCHG ECX, EAX
  8191. XOR EDX, EDX
  8192. MOV EAX, [Applet]
  8193. TEST EAX, EAX
  8194. JNZ @@0
  8195. CMP [ECX].fIsControl, AL
  8196. JMP @@3
  8197. @@0: CMP [appbuttonUsed], DL
  8198. JZ @@2
  8199. @@1: PUSH ECX
  8200. CALL TControl.GetMembers
  8201. POP ECX
  8202. @@2: CMP ECX, EAX
  8203. @@3: SETZ AL
  8204. end;
  8205. {$IFDEF ASM_UNICODE}
  8206. function TControl.get_ClassName: String;
  8207. asm
  8208. PUSH EBX
  8209. XCHG EBX, EAX
  8210. XCHG EAX, EDX
  8211. MOV EDX, [EBX].fControlClassName
  8212. PUSH EAX
  8213. CALL System.@LStrFromPChar
  8214. POP EAX
  8215. CMP [EBX].fCtlClsNameChg, 0
  8216. JNZ @@exit
  8217. MOV ECX, [EAX]
  8218. MOV EDX, offset[ @@obj ]
  8219. CALL System.@LStrCat3
  8220. JMP @@exit
  8221. DD -1, 4
  8222. @@obj: DB 'obj_', 0
  8223. @@exit:
  8224. POP EBX
  8225. end;
  8226. {$ENDIF}
  8227. procedure TControl.SetParent( Value: PControl );
  8228. asm
  8229. PUSH EBX
  8230. PUSH EDI
  8231. XCHG EBX, EAX
  8232. MOV EDI, EDX
  8233. MOV ECX, [EBX].fParent
  8234. CMP EDI, ECX
  8235. JE @@exit
  8236. JECXZ @@1
  8237. {$IFDEF USE_GRAPHCTLS}
  8238. PUSH ECX
  8239. MOV EAX, EBX
  8240. CALL TControl.Invalidate
  8241. POP ECX
  8242. {$ENDIF}
  8243. PUSH ECX
  8244. MOV EAX, [ECX].fChildren
  8245. MOV EDX, EBX
  8246. CALL TList.Remove
  8247. POP EAX
  8248. {$IFNDEF USE_AUTOFREE4CONTROL}
  8249. PUSH EAX
  8250. MOV EDX, EBX
  8251. CALL TObj.RemoveFromAutoFree
  8252. POP EAX
  8253. {$ENDIF}
  8254. {$IFNDEF SMALLEST_CODE}
  8255. MOV ECX, [EAX].fNotifyChild
  8256. JECXZ @@1
  8257. XOR EDX, EDX
  8258. CALL ECX
  8259. {$ENDIF}
  8260. @@1:
  8261. MOV [EBX].fParent, EDI
  8262. TEST EDI, EDI
  8263. JZ @@exit
  8264. MOV EAX, [EDI].fChildren
  8265. MOV EDX, EBX
  8266. CALL TList.Add
  8267. {$IFDEF USE_AUTOFREE4CHILDREN}
  8268. MOV EAX, EDI
  8269. MOV EDX, EBX
  8270. CALL TControl.Add2AutoFree
  8271. {$ENDIF}
  8272. {$IFNDEF INPACKAGE}
  8273. MOV ECX, [EBX].fHandle
  8274. JECXZ @@2
  8275. MOV EAX, EDI
  8276. CALL TControl.GetWindowHandle
  8277. PUSH EAX
  8278. PUSH [EBX].fHandle
  8279. CALL Windows.SetParent
  8280. @@2:
  8281. {$ENDIF}
  8282. {$IFNDEF SMALLEST_CODE}
  8283. MOV ECX, [EDI].fNotifyChild
  8284. JECXZ @@3
  8285. MOV EAX, EDI
  8286. MOV EDX, EBX
  8287. CALL ECX
  8288. @@3:
  8289. MOV ECX, [EBX].fNotifyChild
  8290. JECXZ @@4
  8291. MOV EAX, EDI
  8292. MOV EDX, EBX
  8293. CALL ECX
  8294. @@4: {$ENDIF}
  8295. {$IFNDEF USE_GRAPHCTLS}
  8296. XCHG EAX, EBX
  8297. CALL TControl.Invalidate
  8298. {$ENDIF}
  8299. @@exit:
  8300. POP EDI
  8301. POP EBX
  8302. end;
  8303. constructor TControl.CreateParented(AParent: PControl);
  8304. asm //cmd //opd
  8305. PUSH EAX
  8306. MOV EDX, ECX
  8307. MOV ECX, [EAX]
  8308. CALL dword ptr [ECX+8]
  8309. POP EAX
  8310. end;
  8311. function TControl.GetLeft: Integer;
  8312. asm
  8313. CALL HelpGetBoundsRect
  8314. POP EAX
  8315. POP ECX
  8316. POP ECX
  8317. POP ECX
  8318. end;
  8319. procedure TControl.SetLeft( Value: Integer );
  8320. asm
  8321. PUSH EDI
  8322. PUSH EDX
  8323. CALL HelpGetBoundsRect
  8324. POP EDX // EDX = Left
  8325. POP ECX // ECX = Top
  8326. POP EDI // EDI = Right
  8327. SUB EDI, EDX // EDI = width
  8328. MOV EDX, [ESP+4] // EDX = Left'
  8329. ADD EDI, EDX // EDI = Right'
  8330. PUSH EDI
  8331. PUSH ECX
  8332. PUSH EDX
  8333. MOV EDX, ESP
  8334. CALL SetBoundsRect
  8335. ADD ESP, size_TRect + 4
  8336. POP EDI
  8337. end;
  8338. function TControl.GetTop: Integer;
  8339. asm
  8340. CALL HelpGetBoundsRect
  8341. POP EDX
  8342. POP EAX
  8343. POP EDX
  8344. POP EDX
  8345. end;
  8346. procedure TControl.SetTop( Value: Integer );
  8347. asm
  8348. PUSH ESI
  8349. PUSH EDI
  8350. PUSH EDX
  8351. CALL HelpGetBoundsRect
  8352. POP EDX // EDX = Left
  8353. POP ECX // ECX = Top
  8354. POP EDI // EDI = Right
  8355. POP ESI // ESI = Bottom
  8356. SUB ESI, ECX // ESI = Height'
  8357. POP ECX // ECX = Top'
  8358. ADD ESI, ECX // ESI = Bottom'
  8359. PUSH ESI
  8360. PUSH EDI
  8361. PUSH ECX
  8362. PUSH EDX
  8363. MOV EDX, ESP
  8364. CALL SetBoundsRect
  8365. ADD ESP, size_TRect
  8366. POP EDI
  8367. POP ESI
  8368. end;
  8369. function TControl.GetWidth: Integer;
  8370. asm
  8371. CALL HelpGetBoundsRect
  8372. POP EDX
  8373. POP ECX
  8374. POP EAX
  8375. SUB EAX, EDX
  8376. POP ECX
  8377. end;
  8378. procedure TControl.SetWidth( Value: Integer );
  8379. asm
  8380. PUSH EDX
  8381. CALL HelpGetBoundsRect
  8382. POP EDX
  8383. PUSH EDX
  8384. ADD EDX, [ESP].size_TRect
  8385. MOV [ESP].TRect.Right, EDX
  8386. MOV EDX, ESP
  8387. CALL SetBoundsRect
  8388. ADD ESP, size_TRect + 4
  8389. end;
  8390. function TControl.GetHeight: Integer;
  8391. asm
  8392. CALL HelpGetBoundsRect
  8393. POP ECX
  8394. POP EDX // EDX = top
  8395. POP ECX
  8396. POP EAX // EAX = bottom
  8397. SUB EAX, EDX // result = height
  8398. end;
  8399. procedure TControl.SetHeight( Value: Integer );
  8400. asm
  8401. PUSH EDX
  8402. CALL HelpGetBoundsRect
  8403. MOV EDX, [ESP].TRect.Top
  8404. ADD EDX, [ESP].size_TRect
  8405. MOV [ESP].TRect.Bottom, EDX
  8406. MOV EDX, ESP
  8407. CALL SetBoundsRect
  8408. ADD ESP, size_TRect + 4
  8409. end;
  8410. function TControl.GetPosition: TPoint;
  8411. asm
  8412. PUSH EDX
  8413. CALL HelpGetBoundsRect
  8414. POP EAX // EAX = left
  8415. POP ECX // ECX = top
  8416. POP EDX
  8417. POP EDX
  8418. POP EDX // EDX = @Result
  8419. MOV [EDX], EAX
  8420. MOV [EDX+4], ECX
  8421. end;
  8422. procedure TControl.Set_Position( Value: TPoint );
  8423. asm
  8424. PUSH ESI
  8425. PUSH EDI
  8426. PUSH EAX
  8427. PUSH EDX
  8428. CALL HelpGetBoundsRect
  8429. POP EDX // left
  8430. POP EAX // top
  8431. POP ECX // right
  8432. SUB ECX, EDX // ECX = width
  8433. POP EDX // bottom
  8434. SUB EDX, EAX // EDX = height
  8435. POP EAX // EAX = @Value
  8436. POP ESI // ESI = @Self
  8437. MOV EDI, [EAX+4] // top'
  8438. ADD EDX, EDI
  8439. PUSH EDX // bottom'
  8440. MOV EAX, [EAX] // left'
  8441. ADD ECX, EAX
  8442. PUSH ECX // right'
  8443. PUSH EDI // top'
  8444. PUSH EAX // left'
  8445. MOV EAX, ESI
  8446. MOV EDX, ESP
  8447. CALL SetBoundsRect
  8448. ADD ESP, size_TRect
  8449. POP EDI
  8450. POP ESI
  8451. end;
  8452. procedure DefaultPaintBackground( Sender: PControl; DC: HDC; Rect: PRect );
  8453. asm
  8454. PUSH EDI
  8455. PUSH EDI
  8456. MOV EDI, ESP
  8457. PUSH ECX
  8458. PUSH EDX
  8459. MOV EAX, [EAX].TControl.fColor
  8460. CALL Color2RGB
  8461. PUSH EAX
  8462. CALL CreateSolidBrush
  8463. STOSD
  8464. MOV EDI, EAX
  8465. CALL windows.FillRect
  8466. PUSH EDI
  8467. CALL DeleteObject
  8468. POP EDI
  8469. end;
  8470. procedure TControl.SetCtlColor( Value: TColor );
  8471. asm
  8472. PUSH EBX
  8473. MOV EBX, EAX
  8474. {$IFNDEF INPACKAGE}
  8475. PUSH EDX
  8476. CALL GetWindowHandle
  8477. XCHG ECX, EAX
  8478. POP EDX
  8479. {$ELSE}
  8480. MOV ECX, [EBX].fHandle
  8481. {$ENDIF}
  8482. JECXZ @@1
  8483. MOVZX ECX, [EBX].fCommandActions.aSetBkColor
  8484. JECXZ @@1
  8485. PUSH EDX
  8486. XCHG EAX, EDX
  8487. PUSH ECX
  8488. CALL Color2RGB
  8489. POP ECX
  8490. PUSH EAX // Color2RGB( Value )
  8491. PUSH 0 // 0
  8492. PUSH ECX // fCommandActions.aSetBkColor
  8493. PUSH EBX // @ Self
  8494. CALL TControl.Perform
  8495. POP EDX
  8496. @@1:
  8497. CMP EDX, [EBX].fColor
  8498. JZ @@exit
  8499. MOV [EBX].fColor, EDX
  8500. XOR ECX, ECX
  8501. XCHG ECX, [EBX].fTmpBrush
  8502. JECXZ @@setbrushcolor
  8503. PUSH EDX
  8504. PUSH ECX
  8505. CALL DeleteObject
  8506. POP EDX
  8507. @@setbrushcolor:
  8508. MOV ECX, [EBX].fBrush
  8509. JECXZ @@invldte
  8510. XCHG EAX, ECX
  8511. MOV ECX, EDX
  8512. //MOV EDX, go_Color
  8513. XOR EDX, EDX
  8514. CALL TGraphicTool.SetInt
  8515. @@invldte:
  8516. XCHG EAX, EBX
  8517. CALL TControl.Invalidate
  8518. @@exit:
  8519. POP EBX
  8520. end;
  8521. function TControl.GetParentWnd( NeedHandle: Boolean ): HWnd;
  8522. asm
  8523. MOV ECX, [EAX].fParent
  8524. JECXZ @@exit
  8525. PUSH ECX
  8526. TEST DL, DL
  8527. JZ @@load_handle
  8528. XCHG EAX, ECX
  8529. CALL GetWindowHandle
  8530. @@load_handle:
  8531. POP ECX
  8532. MOV ECX, [ECX].fHandle
  8533. @@exit: XCHG EAX, ECX
  8534. end;
  8535. procedure TControl.CreateChildWindows;
  8536. asm
  8537. PUSH ESI
  8538. MOV ESI, [EAX].TControl.fChildren
  8539. MOV ECX, [ESI].TList.fCount
  8540. MOV ESI, [ESI].TList.fItems
  8541. JECXZ @@exit
  8542. @@loop: PUSH ECX
  8543. LODSD
  8544. CALL CallTControlCreateWindow
  8545. //CALL TControl.GetWindowHandle
  8546. POP ECX
  8547. LOOP @@loop
  8548. @@exit: POP ESI
  8549. end;
  8550. procedure TControl.DestroyChildren;
  8551. asm
  8552. PUSH ESI
  8553. MOV EAX, [EAX].fChildren
  8554. PUSH EAX
  8555. MOV ECX, [EAX].TList.fCount
  8556. JECXZ @@clear
  8557. MOV ESI, [EAX].TList.fItems
  8558. LEA ESI, [ESI + ECX*4 - 4] // is order really important ?
  8559. @@loop: STD //
  8560. LODSD
  8561. CLD //
  8562. PUSH ECX
  8563. CALL TObj.RefDec
  8564. POP ECX
  8565. LOOP @@loop
  8566. @@clear:
  8567. POP EAX
  8568. CALL TList.Clear
  8569. POP ESI
  8570. end;
  8571. function TControl.ProcessMessage: Boolean;
  8572. const size_TMsg = sizeof( TMsg );
  8573. asm
  8574. PUSH EBX
  8575. XCHG EBX, EAX
  8576. ADD ESP, -size_TMsg-4
  8577. MOV EDX, ESP
  8578. PUSH 1
  8579. XOR ECX, ECX
  8580. PUSH ECX
  8581. PUSH ECX
  8582. PUSH ECX
  8583. PUSH EDX
  8584. CALL PeekMessage
  8585. TEST EAX, EAX
  8586. JZ @@exit
  8587. MOV EDX, [ESP].TMsg.message
  8588. CMP DX, WM_QUIT
  8589. JNZ @@tran_disp
  8590. MOV [AppletTerminated], 1
  8591. {$IFDEF PROVIDE_EXITCODE}
  8592. MOV EDX, [ESP].TMsg.wParam
  8593. MOV [ExitCode], EDX
  8594. {$ENDIF PROVIDE_EXITCODE}
  8595. JMP @@fin
  8596. @@tran_disp:
  8597. MOV ECX, [EBX].fExMsgProc
  8598. JECXZ @@do_tran_disp
  8599. MOV EAX, EBX
  8600. MOV EDX, ESP
  8601. CALL ECX
  8602. TEST AL, AL
  8603. JNZ @@fin
  8604. @@do_tran_disp:
  8605. MOV EAX, ESP
  8606. PUSH EAX
  8607. PUSH EAX
  8608. CALL TranslateMessage
  8609. CALL DispatchMessage
  8610. @@fin:
  8611. MOV AX, word ptr [ESP].TMsg.message
  8612. TEST AX, AX
  8613. SETNZ AL
  8614. @@exit: ADD ESP, size_TMsg+4
  8615. POP EBX
  8616. end;
  8617. procedure TControl.ProcessMessages;
  8618. asm
  8619. @@loo: PUSH EAX
  8620. CALL ProcessMessage
  8621. DEC AL
  8622. POP EAX
  8623. JZ @@loo
  8624. end;
  8625. function WndProcForm(Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  8626. const szPaintStruct = sizeof(TPaintStruct);
  8627. asm //cmd //opd
  8628. {$IFDEF ENDSESSION_HALT}
  8629. CMP word ptr [EDX].TMsg.message, WM_ENDSESSION
  8630. JNE @@chk_WM_SETFOCUS
  8631. CMP [EDX].TMsg.wParam, 0
  8632. JZ @@ret_false
  8633. CALL TObj.RefDec
  8634. XOR EAX, EAX
  8635. MOV [AppletRunning], AL
  8636. XCHG EAX, [Applet]
  8637. INC [AppletTerminated]
  8638. CALL TObj.RefDec
  8639. CALL System.@Halt0
  8640. {$ENDIF ENDSESSION_HALT}
  8641. @@chk_WM_SETFOCUS:
  8642. CMP word ptr [EDX].TMsg.message, WM_SETFOCUS
  8643. JNE @@ret_false
  8644. PUSH EBX
  8645. PUSH ESI
  8646. XOR EBX, EBX
  8647. XCHG ESI, EAX
  8648. {$IFDEF FIX_MODAL_SETFOCUS}
  8649. MOV ECX, [ESI].TControl.fModalForm
  8650. JECXZ @@no_fix_modal_setfocus
  8651. PUSH [ECX].TControl.fHandle
  8652. CALL SetFocus
  8653. @@no_fix_modal_setfocus:
  8654. {$ENDIF}
  8655. MOV ECX, [ESI].TControl.FCurrentControl
  8656. JECXZ @@1
  8657. INC EBX
  8658. XCHG EAX, ECX
  8659. // or CreateForm?
  8660. PUSH EAX
  8661. CALL CallTControlCreateWindow
  8662. TEST AL, AL
  8663. POP EAX
  8664. JZ @@1
  8665. PUSH [EAX].TControl.fHandle
  8666. CALL SetFocus
  8667. @@1: MOV ECX, [Applet]
  8668. JECXZ @@ret_EBX
  8669. CMP ECX, ESI
  8670. JE @@ret_EBX
  8671. MOV [ECX].TControl.FCurrentControl, ESI
  8672. @@ret_EBX:
  8673. XCHG EAX, EBX
  8674. POP ESI
  8675. POP EBX
  8676. RET
  8677. @@ret_false:
  8678. XOR EAX, EAX
  8679. end;
  8680. function GetPrevCtrlBoundsRect( P: PControl; var R: TRect ): Boolean;
  8681. asm
  8682. MOV EDX, EBX
  8683. MOV EAX, [EBX].TControl.fParent
  8684. TEST EAX, EAX
  8685. JZ @@exit
  8686. PUSH EAX
  8687. CALL TControl.ChildIndex
  8688. TEST EAX, EAX
  8689. XCHG EDX, EAX
  8690. POP EAX
  8691. JZ @@exit
  8692. DEC EDX
  8693. CALL TControl.GetMembers
  8694. POP ECX // retaddr
  8695. ADD ESP, -size_TRect
  8696. MOV EDX, ESP
  8697. PUSH ECX
  8698. CALL TControl.GetBoundsRect
  8699. STC // return CARRY
  8700. @@exit:
  8701. end;
  8702. function TControl.PlaceUnder: PControl;
  8703. asm
  8704. PUSH EBX
  8705. XCHG EBX, EAX
  8706. CALL GetPrevCtrlBoundsRect
  8707. JNC @@exit
  8708. POP EDX // EDX = Left
  8709. MOV EAX, EBX
  8710. CALL TControl.SetLeft
  8711. POP EDX
  8712. POP EDX
  8713. POP EDX // EDX = Bottom
  8714. MOV EAX, [EBX].fParent
  8715. ADD EDX, [EAX].fMargin
  8716. MOV EAX, EBX
  8717. CALL TControl.SetTop
  8718. @@exit:
  8719. XCHG EAX, EBX
  8720. POP EBX
  8721. end;
  8722. function TControl.PlaceDown: PControl;
  8723. asm
  8724. PUSH EBX
  8725. XCHG EBX, EAX
  8726. CALL GetPrevCtrlBoundsRect
  8727. JNC @@exit
  8728. POP EDX
  8729. POP EDX
  8730. POP EDX
  8731. POP EDX // EDX = Bottom
  8732. MOV EAX, [EBX].fParent
  8733. ADD EDX, [EAX].fMargin
  8734. MOV EAX, EBX
  8735. CALL TControl.SetTop
  8736. @@exit:
  8737. XCHG EAX, EBX
  8738. POP EBX
  8739. end;
  8740. function TControl.PlaceRight: PControl;
  8741. asm
  8742. PUSH EBX
  8743. XCHG EBX, EAX
  8744. CALL GetPrevCtrlBoundsRect
  8745. JNC @@exit
  8746. POP EDX
  8747. POP EDX // EDX = Top
  8748. MOV EAX, EBX
  8749. CALL TControl.SetTop
  8750. POP EDX // EDX = Right
  8751. MOV EAX, [EBX].fParent
  8752. ADD EDX, [EAX].fMargin
  8753. POP ECX
  8754. MOV EAX, EBX
  8755. CALL TControl.SetLeft
  8756. @@exit:
  8757. XCHG EAX, EBX
  8758. POP EBX
  8759. end;
  8760. function TControl.SetSize(W, H: Integer): PControl;
  8761. asm
  8762. PUSH EBX
  8763. XCHG EBX, EAX
  8764. SUB ESP, 16
  8765. XCHG EAX, EDX
  8766. MOV EDX, ESP
  8767. PUSH ECX // save H
  8768. PUSH EAX // save W
  8769. MOV EAX, EBX
  8770. CALL GetBoundsRect
  8771. POP ECX // pop W
  8772. JECXZ @@nochg_W
  8773. ADD ECX, [ESP+4].TRect.Left
  8774. MOV [ESP+4].TRect.Right, ECX
  8775. @@nochg_W:
  8776. POP ECX // pop H
  8777. JECXZ @@nochg_H
  8778. ADD ECX, [ESP].TRect.Top
  8779. MOV [ESP].TRect.Bottom, ECX
  8780. @@nochg_H:
  8781. MOV EAX, EBX
  8782. MOV EDX, ESP
  8783. CALL TControl.SetBoundsRect
  8784. ADD ESP, 16
  8785. XCHG EAX, EBX
  8786. POP EBX
  8787. end;
  8788. function TControl.AlignLeft(P: PControl): PControl;
  8789. asm
  8790. PUSH EAX
  8791. MOV EAX, EDX
  8792. CALL TControl.GetLeft
  8793. MOV EDX, EAX
  8794. POP EAX
  8795. PUSH EAX
  8796. CALL TControl.SetLeft
  8797. POP EAX
  8798. end;
  8799. function TControl.AlignTop(P: PControl): PControl;
  8800. asm
  8801. PUSH EAX
  8802. MOV EAX, EDX
  8803. CALL TControl.GetTop
  8804. MOV EDX, EAX
  8805. POP EAX
  8806. PUSH EAX
  8807. CALL TControl.SetTop
  8808. POP EAX
  8809. end;
  8810. procedure TControl.DoClick;
  8811. asm
  8812. PUSH EAX
  8813. CALL [EAX].fControlClick
  8814. POP EDX
  8815. MOV ECX, [EDX].fOnClick.TMethod.Code
  8816. JECXZ @@exit
  8817. MOV EAX, [EDX].fOnClick.TMethod.Data
  8818. CALL ECX
  8819. @@exit:
  8820. end;
  8821. function TControl.ParentForm: PControl;
  8822. asm
  8823. @@1: CMP [EAX].fIsControl, 0
  8824. JZ @@exit
  8825. MOV EAX, [EAX].fParent
  8826. TEST EAX, EAX
  8827. JNZ @@1
  8828. @@exit:
  8829. end;
  8830. procedure TControl.SetProgressColor(const Value: TColor);
  8831. asm
  8832. PUSH EDX
  8833. PUSH EAX
  8834. MOV EAX, EDX
  8835. CALL Color2RGB
  8836. POP EDX
  8837. PUSH EDX
  8838. PUSH EAX
  8839. PUSH 0
  8840. PUSH PBM_SETBARCOLOR
  8841. PUSH EDX
  8842. CALL Perform
  8843. TEST EAX, EAX
  8844. POP EAX
  8845. POP EDX
  8846. JZ @@exit
  8847. MOV [EAX].fTextColor, EDX
  8848. @@exit:
  8849. end;
  8850. function TControl.GetFont: PGraphicTool;
  8851. asm
  8852. MOV ECX, [EAX].FFont
  8853. INC ECX
  8854. LOOP @@exit
  8855. PUSH EAX
  8856. CALL NewFont
  8857. {$IFDEF USE_AUTOFREE4CONTROLS}
  8858. POP EDX
  8859. PUSH EDX
  8860. PUSH EAX
  8861. XCHG eax, edx
  8862. CALL TObj.Add2AutoFree
  8863. POP EAX
  8864. {$ENDIF}
  8865. POP EDX
  8866. MOV [EDX].FFont, EAX
  8867. MOV ECX, [EDX].fTextColor
  8868. MOV [EAX].TGraphicTool.fData.Color, ECX
  8869. MOV [EAX].TGraphicTool.fOnChange.TMethod.Code, offset[FontChanged]
  8870. MOV [EAX].TGraphicTool.fOnChange.TMethod.Data, EDX
  8871. RET
  8872. @@exit: XCHG EAX, ECX
  8873. end;
  8874. function TControl.GetBrush: PGraphicTool;
  8875. asm
  8876. MOV ECX, [EAX].FBrush
  8877. INC ECX
  8878. LOOP @@exit
  8879. PUSH EAX
  8880. CALL NewBrush
  8881. POP EDX // @ Self
  8882. MOV [EDX].FBrush, EAX
  8883. MOV ECX, [EDX].fColor
  8884. MOV [EAX].TGraphicTool.fData.Color, ECX
  8885. MOV [EAX].TGraphicTool.fOnChange.TMethod.Code, offset[BrushChanged]
  8886. MOV [EAX].TGraphicTool.fOnChange.TMethod.Data, EDX
  8887. {$IFDEF USE_AUTOFREE4CONTROLS}
  8888. PUSH EAX
  8889. XCHG EAX, EDX
  8890. CALL TControl.Add2AutoFree
  8891. POP ECX
  8892. {$ENDIF}
  8893. @@exit: XCHG EAX, ECX
  8894. end;
  8895. procedure TControl.FontChanged(Sender: PGraphicTool);
  8896. asm
  8897. MOV ECX, [EDX].TGraphicTool.fData.Color
  8898. MOV [EAX].fTextColor, ECX
  8899. PUSH EAX
  8900. CALL ApplyFont2Wnd
  8901. POP EAX
  8902. CALL Invalidate
  8903. end;
  8904. procedure TControl.BrushChanged(Sender: PGraphicTool);
  8905. asm
  8906. MOV ECX, [EDX].TGraphicTool.fData.Color
  8907. MOV [EAX].fColor, ECX
  8908. XOR ECX, ECX
  8909. XCHG ECX, [EAX].fTmpBrush
  8910. JECXZ @@inv
  8911. PUSH EAX
  8912. PUSH ECX
  8913. CALL DeleteObject
  8914. POP EAX
  8915. @@inv: CALL Invalidate
  8916. end;
  8917. procedure DoApplyFont2Wnd( _Self: PControl );
  8918. asm
  8919. PUSH EBX
  8920. XCHG EBX, EAX
  8921. MOV ECX, [EBX].TControl.fFont
  8922. JECXZ @@exit
  8923. XCHG EAX, ECX
  8924. MOV ECX, [EBX].TControl.fHandle
  8925. JECXZ @@0
  8926. MOV EDX, [EAX].TGraphicTool.fData.Color
  8927. MOV [EBX].TControl.fTextColor, EDX
  8928. PUSH $FFFF
  8929. CALL TGraphicTool.GetHandle
  8930. PUSH EAX
  8931. PUSH WM_SETFONT
  8932. PUSH EBX
  8933. CALL TControl.Perform
  8934. @@0:
  8935. XOR ECX, ECX
  8936. XCHG ECX, [EBX].TControl.fCanvas
  8937. JECXZ @@1
  8938. XCHG EAX, ECX
  8939. CALL TObj.RefDec
  8940. @@1:
  8941. XCHG EAX, EBX
  8942. CALL TControl.DoAutoSize
  8943. @@exit:
  8944. POP EBX
  8945. end;
  8946. function TControl.ResizeParent: PControl;
  8947. asm
  8948. LEA EDX, [TControl.ResizeParentRight]
  8949. PUSH EDX
  8950. CALL EDX
  8951. CALL TControl.ResizeParentBottom
  8952. end;
  8953. function TControl.ResizeParentBottom: PControl;
  8954. asm
  8955. PUSH EAX
  8956. PUSH EBX
  8957. MOV EBX, [EAX].fParent
  8958. TEST EBX, EBX
  8959. JZ @@exit
  8960. MOV EDX, [EAX].fBoundsRect.Bottom
  8961. ADD EDX, [EBX].fMargin
  8962. TEST [EBX].fChangedPosSz, 20h
  8963. JZ @@1
  8964. PUSH EDX
  8965. MOV EAX, EBX
  8966. CALL GetClientHeight
  8967. POP EDX
  8968. CMP EDX, EAX
  8969. JE @@exit
  8970. @@1:
  8971. MOV EAX, EBX
  8972. CALL TControl.SetClientHeight
  8973. OR [EBX].fChangedPosSz, 20h
  8974. @@exit:
  8975. POP EBX
  8976. POP EAX
  8977. end;
  8978. function TControl.ResizeParentRight: PControl;
  8979. asm
  8980. PUSH EAX
  8981. PUSH EBX
  8982. MOV EBX, [EAX].fParent
  8983. TEST EBX, EBX
  8984. JZ @@exit
  8985. MOV EDX, [EAX].fBoundsRect.Right
  8986. ADD EDX, [EBX].fMargin
  8987. TEST [EBX].fChangedPosSz, 10h
  8988. JZ @@1
  8989. PUSH EDX
  8990. MOV EAX, EBX
  8991. CALL GetClientWidth
  8992. POP EDX
  8993. CMP EDX, EAX
  8994. JLE @@exit
  8995. @@1:
  8996. MOV EAX, EBX
  8997. CALL TControl.SetClientWidth
  8998. OR [EBX].fChangedPosSz, 10h
  8999. @@exit:
  9000. POP EBX
  9001. POP EAX
  9002. end;
  9003. function TControl.GetClientHeight: Integer;
  9004. asm
  9005. ADD ESP, -size_TRect
  9006. MOV EDX, ESP
  9007. CALL TControl.ClientRect
  9008. POP EDX
  9009. POP ECX // Top
  9010. POP EDX
  9011. POP EAX // Bottom
  9012. SUB EAX, ECX // Result = Bottom - Top
  9013. end;
  9014. function TControl.GetClientWidth: Integer;
  9015. asm
  9016. ADD ESP, -size_TRect
  9017. MOV EDX, ESP
  9018. CALL TControl.ClientRect
  9019. POP ECX // Left
  9020. POP EDX
  9021. POP EAX // Right
  9022. SUB EAX, ECX // Result = Right - Left
  9023. POP EDX
  9024. end;
  9025. procedure TControl.SetClientHeight(const Value: Integer);
  9026. asm
  9027. PUSH EBX
  9028. PUSH EDX
  9029. MOV EBX, EAX
  9030. CALL TControl.GetClientHeight
  9031. PUSH EAX
  9032. MOV EAX, EBX
  9033. CALL TControl.GetHeight // EAX = Height
  9034. POP EDX // EDX = ClientHeight
  9035. SUB EAX, EDX // EAX = Delta
  9036. POP EDX // EDX = Value
  9037. ADD EDX, EAX // EDX = Value + Delta
  9038. XCHG EAX, EBX // EAX = @Self
  9039. CALL TControl.SetHeight
  9040. POP EBX
  9041. end;
  9042. procedure TControl.SetClientWidth(const Value: Integer);
  9043. asm
  9044. PUSH EBX
  9045. PUSH EDX
  9046. MOV EBX, EAX
  9047. CALL TControl.GetClientWidth
  9048. PUSH EAX
  9049. MOV EAX, EBX
  9050. CALL TControl.GetWidth // EAX = Width
  9051. POP EDX // EDX = ClientWidth
  9052. SUB EAX, EDX // EAX = Width - ClientWidth
  9053. POP EDX // EDX = Value
  9054. ADD EDX, EAX // EDX = Value + Delta
  9055. XCHG EAX, EBX // EAX = @Self
  9056. CALL TControl.SetWidth
  9057. POP EBX
  9058. end;
  9059. function TControl.CenterOnParent: PControl;
  9060. asm
  9061. PUSHAD
  9062. XCHG ESI, EAX
  9063. MOV ECX, [ESI].fParent
  9064. JECXZ @@1
  9065. CMP [ESI].fIsControl, 0
  9066. JNZ @@2
  9067. @@1:
  9068. PUSH SM_CYSCREEN
  9069. CALL GetSystemMetrics
  9070. PUSH EAX
  9071. PUSH SM_CXSCREEN
  9072. CALL GetSystemMetrics
  9073. PUSH EAX
  9074. PUSH 0
  9075. PUSH 0 // ESP -> Rect( 0, 0, CX, CY )
  9076. JMP @@3
  9077. @@2: ADD ESP, -size_TRect
  9078. MOV EDX, ESP
  9079. XCHG EAX, ECX
  9080. CALL TControl.ClientRect
  9081. // ESP -> ClientRect
  9082. @@3: MOV EAX, ESI
  9083. CALL GetWindowHandle
  9084. MOV EAX, ESI
  9085. CALL GetWidth
  9086. POP EDX // left
  9087. ADD EAX, EDX // + width
  9088. POP EDI // top
  9089. POP EDX // right
  9090. SUB EDX, EAX
  9091. SAR EDX, 1
  9092. MOV EAX, ESI
  9093. CALL SetLeft
  9094. MOV EAX, ESI
  9095. CALL GetHeight
  9096. ADD EAX, EDI // height + top
  9097. POP EDX // bottom
  9098. SUB EDX, EAX
  9099. SAR EDX, 1
  9100. XCHG EAX, ESI
  9101. CALL SetTop
  9102. POPAD
  9103. end;
  9104. function TControl.GetHasBorder: Boolean;
  9105. const style_mask = WS_BORDER or WS_THICKFRAME or WS_DLGFRAME;
  9106. asm
  9107. CALL UpdateWndStyles
  9108. MOV EDX, [EAX].fStyle
  9109. AND EDX, style_mask
  9110. SETNZ DL
  9111. MOV EAX, [EAX].fExStyle
  9112. AND EAX, WS_EX_CLIENTEDGE
  9113. SETNZ AL
  9114. OR AL, DL
  9115. end;
  9116. function TControl.GetHasCaption: Boolean;
  9117. const style_mask1 = (WS_POPUP or WS_DLGFRAME) shr 16;
  9118. style_mask2 = WS_CAPTION shr 16;
  9119. asm
  9120. CALL UpdateWndStyles
  9121. MOV ECX, [EAX].fStyle + 2
  9122. MOV EDX, ECX
  9123. MOV AL, 1
  9124. AND DX, style_mask1
  9125. JZ @@1
  9126. AND CX, style_mask2
  9127. JNZ @@1
  9128. XOR EAX, EAX
  9129. @@1:
  9130. end;
  9131. procedure TControl.SetHasCaption(const Value: Boolean);
  9132. const style_mask = not (WS_BORDER or WS_THICKFRAME or WS_DLGFRAME or WS_CAPTION
  9133. or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU);
  9134. exstyle_mask = not (WS_EX_CONTROLPARENT or WS_EX_DLGMODALFRAME
  9135. or WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE);
  9136. asm
  9137. PUSH EAX
  9138. PUSH EDX
  9139. CALL GetHasCaption
  9140. POP ECX
  9141. CMP AL, CL
  9142. POP EAX
  9143. JZ @@exit // Value = HasCaption
  9144. MOV EDX, [EAX].fStyle
  9145. DEC CL
  9146. JNZ @@1 // if not Value -> @@1
  9147. AND EDX, not WS_POPUP
  9148. OR EDX, WS_CAPTION
  9149. JMP @@set_style
  9150. @@1:
  9151. CMP [EAX].fIsControl, 0
  9152. JNZ @@2 // if fIsControl -> @@2
  9153. AND EDX, not (WS_CAPTION or WS_SYSMENU)
  9154. OR EDX, WS_POPUP
  9155. JMP @@3
  9156. @@2:
  9157. AND EDX, not WS_CAPTION
  9158. OR EDX, WS_DLGFRAME
  9159. @@3:
  9160. PUSH EDX
  9161. MOV EDX, [EAX].fExStyle
  9162. OR EDX, WS_EX_DLGMODALFRAME
  9163. PUSH EAX
  9164. CALL SetExStyle
  9165. POP EAX
  9166. POP EDX
  9167. @@set_style:
  9168. CALL SetStyle
  9169. @@exit:
  9170. end;
  9171. function TControl.GetCanResize: Boolean;
  9172. asm
  9173. MOV AL, [EAX].fPreventResize
  9174. {$IFDEF PARANOIA} DB $34,$01 {$ELSE} XOR AL, 1 {$ENDIF}
  9175. end;
  9176. procedure TControl.SetCanResize( const Value: Boolean );
  9177. asm
  9178. PUSH EBX
  9179. MOV EBX, EAX
  9180. CALL GetCanResize
  9181. CMP AL, DL
  9182. JZ @@exit // Value = CanResize
  9183. MOV [EBX].fPreventResize, AL
  9184. {$IFDEF CANRESIZE_THICKFRAME}
  9185. TEST DL, DL
  9186. MOV EDX, [EBX].fStyle
  9187. JZ @@set_thick
  9188. OR EDX, WS_THICKFRAME
  9189. JMP @@set_style
  9190. @@set_thick:
  9191. AND EDX, not WS_THICKFRAME
  9192. @@set_style:
  9193. MOV EAX, EBX
  9194. CALL SetStyle
  9195. {$ENDIF CANRESIZE_THICKFRAME}
  9196. MOV EAX, EBX
  9197. CALL GetWindowHandle
  9198. MOV EAX, EBX
  9199. CALL GetWidth
  9200. MOV [EBX].FFixWidth, EAX
  9201. MOV EAX, EBX
  9202. CALL GetHeight
  9203. MOV [EBX].FFixHeight, EAX
  9204. XCHG EAX, EBX
  9205. MOV EDX, offset[WndProcCanResize]
  9206. CALL TControl.AttachProc
  9207. @@exit:
  9208. POP EBX
  9209. end;
  9210. function TControl.GetStayOnTop: Boolean;
  9211. asm
  9212. CALL UpdateWndStyles
  9213. TEST byte ptr [EAX].fExStyle, WS_EX_TOPMOST
  9214. SETNZ AL
  9215. end;
  9216. procedure TControl.SetStayOnTop(const Value: Boolean);
  9217. asm
  9218. PUSH EAX
  9219. PUSH EDX
  9220. CALL GetStayOnTop
  9221. POP ECX
  9222. MOVZX ECX, CL
  9223. CMP AL, CL
  9224. POP EAX
  9225. JZ @@exit // Value = StayOnTop
  9226. MOV EDX, [EAX].fHandle
  9227. TEST EDX, EDX
  9228. JZ @@1
  9229. PUSH SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE
  9230. XOR EAX, EAX
  9231. PUSH EAX
  9232. PUSH EAX
  9233. PUSH EAX
  9234. PUSH EAX
  9235. DEC ECX
  9236. DEC ECX
  9237. PUSH ECX
  9238. PUSH EDX
  9239. CALL SetWindowPos
  9240. RET
  9241. @@1:
  9242. JECXZ @@1and
  9243. OR byte ptr [EAX].fExStyle, WS_EX_TOPMOST
  9244. RET
  9245. @@1and: AND byte ptr [EAX].fExStyle, not WS_EX_TOPMOST
  9246. @@exit:
  9247. end;
  9248. function TControl.UpdateWndStyles: PControl;
  9249. asm
  9250. MOV ECX, [EAX].fHandle
  9251. JECXZ @@exit
  9252. PUSH EBX
  9253. XCHG EBX, EAX
  9254. PUSH GCL_STYLE
  9255. PUSH ECX
  9256. PUSH GWL_EXSTYLE
  9257. PUSH ECX
  9258. PUSH GWL_STYLE
  9259. PUSH ECX
  9260. CALL GetWindowLong
  9261. MOV [EBX].fStyle, EAX
  9262. CALL GetWindowLong
  9263. MOV [EBX].fExStyle, EAX
  9264. CALL GetClassLong
  9265. MOV [EBX].fClsStyle, EAX
  9266. XCHG EAX, EBX
  9267. POP EBX
  9268. @@exit:
  9269. end;
  9270. function TControl.GetChecked: Boolean;
  9271. asm
  9272. TEST [EAX].fBitBtnOptions, 8 //1 shl Ord(bboFixed)
  9273. JZ @@1
  9274. MOV AL, [EAX].fChecked
  9275. RET
  9276. @@1:
  9277. PUSH 0
  9278. PUSH 0
  9279. PUSH BM_GETCHECK
  9280. PUSH EAX
  9281. CALL Perform
  9282. @@exit:
  9283. end;
  9284. procedure TControl.Set_Checked(const Value: Boolean);
  9285. asm
  9286. TEST [EAX].fBitBtnOptions, 8 //1 shl Ord(bboFixed)
  9287. JZ @@1
  9288. MOV [EAX].fChecked, DL
  9289. JMP Invalidate
  9290. @@1:
  9291. PUSH 0
  9292. MOVZX EDX, DL
  9293. PUSH EDX
  9294. PUSH BM_SETCHECK
  9295. PUSH EAX
  9296. Call Perform
  9297. end;
  9298. function TControl.SetRadioCheckedOld: PControl;
  9299. asm
  9300. PUSH EAX
  9301. MOV ECX, [EAX].fParent
  9302. JECXZ @@exit
  9303. PUSH [EAX].fMenu
  9304. PUSH [ECX].fRadioLast
  9305. PUSH [ECX].fRadio1st
  9306. MOV EAX, ECX
  9307. CALL GetWindowHandle
  9308. PUSH EAX
  9309. CALL CheckRadioButton
  9310. @@exit:
  9311. POP EAX
  9312. end;
  9313. function TControl.SetRadioChecked: PControl;
  9314. asm
  9315. PUSH EAX
  9316. PUSH DWORD PTR[EAX].fTabStop
  9317. MOV [EAX].fTabStop, 0
  9318. @@1:
  9319. CALL DoClick
  9320. POP EDX
  9321. POP EAX
  9322. MOV [EAX].fTabStop, DL
  9323. end;
  9324. function TControl.GetSelStart: Integer;
  9325. asm
  9326. MOVZX ECX, [EAX].fCommandActions.aGetSelRange
  9327. JECXZ @@exit
  9328. XOR EDX, EDX
  9329. PUSH EDX // space for Result
  9330. PUSH EDX // 0
  9331. LEA EDX, [ESP+4]
  9332. PUSH EDX // @ Result
  9333. PUSH ECX // EM_GETSEL
  9334. PUSH EAX
  9335. CALL Perform
  9336. POP ECX // Result
  9337. @@exit:
  9338. XCHG EAX, ECX
  9339. end;
  9340. function TControl.GetSelLength: Integer;
  9341. asm
  9342. XOR EDX, EDX
  9343. MOVZX ECX, word ptr[EAX].fCommandActions.aGetSelCount
  9344. JECXZ @@ret_ecx
  9345. CMP CX, EM_GETSEL
  9346. JNZ @@1
  9347. PUSH EDX
  9348. PUSH EDX
  9349. MOV EDX, ESP
  9350. PUSH EDX
  9351. ADD EDX, 4
  9352. PUSH EDX
  9353. PUSH ECX
  9354. PUSH EAX
  9355. CALL Perform
  9356. POP ECX
  9357. POP EDX
  9358. SUB ECX, EDX
  9359. @@ret_ecx:
  9360. XCHG EAX, ECX
  9361. RET
  9362. @@1: // LB_GETSELCOUNT, LVM_GETSELECTEDCOUNT
  9363. PUSH EDX // 0
  9364. PUSH EDX // 0
  9365. PUSH ECX // aGetSelCount
  9366. PUSH EAX // Handle
  9367. CALL Perform
  9368. @@fin_EAX:
  9369. end;
  9370. procedure TControl.SetSelLength(const Value: Integer);
  9371. asm
  9372. PUSH EBP
  9373. MOV EBP, ESP
  9374. PUSH EAX
  9375. PUSH EDX
  9376. CALL GetSelStart
  9377. POP ECX
  9378. POP EDX
  9379. ADD ECX, EAX
  9380. PUSH ECX
  9381. MOVZX ECX, [EDX].fCommandActions.aSetSelRange
  9382. JECXZ @@check_ex
  9383. PUSH EAX
  9384. JMP @@perform
  9385. @@check_ex:
  9386. MOVZX ECX, [EDX].fCommandActions.aExSetSelRange
  9387. JECXZ @@exit
  9388. PUSH EAX
  9389. PUSH ESP
  9390. PUSH 0
  9391. @@perform:
  9392. PUSH ECX
  9393. PUSH EDX
  9394. CALL Perform
  9395. @@exit: MOV ESP, EBP
  9396. POP EBP
  9397. end;
  9398. {$IFDEF ASM_UNICODE}
  9399. function TControl.GetItems(Idx: Integer): String;
  9400. asm
  9401. PUSH ESI
  9402. PUSH EDI
  9403. PUSH EBX
  9404. PUSH EBP
  9405. MOV EBP, ESP
  9406. MOV EBX, EAX // @Self
  9407. MOV ESI, EDX // Idx
  9408. MOV EDI, ECX // @Result
  9409. CALL Item2Pos
  9410. PUSH 0 // push 0
  9411. PUSH EAX // store Pos
  9412. XCHG EDX, EAX
  9413. MOV EAX, EBX
  9414. CALL Pos2Item // EAX = Idx'
  9415. XCHG ESI, EAX // ESI = Idx'
  9416. XOR EAX, EAX
  9417. MOVZX ECX, [EBX].fCommandActions.aGetItemLength
  9418. JECXZ @@ret_empty
  9419. PUSH ECX // push aGetItemLength
  9420. PUSH EBX
  9421. CALL Perform
  9422. TEST EAX, EAX
  9423. JZ @@ret_empty
  9424. PUSH EAX // save L
  9425. ADD EAX, 4
  9426. CALL System.@GetMem // GetMem( L+4 )
  9427. POP EDX // restore L
  9428. LEA ECX, [EDX+1]
  9429. MOV dword ptr [EAX], ECX
  9430. MOVZX ECX, [EBX].fCommandActions.aGetItemText
  9431. JECXZ @@ret_buf
  9432. PUSH EDX // save L
  9433. //MOV word ptr [EAX], DX
  9434. PUSH EAX
  9435. PUSH EAX // push Buf
  9436. PUSH ESI // push Idx
  9437. PUSH ECX // push aGetItemText
  9438. PUSH EBX
  9439. CALL Perform
  9440. POP EAX
  9441. POP EDX
  9442. @@ret_buf:
  9443. MOV byte ptr [EAX + EDX], 0 // Buf[ L ] := #0
  9444. @@ret_empty: // EAX = 0
  9445. XCHG EDX, EAX
  9446. MOV EAX, EDI
  9447. PUSH EDX
  9448. CALL System.@LStrFromPChar
  9449. POP ECX
  9450. JECXZ @@exit
  9451. XCHG EAX, ECX
  9452. CALL System.@FreeMem
  9453. @@exit:
  9454. MOV ESP, EBP
  9455. POP EBP
  9456. POP EBX
  9457. POP EDI
  9458. POP ESI
  9459. end;
  9460. {$ENDIF ASM_UNICODE}
  9461. {$IFDEF ASM_UNICODE}
  9462. procedure TControl.SetItems(Idx: Integer; const Value: String);
  9463. asm
  9464. PUSH EDI
  9465. PUSH EBX
  9466. XCHG EBX, EAX
  9467. XCHG EDI, EDX // EDI = Idx
  9468. CALL ECX2PChar
  9469. PUSH ECX // @Value[1]
  9470. MOVZX ECX, [EBX].fCommandActions.aSetItemText
  9471. JECXZ @@1
  9472. PUSH 0
  9473. PUSH ECX
  9474. MOV EDX, EDI
  9475. MOV EAX, EBX
  9476. CALL Item2Pos
  9477. PUSH EAX // store Strt
  9478. MOV EDX, EDI
  9479. INC EDX
  9480. MOV EAX, EBX
  9481. CALL Item2Pos
  9482. POP EDX // EDX = Strt
  9483. SUB EAX, EDX
  9484. PUSH EAX // store L
  9485. MOV EAX, EBX
  9486. CALL SetSelStart
  9487. POP EDX // EDX = L
  9488. PUSH EBX // prepare @Self for Perform
  9489. XCHG EAX, EBX
  9490. CALL SetSelLength
  9491. // @Value[1] already in stack,
  9492. // 0 already in stack
  9493. // aSetItemText already in stack
  9494. // @Self already in stack
  9495. CALL Perform
  9496. JMP @@exit
  9497. @@1: // @Value[1] in stack already
  9498. POP EDX
  9499. MOVZX ECX, [EBX].fCommandActions.aDeleteItem
  9500. JECXZ @@exit
  9501. {$IFNDEF NOT_FIX_CURINDEX}
  9502. PUSH ESI
  9503. PUSH EBP
  9504. PUSH EDX
  9505. MOV EAX, EBX // +AK
  9506. CALL GetCurIndex // +AK
  9507. XCHG ESI, EAX // ESI = TmpCurIdx
  9508. MOV EAX, EBX
  9509. MOV EDX, EDI
  9510. CALL GetItemData
  9511. XCHG EBP, EAX // EBP = TmpData
  9512. MOV EDX, EDI
  9513. MOV EAX, EBX
  9514. CALL Delete
  9515. MOV EAX, EBX // *AK
  9516. MOV EDX, EDI
  9517. POP ECX
  9518. CALL Insert
  9519. MOV ECX, EBP // ECX = TmpData
  9520. MOV EDX, EDI
  9521. MOV EAX, EBX
  9522. CALL SetItemData
  9523. XCHG EAX, EBX // +AK
  9524. MOV EDX, ESI // +AK
  9525. CALL SetCurIndex // +AK
  9526. POP EBP
  9527. POP ESI
  9528. {$ELSE NOT_FIX_CURINDEX}
  9529. PUSH EDX
  9530. MOV EDX, EDI
  9531. MOV EAX, EBX
  9532. CALL Delete
  9533. XCHG EAX, EBX
  9534. XCHG EDX, EDI
  9535. POP ECX
  9536. CALL Insert
  9537. {$ENDIF NOT_FIX_CURINDEX}
  9538. @@exit:
  9539. POP EBX
  9540. POP EDI
  9541. end;
  9542. {$ENDIF ASM_UNICODE}
  9543. function TControl.GetItemsCount: Integer;
  9544. asm
  9545. PUSH 0
  9546. MOVZX ECX, [EAX].fCommandActions.aGetCount
  9547. JECXZ @@ret_0
  9548. PUSH 0
  9549. PUSH ECX
  9550. PUSH EAX
  9551. CALL Perform
  9552. PUSH EAX
  9553. @@ret_0:
  9554. POP EAX
  9555. end;
  9556. procedure HelpConvertItem2Pos;
  9557. asm
  9558. JECXZ @@exit
  9559. PUSH 0
  9560. PUSH EDX
  9561. PUSH ECX
  9562. PUSH EAX
  9563. CALL TControl.Perform
  9564. {XOR EDX, EDX
  9565. TEST EAX, EAX
  9566. JL @@exit
  9567. RET}
  9568. XCHG EDX, EAX
  9569. @@exit:
  9570. XCHG EAX, EDX
  9571. end;
  9572. function TControl.Item2Pos(ItemIdx: Integer): DWORD;
  9573. asm
  9574. MOVZX ECX, [EAX].fCommandActions.aItem2Pos
  9575. JMP HelpConvertItem2Pos
  9576. end;
  9577. function TControl.Pos2Item(Pos: Integer): DWORD;
  9578. asm
  9579. MOVZX ECX, [EAX].fCommandActions.aPos2Item
  9580. JMP HelpConvertItem2Pos
  9581. end;
  9582. {$IFDEF ASM_UNICODE}
  9583. function TControl.Add(const S: KOLString): Integer;
  9584. asm
  9585. PUSH EBX
  9586. MOV EBX, EAX // EBX = @Self
  9587. MOVZX ECX, [EBX].fCommandActions.aAddItem // ECX = aAddItem
  9588. JECXZ @@chk_addtext
  9589. CALL EDX2PChar
  9590. PUSH EDX
  9591. PUSH 0
  9592. PUSH ECX
  9593. PUSH EBX
  9594. CALL Perform
  9595. PUSH EAX
  9596. MOV EAX, EBX
  9597. CALL TControl.GetItemsCount
  9598. XCHG EAX, ECX
  9599. LOOP @@ret_EAX
  9600. XCHG EAX, EBX
  9601. INC ECX
  9602. XOR EDX, EDX
  9603. CALL TControl.SetItemSelected
  9604. @@ret_EAX:
  9605. POP EAX
  9606. JMP @@exit
  9607. @@chk_addtext:
  9608. MOV ECX, [EBX].fCommandActions.aAddText
  9609. JECXZ @@add_text_simple
  9610. CALL ECX
  9611. JMP @@exit_0
  9612. @@add_text_simple:
  9613. LEA EAX, [EBX].fCaption
  9614. CALL System.@LStrCat
  9615. MOV EDX, [EBX].fCaption
  9616. MOV EAX, EBX
  9617. CALL SetCaption
  9618. @@exit_0:
  9619. XOR EAX, EAX
  9620. @@exit:
  9621. POP EBX
  9622. end;
  9623. {$ENDIF}
  9624. procedure TControl.Delete(Idx: Integer);
  9625. asm
  9626. MOVZX ECX, [EAX].fCommandActions.aDeleteItem
  9627. JECXZ @@exit
  9628. PUSH 0
  9629. PUSH EDX
  9630. PUSH ECX
  9631. PUSH EAX
  9632. CALL Perform
  9633. @@exit:
  9634. end;
  9635. {$IFDEF ASM_UNICODE}
  9636. function TControl.Insert(Idx: Integer; const S: String): Integer;
  9637. asm
  9638. CALL ECX2PChar
  9639. PUSH ECX
  9640. MOVZX ECX, [EAX].fCommandActions.aInsertItem
  9641. JECXZ @@exit_1
  9642. PUSH EDX
  9643. PUSH ECX
  9644. PUSH EAX
  9645. CALL Perform
  9646. RET
  9647. @@exit_1:OR EAX, -1
  9648. POP ECX
  9649. end;
  9650. {$ENDIF ASM_UNICODE}
  9651. function TControl.GetItemSelected(ItemIdx: Integer): Boolean;
  9652. asm
  9653. MOVZX ECX, [EAX].fCommandActions.aGetSelected
  9654. JECXZ @@check_range
  9655. PUSH 1
  9656. CMP CL, CB_GETCURSEL and $FF
  9657. JNZ @@1
  9658. MOV [ESP], EDX
  9659. @@1:
  9660. PUSH LVIS_SELECTED // 2
  9661. PUSH EDX
  9662. PUSH ECX
  9663. PUSH EAX
  9664. CALL Perform
  9665. POP EDX
  9666. CMP EAX, EDX
  9667. SETZ AL
  9668. RET
  9669. @@check_range:
  9670. PUSH EBX
  9671. PUSH ESI
  9672. XCHG ESI, EDX
  9673. MOV EBX, EAX
  9674. CALL GetSelStart
  9675. XCHG EBX, EAX
  9676. CALL GetSelLength
  9677. SUB ESI, EBX
  9678. JL @@ret_false
  9679. CMP EAX, ESI
  9680. @@ret_false:
  9681. SETGE AL
  9682. POP ESI
  9683. POP EBX
  9684. end;
  9685. procedure TControl.SetItemSelected(ItemIdx: Integer; const Value: Boolean);
  9686. asm
  9687. PUSH EDX
  9688. PUSH ECX
  9689. MOVZX ECX, [EAX].fCommandActions.aSetSelected
  9690. JECXZ @@chk_aSetCurrent
  9691. @@0:
  9692. PUSH ECX
  9693. PUSH EAX
  9694. CALL Perform
  9695. RET
  9696. @@chk_aSetCurrent:
  9697. POP ECX
  9698. MOVZX ECX, [EAX].fCommandActions.aSetCurrent
  9699. JECXZ @@chk_aSetSelRange
  9700. POP EDX
  9701. PUSH 0
  9702. JMP @@3
  9703. @@chk_aSetSelRange:
  9704. MOVZX ECX, [EAX].fCommandActions.aSetSelRange
  9705. JECXZ @@chk_aExSetSelRange
  9706. @@3:
  9707. PUSH EDX
  9708. JMP @@0
  9709. @@else: MOV [EAX].FCurIndex, EDX
  9710. CALL Invalidate
  9711. JMP @@exit
  9712. @@chk_aExSetSelRange:
  9713. MOVZX ECX, [EAX].fCommandActions.aExSetSelRange
  9714. JECXZ @@else
  9715. PUSH EDX
  9716. PUSH ESP
  9717. PUSH 0
  9718. PUSH ECX
  9719. PUSH EAX
  9720. CALL Perform
  9721. POP ECX
  9722. @@exit:
  9723. POP ECX
  9724. end;
  9725. procedure TControl.SetCtl3D(const Value: Boolean);
  9726. asm
  9727. MOV [EAX].fCtl3Dchild, DL
  9728. //CMP [EAX].fCtl3D, DL
  9729. //JE @@exit
  9730. MOV [EAX].fCtl3D, DL
  9731. PUSHAD
  9732. CALL UpdateWndStyles
  9733. POPAD
  9734. MOV ECX, [EAX].fExStyle
  9735. DEC DL
  9736. MOV EDX, [EAX].fStyle
  9737. JNZ @@1
  9738. AND EDX, not WS_BORDER
  9739. OR CH, WS_EX_CLIENTEDGE shr 8
  9740. JMP @@2
  9741. @@1:
  9742. OR EDX, WS_BORDER
  9743. AND CH, not(WS_EX_CLIENTEDGE shr 8)
  9744. @@2:
  9745. PUSH ECX
  9746. PUSH EAX
  9747. CALL SetStyle
  9748. POP EAX
  9749. POP EDX
  9750. JMP SetExStyle
  9751. @@exit:
  9752. end;
  9753. function TControl.Shift(dX, dY: Integer): PControl;
  9754. asm
  9755. PUSHAD
  9756. ADD EDX, [EAX].fBoundsRect.TRect.Left
  9757. CALL SetLeft
  9758. POPAD
  9759. PUSH EAX
  9760. MOV EDX, [EAX].fBoundsRect.TRect.Top
  9761. ADD EDX, ECX
  9762. CALL SetTop
  9763. POP EAX
  9764. end;
  9765. function CollectTabControls( Form: PControl ): PList;
  9766. asm
  9767. PUSH EDI
  9768. PUSH EAX
  9769. CALL NewList
  9770. XCHG EDI, EAX
  9771. POP EAX
  9772. CALL @@collecttab
  9773. XCHG EAX, EDI
  9774. POP EDI
  9775. RET
  9776. @@collecttab:
  9777. { <- EDI = Result:PList
  9778. EAX = Form (or Control)
  9779. }
  9780. PUSH EBP
  9781. XOR EBP, EBP // Result := FALSE;
  9782. PUSH ESI
  9783. PUSH EBX
  9784. MOV EDX, [EAX].TControl.fChildren
  9785. MOV ECX, [EDX].TList.fCount
  9786. MOV ESI, [EDX].TList.fItems
  9787. JECXZ @@e_loop
  9788. @@loo: PUSH ECX
  9789. LODSD
  9790. PUSH EAX
  9791. TEST byte ptr [EAX].TControl.fStyle+2, WS_TABSTOP shr 16
  9792. JZ @@call_recur
  9793. MOV DL, [EAX].TControl.fTabStop
  9794. AND DL, [EAX].TControl.fEnabled
  9795. JZ @@call_recur
  9796. CALL TControl.GetToBeVisible
  9797. TEST AL, AL
  9798. POP EAX
  9799. JZ @@next
  9800. PUSH EAX
  9801. XCHG EDX, EAX
  9802. PUSH ESI
  9803. MOV ECX, [EDI].TList.fCount
  9804. MOV ESI, [EDI].TList.fItems
  9805. XOR EBX, EBX
  9806. JECXZ @@e_loo2
  9807. @@loo2: LODSD
  9808. MOV EAX, [EAX].TControl.fTabOrder
  9809. CMP EAX, [EDX].TControl.fTabOrder
  9810. JLE @@next2
  9811. POP ESI
  9812. MOV ECX, EDX
  9813. MOV EDX, EBX
  9814. MOV EAX, EDI
  9815. CALL TList.Insert
  9816. JMP @@call_recur
  9817. @@next2: INC EBX
  9818. LOOP @@loo2
  9819. @@e_loo2:
  9820. POP ESI
  9821. MOV EAX, EDI
  9822. CALL TList.Add
  9823. @@call_recur:
  9824. OR EBP, 1 // Result := TRUE;
  9825. POP EAX
  9826. MOVZX ECX, [EAX].TControl.fEnabled
  9827. JECXZ @@next
  9828. PUSH EAX
  9829. CALL @@collecttab
  9830. POP EDX
  9831. JZ @@next
  9832. MOV EAX, EDI
  9833. CALL TList.Remove
  9834. @@next: POP ECX
  9835. LOOP @@loo
  9836. @@e_loop:
  9837. POP EBX
  9838. POP ESI
  9839. TEST EBP, EBP
  9840. POP EBP
  9841. end;
  9842. procedure Tabulate2Next( Form: PControl; Dir: Integer );
  9843. asm
  9844. PUSHAD
  9845. PUSH EAX // save Form
  9846. MOV EBX, EAX
  9847. MOV EBP, EDX // EBP = Dir (direction <0 or >0)
  9848. CALL CollectTabControls
  9849. XCHG EDI, EAX // EDI = CL (list of controls)
  9850. MOV ECX, [EBX].TControl.fCurrentControl // C := Form.fCurrentControl
  9851. XOR EBX, EBX // I = 0
  9852. JECXZ @@1
  9853. MOV EBX, [ECX].TControl.fTabOrder // I = C.fTabOrder
  9854. @@1:
  9855. MOV ECX, [EDI].TList.fCount
  9856. MOV ESI, [EDI].TList.fItems
  9857. XOR EDX, EDX
  9858. PUSH EDX // Ctrl1 = nil
  9859. PUSH EDX // Ctrl2 = nil
  9860. TEST ECX, ECX
  9861. JZ @@e_loop
  9862. @@loop: PUSH ECX
  9863. LODSD
  9864. CMP [EAX].TControl.fTabOrder, EBX
  9865. JZ @@next
  9866. MOV ECX, [ESP+8] // ECX = Ctrl1
  9867. JECXZ @@c1nil
  9868. MOV ECX, [ECX].TControl.fTabOrder // ECX = Ctrl1.fTabOrder
  9869. TEST EBP, EBP
  9870. JGE @@c1ge
  9871. CMP [EAX].TControl.fTabOrder, EBX
  9872. JGE @@2
  9873. CMP [EAX].TControl.fTabOrder, ECX
  9874. JLE @@2
  9875. @@c1new:
  9876. MOV [ESP+8], EAX // Ctrl1 := C
  9877. JMP @@2
  9878. @@c1ge: CMP [EAX].TControl.fTabOrder, EBX
  9879. JLE @@2
  9880. CMP [EAX].TControl.fTabOrder, ECX
  9881. JL @@c1new
  9882. JMP @@2
  9883. @@c1nil:
  9884. TEST EBP, EBP
  9885. JL @@c1nil_dirL
  9886. CMP [EAX].TControl.fTabOrder, EBX
  9887. JG @@c1new
  9888. JMP @@2
  9889. @@c1nil_dirL:
  9890. CMP [EAX].TControl.fTabOrder, EBX
  9891. JL @@c1new
  9892. @@2:
  9893. MOV ECX, [ESP+4] // ECX = Ctrl2
  9894. JECXZ @@c2new
  9895. MOV ECX, [ECX].TControl.fTabOrder
  9896. TEST EBP, EBP
  9897. JL @@c2dirL
  9898. CMP [EAX].TControl.fTabOrder, ECX
  9899. JGE @@next
  9900. JMP @@c2new
  9901. @@c2dirL:
  9902. CMP [EAX].TControl.fTabOrder, ECX
  9903. JLE @@next
  9904. @@c2new:
  9905. MOV [ESP+4], EAX
  9906. @@next: POP ECX
  9907. DEC ECX
  9908. JNZ @@loop
  9909. //LOOP @@loop
  9910. @@e_loop:
  9911. POP EDX // Ctrl2
  9912. POP ECX // Ctrl1
  9913. INC ECX
  9914. LOOP @@3
  9915. MOV ECX, EDX
  9916. @@3:
  9917. POP EBX // EBX = Form
  9918. JECXZ @@exit
  9919. XCHG EAX, ECX
  9920. {$IFDEF USE_GRAPHCTLS}
  9921. CMP [EAX].TControl.fWindowed, 0
  9922. JZ @@4
  9923. {$ENDIF}
  9924. MOV ECX, [EAX].TControl.fHandle
  9925. JECXZ @@no_handle
  9926. @@4:
  9927. INC [EAX].TControl.fClickDisabled
  9928. PUSH EAX
  9929. MOV DL, 1
  9930. CALL TControl.SetFocused
  9931. POP EAX
  9932. DEC [EAX].TControl.fClickDisabled
  9933. @@no_handle:
  9934. MOV [EBX].TControl.fCurrentControl, EAX
  9935. @@exit:
  9936. XCHG EAX, EDI
  9937. CALL TObj.RefDec
  9938. POPAD
  9939. end;
  9940. function Tabulate2Control( Self_: PControl; Key: DWORD; checkOnly: Boolean ): Boolean;
  9941. const tk_Tab = 1;
  9942. tk_LR = 2;
  9943. tk_UD = 4;
  9944. tk_PuPd= 8;
  9945. asm
  9946. PUSH ESI
  9947. MOV ESI, offset[@@data]
  9948. PUSH EAX
  9949. MOV AH, 9
  9950. @@loop:
  9951. LODSB
  9952. CMP DL, AL
  9953. JE @@1
  9954. LODSB
  9955. CMP DL, AL
  9956. JE @@2
  9957. ADD AH, AH
  9958. JNB @@loop
  9959. POP EAX
  9960. @@exit0:
  9961. XOR EAX, EAX
  9962. JMP @@exit
  9963. @@data:
  9964. DB -1, VK_TAB, VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT
  9965. @@1:
  9966. OR EDX, -1
  9967. JMP @@3
  9968. @@2:
  9969. XOR EDX, EDX
  9970. TEST AH, 1
  9971. JZ @@3
  9972. PUSH ECX
  9973. PUSH EAX
  9974. PUSH VK_SHIFT
  9975. CALL GetKeyState
  9976. CWDE
  9977. XCHG EDX, EAX
  9978. POP EAX
  9979. POP ECX
  9980. @@3:
  9981. POP ESI
  9982. MOV AL, AH
  9983. {$IFDEF PARANOIA} DB $24, 1 {$ELSE} AND AL, 1 {$ENDIF}
  9984. TEST byte ptr [ESI].TControl.fLookTabKeys, AL
  9985. JZ @@exit0
  9986. TEST CL, CL
  9987. JNZ @@exit
  9988. PUSH EDX
  9989. MOV EAX, ESI
  9990. CALL TControl.ParentForm
  9991. POP EDX
  9992. CALL Tabulate2Next
  9993. @@exit:
  9994. POP ESI
  9995. end;
  9996. function Tabulate2ControlEx( Self_: PControl; Key: DWORD; checkOnly: Boolean ): Boolean;
  9997. asm
  9998. PUSH EDI
  9999. MOVZX EDI, CL
  10000. TEST byte ptr [EAX].TControl.fLookTabKeys, 1
  10001. JZ @@1
  10002. @@0:
  10003. MOV ECX, EDX
  10004. AND CL, 7Fh
  10005. CMP CL, VK_TAB
  10006. JNE @@1
  10007. PUSH EDX
  10008. CALL TControl.ParentForm
  10009. POP EDX
  10010. MOVSX EDX, DL
  10011. TEST EDX, EDX
  10012. JS @@tab
  10013. PUSH EAX
  10014. PUSH VK_SHIFT
  10015. CALL GetAsyncKeyState
  10016. SAR EAX, 31
  10017. {$IFDEF PARANOIA} DB $0C, $01 {$ELSE} OR AL, 1 {$ENDIF}
  10018. MOV EDX, EAX
  10019. POP EAX
  10020. @@tab:
  10021. TEST EDI, EDI
  10022. POP EDI
  10023. JNZ @@no_tab
  10024. CALL Tabulate2Next
  10025. @@no_tab:
  10026. MOV AL, 1
  10027. RET
  10028. @@data: DB VK_LEFT, VK_LEFT
  10029. DD offset[@@left]
  10030. DB VK_UP, 2
  10031. DB VK_RIGHT, VK_RIGHT
  10032. DD offset[@@right]
  10033. DB VK_DOWN, 2
  10034. DB VK_UP, VK_PRIOR
  10035. DD offset[@@up]
  10036. DB VK_TAB or 80h, $C
  10037. DB VK_DOWN, VK_NEXT
  10038. DD offset[@@down]
  10039. DB VK_TAB, $C
  10040. @@1:
  10041. // EAX <- Self_:PControl
  10042. // DL <- Key
  10043. PUSH ESI
  10044. MOV ESI, offset[@@data]-6
  10045. MOV DH, 9
  10046. PUSH EAX
  10047. @@loop:
  10048. ADD DH, DH
  10049. JNB @@l1
  10050. JMP @@abort
  10051. @@fault1:
  10052. POP EDI
  10053. POPAD
  10054. PUSH EAX
  10055. @@abort:
  10056. POP EAX
  10057. @@abort1:
  10058. POP ESI
  10059. POP EDI
  10060. XOR EAX, EAX
  10061. RET
  10062. @@right:
  10063. MOV EAX, [ESP].TRect.Left
  10064. SUB EAX, [ESP+16].TRect.Left
  10065. @@left_right:
  10066. JL @@next1
  10067. MOV EDX, [ESP].TRect.Bottom
  10068. SUB EDX, [ESP+16].TRect.Top
  10069. JL @@next1
  10070. MOV EDX, [ESP].TRect.Top
  10071. SUB EDX, [ESP+16].TRect.Bottom
  10072. JGE @@next1
  10073. @@chk_dist:
  10074. CMP EAX, EDI
  10075. JA @@next1
  10076. MOV EDI, EAX
  10077. MOV EAX, [EBX+ECX*4-4]
  10078. MOV [ESP+36], EAX // Found = Ctrl
  10079. JMP @@next1
  10080. @@l1:
  10081. LODSD
  10082. LODSW
  10083. LODSW
  10084. CMP AL, DL
  10085. JE @@2
  10086. CMP AH, DL
  10087. JNE @@loop
  10088. @@2:
  10089. PUSH ESI
  10090. LODSD
  10091. LODSW
  10092. POP ESI
  10093. XCHG EDX, EAX
  10094. POP EAX
  10095. TEST [EAX].TControl.fLookTabKeys, DH
  10096. JZ @@abort1
  10097. PUSHAD
  10098. PUSH EDI
  10099. CALL TControl.ParentForm
  10100. MOV ECX, [EAX].TControl.fCurrentControl
  10101. JECXZ @@fault1
  10102. MOV EBP, ECX // EBP = CurCtrl
  10103. PUSH EAX // save Form
  10104. MOV EBX, EAX
  10105. CALL CollectTabControls
  10106. PUSH 0 // save Found = nil
  10107. PUSH EAX // save CollectedList
  10108. MOV EDI, EAX
  10109. MOV EBX, [EDI].TList.fItems
  10110. ADD ESP, -16
  10111. PUSH ESP
  10112. PUSH [EBP].TControl.fHandle
  10113. CALL GetWindowRect
  10114. MOV ECX, [EDI].TList.fCount
  10115. OR EDI, -1 // EDI = minDist
  10116. @@loop1:
  10117. MOV EAX, [EBX+ECX*4-4]
  10118. CMP EAX, EBP
  10119. JE @@next
  10120. {}
  10121. MOV DL, [EAX].TControl.fEnabled
  10122. AND DL, [EAX].TControl.fTabstop
  10123. JZ @@next
  10124. {}
  10125. ADD ESP, -16
  10126. MOV EDX, ESP
  10127. PUSH ECX
  10128. PUSH EDX
  10129. PUSH [EAX].TControl.fHandle
  10130. CALL GetWindowRect
  10131. POP ECX
  10132. JMP dword ptr [ESI]
  10133. @@left:
  10134. MOV EAX, [ESP+16].TRect.Left
  10135. SUB EAX, [ESP].TRect.Left
  10136. JMP @@left_right
  10137. @@not_found:
  10138. POP EDI
  10139. POPAD
  10140. MOV DL, [ESI+4]
  10141. POP ESI
  10142. JMP @@0
  10143. @@up:
  10144. MOV EAX, [ESP+16].TRect.Top
  10145. SUB EAX, [ESP].TRect.Top
  10146. JMP @@up_down
  10147. @@down:
  10148. MOV EAX, [ESP].TRect.Top
  10149. SUB EAX, [ESP+16].TRect.Top
  10150. @@up_down:
  10151. JL @@next1
  10152. MOV EDX, [ESP].TRect.Right
  10153. SUB EDX, [ESP+16].TRect.Left
  10154. JL @@next1
  10155. MOV EDX, [ESP].TRect.Left
  10156. SUB EDX, [ESP+16].TRect.Right
  10157. JL @@chk_dist
  10158. @@next1:
  10159. ADD ESP, 16
  10160. @@next:
  10161. LOOP @@loop1
  10162. ADD ESP, 16
  10163. POP EAX // pop CollectedList
  10164. CALL TObj.RefDec
  10165. POP ECX // pop Found
  10166. POP EAX // pop Form
  10167. JECXZ @@not_found
  10168. POP EDI
  10169. TEST EDI, EDI
  10170. JNZ @@no_go
  10171. MOV [EAX].TControl.fCurrentControl, ECX
  10172. INC [ECX].TControl.fClickDisabled
  10173. PUSH ECX
  10174. MOV ECX, [ECX].TControl.fHandle
  10175. JECXZ @@4
  10176. PUSH ECX
  10177. CALL Windows.SetFocus
  10178. @@4: POP ECX
  10179. DEC [ECX].TControl.fClickDisabled
  10180. @@no_go:
  10181. POPAD
  10182. POP ESI
  10183. POP EDI
  10184. MOV AL, 1 // Result = True
  10185. end;
  10186. function TControl.Tabulate: PControl;
  10187. asm
  10188. PUSH EAX
  10189. CALL ParentForm
  10190. TEST EAX, EAX
  10191. JZ @@exit
  10192. MOV [EAX].fGotoControl, offset[Tabulate2Control]
  10193. @@exit: POP EAX
  10194. end;
  10195. function TControl.TabulateEx: PControl;
  10196. asm
  10197. PUSH EAX
  10198. CALL ParentForm
  10199. TEST EAX, EAX
  10200. JZ @@exit
  10201. MOV [EAX].fGotoControl, offset[Tabulate2ControlEx]
  10202. @@exit: POP EAX
  10203. end;
  10204. function TControl.GetCurIndex: Integer;
  10205. asm
  10206. PUSH EBX
  10207. XCHG EBX, EAX
  10208. MOV EAX, [EBX].fCurIndex
  10209. MOVZX ECX, [EBX].fCommandActions.aGetCurrent
  10210. JECXZ @@exit
  10211. XOR EAX, EAX
  10212. CDQ
  10213. CMP CX, LVM_GETNEXTITEM
  10214. JNE @@0
  10215. INC EAX
  10216. INC EAX
  10217. JMP @@1
  10218. @@0:
  10219. CMP CL, EM_LINEINDEX and $FF
  10220. JNZ @@2
  10221. @@1:
  10222. DEC EDX
  10223. @@2:
  10224. PUSH EAX
  10225. PUSH EDX
  10226. PUSH ECX
  10227. PUSH EBX
  10228. CALL Perform
  10229. @@exit: POP EBX
  10230. end;
  10231. procedure TControl.SetCurIndex(const Value: Integer);
  10232. asm
  10233. MOVZX ECX, [EAX].fCommandActions.aSetCurrent
  10234. JECXZ @@set_item_sel
  10235. PUSHAD
  10236. PUSH 0
  10237. PUSH EDX
  10238. PUSH ECX
  10239. PUSH EAX
  10240. CALL Perform
  10241. POPAD
  10242. CMP CX, TCM_SETCURSEL
  10243. JNE @@exit
  10244. PUSH TCN_SELCHANGE
  10245. PUSH EAX // idfrom doesn't matter
  10246. PUSH [EAX].fHandle
  10247. PUSH ESP
  10248. PUSH 0
  10249. PUSH WM_NOTIFY
  10250. PUSH EAX
  10251. CALL Perform
  10252. POP ECX
  10253. POP ECX
  10254. POP ECX
  10255. @@exit:
  10256. RET
  10257. @@set_item_sel:
  10258. INC ECX
  10259. CALL SetItemSelected
  10260. end;
  10261. function TControl.GetTextAlign: TTextAlign;
  10262. asm
  10263. PUSH EAX
  10264. CALL UpdateWndStyles
  10265. MOV ECX, [EAX].fStyle
  10266. MOV EDX, dword ptr [EAX].fCommandActions.aTextAlignRight
  10267. XOR EAX, EAX
  10268. AND DX, CX
  10269. JNZ @@ret_1
  10270. SHR EDX, 16
  10271. AND ECX, EDX
  10272. JNZ @@ret_2
  10273. POP EAX
  10274. MOVZX EAX, [EAX].fTextAlign
  10275. RET
  10276. @@ret_2:INC EAX
  10277. @@ret_1:INC EAX
  10278. @@ret_0:POP ECX
  10279. end;
  10280. procedure TControl.SetTextAlign(const Value: TTextAlign);
  10281. asm
  10282. MOV [EAX].fTextAlign, DL
  10283. XOR ECX, ECX
  10284. MOV CX, [EAX].fCommandActions.aTextAlignLeft
  10285. OR CX, [EAX].fCommandActions.aTextAlignCenter
  10286. OR CX, [EAX].fCommandActions.aTextAlignRight
  10287. NOT ECX
  10288. AND ECX, [EAX].fStyle
  10289. AND EDX, 3
  10290. OR CX, [EAX + EDX * 2].fCommandActions.aTextAlignLeft
  10291. MOV DL, [EAX].fCommandActions.aTextAlignMask
  10292. NOT EDX
  10293. AND EDX, ECX
  10294. CALL SetStyle
  10295. end;
  10296. function TControl.GetVerticalAlign: TVerticalAlign;
  10297. asm
  10298. PUSH EAX
  10299. CALL UpdateWndStyles
  10300. MOV EDX, dword ptr [EAX].fCommandActions.aVertAlignCenter
  10301. MOV ECX, [EAX].fStyle
  10302. XOR EAX, EAX
  10303. MOV DH, DL
  10304. AND DL, CH
  10305. JZ @@1
  10306. CMP DL, DH
  10307. JE @@ret_0
  10308. @@1: SHR EDX, 16
  10309. MOV DH, DL
  10310. AND DL, CH
  10311. JZ @@2
  10312. CMP DL, DH
  10313. JE @@ret_2
  10314. @@2: POP EAX
  10315. MOVZX EAX, [EAX].fVerticalAlign
  10316. RET
  10317. @@ret_2:INC EAX
  10318. @@ret_1:INC EAX
  10319. @@ret_0:POP ECX
  10320. end;
  10321. procedure TControl.SetVerticalAlign(const Value: TVerticalAlign);
  10322. asm
  10323. PUSH EBX
  10324. MOVZX EBX, DL
  10325. MOV [EAX].fVerticalAlign, BL
  10326. MOV ECX, dword ptr [EAX].fCommandActions.aVertAlignCenter
  10327. OR CH, CL
  10328. SHR ECX, 8
  10329. OR CL, CH
  10330. NOT ECX
  10331. MOV EDX, [EAX].fStyle
  10332. AND DH, CL
  10333. OR DH, [EAX+EBX].fCommandActions.aVertAlignCenter
  10334. POP EBX
  10335. CALL SetStyle
  10336. end;
  10337. function TControl.Dc2Canvas( Sender: PCanvas ): HDC;
  10338. asm
  10339. MOV ECX, [EAX].fPaintDC
  10340. JECXZ @@chk_fHandle
  10341. PUSH ECX
  10342. XCHG EAX, EDX // EAX <= Sender
  10343. MOV EDX, ECX // EDX <= fPaintDC
  10344. PUSH EAX
  10345. CALL TCanvas.SetHandle
  10346. POP EAX
  10347. MOV [EAX].TCanvas.fIsPaintDC, 1
  10348. POP ECX
  10349. @@ret_ECX:
  10350. XCHG EAX, ECX
  10351. RET
  10352. @@chk_fHandle:
  10353. MOV ECX, [EDX].TCanvas.fHandle
  10354. INC ECX
  10355. LOOP @@ret_ECX
  10356. CALL GetWindowHandle
  10357. PUSH EAX
  10358. CALL GetDC
  10359. end;
  10360. function TControl.GetCanvas: PCanvas;
  10361. asm
  10362. PUSH EBX
  10363. PUSH ESI
  10364. XCHG EBX, EAX
  10365. MOV ESI, [EBX].fCanvas
  10366. TEST ESI, ESI
  10367. JNZ @@exit
  10368. XOR EAX, EAX
  10369. CALL NewCanvas
  10370. MOV [EBX].fCanvas, EAX
  10371. MOV [EAX].TCanvas.fOwnerControl, EBX
  10372. MOV [EAX].TCanvas.fOnGetHandle.TMethod.Code, offset[ DC2Canvas ]
  10373. MOV [EAX].TCanvas.fOnGetHandle.TMethod.Data, EBX
  10374. XCHG ESI, EAX
  10375. MOV ECX, [EBX].fFont
  10376. JECXZ @@exit
  10377. MOV EAX, [ESI].TCanvas.fFont
  10378. MOV EDX, ECX
  10379. CALL TGraphicTool.Assign
  10380. MOV [ESI].TCanvas.fFont, EAX
  10381. MOV ECX, [EBX].fBrush
  10382. JECXZ @@exit
  10383. MOV EAX, [ESI].TCanvas.fBrush
  10384. MOV EDX, ECX
  10385. CALL TGraphicTool.Assign
  10386. MOV [ESI].TCanvas.fBrush, EAX
  10387. @@exit: XCHG EAX, ESI
  10388. POP ESI
  10389. POP EBX
  10390. end;
  10391. procedure TControl.SetTransparent(const Value: Boolean);
  10392. asm
  10393. MOV [EAX].fTransparent, DL
  10394. MOV ECX, [EAX].fParent
  10395. JECXZ @@exit
  10396. TEST DL, DL
  10397. JZ @@exit
  10398. {$IFDEF GRAPHCTL_XPSTYLES}
  10399. CMP AppTheming, FALSE
  10400. JNE @@not_th
  10401. PUSH EBX
  10402. MOV BL, [EAX].fTransparent
  10403. MOV [EAX].fClassicTransparent, BL;
  10404. POP EBX
  10405. @@not_th:
  10406. {$ENDIF}
  10407. PUSH EAX
  10408. XCHG EAX, ECX
  10409. CALL SetDoubleBuffered
  10410. POP EAX
  10411. MOV EDX, offset[WndProcTransparent]
  10412. CALL AttachProc
  10413. @@exit:
  10414. end;
  10415. function _NewTrayIcon: PTrayIcon;
  10416. begin
  10417. New(Result,Create);
  10418. end;
  10419. function NewTrayIcon( Wnd: PControl; Icon: HIcon ): PTrayIcon;
  10420. asm
  10421. PUSH EBX
  10422. PUSH EDX // push Icon
  10423. PUSH EAX // push Wnd
  10424. CALL _NewTrayIcon
  10425. XCHG EBX, EAX
  10426. MOV EAX, [FTrayItems]
  10427. TEST EAX, EAX
  10428. JNZ @@1
  10429. CALL NewList
  10430. MOV [FTrayItems], EAX
  10431. @@1:
  10432. MOV EDX, EBX
  10433. CALL TList.Add
  10434. POP EAX //Wnd
  10435. MOV [EBX].TTrayIcon.fControl, EAX
  10436. POP [EBX].TTrayIcon.fIcon //Icon
  10437. MOV EDX, offset[WndProcTray]
  10438. TEST EAX, EAX
  10439. JZ @@2
  10440. CALL TControl.AttachProc
  10441. @@2:
  10442. MOV DL, 1
  10443. MOV EAX, EBX
  10444. CALL TTrayIcon.SetActive
  10445. XCHG EAX, EBX
  10446. POP EBX
  10447. end;
  10448. function WndProcRecreateTrayIcons( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  10449. asm //cmd //opd
  10450. MOV ECX, [fRecreateMsg]
  10451. CMP word ptr [EDX].TMsg.message, CX
  10452. JNE @@ret_false
  10453. PUSH ESI
  10454. MOV ESI, [FTrayItems]
  10455. MOV ECX, [ESI].TList.fCount
  10456. MOV ESI, [ESI].TList.fItems
  10457. @@loo: PUSH ECX
  10458. LODSD
  10459. MOV DL, [EAX].TTrayIcon.fAutoRecreate
  10460. AND DL, [EAX].TTrayIcon.fActive
  10461. JZ @@nx
  10462. DEC [EAX].TTrayIcon.fActive
  10463. CALL TTrayIcon.SetActive
  10464. @@nx: POP ECX
  10465. LOOP @@loo
  10466. @@e_loo:POP ESI
  10467. @@ret_false:
  10468. XOR EAX, EAX
  10469. end;
  10470. procedure TTrayIcon.SetAutoRecreate(const Value: Boolean);
  10471. asm //cmd //opd
  10472. MOV [EAX].fAutoRecreate, DL
  10473. MOV EAX, [EAX].FControl
  10474. CALL TControl.ParentForm
  10475. MOV EDX, offset[WndProcRecreateTrayIcons]
  10476. CALL TControl.AttachProc
  10477. PUSH offset[TaskbarCreatedMsg]
  10478. CALL RegisterWindowMessage
  10479. MOV [fRecreateMsg], EAX
  10480. end;
  10481. destructor TTrayIcon.Destroy;
  10482. asm
  10483. PUSH EBX
  10484. PUSH ESI
  10485. MOV EBX, EAX
  10486. XOR EDX, EDX
  10487. CALL SetActive
  10488. MOV ECX, [EBX].fIcon
  10489. JECXZ @@icon_destroyed
  10490. PUSH ECX
  10491. CALL DestroyIcon
  10492. @@icon_destroyed:
  10493. MOV EDX, EBX
  10494. MOV ESI, [FTrayItems]
  10495. MOV EAX, ESI
  10496. CALL TList.IndexOf
  10497. TEST EAX, EAX
  10498. JL @@fin
  10499. XCHG EDX, EAX
  10500. MOV EAX, ESI
  10501. CALL TList.Delete
  10502. MOV EAX, [ESI].TList.fCount
  10503. TEST EAX, EAX
  10504. JNZ @@fin
  10505. XCHG EAX, [FTrayItems]
  10506. CALL TObj.RefDec
  10507. @@fin: LEA EAX, [EBX].FTooltip
  10508. {$IFDEF UNICODE_CTRLS}
  10509. CALL System.@WStrClr
  10510. {$ELSE}
  10511. CALL System.@LStrClr
  10512. {$ENDIF}
  10513. XCHG EAX, EBX
  10514. CALL TObj.Destroy
  10515. POP ESI
  10516. POP EBX
  10517. end;
  10518. procedure TTrayIcon.SetActive(const Value: Boolean);
  10519. asm
  10520. CMP [EAX].fActive, DL
  10521. JE @@exit
  10522. MOV ECX, [EAX].fIcon
  10523. JECXZ @@exit
  10524. PUSH EDX
  10525. PUSH EAX
  10526. MOV ECX, [EAX].FWnd
  10527. INC ECX
  10528. LOOP @@1
  10529. MOV ECX, [EAX].fControl
  10530. XOR EAX, EAX
  10531. JECXZ @@1
  10532. XCHG EAX, ECX
  10533. CALL TControl.GetWindowHandle
  10534. @@1:
  10535. POP ECX
  10536. POP EDX
  10537. XCHG EAX, ECX
  10538. JECXZ @@exit
  10539. MOV [EAX].fActive, DL
  10540. MOVZX EDX, DL
  10541. XOR DL, 1
  10542. ADD EDX, EDX
  10543. CALL SetTrayIcon
  10544. @@exit:
  10545. end;
  10546. procedure TTrayIcon.SetIcon(const Value: HIcon);
  10547. asm
  10548. MOV ECX, [EAX].fIcon
  10549. CMP ECX, EDX
  10550. JE @@exit
  10551. MOV [EAX].fIcon, EDX
  10552. XOR EDX, EDX
  10553. JECXZ @@nim_add
  10554. INC EDX // NIM_MODIFY = 1
  10555. @@nim_add:
  10556. MOVZX ECX, [EAX].fActive
  10557. JECXZ @@exit
  10558. CALL SetTrayIcon
  10559. @@exit:
  10560. end;
  10561. {$IFDEF ASM_UNICODE}
  10562. procedure TTrayIcon.SetTooltip(const Value: String);
  10563. asm
  10564. PUSH EBX
  10565. XCHG EBX, EAX
  10566. MOV EAX, [EBX].fTooltip
  10567. PUSH EDX
  10568. CALL System.@LStrCmp
  10569. POP EDX
  10570. JE @@exit
  10571. LEA EAX, [EBX].fTooltip
  10572. CALL System.@LStrAsg
  10573. CMP [EBX].fActive, 0
  10574. JE @@exit
  10575. XOR EDX, EDX
  10576. INC EDX // EDX = NIM_MODIFY
  10577. XCHG EAX, EBX
  10578. CALL SetTrayIcon
  10579. @@exit:
  10580. POP EBX
  10581. end;
  10582. {$ENDIF ASM_UNICODE}
  10583. {$IFDEF ASM_UNICODE}
  10584. procedure TTrayIcon.SetTrayIcon(const Value: DWORD);
  10585. const sz_tid = sizeof( TNotifyIconData );
  10586. asm
  10587. CMP [AppletTerminated], 0
  10588. JE @@1
  10589. MOV DL, NIM_DELETE
  10590. @@1:
  10591. PUSH EBX
  10592. PUSH ESI
  10593. MOV ESI, EAX
  10594. MOV EBX, EDX
  10595. XOR ECX, ECX
  10596. PUSH ECX
  10597. ADD ESP, -60
  10598. MOV EDX, [ESI].fToolTip
  10599. CALL EDX2PChar
  10600. MOV EAX, ESP
  10601. MOV CL, 63
  10602. CALL StrLCopy
  10603. PUSH [ESI].fIcon
  10604. PUSH CM_TRAYICON
  10605. XOR EDX, EDX
  10606. CMP BL, NIM_DELETE
  10607. JE @@2
  10608. MOV DL, NIF_ICON or NIF_MESSAGE or NIF_TIP
  10609. @@2: PUSH EDX
  10610. PUSH ESI
  10611. MOV EAX, [ESI].FWnd
  10612. TEST EAX, EAX
  10613. JNZ @@3
  10614. MOV EAX, [ESI].fControl
  10615. MOV EAX, [EAX].TControl.fHandle
  10616. @@3:
  10617. PUSH EAX
  10618. PUSH sz_tid
  10619. PUSH ESP
  10620. PUSH EBX
  10621. CALL Shell_NotifyIcon
  10622. ADD ESP, sz_tid
  10623. POP ESI
  10624. POP EBX
  10625. @@exit:
  10626. end;
  10627. {$ENDIF ASM_UNICODE}
  10628. function WndProcJustOne( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
  10629. asm
  10630. MOV ECX, [EDX].TMsg.message
  10631. SUB ECX, WM_CLOSE
  10632. JE @@1
  10633. SUB ECX, WM_NCDESTROY - WM_CLOSE
  10634. JNE @@exit
  10635. @@1:
  10636. MOV ECX, [EDX].TMsg.hwnd
  10637. SUB ECX, [EAX].TControl.fHandle
  10638. JNE @@exit
  10639. XCHG ECX, [JustOneMutex]
  10640. JECXZ @@exit
  10641. PUSH ECX
  10642. CALL CloseHandle
  10643. @@exit:
  10644. XOR EAX, EAX
  10645. end;
  10646. function WndProcJustOneNotify( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
  10647. asm
  10648. PUSH EBP
  10649. MOV EBP, ESP
  10650. PUSHAD
  10651. CALL WndProcJustOne
  10652. POPAD
  10653. XOR EAX, EAX
  10654. PUSH ECX
  10655. MOV ECX, [EDX].TMsg.message
  10656. SUB ECX, [JustOneMsg]
  10657. POP ECX
  10658. JNE @@exit
  10659. MOV [ECX], EAX
  10660. CMP [OnAnotherInstance].TMethod.Code, EAX
  10661. JE @@exit_1
  10662. //MOV EAX, (MAX_PATH + 3) and 0FFFFCh
  10663. MOV AH, 2
  10664. SUB ESP, EAX
  10665. MOV ECX, ESP
  10666. PUSH EAX
  10667. PUSH ECX
  10668. PUSH [EDX].TMsg.lParam
  10669. CALL GetWindowText
  10670. MOV EDX, ESP
  10671. PUSH 0
  10672. MOV EAX, ESP
  10673. CALL System.@LStrFromPChar
  10674. MOV EDX, [ESP]
  10675. MOV EAX, [OnAnotherInstance].TMethod.Data
  10676. CALL [OnAnotherInstance].TMethod.Code
  10677. MOV EAX, ESP
  10678. CALL System.@LStrClr
  10679. @@exit_1:
  10680. MOV AL, 1
  10681. @@exit:
  10682. MOV ESP, EBP
  10683. POP EBP
  10684. end;
  10685. {$IFDEF ASM_UNICODE}
  10686. function JustOneNotify( Wnd: PControl; const Identifier : String;
  10687. const aOnAnotherInstance: TOnAnotherInstance ) : Boolean;
  10688. asm
  10689. PUSHAD
  10690. MOV EBP, ESP
  10691. XCHG EAX, EDX
  10692. PUSH EAX
  10693. CALL System.@LStrLen
  10694. POP EDX
  10695. ADD EAX, EAX
  10696. SUB ESP, EAX
  10697. MOV EAX, ESP
  10698. CALL StrPCopy
  10699. PUSH '.ega'
  10700. PUSH 'sseM'
  10701. PUSH ESP
  10702. CALL RegisterWindowMessage
  10703. MOV [JustOneMsg], EAX
  10704. TEST EAX, EAX
  10705. MOV ESP, EBP
  10706. POPAD
  10707. JE @@exit_f
  10708. PUSHAD
  10709. CALL JustOne
  10710. DEC AL
  10711. POPAD
  10712. JZ @@exit_t
  10713. PUSH EBX
  10714. XCHG EBX, EAX
  10715. XOR EDX, EDX
  10716. XCHG [EBX].TControl.fCaption, EDX
  10717. PUSH EDX
  10718. CALL GetCommandLine
  10719. XCHG EDX, EAX
  10720. LEA EAX, [EBX].TControl.fCaption
  10721. CALL System.@LStrFromPChar
  10722. MOV EAX, EBX
  10723. MOV EDX, [EBX].TControl.fCaption
  10724. CALL TControl.SetCaption
  10725. MOV EAX, EBX
  10726. CALL TControl.GetWindowHandle
  10727. TEST EAX, EAX
  10728. JZ @@rest_cap
  10729. PUSH BSM_APPLICATIONS
  10730. MOV EDX, ESP
  10731. PUSH EAX
  10732. PUSH 0
  10733. PUSH [JustOneMsg]
  10734. PUSH EDX
  10735. PUSH BSF_QUERY or BSF_IGNORECURRENTTASK
  10736. CALL BroadcastSystemMessage
  10737. POP EDX
  10738. @@rest_cap:
  10739. LEA EAX, [EBX].TControl.fCaption
  10740. CALL System.@LStrClr
  10741. POP EDX
  10742. MOV [EBX].TControl.fCaption, EDX
  10743. MOV EAX, EBX
  10744. CALL TControl.SetCaption
  10745. POP EBX
  10746. @@exit_f:
  10747. XOR EAX, EAX
  10748. JMP @@exit
  10749. @@exit_t:
  10750. PUSHAD
  10751. LEA ESI, [aOnAnotherInstance]
  10752. LEA EDI, [OnAnotherInstance]
  10753. MOVSD
  10754. MOVSD
  10755. MOV EDX, offset[WndProcJustOneNotify]
  10756. CALL TControl.AttachProc
  10757. POPAD
  10758. MOV AL, 1
  10759. @@exit:
  10760. end;
  10761. {$ENDIF ASM_UNICODE}
  10762. destructor TStrList.Destroy;
  10763. asm
  10764. PUSH EAX
  10765. CALL Clear
  10766. POP EAX
  10767. CALL TObj.Destroy
  10768. end;
  10769. function TStrList.Add(const S: string): integer;
  10770. asm
  10771. MOV ECX, EDX
  10772. MOV EDX, [EAX].fCount
  10773. PUSH EDX
  10774. CALL Insert
  10775. POP EAX
  10776. end;
  10777. procedure TStrList.AddStrings(Strings: PStrList);
  10778. asm
  10779. PUSH EAX
  10780. XCHG EAX, EDX
  10781. PUSH 0
  10782. MOV EDX, ESP
  10783. CALL GetTextStr
  10784. POP EDX
  10785. POP EAX
  10786. MOV CL, 1
  10787. PUSH EDX
  10788. CALL SetText
  10789. CALL RemoveStr
  10790. end;
  10791. procedure TStrList.Assign(Strings: PStrList);
  10792. asm
  10793. PUSHAD
  10794. CALL Clear
  10795. POPAD
  10796. JMP AddStrings
  10797. end;
  10798. procedure TStrList.Clear;
  10799. asm
  10800. PUSH EBX
  10801. XCHG EBX, EAX
  10802. MOV EDX, [EBX].fCount
  10803. @@loo: DEC EDX
  10804. JL @@eloo
  10805. PUSH EDX
  10806. MOV EAX, EBX
  10807. CALL Delete
  10808. POP EDX
  10809. JMP @@loo
  10810. @@eloo:
  10811. XOR EAX, EAX
  10812. MOV [EBX].fTextSiz, EAX
  10813. XCHG EAX, [EBX].fTextBuf
  10814. TEST EAX, EAX
  10815. JZ @@1
  10816. CALL System.@FreeMem
  10817. {$IFNDEF _D2orD3} //???//
  10818. XOR EAX, EAX // not needed for Delphi4 and Higher: if OK, EAX = 0
  10819. {$ENDIF}
  10820. @@1: XCHG EAX, [EBX].fList
  10821. CALL TObj.RefDec
  10822. POP EBX
  10823. end;
  10824. procedure TStrList.Delete(Idx: integer);
  10825. asm
  10826. DEC [EAX].fCount
  10827. PUSH EAX
  10828. MOV EAX, [EAX].fList
  10829. MOV ECX, [EAX].TList.fItems
  10830. PUSH dword ptr [ECX+EDX*4]
  10831. CALL TList.Delete
  10832. POP EAX
  10833. POP EDX
  10834. MOV ECX, [EDX].fTextSiz
  10835. JECXZ @@fremem
  10836. CMP EAX, [EDX].fTextBuf
  10837. JB @@fremem
  10838. ADD ECX, [EDX].fTextBuf
  10839. CMP EAX, ECX
  10840. JB @@exit
  10841. @@fremem:
  10842. CALL System.@FreeMem
  10843. @@exit:
  10844. end;
  10845. function TStrList.Get(Idx: integer): string;
  10846. asm
  10847. PUSH ECX
  10848. MOV EAX, [EAX].fList
  10849. TEST EAX, EAX
  10850. JZ @@1
  10851. CALL TList.Get
  10852. @@1: XCHG EDX, EAX
  10853. POP EAX
  10854. JMP System.@LStrFromPChar
  10855. end;
  10856. function TStrList.GetPChars(Idx: Integer): PChar;
  10857. asm
  10858. MOV EAX, [EAX].fList
  10859. MOV EAX, [EAX].TList.fItems
  10860. MOV EAX, [EAX+EDX*4]
  10861. end;
  10862. function TStrList.GetTextStr: string;
  10863. asm
  10864. PUSH ESI
  10865. PUSH EDI
  10866. MOV ECX, [EAX].fCount
  10867. MOV EAX, [EAX].fList
  10868. PUSH ECX
  10869. JECXZ @@1
  10870. MOV ESI, [EAX].TList.fItems
  10871. @@1: PUSH ESI
  10872. XCHG EAX, EDX
  10873. XOR EDX, EDX
  10874. JECXZ @@10
  10875. PUSH EAX
  10876. @@loo1:
  10877. PUSH ECX
  10878. PUSH EDX
  10879. LODSD
  10880. CALL StrLen
  10881. POP EDX
  10882. LEA EDX, [EDX+EAX+2]
  10883. POP ECX
  10884. LOOP @@loo1
  10885. POP EAX
  10886. POP ESI
  10887. XCHG ECX, EDX
  10888. PUSH EAX
  10889. @@10:
  10890. {$IFDEF _D2}
  10891. CALL _LStrFromPCharLen
  10892. {$ELSE}
  10893. CALL System.@LStrFromPCharLen
  10894. {$ENDIF}
  10895. POP EDI
  10896. POP ECX
  10897. JECXZ @@exit
  10898. MOV EDI, [EDI]
  10899. @@loo2: PUSH ECX
  10900. LODSD
  10901. PUSH EAX
  10902. CALL StrLen
  10903. XCHG ECX, EAX
  10904. POP EAX
  10905. XCHG EAX, ESI
  10906. REP MOVSB
  10907. XCHG ESI, EAX
  10908. MOV AX, $0A0D
  10909. STOSW
  10910. POP ECX
  10911. LOOP @@loo2
  10912. XCHG EAX, ECX
  10913. STOSB
  10914. @@exit:
  10915. POP EDI
  10916. POP ESI
  10917. end;
  10918. function TStrList.IndexOf(const S: string): integer;
  10919. asm
  10920. PUSH EBX
  10921. PUSH ESI
  10922. OR EBX, -1
  10923. MOV ECX, [EAX].fCount
  10924. JECXZ @@exit
  10925. MOV ESI, [EAX].fList
  10926. MOV ESI, [ESI].TList.fItems
  10927. CALL EDX2PChar
  10928. @@loo: LODSD
  10929. INC EBX
  10930. PUSH EDX
  10931. PUSH ECX
  10932. CALL StrComp
  10933. POP ECX
  10934. POP EDX
  10935. JE @@exit
  10936. @@1: LOOP @@loo
  10937. OR EBX, -1
  10938. @@exit: XCHG EAX, EBX
  10939. POP ESI
  10940. POP EBX
  10941. end;
  10942. procedure TStrList.Insert(Idx: integer; const S: string);
  10943. asm
  10944. PUSH EBX
  10945. PUSH EDX
  10946. PUSH ECX
  10947. XCHG EBX, EAX
  10948. MOV EAX, [EBX].fList
  10949. TEST EAX, EAX
  10950. JNZ @@1
  10951. CALL NewList
  10952. MOV [EBX].fList, EAX
  10953. @@1:
  10954. POP EAX
  10955. PUSH EAX // push S
  10956. CALL System.@LStrLen
  10957. INC EAX
  10958. PUSH EAX // push L
  10959. CALL System.@GetMem
  10960. MOV byte ptr[EAX], 0
  10961. XCHG EDX, EAX
  10962. POP ECX
  10963. POP EAX
  10964. PUSH EDX // push Mem
  10965. TEST EAX, EAX
  10966. JE @@2
  10967. CALL System.Move
  10968. @@2: POP ECX
  10969. POP EDX
  10970. MOV EAX, [EBX].fList
  10971. CALL TList.Insert
  10972. INC [EBX].fCount
  10973. POP EBX
  10974. end;
  10975. procedure TStrList.Put(Idx: integer; const Value: string);
  10976. asm
  10977. PUSH EAX
  10978. PUSH EDX
  10979. CALL Insert
  10980. POP EDX
  10981. POP EAX
  10982. INC EDX
  10983. JMP Delete
  10984. end;
  10985. procedure TStrList.SetText(const S: string; Append2List: boolean);
  10986. asm
  10987. DEC CL
  10988. JZ @@1
  10989. PUSHAD
  10990. CALL Clear
  10991. POPAD
  10992. @@1: CALL EDX2PChar
  10993. JZ @@exit
  10994. PUSH EBX
  10995. PUSH EDI
  10996. MOV EBX, EAX
  10997. MOV EDI, [EBX].fTextSiz
  10998. MOV EAX, [EDX-4] // EAX = Length(S)
  10999. INC EAX
  11000. PUSH EAX
  11001. // add S to text buffer
  11002. PUSH EDX
  11003. PUSH [EBX].fTextBuf
  11004. ADD EAX, [EBX].fTextSiz
  11005. CALL System.@GetMem
  11006. MOV [EBX].fTextBuf, EAX
  11007. MOV ECX, EDI
  11008. XCHG EDX, EAX
  11009. POP EAX
  11010. JECXZ @@atb_fin
  11011. PUSH EAX
  11012. CALL System.Move
  11013. POP EDX
  11014. PUSH EDX
  11015. PUSH ESI
  11016. MOV ESI, [EBX].fList
  11017. MOV ESI, [ESI].TList.fItems
  11018. MOV ECX, [EBX].fCount
  11019. @@atb_loo:
  11020. LODSD
  11021. SUB EAX, EDX
  11022. CMP EAX, [EBX].fTextSiz
  11023. JAE @@atb_nxt
  11024. ADD EAX, [EBX].fTextBuf
  11025. MOV [ESI-4], EAX
  11026. @@atb_nxt: LOOP @@atb_loo
  11027. POP ESI
  11028. POP EAX
  11029. CALL System.@FreeMem
  11030. @@atb_fin:
  11031. POP EAX
  11032. MOV EDX, EDI
  11033. ADD EDX, [EBX].fTextBuf
  11034. POP ECX
  11035. PUSH ECX
  11036. ADD [EBX].fTextSiz, ECX
  11037. CALL System.Move
  11038. @@eatb:
  11039. ADD EDI, [EBX].fTextBuf // EDI ~ P
  11040. MOV ECX, [EBX].fList
  11041. INC ECX
  11042. LOOP @@2
  11043. CALL NewList
  11044. MOV [EBX].fList, EAX
  11045. @@2:
  11046. POP ECX
  11047. MOV EDX, [EBX].fCount
  11048. PUSH EDI
  11049. PUSH ECX
  11050. MOV AL, $0D
  11051. @@loo1: CMP byte ptr [EDI], 0
  11052. JZ @@eloo1
  11053. INC EDX
  11054. REPNZ SCASB
  11055. JNZ @@eloo1
  11056. CMP byte ptr [EDI], $0A
  11057. JNZ @@loo1
  11058. INC EDI
  11059. LOOP @@loo1
  11060. @@eloo1:
  11061. MOV [EBX].fCount, EDX
  11062. MOV EAX, [EBX].fList
  11063. PUSH EDX
  11064. PUSH EAX
  11065. CMP EDX, [EAX].TList.fCapacity
  11066. JLE @@3
  11067. CALL TList.SetCapacity
  11068. @@3: POP EAX
  11069. POP ECX
  11070. XCHG ECX, [EAX].TList.fCount
  11071. MOV EDX, [EAX].TList.fItems
  11072. LEA EDX, [EDX+ECX*4]
  11073. POP ECX
  11074. POP EDI
  11075. MOV EAX, $0D
  11076. @@loo2: CMP byte ptr [EDI], AH
  11077. JZ @@eloo2
  11078. MOV [EDX], EDI
  11079. ADD EDX, 4
  11080. REPNZ SCASB
  11081. JNZ @@eloo2
  11082. MOV [EDI-1], AH
  11083. CMP byte ptr [EDI], $0A
  11084. JNZ @@loo2
  11085. INC EDI
  11086. LOOP @@loo2
  11087. @@eloo2:
  11088. POP EDI
  11089. POP EBX
  11090. @@exit:
  11091. end;
  11092. procedure LowerCaseStrFromPCharEDX;
  11093. asm
  11094. { <- EDX = PChar string
  11095. -> [ESP] = LowerCase( PChar( EDX ) ),
  11096. EAX, EDX, ECX - ?
  11097. }
  11098. POP EAX
  11099. PUSH 0
  11100. PUSH EAX
  11101. LEA EAX, [ESP+4]
  11102. PUSH EAX
  11103. CALL System.@LStrFromPChar
  11104. POP EDX
  11105. MOV EAX, [EDX]
  11106. JMP LowerCase
  11107. end;
  11108. function CompareStrListItems( const Sender : Pointer; const e1, e2 : DWORD ) : Integer;
  11109. asm
  11110. CMP [EAX].TStrList.fCaseSensitiveSort, 0
  11111. MOV EAX, [EAX].TStrList.fList
  11112. MOV EAX, [EAX].TList.fItems
  11113. MOV EDX, [EAX+EDX*4]
  11114. MOV EAX, [EAX+ECX*4]
  11115. XCHG EAX, EDX
  11116. JNZ StrComp
  11117. PUSH EBX
  11118. XCHG EBX, EAX
  11119. CALL LowerCaseStrFromPCharEDX
  11120. MOV EDX, EBX
  11121. CALL LowerCaseStrFromPCharEDX
  11122. POP EAX
  11123. POP EDX
  11124. PUSH EDX
  11125. PUSH EAX
  11126. CALL EAX2PChar
  11127. CALL EDX2PChar
  11128. CALL StrComp
  11129. XCHG EBX, EAX
  11130. CALL RemoveStr
  11131. CALL RemoveStr
  11132. XCHG EAX, EBX
  11133. POP EBX
  11134. end;
  11135. function CompareAnsiStrListItems( const Sender : Pointer; const e1, e2 : DWORD ) : Integer;
  11136. asm
  11137. CMP byte ptr [EAX].TStrList.fCaseSensitiveSort, 0
  11138. MOV EAX, [EAX].TStrList.fList
  11139. MOV EAX, [EAX].TList.fItems
  11140. MOV EDX, [EAX+EDX*4]
  11141. MOV EAX, [EAX+ECX*4]
  11142. XCHG EAX, EDX
  11143. JZ _AnsiCompareStrNoCase
  11144. JMP _AnsiCompareStr
  11145. end;
  11146. procedure TStrList.Sort(CaseSensitive: Boolean);
  11147. asm
  11148. MOV [EAX].fCaseSensitiveSort, DL
  11149. PUSH Offset[TStrList.Swap]
  11150. MOV ECX, Offset[CompareStrListItems]
  11151. MOV EDX, [EAX].fCount
  11152. CALL SortData
  11153. end;
  11154. procedure TStrList.AnsiSort(CaseSensitive: Boolean);
  11155. asm
  11156. MOV [EAX].fCaseSensitiveSort, DL
  11157. PUSH Offset[TStrList.Swap]
  11158. MOV ECX, Offset[CompareAnsiStrListItems]
  11159. MOV EDX, [EAX].fCount
  11160. CALL SortData
  11161. end;
  11162. {$IFDEF ASM_UNICODE}
  11163. function TStrList.AppendToFile(const FileName: string): Boolean;
  11164. asm
  11165. PUSH EBX
  11166. MOV EBX, EDX
  11167. PUSH 0
  11168. MOV EDX, ESP
  11169. CALL GetTextStr
  11170. XCHG EAX, EBX
  11171. MOV EDX, ofOpenWrite or ofOpenAlways
  11172. CALL FileCreate
  11173. MOV EBX, EAX
  11174. INC EAX
  11175. JZ @@exit
  11176. DEC EAX
  11177. XOR EDX, EDX
  11178. XOR ECX, ECX
  11179. MOV CL, spEnd
  11180. CALL FileSeek
  11181. POP EAX
  11182. PUSH EAX
  11183. CALL System.@LStrLen
  11184. XCHG ECX, EAX
  11185. MOV EAX, EBX
  11186. POP EDX
  11187. PUSH EDX
  11188. CALL FileWrite
  11189. XCHG EAX, EBX
  11190. CALL FileClose
  11191. @@exit:
  11192. CALL RemoveStr
  11193. POP EBX
  11194. end;
  11195. {$ENDIF}
  11196. {$IFDEF ASM_UNICODE}
  11197. function TStrList.LoadFromFile(const FileName: string): Boolean;
  11198. asm
  11199. PUSH EAX
  11200. XCHG EAX, EDX
  11201. MOV EDX, ofOpenRead or ofShareDenyWrite or ofOpenExisting
  11202. CALL FileCreate
  11203. INC EAX
  11204. JZ @@exit
  11205. DEC EAX
  11206. PUSH EBX
  11207. XCHG EBX, EAX
  11208. PUSH 0
  11209. PUSH EBX
  11210. CALL GetFileSize
  11211. XOR EDX, EDX
  11212. PUSH EDX
  11213. XCHG ECX, EAX
  11214. MOV EAX, ESP
  11215. PUSH ECX
  11216. {$IFDEF _D2}
  11217. CALL _LStrFromPCharLen
  11218. {$ELSE}
  11219. CALL System.@LStrFromPCharLen
  11220. {$ENDIF}
  11221. POP ECX
  11222. MOV EAX, EBX
  11223. POP EDX
  11224. PUSH EDX
  11225. CALL FileRead
  11226. XCHG EAX, EBX
  11227. CALL FileClose
  11228. POP EDX
  11229. POP EBX
  11230. POP EAX
  11231. PUSH EDX
  11232. XOR ECX, ECX
  11233. CALL SetText
  11234. CALL RemoveStr
  11235. PUSH EDX
  11236. MOV AL, 1
  11237. @@exit: POP EDX
  11238. end;
  11239. {$ENDIF}
  11240. procedure TStrList.LoadFromStream(Stream: PStream; Append2List: boolean);
  11241. asm
  11242. PUSH EAX
  11243. PUSH ECX
  11244. PUSH EBX
  11245. XCHG EAX, EDX
  11246. MOV EBX, EAX
  11247. CALL TStream.GetSize
  11248. PUSH EAX
  11249. MOV EAX, EBX
  11250. CALL TStream.GetPosition
  11251. POP ECX
  11252. SUB ECX, EAX
  11253. XOR EDX, EDX
  11254. PUSH EDX
  11255. MOV EAX, ESP
  11256. PUSH ECX
  11257. {$IFDEF _D2}
  11258. CALL _LStrFromPCharLen
  11259. {$ELSE}
  11260. CALL System.@LStrFromPCharLen
  11261. {$ENDIF}
  11262. POP ECX
  11263. POP EDX
  11264. XCHG EAX, EBX
  11265. PUSH EDX
  11266. CALL TStream.Read
  11267. POP EDX
  11268. POP EBX
  11269. POP ECX
  11270. POP EAX
  11271. PUSH EDX
  11272. CALL SetText
  11273. CALL RemoveStr
  11274. end;
  11275. procedure TStrList.MergeFromFile(const FileName: KOLString);
  11276. asm
  11277. PUSH EAX
  11278. XCHG EAX, EDX
  11279. CALL NewReadFileStream
  11280. XCHG EDX, EAX
  11281. POP EAX
  11282. MOV CL, 1
  11283. PUSH EDX
  11284. CALL LoadFromStream
  11285. POP EAX
  11286. JMP TObj.RefDec
  11287. end;
  11288. {$IFDEF ASM_UNICODE}
  11289. function TStrList.SaveToFile(const FileName: string): Boolean;
  11290. asm
  11291. PUSH EBX
  11292. PUSH EAX
  11293. XCHG EAX, EDX
  11294. MOV EDX, ofOpenWrite or ofCreateAlways
  11295. CALL FileCreate
  11296. INC EAX
  11297. JZ @@exit
  11298. DEC EAX
  11299. XCHG EBX, EAX
  11300. POP EAX
  11301. PUSH 0
  11302. MOV EDX, ESP
  11303. CALL GetTextStr
  11304. POP EAX
  11305. PUSH EAX
  11306. CALL System.@LStrLen
  11307. XCHG ECX, EAX
  11308. POP EDX
  11309. PUSH EDX
  11310. MOV EAX, EBX
  11311. CALL FileWrite
  11312. PUSH EBX
  11313. CALL SetEndOfFile
  11314. XCHG EAX, EBX
  11315. CALL FileClose
  11316. CALL RemoveStr
  11317. PUSH EDX
  11318. INC EAX
  11319. @@exit:
  11320. POP EDX
  11321. POP EBX
  11322. end;
  11323. {$ENDIF}
  11324. procedure TStrList.SaveToStream(Stream: PStream);
  11325. asm
  11326. PUSH EDX
  11327. PUSH 0
  11328. MOV EDX, ESP
  11329. CALL GetTextStr
  11330. POP EAX
  11331. PUSH EAX
  11332. CALL System.@LStrLen
  11333. XCHG ECX, EAX
  11334. POP EDX
  11335. POP EAX
  11336. PUSH EDX
  11337. JECXZ @@1
  11338. CALL TStream.Write
  11339. @@1:
  11340. CALL RemoveStr
  11341. end;
  11342. function CompareIntegers( const Sender : Pointer; const e1, e2 : DWORD ) : Integer;
  11343. asm
  11344. MOV EDX, [EAX+EDX*4]
  11345. SUB EDX, [EAX+ECX*4]
  11346. XCHG EAX, EDX
  11347. end;
  11348. function CompareDwords( const Sender : Pointer; const e1, e2 : DWORD ) : Integer;
  11349. asm
  11350. MOV EDX, [EAX+EDX*4]
  11351. SUB EDX, [EAX+ECX*4]
  11352. XCHG EAX, EDX
  11353. JNB @@1
  11354. SBB EAX, EAX
  11355. @@1:
  11356. end;
  11357. procedure SwapIntegers( const Sender : Pointer; const e1, e2 : DWORD );
  11358. asm
  11359. LEA EDX, [EAX+EDX*4]
  11360. LEA ECX, [EAX+ECX*4]
  11361. MOV EAX, [EDX]
  11362. XCHG EAX, [ECX]
  11363. MOV [EDX], EAX
  11364. end;
  11365. function _NewStatusbar( AParent: PControl ): PControl;
  11366. const STAT_CLS_NAM: PKOLChar = STATUSCLASSNAME;
  11367. asm
  11368. PUSH 0
  11369. PUSH 0
  11370. CMP [EAX].TControl.fSizeGrip, 0
  11371. MOV ECX, WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or 3 or WS_VISIBLE
  11372. JZ @@1
  11373. INC CH
  11374. AND CL, not 3
  11375. @@1:
  11376. MOV EDX, [STAT_CLS_NAM]
  11377. CALL _NewCommonControl
  11378. PUSH EBX
  11379. XCHG EBX, EAX
  11380. PUSH EDI
  11381. LEA EDI, [EBX].TControl.fBoundsRect
  11382. XOR EAX, EAX
  11383. STOSD
  11384. STOSD
  11385. STOSD
  11386. STOSD
  11387. MOV [EBX].TControl.fAlign, caBottom
  11388. INC [EBX].TControl.fNotUseAlign
  11389. POP EDI
  11390. MOV EAX, EBX
  11391. CALL InitCommonControlSizeNotify
  11392. XCHG EAX, EBX
  11393. POP EBX
  11394. end;
  11395. procedure TControl.SetStatusText(Index: Integer; Value: PKOLChar);
  11396. asm
  11397. PUSHAD
  11398. MOV EBX, EDX // EBX = Index
  11399. MOV ESI, EAX // ESI = @Self
  11400. PUSH Value // prepare value for call at the end of procedure
  11401. PUSH EBX // prepare Index for call at the end of procedure
  11402. MOV ECX, [ESI].fStatusCtl
  11403. INC ECX
  11404. LOOP @@status_created
  11405. CALL GetClientHeight
  11406. PUSH EAX // ch = old client height
  11407. MOV EAX, ESI
  11408. CALL _NewStatusBar
  11409. MOV [ESI].fStatusCtl, EAX
  11410. PUSH EAX //-----------v
  11411. CALL TControl.GetWindowHandle
  11412. MOV [ESI].fStatusWnd, EAX
  11413. XCHG EDI, EAX
  11414. POP EAX //-----------^
  11415. XOR EDX, EDX
  11416. PUSH EDX
  11417. INC DH
  11418. DEC EDX
  11419. CMP EBX, EDX
  11420. SETZ DL
  11421. NEG EDX
  11422. @@1: PUSH EDX
  11423. PUSH SB_SIMPLE
  11424. PUSH EAX
  11425. CALL TControl.Perform
  11426. ADD ESP, -16
  11427. PUSH ESP
  11428. PUSH [ESI].fStatusWnd
  11429. CALL GetWindowRect
  11430. POP EAX
  11431. POP EDX
  11432. POP EAX
  11433. POP EAX
  11434. SUB EAX, EDX
  11435. MOV [ESI].fClientBottom, EAX
  11436. POP EDX // ch
  11437. PUSH 0
  11438. PUSH 0
  11439. PUSH WM_SIZE
  11440. PUSH EDI
  11441. MOV EAX, ESI
  11442. CALL TControl.SetClientHeight
  11443. CALL SendMessage
  11444. @@status_created:
  11445. CMP EBX, 255
  11446. JGE @@not_simple
  11447. PUSH 0
  11448. PUSH 0
  11449. PUSH SB_GETPARTS
  11450. PUSH [ESI].fStatusWnd
  11451. CALL SendMessage
  11452. CMP EAX, EBX
  11453. JG @@reset_simple
  11454. MOV EAX, ESI
  11455. CALL GetWidth
  11456. CDQ
  11457. MOV ECX, EBX
  11458. INC ECX
  11459. IDIV ECX
  11460. MOV EDX, EAX
  11461. ADD ESP, -1024
  11462. MOV ECX, EBX
  11463. MOV EDI, ESP
  11464. JECXZ @@2
  11465. @@store_loo:
  11466. STOSD
  11467. ADD EAX, EDX
  11468. LOOP @@store_loo
  11469. @@2:
  11470. OR dword ptr [ESP+EBX*4], -1
  11471. PUSH ESP
  11472. INC EBX
  11473. PUSH EBX
  11474. PUSH SB_SETPARTS
  11475. PUSH [ESI].fStatusWnd
  11476. CALL SendMessage
  11477. ADD ESP, 1024
  11478. @@reset_simple:
  11479. PUSH 0
  11480. PUSH 0
  11481. PUSH SB_SIMPLE
  11482. PUSH [ESI].fStatusWnd
  11483. CALL SendMessage
  11484. @@not_simple:
  11485. PUSH SB_SETTEXT
  11486. PUSH [ESI].fStatusWnd
  11487. CALL SendMessage
  11488. POPAD
  11489. end;
  11490. function TControl.GetStatusText( Index: Integer ): PKOLChar;
  11491. asm
  11492. MOV ECX, [EAX].fStatusWnd
  11493. JECXZ @@exit
  11494. PUSH EBX
  11495. PUSH ESI
  11496. XCHG ESI, EAX // ESI = @Self
  11497. MOV EBX, EDX // EBX = Index
  11498. XOR EAX, EAX
  11499. XCHG EAX, [ESI].fStatusTxt
  11500. TEST EAX, EAX
  11501. JZ @@1
  11502. CALL System.@FreeMem
  11503. @@1:
  11504. XOR EAX, EAX
  11505. CDQ
  11506. MOV DL, WM_GETTEXTLENGTH
  11507. PUSH WM_GETTEXT
  11508. CMP EBX, 255
  11509. JZ @@2
  11510. POP EAX
  11511. MOV EAX, EBX
  11512. MOV DX, SB_GETTEXTLENGTH
  11513. PUSH SB_GETTEXT
  11514. @@2:
  11515. MOV EBX, EAX
  11516. PUSH 0
  11517. PUSH EAX
  11518. PUSH EDX
  11519. PUSH [ESI].fStatusWnd
  11520. CALL SendMessage
  11521. TEST AX, AX
  11522. JZ @@get_rslt
  11523. PUSH EAX
  11524. INC EAX
  11525. CALL System.@GetMem
  11526. POP EDX
  11527. MOV [ESI].fStatusTxt, EAX
  11528. MOV byte ptr [EAX+EDX], 0
  11529. POP EDX // Msg
  11530. PUSH EAX
  11531. PUSH EBX
  11532. PUSH EDX
  11533. PUSH [ESI].fStatusWnd
  11534. CALL SendMessage
  11535. PUSH EDX
  11536. @@get_rslt:
  11537. POP EDX
  11538. MOV ECX, [ESI].fStatusTxt
  11539. POP ESI
  11540. POP EBX
  11541. @@exit: XCHG EAX, ECX
  11542. end;
  11543. procedure TControl.RemoveStatus;
  11544. asm
  11545. MOV ECX, [EAX].fStatusCtl
  11546. JECXZ @@exit
  11547. PUSH EBX
  11548. MOV EBX, EAX
  11549. CALL GetClientHeight
  11550. PUSH EAX
  11551. CDQ
  11552. MOV [EBX].fStatusWnd, EDX
  11553. XCHG EAX, EDX
  11554. XCHG [EBX].fStatusCtl, EAX
  11555. CALL TObj.RefDec
  11556. POP EAX
  11557. CDQ
  11558. MOV [EBX].fClientBottom, EDX
  11559. XCHG EDX, EAX
  11560. XCHG EAX, EBX
  11561. POP EBX
  11562. CALL SetClientHeight
  11563. @@exit:
  11564. end;
  11565. function TControl.StatusPanelCount: Integer;
  11566. asm
  11567. MOV EAX, [EAX].fStatusWnd
  11568. TEST EAX, EAX
  11569. JZ @@exit
  11570. PUSH 0
  11571. PUSH 0
  11572. PUSH SB_GETPARTS
  11573. PUSH EAX
  11574. CALL SendMessage
  11575. @@exit:
  11576. end;
  11577. function TControl.GetStatusPanelX(Idx: Integer): Integer;
  11578. asm
  11579. MOV ECX, [EAX].fStatusWnd
  11580. JECXZ @@exit
  11581. PUSH EBX
  11582. MOV EBX, EDX
  11583. ADD ESP, -1024
  11584. PUSH ESP
  11585. XOR EDX, EDX
  11586. DEC DL
  11587. PUSH EDX
  11588. MOV DX, SB_GETPARTS
  11589. PUSH EDX
  11590. PUSH ECX
  11591. CALL SendMessage
  11592. CMP EAX, EBX
  11593. MOV ECX, [ESP+EBX*4]
  11594. JG @@1
  11595. XOR ECX, ECX
  11596. @@1: ADD ESP, 1024
  11597. POP EBX
  11598. @@exit:
  11599. XCHG EAX, ECX
  11600. end;
  11601. procedure TControl.SetStatusPanelX(Idx: Integer; const Value: Integer);
  11602. asm
  11603. ADD ESP, -1024
  11604. MOV EAX, [EAX].fStatusWnd
  11605. TEST EAX, EAX
  11606. JZ @@exit
  11607. PUSH ESP
  11608. PUSH EDX
  11609. PUSH SB_SETPARTS
  11610. PUSH EAX
  11611. PUSH EDX
  11612. PUSH ECX
  11613. LEA EDX, [ESP+24]
  11614. PUSH EDX
  11615. PUSH 255
  11616. PUSH SB_GETPARTS
  11617. PUSH EAX
  11618. CALL SendMessage
  11619. POP ECX
  11620. POP EDX
  11621. CMP EAX, EDX
  11622. JG @@1
  11623. ADD ESP, 16
  11624. JMP @@exit
  11625. @@1: MOV [ESP+8], EAX
  11626. MOV [ESP+16+EDX*4], ECX
  11627. CALL SendMessage
  11628. @@exit: ADD ESP, 1024
  11629. end;
  11630. destructor TImageList.Destroy;
  11631. asm
  11632. PUSH EAX
  11633. XOR EDX, EDX
  11634. CALL SetHandle
  11635. POP EAX
  11636. MOV EDX, [EAX].fNext
  11637. MOV ECX, [EAX].fPrev
  11638. TEST EDX, EDX
  11639. JZ @@nonext
  11640. MOV [EDX].fPrev, ECX
  11641. @@nonext:
  11642. JECXZ @@noprev
  11643. MOV [ECX].fNext, EDX
  11644. @@noprev:
  11645. MOV ECX, [EAX].fControl
  11646. JECXZ @@fin
  11647. CMP [ECX].TControl.fImageList, EAX
  11648. JNZ @@fin
  11649. MOV [ECX].TControl.fImageList, EDX
  11650. {$IFDEF USE_AUTOFREE4CONTROLS}
  11651. PUSH EAX
  11652. XCHG EAX, ECX
  11653. MOV EDX, ECX
  11654. CALL TControl.RemoveFromAutoFree
  11655. POP EAX
  11656. {$ENDIF}
  11657. @@fin: CALL TObj.Destroy
  11658. end;
  11659. function TImageList.GetHandle: THandle;
  11660. asm
  11661. PUSH EAX
  11662. CALL HandleNeeded
  11663. POP EAX
  11664. MOV EAX, [EAX].FHandle
  11665. end;
  11666. procedure TImageList.SetHandle(const Value: THandle);
  11667. asm
  11668. PUSH EBX
  11669. XCHG EBX, EAX
  11670. MOV ECX, [EBX].FHandle
  11671. CMP ECX, EDX
  11672. JZ @@exit
  11673. JECXZ @@set_handle
  11674. CMP [EBX].fShareImages, 0
  11675. JNZ @@set_handle
  11676. PUSH EDX
  11677. PUSH ECX
  11678. CALL ImageList_Destroy
  11679. POP EDX
  11680. @@set_handle:
  11681. MOV [EBX].FHandle, EDX
  11682. TEST EDX, EDX
  11683. JZ @@set_sz0
  11684. LEA EAX, [EBX].FImgHeight
  11685. PUSH EAX
  11686. LEA EAX, [EBX].FImgWidth
  11687. PUSH EAX
  11688. PUSH EDX
  11689. CALL ImageList_GetIconSize
  11690. JMP @@exit
  11691. @@set_sz0:
  11692. MOV [EBX].fImgWidth, EDX
  11693. MOV [EBX].fImgHeight, EDX
  11694. @@exit:
  11695. POP EBX
  11696. end;
  11697. function TControl.Perform(msgcode: DWORD; wParam, lParam: Integer): Integer; stdcall;
  11698. asm
  11699. PUSH [lParam]
  11700. PUSH [wParam]
  11701. PUSH [msgcode]
  11702. MOV EAX, [EBP+8]
  11703. CALL TControl.GetWindowHandle
  11704. PUSH EAX
  11705. {$IFDEF UNICODE_CTRLS}
  11706. CALL Windows.SendMessageW
  11707. {$ELSE}
  11708. CALL Windows.SendMessage
  11709. {$ENDIF}
  11710. end;
  11711. function TControl.Postmsg(msgcode: DWORD; wParam, lParam: Integer): Boolean; stdcall;
  11712. asm
  11713. PUSH [lParam]
  11714. PUSH [wParam]
  11715. PUSH [msgcode]
  11716. MOV EAX, [EBP+8]
  11717. CALL TControl.GetWindowHandle
  11718. PUSH EAX
  11719. CALL Windows.PostMessage
  11720. end;
  11721. function TControl.GetChildCount: Integer;
  11722. asm
  11723. MOV EAX, [EAX].fChildren
  11724. MOV EAX, [EAX].TList.fCount
  11725. end;
  11726. procedure TControl.SetItemVal(Item: Integer; const Index: Integer; const Value: Integer);
  11727. asm
  11728. PUSH EAX
  11729. PUSH [Value]
  11730. PUSH EDX
  11731. MOV EDX, ECX
  11732. SHR EDX, 16
  11733. JNZ @@1
  11734. MOV EDX, ECX
  11735. INC EDX
  11736. @@1:
  11737. MOV EBP, EDX
  11738. AND EDX, 7FFFh
  11739. PUSH EDX
  11740. PUSH EAX
  11741. CALL Perform
  11742. MOV EAX, EBP
  11743. ADD AX, AX
  11744. POP EAX
  11745. JNB @@2
  11746. CALL Invalidate
  11747. @@2:
  11748. end;
  11749. destructor TOpenSaveDialog.Destroy;
  11750. asm //cmd //opd
  11751. PUSH EAX
  11752. PUSH 0
  11753. LEA EDX, [EAX].FFilter
  11754. PUSH EDX
  11755. LEA EDX, [EAX].FInitialDir
  11756. PUSH EDX
  11757. LEA EDX, [EAX].FDefExtension
  11758. PUSH EDX
  11759. LEA EDX, [EAX].FFileName
  11760. PUSH EDX
  11761. LEA EAX, [EAX].FTitle
  11762. @@loo:
  11763. {$IFDEF UNICODE_CTRLS}
  11764. CALL System.@WStrClr
  11765. {$ELSE}
  11766. CALL System.@LStrClr
  11767. {$ENDIF}
  11768. POP EAX
  11769. TEST EAX, EAX
  11770. JNZ @@loo
  11771. POP EAX
  11772. CALL TObj.Destroy
  11773. end;
  11774. {$IFDEF ASM_UNICODE}
  11775. function TOpenSaveDialog.Execute: Boolean;
  11776. asm
  11777. PUSH EBX
  11778. XCHG EBX, EAX
  11779. XOR ECX, ECX
  11780. {$IFDEF OpenSaveDialog_Extended}
  11781. MOVZX EAX, [EBX].NoPlaceBar
  11782. PUSH EAX
  11783. PUSH ECX
  11784. PUSH ECX
  11785. PUSH [EBX].TemplateName
  11786. PUSH [EBX].HookProc
  11787. {$ELSE}
  11788. PUSH ECX // prepare lpTemplateName = nil
  11789. PUSH ECX // prepare lpfnHook = nil
  11790. {$ENDIF}
  11791. PUSH EBX // prepare lCustData = @Self
  11792. MOV EDX, [EBX].FDefExtension
  11793. CALL EDX2PChar
  11794. PUSH EDX // prepare lpstrDefExt = FDefExtension
  11795. PUSH ECX // prepare nFileExtension, nFileOffset: Word = 0, 0
  11796. // prepare flags:
  11797. LEA EAX, [EBX].FOptions
  11798. MOV EDX, Offset[@@OpenSaveFlags]
  11799. {$IFDEF OpenSaveDialog_Extended}
  11800. MOV CL, 14
  11801. {$ELSE}
  11802. MOV CL, 12
  11803. {$ENDIF}
  11804. CALL MakeFlags
  11805. XOR ECX, ECX
  11806. OR EAX, OFN_EXPLORER or OFN_LONGNAMES or OFN_ENABLESIZING
  11807. PUSH EAX // push Flags
  11808. PUSH [EBX].FTitle // prepare lpstrTitle
  11809. PUSH [EBX].FInitialDir // prepare lpstrInitialDir
  11810. PUSH ECX // prepare nMaxFileTitle = 0
  11811. PUSH ECX // prepare lpstrFileTitle = nil
  11812. TEST AH, 2 // MultiSelect?
  11813. MOV EAX, 65520
  11814. JNZ @@1
  11815. MOV AX, MAX_PATH+2
  11816. @@1: PUSH EAX // prepare nMaxFile
  11817. CALL System.@GetMem
  11818. POP ECX
  11819. PUSH ECX
  11820. PUSH EAX // prepare lpStrFile
  11821. XOR EDX, EDX
  11822. @@2: MOV EDX, [EBX].fFileName // no, fill it initilly by FileName
  11823. CALL EDX2PChar
  11824. DEC ECX // added 5 october 2003 to prevent possible error if FileName too big
  11825. CALL StrLCopy
  11826. XOR EDX, EDX
  11827. PUSH [EBX].FFilterIndex // prepare nFilterIndex
  11828. PUSH EDX // prepare nMaxCustFilter
  11829. PUSH EDX // prepare lpstrCustomFilter
  11830. PUSH EDX // prepare lpstrFilter = nil
  11831. MOV EAX, ESP
  11832. OR EDX, [EBX].FFilter
  11833. JZ @@5
  11834. MOV ECX, offset[@@0]
  11835. CALL System.@LStrCat3 // prepare lpStrFilter = FFilter + #0
  11836. POP EAX
  11837. PUSH EAX
  11838. XOR EDX, EDX
  11839. @@3: INC EAX // filter is not starting from ';' or '|'...
  11840. CMP [EAX], DL
  11841. JZ @@5
  11842. CMP byte ptr [EAX], '|'
  11843. JNZ @@3
  11844. @@4: MOV [EAX], DL
  11845. JMP @@3
  11846. @@OpenSaveFlags:
  11847. DD OFN_CREATEPROMPT, OFN_EXTENSIONDIFFERENT, OFN_FILEMUSTEXIST
  11848. DD OFN_HIDEREADONLY, OFN_NOCHANGEDIR, OFN_NODEREFERENCELINKS
  11849. DD OFN_ALLOWMULTISELECT, OFN_NONETWORKBUTTON, OFN_NOREADONLYRETURN
  11850. DD OFN_OVERWRITEPROMPT, OFN_PATHMUSTEXIST, OFN_READONLY, OFN_NOVALIDATE
  11851. {$IFDEF OpenSaveDialog_Extended}
  11852. DD OFN_ENABLETEMPLATE, OFN_ENABLEHOOK
  11853. {$ENDIF}
  11854. DD -1, 1
  11855. @@0: DB 0
  11856. @@5:
  11857. PUSH [hInstance] // prepare hInstance
  11858. MOV ECX, [EBX].TControl.fWnd
  11859. INC ECX
  11860. LOOP @@6
  11861. MOV ECX, [Applet]
  11862. JECXZ @@6
  11863. MOV ECX, [ECX].TControl.fHandle
  11864. @@6: PUSH ECX // prepare hWndOwner
  11865. {$IFDEF OpenSaveDialog_Extended}
  11866. CALL WinVer
  11867. CMP AL, wvNT
  11868. MOV DL, 76+12
  11869. JA @@6a
  11870. CMP AL, wvME
  11871. JE @@6a
  11872. MOV DL, 76
  11873. @@6a: MOVZX EAX, DL
  11874. PUSH EAX
  11875. {$ELSE}
  11876. PUSH 76 // prepare lStructSize
  11877. {$ENDIF}
  11878. PUSH ESP
  11879. CMP [EBX].TControl.FOpenDialog, 0
  11880. JZ @@7
  11881. CALL GetOpenFileName
  11882. JMP @@8
  11883. @@7: CALL GetSaveFileName
  11884. @@8:
  11885. PUSH EAX
  11886. XOR EDX, EDX
  11887. TEST EAX, EAX
  11888. JZ @@10
  11889. MOV EAX, [ESP+4].TOpenFileName.nFilterIndex
  11890. MOV [EBX].FFilterIndex, EAX
  11891. TEST BYTE PTR [ESP+4].TOpenFileName.Flags, OFN_READONLY
  11892. SETNZ AL
  11893. MOV [EBX].fOpenReadOnly, AL
  11894. MOV EAX, [ESP+4].TOpenFileName.lpstrFile
  11895. MOV EDX, EAX
  11896. XOR ECX, ECX
  11897. TEST [EBX].FOptions, 1 shl OSAllowMultiSelect
  11898. JZ @@10
  11899. DEC EAX
  11900. @@9: INC EAX
  11901. CMP byte ptr [EAX], CL
  11902. JNZ @@9
  11903. CMP byte ptr [EAX+1], CL
  11904. JZ @@10
  11905. MOV byte ptr [EAX], 13
  11906. JMP @@9
  11907. @@10:
  11908. LEA EAX, [EBX].FFileName
  11909. CALL System.@LStrFromPChar
  11910. MOV EAX, [ESP+4].TOpenFileName.lpstrFile
  11911. CALL System.@FreeMem // v1.86 +AK
  11912. LEA EAX, [ESP+4].TOpenFileName.lpstrFilter
  11913. CALL System.@LStrClr
  11914. POP EAX
  11915. {$IFDEF OpenSaveDialog_Extended}
  11916. ADD ESP, 76+12
  11917. {$ELSE}
  11918. ADD ESP, 76
  11919. {$ENDIF}
  11920. POP EBX
  11921. end;
  11922. {$ENDIF ASM_UNICODE}
  11923. destructor TOpenDirDialog.Destroy;
  11924. asm //cmd //opd
  11925. PUSH EAX
  11926. PUSH 0
  11927. LEA EDX, [EAX].FTitle
  11928. PUSH EDX
  11929. LEA EDX, [EAX].FInitialPath
  11930. PUSH EDX
  11931. LEA EAX, [EAX].FStatusText
  11932. @@loo:
  11933. {$IFDEF UNICODE_CTRLS}
  11934. CALL System.@WStrClr
  11935. {$ELSE}
  11936. CALL System.@LStrClr
  11937. {$ENDIF}
  11938. POP EAX
  11939. TEST EAX, EAX
  11940. JNZ @@loo
  11941. POP EAX
  11942. CALL TObj.Destroy
  11943. end;
  11944. {$IFDEF ASM_UNICODE}
  11945. function OpenDirSelChangeCallBack( Wnd: HWnd; Msg: DWORD; lParam, lpData: LParam ):
  11946. Integer; stdcall;
  11947. asm
  11948. MOV EAX, [lpData]
  11949. MOV ECX, [EAX].TOpenDirDialog.FOnSelChanged.TMethod.Code
  11950. JECXZ @@exit
  11951. LEA EDX, [EAX].TOpenDirDialog.FBuf
  11952. PUSH EDX
  11953. PUSH [lParam]
  11954. CALL SHGetPathFromIDListA
  11955. MOV EDX, [lpData]
  11956. LEA ECX, [EDX].TOpenDirDialog.FBuf
  11957. PUSH 0
  11958. PUSH ESP
  11959. LEA EAX, [EDX].TOpenDirDialog.FStatusText
  11960. PUSH EAX
  11961. MOV EAX, [EDX].TOpenDirDialog.FOnSelChanged.TMethod.Data
  11962. CALL dword ptr [EDX].TOpenDirDialog.FOnSelChanged.TMethod.Code
  11963. PUSH 0
  11964. PUSH BFFM_ENABLEOK
  11965. PUSH [Wnd]
  11966. CALL SendMessage
  11967. @@1:
  11968. MOV EDX, [lpData]
  11969. MOV ECX, [EDX].TOpenDirDialog.FStatusText
  11970. JECXZ @@exit
  11971. PUSH ECX
  11972. PUSH 0
  11973. PUSH BFFM_SETSTATUSTEXT
  11974. PUSH [Wnd]
  11975. CALL SendMessage
  11976. @@exit: XOR EAX, EAX
  11977. end;
  11978. {$ENDIF}
  11979. {$IFNDEF NEW_OPEN_DIR_STYLE_EX}
  11980. function OpenDirCallBack( Wnd: HWnd; Msg: DWORD; lParam, lpData: LParam ): Integer;
  11981. stdcall;
  11982. asm
  11983. MOV EAX, [Wnd]
  11984. MOV EDX, [lpData]
  11985. MOV [EDX].TOpenDirDialog.FDialogWnd, EAX
  11986. MOV ECX, [Msg]
  11987. LOOP @@chk_sel_chg
  11988. // Msg = 1 -> BFFM_Initialized
  11989. MOV ECX, [EDX].TOpenDirDialog.FCenterProc
  11990. JECXZ @@1
  11991. PUSH EDX
  11992. CALL ECX
  11993. POP EDX
  11994. @@1: MOV ECX, [EDX].TOpenDirDialog.FInitialPath
  11995. JECXZ @@exit
  11996. PUSH ECX
  11997. PUSH 1
  11998. PUSH BFFM_SETSELECTION
  11999. PUSH [Wnd]
  12000. CALL SendMessage
  12001. JMP @@exit
  12002. @@chk_sel_chg:
  12003. LOOP @@exit
  12004. // Msg = 2 -> BFFM_SelChanged
  12005. MOV ECX, [EDX].TOpenDirDialog.FDoSelChanged
  12006. JECXZ @@exit
  12007. POP EBP
  12008. JMP ECX
  12009. @@exit: XOR EAX, EAX
  12010. end;
  12011. {$ENDIF}
  12012. procedure OpenDirDlgCenter( Wnd: HWnd );
  12013. asm
  12014. PUSH EBX
  12015. MOV EBX, EAX
  12016. ADD ESP, -16
  12017. PUSH ESP
  12018. PUSH EAX
  12019. CALL GetWindowRect
  12020. POP EDX // EDX = Left
  12021. POP ECX // ECX = Top
  12022. POP EAX // EAX = Right
  12023. SUB EAX, EDX // EAX = W
  12024. POP EDX // EDX = Bottom
  12025. SUB EDX, ECX // EDX = H
  12026. XOR ECX, ECX
  12027. INC ECX
  12028. PUSH ECX // prepare True
  12029. PUSH EDX // prepare H
  12030. PUSH EAX // prepare W
  12031. INC ECX
  12032. @@1:
  12033. PUSH ECX
  12034. DEC ECX
  12035. PUSH ECX
  12036. CALL GetSystemMetrics
  12037. POP ECX
  12038. SUB EAX, [ESP+4]
  12039. SAR EAX, 1
  12040. PUSH EAX
  12041. LOOP @@1
  12042. PUSH EBX
  12043. CALL MoveWindow
  12044. POP EBX
  12045. end;
  12046. procedure TOpenDirDialog.SetCenterOnScreen(const Value: Boolean);
  12047. asm
  12048. MOV [EAX].FCenterOnScreen, DL
  12049. MOVZX ECX, DL
  12050. JECXZ @@1
  12051. MOV ECX, Offset[OpenDirDlgCenter]
  12052. @@1: MOV [EAX].FCenterProc, ECX
  12053. end;
  12054. {$IFDEF ASM_UNICODE}
  12055. function TControl.TBAddInsButtons(Idx: Integer; const Buttons: array of PKOLChar;
  12056. const BtnImgIdxArray: array of Integer): Integer; stdcall;
  12057. asm
  12058. { [EBP+$8] = @Self
  12059. [EBP+$C] = Idx
  12060. [EBP+$10] = Buttons
  12061. [EBP+$14] = High(Butons)
  12062. [EBP+$18] = BtnImgIdxArray
  12063. [EBP+$1C] = High(BtnImgIdxArray)
  12064. }
  12065. PUSH EBX
  12066. PUSH ESI
  12067. PUSH EDI
  12068. OR EBX, -1
  12069. MOV EAX, 20
  12070. MOV ECX, [EBP+$14]
  12071. CMP ECX, EBX
  12072. JLE @@fin
  12073. INC ECX
  12074. MUL ECX
  12075. CALL System.@GetMem
  12076. PUSH EAX // save AB to FreeMem after
  12077. MOV EDX, EBX
  12078. DEC EDX // nBmp := -2
  12079. MOV ECX, [EBP+$14]
  12080. INC ECX
  12081. JZ @@exit
  12082. MOV ECX, [EBP+$1C]
  12083. INC ECX
  12084. JZ @@1
  12085. MOV ECX, [BtnImgIdxArray]
  12086. MOV EDX, [ECX]
  12087. DEC EDX // nBmp := BtnImgIdxArray[ 0 ] - 1
  12088. @@1: MOV ECX, [EBP+$14]
  12089. INC ECX
  12090. MOV ESI, [Buttons]
  12091. MOV EDI, EAX // EDI = PAB
  12092. PUSH 0 // N:=0 in [EBP-$14]
  12093. // -- impossible?-- JZ @@break
  12094. @@loop:
  12095. LODSD
  12096. TEST EAX, EAX
  12097. JZ @@break
  12098. PUSH ECX
  12099. CMP word ptr [EAX], '-'
  12100. JNE @@2
  12101. OR EAX, -1
  12102. STOSD
  12103. MOV EAX, [ToolbarsIDcmd]
  12104. TEST EBX, EBX
  12105. {$IFDEF USE_CMOV}
  12106. CMOVL EBX, EAX
  12107. {$ELSE}
  12108. JGE @@b0
  12109. MOV EBX, EAX
  12110. @@b0: {$ENDIF}
  12111. //INC [ToolbarsIDcmd]
  12112. STOSD
  12113. XOR EAX, EAX
  12114. INC AH // TBSTYLE_SEP = 1
  12115. STOSD
  12116. DEC AH
  12117. STOSD
  12118. DEC EAX
  12119. JMP @@3
  12120. DD -1, 1
  12121. @@0: DB 0
  12122. @@2:
  12123. INC EDX // Inc( nBmp )
  12124. PUSH EAX
  12125. MOV EAX, [EBP+$1C]
  12126. MOV ECX, [EBP-$14]
  12127. CMP EAX, ECX
  12128. MOV EAX, EDX
  12129. JL @@21
  12130. MOV EAX, [BtnImgIdxArray]
  12131. MOV EAX, [EAX+ECX*4]
  12132. @@21: STOSD
  12133. TEST EDX, EDX
  12134. JGE @@2a
  12135. DEC EDX
  12136. @@2a:
  12137. MOV EAX, [ToolbarsIDcmd]
  12138. //INC [ToolbarsIDcmd]
  12139. STOSD
  12140. TEST EBX, EBX
  12141. {$IFDEF USE_CMOV}
  12142. CMOVL EBX, EAX
  12143. {$ELSE}
  12144. JGE @@210
  12145. MOV EBX, EAX
  12146. @@210: {$ENDIF}
  12147. POP ECX
  12148. MOV AX, $1004 // AL=fsState=_ENABLED, AH=fsStyle=_AUTOSIZE
  12149. CMP byte ptr [ECX], '^'
  12150. JNE @@22
  12151. MOV AH, TBSTYLE_DROPDOWN or TBSTYLE_AUTOSIZE
  12152. INC ECX
  12153. @@22: CMP byte ptr [ECX], '-'
  12154. JZ @@23
  12155. CMP byte ptr [ECX], '+'
  12156. JNZ @@24
  12157. MOV AL, TBSTATE_ENABLED or TBSTATE_CHECKED
  12158. @@23: INC ECX
  12159. OR AH, TBSTYLE_CHECK
  12160. CMP byte ptr [ECX], '!'
  12161. JNZ @@24
  12162. OR AH, TBSTYLE_GROUP
  12163. INC ECX
  12164. @@24: {$IFDEF TOOLBAR_DOT_NOAUTOSIZE_BUTTON}
  12165. CMP byte ptr [ECX], '.'
  12166. JNZ @@25
  12167. AND AH, not TBSTYLE_AUTOSIZE
  12168. INC ECX
  12169. @@25:
  12170. {$ENDIF TOOLBAR_DOT_NOAUTOSIZE_BUTTON}
  12171. STOSD
  12172. MOV EAX, [EBP+8]
  12173. STOSD
  12174. OR EAX, -1
  12175. CMP word ptr [ECX], ' '
  12176. JZ @@3
  12177. CMP byte ptr [ECX], 0
  12178. JZ @@3
  12179. PUSH EDX
  12180. PUSH 0
  12181. MOV EDX, ECX
  12182. MOV EAX, ESP
  12183. CALL System.@LStrFromPChar
  12184. MOV EAX, ESP
  12185. MOV EDX, offset[@@0]
  12186. CALL System.@LStrCat
  12187. PUSH dword ptr [ESP]
  12188. PUSH 0
  12189. PUSH TB_ADDSTRING
  12190. PUSH dword ptr [EBP+8]
  12191. CALL Perform
  12192. STOSD
  12193. CALL RemoveStr
  12194. POP EDX
  12195. JMP @@30
  12196. @@3: STOSD
  12197. @@30: INC dword ptr [EBP-$14]
  12198. INC [ToolbarsIDcmd]
  12199. POP ECX
  12200. DEC ECX
  12201. JNZ @@loop
  12202. @@break:
  12203. POP ECX
  12204. JECXZ @@exit
  12205. PUSH dword ptr [ESP]
  12206. MOV EAX, [Idx]
  12207. TEST EAX, EAX
  12208. JGE @@31
  12209. PUSH ECX
  12210. PUSH TB_ADDBUTTONS
  12211. JMP @@32
  12212. @@31:
  12213. PUSH EAX
  12214. PUSH TB_INSERTBUTTON
  12215. @@32:
  12216. PUSH dword ptr [EBP+8]
  12217. CALL Perform
  12218. @@exit:
  12219. POP EAX
  12220. CALL System.@FreeMem
  12221. @@fin:
  12222. POP EDI
  12223. POP ESI
  12224. XCHG EAX, EBX
  12225. POP EBX
  12226. end;
  12227. {$ENDIF ASM_UNICODE}
  12228. function TControl.TBAddButtons(const Buttons: array of PKOLChar;
  12229. const BtnImgIdxArray: array of Integer): Integer;
  12230. asm
  12231. PUSH dword ptr [EBP+8]
  12232. PUSH dword ptr [EBP+12]
  12233. PUSH ECX
  12234. PUSH EDX
  12235. PUSH -1
  12236. PUSH EAX
  12237. CALL TBAddInsButtons
  12238. end;
  12239. function TControl.TBGetBtnStt(BtnID: Integer; const Index: Integer): Boolean;
  12240. asm
  12241. PUSH 0
  12242. PUSH ECX
  12243. PUSH EAX
  12244. CALL GetTBBtnGoodID
  12245. POP EDX
  12246. POP ECX
  12247. PUSH EAX
  12248. ADD ECX, 8
  12249. PUSH ECX
  12250. PUSH EDX
  12251. CALL Perform
  12252. TEST EAX, EAX
  12253. SETNZ AL
  12254. end;
  12255. function TControl.TBIndex2Item(Idx: Integer): Integer;
  12256. const //
  12257. _sizeof_TTBButton = sizeof( TTBButton ); //
  12258. asm
  12259. ADD ESP, -_sizeof_TTBButton //
  12260. PUSH ESP
  12261. PUSH EDX
  12262. PUSH TB_GETBUTTON
  12263. PUSH EAX
  12264. CALL Perform
  12265. TEST EAX, EAX
  12266. MOV EAX, [ESP].TTBButton.idCommand
  12267. JNZ @@1
  12268. OR EAX, -1
  12269. @@1: ADD ESP, _sizeof_TTBButton //
  12270. end;
  12271. {$IFDEF ASM_UNICODE}
  12272. function TControl.TBGetButtonText( BtnID: Integer ): String;
  12273. asm
  12274. PUSH ECX
  12275. ADD ESP, -1024
  12276. PUSH ESP
  12277. PUSH EAX
  12278. CALL GetTBBtnGoodID
  12279. POP EDX
  12280. PUSH EAX
  12281. PUSH TB_GETBUTTONTEXT
  12282. PUSH EDX
  12283. CALL Perform
  12284. TEST EAX, EAX
  12285. JLE @@2
  12286. MOV EDX, ESP
  12287. JMP @@1
  12288. @@2: XOR EDX, EDX
  12289. @@1: MOV EAX, [ESP+1024]
  12290. CALL System.@LStrFromPChar
  12291. ADD ESP, 1028
  12292. end;
  12293. {$ENDIF}
  12294. {$IFDEF ASM_UNICODE}
  12295. procedure TControl.TBSetTooltips(BtnID1st: Integer;
  12296. const Tooltips: array of PKOLChar);
  12297. asm
  12298. PUSH EBX
  12299. PUSH ESI
  12300. MOV ESI, ECX
  12301. MOV EBX, EAX
  12302. PUSHAD
  12303. MOV ECX, [EBX].fTBttCmd
  12304. INC ECX
  12305. LOOP @@1
  12306. CALL NewList
  12307. MOV [EBX].fTBttCmd, EAX
  12308. {$IFDEF USE_AUTOFREE4CONTROLS}
  12309. XCHG EDX, EAX
  12310. MOV EAX, EBX
  12311. CALL TControl.Add2AutoFree
  12312. {$ENDIF}
  12313. CALL NewStrList
  12314. MOV [EBX].fTBttTxt, EAX
  12315. {$IFDEF USE_AUTOFREE4CONTROLS}
  12316. XCHG EDX, EAX
  12317. MOV EAX, EBX
  12318. CALL TControl.Add2AutoFree
  12319. {$ENDIF}
  12320. @@1: POPAD
  12321. MOV ECX, [EBP+8]
  12322. INC ECX
  12323. JZ @@exit
  12324. @@loop:
  12325. PUSH ECX
  12326. PUSH EDX
  12327. PUSH 0
  12328. LODSD
  12329. MOV EDX, EAX
  12330. MOV EAX, ESP
  12331. CALL System.@LStrFromPChar
  12332. MOV EDX, [ESP+4]
  12333. MOV EAX, [EBX].fTBttCmd
  12334. CALL TList.IndexOf
  12335. TEST EAX, EAX
  12336. JGE @@2
  12337. MOV EDX, [ESP+4]
  12338. MOV EAX, [EBX].fTBttCmd
  12339. CALL TList.Add
  12340. POP EDX
  12341. PUSH EDX
  12342. MOV EAX, [EBX].fTBttTxt
  12343. CALL TStrList.Add
  12344. JMP @@3
  12345. @@2:
  12346. MOV EDX, EAX
  12347. POP ECX
  12348. PUSH ECX
  12349. MOV EAX, [EBX].fTBttTxt
  12350. CALL TStrList.Put
  12351. @@3:
  12352. CALL RemoveStr
  12353. POP EDX
  12354. POP ECX
  12355. INC EDX
  12356. LOOP @@loop
  12357. @@exit:
  12358. POP ESI
  12359. POP EBX
  12360. end;
  12361. {$ENDIF}
  12362. function TControl.TBButtonAtPos(X, Y: Integer): Integer;
  12363. asm
  12364. PUSH EAX
  12365. CALL TBBtnIdxAtPos
  12366. TEST EAX, EAX
  12367. MOV EDX, EAX
  12368. POP EAX
  12369. JGE TBIndex2Item
  12370. MOV EAX, EDX
  12371. end;
  12372. function TControl.TBBtnIdxAtPos(X, Y: Integer): Integer;
  12373. asm
  12374. PUSH EBX
  12375. PUSH ECX
  12376. PUSH EDX
  12377. MOV EBX, EAX
  12378. CALL GetItemsCount
  12379. MOV ECX, EAX
  12380. JECXZ @@fin
  12381. @@1: PUSH ECX
  12382. ADD ESP, -16
  12383. PUSH ESP
  12384. DEC ECX
  12385. PUSH ECX
  12386. PUSH TB_GETITEMRECT
  12387. PUSH EBX
  12388. CALL Perform
  12389. MOV EDX, ESP
  12390. LEA EAX, [ESP+20]
  12391. CALL PointInRect
  12392. ADD ESP, 16
  12393. POP ECX
  12394. TEST AL, AL
  12395. {$IFDEF USE_CMOV}
  12396. CMOVNZ EAX, ECX
  12397. {$ELSE}
  12398. JZ @@2
  12399. MOV EAX, ECX
  12400. JMP @@fin
  12401. @@2: {$ENDIF}
  12402. JNZ @@fin
  12403. LOOP @@1
  12404. @@fin: DEC EAX
  12405. POP EDX
  12406. POP EDX
  12407. POP EBX
  12408. end;
  12409. procedure TControl.TBSetButtonText(BtnID: Integer; const Value: KOLString);
  12410. asm
  12411. PUSH 0
  12412. PUSH ECX
  12413. PUSH EAX
  12414. CALL GetTBBtnGoodID
  12415. POP EDX
  12416. ADD ESP, -16
  12417. PUSH TBIF_TEXT
  12418. PUSH 32 //Sizeof( TTBButtonInfo )
  12419. PUSH ESP
  12420. PUSH EAX
  12421. PUSH TB_SETBUTTONINFO
  12422. PUSH EDX
  12423. CALL Perform
  12424. ADD ESP, 32 //sizeof( TTBButtonInfo )
  12425. end;
  12426. function TControl.TBGetBtnWidth(BtnID: Integer): Integer;
  12427. asm
  12428. ADD ESP, -16
  12429. MOV ECX, ESP
  12430. CALL TBGetButtonRect
  12431. POP EDX
  12432. POP ECX
  12433. POP EAX
  12434. SUB EAX, EDX
  12435. POP EDX
  12436. end;
  12437. procedure TControl.TBSetBtnWidth(BtnID: Integer; const Value: Integer);
  12438. asm
  12439. PUSH EBX
  12440. MOV EBX, ECX
  12441. PUSH EAX
  12442. CALL GetTBBtnGoodID
  12443. POP EDX
  12444. ADD ESP, -24
  12445. PUSH TBIF_SIZE or TBIF_STYLE
  12446. PUSH 32
  12447. MOV ECX, ESP
  12448. PUSH ECX
  12449. PUSH EAX
  12450. PUSH TB_SETBUTTONINFO
  12451. PUSH EDX
  12452. PUSH ECX
  12453. PUSH EAX
  12454. PUSH TB_GETBUTTONINFO
  12455. PUSH EDX
  12456. CALL Perform
  12457. MOV [ESP+16+18], BX
  12458. AND byte ptr [ESP+16].TTBButtonInfo.fsStyle, not TBSTYLE_AUTOSIZE
  12459. CALL Perform
  12460. ADD ESP, 32
  12461. POP EBX
  12462. end;
  12463. procedure TControl.AddDirList(const Filemask: KOLString; Attrs: DWORD);
  12464. asm
  12465. CALL EDX2PChar
  12466. PUSH EDX
  12467. PUSH ECX
  12468. MOVZX ECX, [EAX].fCommandActions.aDir
  12469. JECXZ @@exit
  12470. PUSH ECX
  12471. PUSH EAX
  12472. CALL Perform
  12473. RET
  12474. @@exit:
  12475. POP ECX
  12476. POP ECX
  12477. end;
  12478. {$IFDEF noASM_VERSION}
  12479. function WndProcShowModal( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  12480. asm
  12481. CMP word ptr [EDX].TMsg.message, WM_CLOSE
  12482. JNZ @@ret_false
  12483. XCHG EDX, EAX
  12484. XOR EAX, EAX
  12485. CMP [EDX].TControl.fModalResult, EAX
  12486. JNZ @@1
  12487. OR [EDX].TControl.fModalResult, -1
  12488. @@1:
  12489. MOV [ECX], EAX
  12490. INC EAX
  12491. RET
  12492. @@ret_false:
  12493. XOR EAX, EAX
  12494. end;
  12495. {$ENDIF}
  12496. function TimerProc( Wnd : HWnd; Msg : Integer; T : PTimer; CurrentTime : DWord ): Integer;
  12497. stdcall;
  12498. asm //cmd //opd
  12499. {$IFDEF STOPTIMER_AFTER_APPLETTERMINATED}
  12500. CMP [AppletTerminated], 0
  12501. JNZ @@exit
  12502. {$ENDIF}
  12503. MOV EDX, T
  12504. MOV ECX, [EDX].TTimer.fOnTimer.TMethod.Code
  12505. JECXZ @@exit
  12506. MOV EAX, [EDX].TTimer.fOnTimer.TMethod.Data
  12507. CALL ECX
  12508. @@exit: XOR EAX, EAX
  12509. end;
  12510. destructor TTimer.Destroy;
  12511. asm
  12512. PUSH EAX
  12513. XOR EDX, EDX
  12514. CALL TTimer.SetEnabled
  12515. POP EAX
  12516. CALL TObj.Destroy
  12517. DEC [TimerCount]
  12518. JNZ @@exit
  12519. XOR EAX, EAX
  12520. XCHG EAX, [TimerOwnerWnd]
  12521. CALL TObj.RefDec
  12522. @@exit:
  12523. end;
  12524. procedure TTimer.SetEnabled(const Value: Boolean);
  12525. asm
  12526. PUSH EBX
  12527. XCHG EBX, EAX
  12528. CMP [EBX].fEnabled, DL
  12529. JZ @@exit
  12530. {$IFDEF TIMER_APPLETWND}
  12531. MOV ECX, [Applet]
  12532. JECXZ @@exit
  12533. MOV [EBX].fEnabled, DL
  12534. TEST DL, DL
  12535. JZ @@disable
  12536. {$ELSE}
  12537. MOV [EBX].fEnabled, DL
  12538. TEST DL, DL
  12539. JZ @@disable
  12540. MOV ECX, [TimerOwnerWnd]
  12541. INC ECX
  12542. LOOP @@owner_ready
  12543. INC ECX
  12544. MOV EDX, offset[EmptyString]
  12545. XOR EAX, EAX
  12546. CALL _NewWindowed
  12547. MOV [TimerOwnerWnd], EAX
  12548. MOV [EAX].TControl.fStyle, 0
  12549. INC [EAX].TControl.fIsControl
  12550. XCHG ECX, EAX
  12551. {$ENDIF}
  12552. @@owner_ready:
  12553. PUSH offset[TimerProc]
  12554. PUSH [EBX].fInterval
  12555. PUSH EBX
  12556. XCHG EAX, ECX
  12557. CALL TControl.GetWindowHandle
  12558. PUSH EAX
  12559. CALL SetTimer
  12560. MOV [EBX].fHandle, EAX
  12561. JMP @@exit
  12562. @@disable:
  12563. XOR ECX, ECX
  12564. XCHG ECX, [EBX].TTimer.fHandle
  12565. JECXZ @@exit
  12566. PUSH ECX
  12567. {$IFDEF TIMER_APPLETWND}
  12568. MOV EAX, [Applet]
  12569. {$ELSE}
  12570. MOV EAX, [TimerOwnerWnd]
  12571. {$ENDIF}
  12572. PUSH [EAX].TControl.fHandle
  12573. CALL KillTimer
  12574. @@exit:
  12575. POP EBX
  12576. end;
  12577. function PrepareBitmapHeader( W, H, BitsPerPixel: Integer ): PBitmapInfo;
  12578. const szIH = sizeof(TBitmapInfoHeader);
  12579. szHd = szIH + 256 * Sizeof(TRGBQuad);
  12580. asm
  12581. PUSH EDI
  12582. PUSH ECX // BitsPerPixel
  12583. PUSH EDX // H
  12584. PUSH EAX // W
  12585. MOV EAX, szHd
  12586. CALL AllocMem
  12587. MOV EDI, EAX
  12588. XCHG ECX, EAX
  12589. XOR EAX, EAX
  12590. MOV AL, szIH
  12591. STOSD // biSize = Sizeof( TBitmapInfoHeader )
  12592. POP EAX // ^ W
  12593. STOSD // -> biWidth
  12594. POP EAX // ^ H
  12595. STOSD // -> biHeight
  12596. XOR EAX, EAX
  12597. INC EAX
  12598. STOSW // 1 -> biPlanes
  12599. POP EAX // ^ BitsPerPixel
  12600. STOSW // -> biBitCount
  12601. XCHG EAX, ECX // EAX = Result
  12602. POP EDI
  12603. end;
  12604. function Bits2PixelFormat( BitsPerPixel: Integer ): TPixelFormat;
  12605. asm
  12606. PUSH ESI
  12607. MOV ESI, offset[ BitsPerPixel_By_PixelFormat + 1 ]
  12608. XOR ECX, ECX
  12609. XCHG EDX, EAX
  12610. @@loo: INC ECX
  12611. LODSB
  12612. CMP AL, DL
  12613. JZ @@exit
  12614. TEST AL, AL
  12615. JNZ @@loo
  12616. @@exit: XCHG EAX, ECX
  12617. POP ESI
  12618. end;
  12619. function _NewBitmap( W, H: Integer ): PBitmap;
  12620. begin
  12621. New( Result, Create );
  12622. Result.fDetachCanvas := DummyDetachCanvas;
  12623. Result.fWidth := W;
  12624. Result.fHeight := H;
  12625. end;
  12626. function NewBitmap( W, H: Integer ): PBitmap;
  12627. asm
  12628. PUSH EAX
  12629. PUSH EDX
  12630. CALL _NewBitmap
  12631. POP EDX
  12632. POP ECX
  12633. PUSH EAX
  12634. INC [EAX].TBitmap.fHandleType
  12635. JECXZ @@exit
  12636. TEST EDX, EDX
  12637. JZ @@exit
  12638. PUSH EBX
  12639. PUSH EAX
  12640. PUSH EDX
  12641. PUSH ECX
  12642. PUSH 0
  12643. CALL GetDC
  12644. PUSH EAX
  12645. XCHG EBX, EAX
  12646. CALL CreateCompatibleBitmap
  12647. POP EDX
  12648. MOV [EDX].TBitmap.fHandle, EAX
  12649. PUSH EBX
  12650. PUSH 0
  12651. CALL ReleaseDC
  12652. POP EBX
  12653. @@exit: POP EAX
  12654. end;
  12655. procedure PreparePF16bit( DIBHeader: PBitmapInfo );
  12656. const szBIH = sizeof(TBitmapInfoHeader);
  12657. asm
  12658. MOV byte ptr [EAX].TBitmapInfoHeader.biCompression, BI_BITFIELDS
  12659. ADD EAX, szBIH
  12660. XCHG EDX, EAX
  12661. MOV EAX, offset[InitColors]
  12662. XOR ECX, ECX
  12663. MOV CL, 19*4
  12664. CALL System.Move
  12665. end;
  12666. function NewDIBBitmap( W, H: Integer; PixelFormat: TPixelFormat ): PBitmap;
  12667. asm
  12668. PUSH EBX
  12669. PUSH ECX
  12670. PUSH EDX
  12671. PUSH EAX
  12672. CALL _NewBitmap
  12673. XCHG EBX, EAX
  12674. POP EAX //W
  12675. POP EDX //H
  12676. POP ECX //PixelFormat
  12677. TEST EAX, EAX
  12678. JZ @@exit
  12679. TEST EDX, EDX
  12680. JZ @@exit
  12681. PUSH EAX
  12682. MOVZX EAX, CL
  12683. JMP @@loadBitsPixel
  12684. @@loadDefault:
  12685. MOVZX EAX, [DefaultPixelFormat]
  12686. @@loadBitsPixel:
  12687. MOVZX ECX, byte ptr [ BitsPerPixel_By_PixelFormat + EAX ]
  12688. JECXZ @@loadDefault
  12689. MOV [EBX].TBitmap.fNewPixelFormat, AL
  12690. {$IFDEF PARANOIA} DB $3C, pf16bit {$ELSE} CMP AL, pf16bit {$ENDIF}
  12691. POP EAX
  12692. PUSHFD
  12693. CALL PrepareBitmapHeader
  12694. MOV [EBX].TBitmap.fDIBHeader, EAX
  12695. POPFD
  12696. JNZ @@2
  12697. CALL PreparePF16bit
  12698. @@2:
  12699. MOV EAX, EBX
  12700. CALL TBitmap.GetScanLineSize
  12701. MOV EDX, [EBX].TBitmap.fHeight
  12702. MUL EDX
  12703. MOV [EBX].TBitmap.fDIBSize, EAX
  12704. ADD EAX, 16
  12705. PUSH EAX
  12706. PUSH GMEM_FIXED or GMEM_ZEROINIT
  12707. CALL GlobalAlloc
  12708. MOV [EBX].TBitmap.fDIBBits, EAX
  12709. @@exit:
  12710. XCHG EAX, EBX
  12711. POP EBX
  12712. end;
  12713. procedure TBitmap.ClearData;
  12714. asm
  12715. PUSH EBX
  12716. MOV EBX, EAX
  12717. CALL [EBX].fDetachCanvas
  12718. XOR ECX, ECX
  12719. XCHG ECX, [EBX].fHandle
  12720. JECXZ @@1
  12721. PUSH ECX
  12722. CALL DeleteObject
  12723. XOR ECX, ECX
  12724. MOV [EBX].fDIBBits, ECX
  12725. @@1: XCHG ECX, [EBX].fDIBBits
  12726. JECXZ @@2
  12727. PUSH ECX
  12728. CALL GlobalFree
  12729. @@2: XOR ECX, ECX
  12730. XCHG ECX, [EBX].fDIBHeader
  12731. JECXZ @@3
  12732. XCHG EAX, ECX
  12733. CALL System.@FreeMem
  12734. @@3: XOR EAX, EAX
  12735. MOV [EBX].fScanLineSize, EAX
  12736. MOV [EBX].fGetDIBPixels, EAX
  12737. MOV [EBX].fSetDIBPixels, EAX
  12738. XCHG EAX, EBX
  12739. POP EBX
  12740. CALL ClearTransImage
  12741. end;
  12742. procedure TBitmap.Clear;
  12743. asm
  12744. PUSH EAX
  12745. CALL RemoveCanvas
  12746. POP EAX
  12747. PUSH EAX
  12748. CALL ClearData
  12749. POP EAX
  12750. XOR EDX, EDX
  12751. MOV [EAX].fWidth, EDX
  12752. MOV [EAX].fHeight, EDX
  12753. MOV [EAX].fDIBAutoFree, DL
  12754. end;
  12755. destructor TBitmap.Destroy;
  12756. asm
  12757. PUSH EAX
  12758. CALL Clear
  12759. POP EAX
  12760. CALL TObj.Destroy
  12761. end;
  12762. procedure TBitmap.Draw(DC: HDC; X, Y: Integer);
  12763. const szBitmap = sizeof( tagBitmap );
  12764. asm // [EBP+8] = Y
  12765. PUSH EDX // [EBP-4] = DC
  12766. PUSH ECX // [EBP-8] = X
  12767. PUSH EBX
  12768. PUSH ESI
  12769. @@try_again:
  12770. MOV EBX, EAX
  12771. CALL GetEmpty // GetEmpty must be assembler version !
  12772. JZ @@exit
  12773. MOV ECX, [EBX].fHandle
  12774. JECXZ @@2
  12775. //MOV EAX, EBX
  12776. //CALL [EBX].fDetachCanvas // detached in StartDC
  12777. ADD ESP, -szBitmap
  12778. PUSH ESP
  12779. PUSH szBitmap
  12780. PUSH [EBX].fHandle
  12781. CALL GetObject
  12782. TEST EAX, EAX
  12783. MOV ESI, [ESP].tagBitmap.bmHeight
  12784. {$IFDEF USE_CMOV}
  12785. CMOVZ ESI, [EBX].fHeight
  12786. {$ELSE}
  12787. JNZ @@1
  12788. MOV ESI, [EBX].fHeight
  12789. @@1: {$ENDIF}
  12790. ADD ESP, szBitmap
  12791. CALL StartDC
  12792. PUSH SRCCOPY
  12793. PUSH 0
  12794. PUSH 0
  12795. PUSH EAX
  12796. CALL @@prepare
  12797. CALL BitBlt
  12798. CALL FinishDC
  12799. JMP @@exit
  12800. @@prepare:
  12801. XCHG ESI, [ESP]
  12802. PUSH [EBX].fWidth
  12803. PUSH Y
  12804. PUSH dword ptr [EBP-8]
  12805. PUSH dword ptr [EBP-4]
  12806. JMP ESI
  12807. @@2:
  12808. MOV ECX, [EBX].fDIBHeader
  12809. JECXZ @@exit
  12810. MOV ESI, [ECX].TBitmapInfoHeader.biHeight
  12811. TEST ESI, ESI
  12812. JGE @@20
  12813. NEG ESI
  12814. @@20:
  12815. PUSH SRCCOPY
  12816. PUSH DIB_RGB_COLORS
  12817. PUSH ECX
  12818. PUSH [EBX].fDIBBits
  12819. PUSH ESI
  12820. PUSH [EBX].fWidth
  12821. PUSH 0
  12822. PUSH 0
  12823. CALL @@prepare
  12824. CALL StretchDIBits
  12825. TEST EAX, EAX
  12826. JNZ @@exit
  12827. MOV EAX, EBX
  12828. CALL GetHandle
  12829. TEST EAX, EAX
  12830. XCHG EAX, EBX
  12831. JNZ @@try_again
  12832. @@exit:
  12833. POP ESI
  12834. POP EBX
  12835. MOV ESP, EBP
  12836. end;
  12837. procedure TBitmap.StretchDraw(DC: HDC; const Rect: TRect);
  12838. asm
  12839. PUSH EBX
  12840. PUSH EDI
  12841. PUSH EBP
  12842. MOV EBP, ESP
  12843. PUSH EDX
  12844. PUSH ECX
  12845. MOV EBX, EAX
  12846. CALL GetEmpty
  12847. JZ @@exit
  12848. MOV ECX, [EBX].fHandle
  12849. JECXZ @@2
  12850. @@0:
  12851. CALL StartDC
  12852. PUSH SRCCOPY
  12853. PUSH [EBX].fHeight
  12854. PUSH [EBX].fWidth
  12855. PUSH 0
  12856. PUSH 0
  12857. PUSH EAX
  12858. CALL @@prepare
  12859. CALL StretchBlt
  12860. CALL FinishDC
  12861. JMP @@exit
  12862. @@prepare:
  12863. POP EDI
  12864. MOV EAX, [EBP-8]
  12865. MOV EDX, [EAX].TRect.Bottom
  12866. MOV ECX, [EAX].TRect.Top
  12867. SUB EDX, ECX
  12868. PUSH EDX
  12869. MOV EDX, [EAX].TRect.Right
  12870. MOV EAX, [EAX].TRect.Left
  12871. SUB EDX, EAX
  12872. PUSH EDX
  12873. PUSH ECX
  12874. PUSH EAX
  12875. PUSH dword ptr [EBP-4]
  12876. JMP EDI
  12877. @@2: MOV ECX, [EBX].fDIBHeader
  12878. JECXZ @@exit
  12879. PUSH SRCCOPY
  12880. PUSH DIB_RGB_COLORS
  12881. PUSH ECX
  12882. PUSH [EBX].fDIBBits
  12883. PUSH [EBX].fHeight
  12884. PUSH [EBX].fWidth
  12885. PUSH 0
  12886. PUSH 0
  12887. CALL @@prepare
  12888. CALL StretchDIBits
  12889. TEST EAX, EAX
  12890. JG @@exit
  12891. MOV EAX, EBX
  12892. CALL GetHandle
  12893. MOV ECX, [EBX].fHandle
  12894. JECXZ @@exit
  12895. JMP @@0
  12896. @@exit: MOV ESP, EBP
  12897. POP EBP
  12898. POP EDI
  12899. POP EBX
  12900. end;
  12901. procedure TBitmap.DrawTransparent(DC: HDC; X, Y: Integer; TranspColor: TColor);
  12902. asm
  12903. PUSH ECX
  12904. MOV ECX, TranspColor
  12905. INC ECX
  12906. MOV ECX, [Y]
  12907. JNZ @@2
  12908. XCHG ECX, [ESP]
  12909. CALL Draw
  12910. JMP @@exit
  12911. @@2:
  12912. ADD ECX, [EAX].fHeight
  12913. PUSH ECX
  12914. MOV ECX, [EBP-4]
  12915. ADD ECX, [EAX].fWidth
  12916. PUSH ECX
  12917. PUSH [Y]
  12918. PUSH dword ptr [EBP-4]
  12919. MOV ECX, ESP
  12920. PUSH [TranspColor]
  12921. CALL StretchDrawTransparent
  12922. @@exit:
  12923. MOV ESP, EBP
  12924. end;
  12925. procedure TBitmap.StretchDrawTransparent(DC: HDC; const Rect: TRect; TranspColor: TColor);
  12926. asm
  12927. PUSH EBX
  12928. XCHG EBX, EAX
  12929. MOV EAX, [TranspColor]
  12930. INC EAX
  12931. MOV EAX, EBX
  12932. JNZ @@2
  12933. CALL StretchDraw
  12934. JMP @@exit
  12935. @@2:
  12936. PUSH EDX
  12937. PUSH ECX
  12938. CALL GetHandle
  12939. TEST EAX, EAX
  12940. JZ @@exit2
  12941. MOV EAX, [TranspColor]
  12942. CALL Color2RGB
  12943. MOV ECX, [EBX].fTransMaskBmp
  12944. JECXZ @@makemask0
  12945. CMP EAX, [EBX].fTransColor
  12946. JE @@3
  12947. @@makemask0:
  12948. MOV [EBX].fTransColor, EAX
  12949. INC ECX
  12950. LOOP @@20
  12951. XOR EAX, EAX // pass height = 0
  12952. // absolutely no matter what to pass as width
  12953. CALL NewBitmap
  12954. MOV [EBX].fTransMaskBmp, EAX
  12955. @@20:
  12956. MOV EAX, [EBX].fTransMaskBmp
  12957. PUSH EAX
  12958. MOV EDX, EBX
  12959. CALL Assign
  12960. POP EAX
  12961. MOV EDX, [EBX].fTransColor
  12962. CALL Convert2Mask
  12963. @@3:
  12964. MOV EAX, [EBX].fTransMaskBmp
  12965. CALL GetHandle
  12966. POP ECX
  12967. POP EDX
  12968. PUSH EAX
  12969. XCHG EAX, EBX
  12970. CALL StretchDrawMasked
  12971. JMP @@exit
  12972. @@exit2:
  12973. POP ECX
  12974. POP EDX
  12975. @@exit:
  12976. POP EBX
  12977. end;
  12978. procedure TBitmap.StretchDrawMasked(DC: HDC; const Rect: TRect; Mask: HBitmap);
  12979. asm
  12980. PUSH EDX // [EBP-4] = DC
  12981. PUSH ECX // [EBP-8] = Rect
  12982. PUSH EBX // save EBX
  12983. MOV EBX, EAX // EBX = @ Self
  12984. PUSH ESI // save ESI
  12985. {$IFDEF FIX_TRANSPBMPPALETTE}
  12986. CALL GetPixelFormat
  12987. CMP AL, pf4bit
  12988. JZ @@draw_fixed
  12989. CMP AL, pf8bit
  12990. JNZ @@draw_normal
  12991. @@draw_fixed:
  12992. XOR EAX, EAX
  12993. XOR EDX, EDX
  12994. CALL NewBitmap
  12995. MOV ESI, EAX
  12996. MOV EDX, EBX
  12997. CALL Assign
  12998. MOV EAX, ESI
  12999. XOR EDX, EDX
  13000. MOV DL, pf32bit
  13001. CALL SetPixelFormat
  13002. MOV EAX, ESI
  13003. MOV EDX, [EBP-4]
  13004. MOV ECX, [EBP-8]
  13005. PUSH [Mask]
  13006. CALL StretchDrawMasked
  13007. XCHG EAX, ESI
  13008. CALL TObj.RefDec
  13009. JMP @@exit
  13010. @@draw_normal:
  13011. MOV EAX, EBX
  13012. {$ENDIF FIX_TRANSPBMPPALETTE}
  13013. CALL GetHandle
  13014. TEST EAX, EAX
  13015. JZ @@to_exit
  13016. PUSH 0
  13017. CALL CreateCompatibleDC
  13018. PUSH EAX // [EBP-20] = MaskDC
  13019. PUSH [Mask]
  13020. PUSH EAX
  13021. CALL SelectObject
  13022. PUSH EAX // [EBP-24] = Save4Mask
  13023. CALL StartDC // [EBP-28] = DCfrom; [EBP-32] = Save4From
  13024. PUSH [EBX].fHeight
  13025. PUSH [EBX].fWidth
  13026. PUSH EAX
  13027. CALL CreateCompatibleBitmap
  13028. PUSH EAX // [EBP-36] = MemBmp
  13029. PUSH 0
  13030. CALL CreateCompatibleDC
  13031. PUSH EAX // [EBP-40] = MemDC
  13032. PUSH dword ptr [EBP-36] //MemBmp
  13033. PUSH EAX
  13034. CALL SelectObject
  13035. PUSH EAX // [EBP-44] = Save4Mem
  13036. PUSH SRCCOPY
  13037. MOV EAX, [EBP-20] //MaskDC
  13038. CALL @@stretch1
  13039. PUSH SRCERASE
  13040. MOV EAX, [EBP-28] //DCfrom
  13041. CALL @@stretch1
  13042. PUSH 0
  13043. PUSH dword ptr [EBP-4] //DC
  13044. CALL SetTextColor
  13045. PUSH EAX // [EBP-48] = crText
  13046. PUSH $FFFFFF
  13047. PUSH dword ptr [EBP-4] //DC
  13048. CALL Windows.SetBkColor
  13049. PUSH EAX // [EBP-52] = crBack
  13050. PUSH SRCAND
  13051. MOV EAX, [EBP-20] //MaskDC
  13052. CALL @@stretch2
  13053. PUSH SRCINVERT
  13054. MOV EAX, [EBP-40] //MemDC
  13055. CALL @@stretch2
  13056. PUSH dword ptr [EBP-4] //DC
  13057. CALL Windows.SetBkColor
  13058. PUSH dword ptr [EBP-4] //DC
  13059. CALL SetTextColor
  13060. MOV ESI, offset[FinishDC]
  13061. CALL ESI
  13062. CALL DeleteObject // DeleteObject( MemBmp )
  13063. CALL ESI
  13064. CALL ESI
  13065. @@to_exit:
  13066. STC
  13067. JC @@exit
  13068. @@stretch1:
  13069. POP ESI
  13070. PUSH [EBX].fHeight
  13071. PUSH [EBX].fWidth
  13072. XOR EDX, EDX
  13073. PUSH EDX
  13074. PUSH EDX
  13075. PUSH EAX
  13076. PUSH [EBX].fHeight
  13077. PUSH [EBX].fWidth
  13078. PUSH EDX
  13079. PUSH EDX
  13080. PUSH dword ptr [EBP-40] //MemDC
  13081. JMP @@stretch3
  13082. @@stretch2:
  13083. POP ESI
  13084. PUSH [EBX].fHeight
  13085. PUSH [EBX].fWidth
  13086. PUSH 0
  13087. PUSH 0
  13088. PUSH EAX
  13089. MOV EAX, [EBP-8] //Rect
  13090. MOV EDX, [EAX].TRect.Bottom
  13091. MOV ECX, [EAX].TRect.Top
  13092. SUB EDX, ECX
  13093. PUSH EDX
  13094. MOV EDX, [EAX].TRect.Right
  13095. MOV EAX, [EAX].TRect.Left
  13096. SUB EDX, EAX
  13097. PUSH EDX
  13098. PUSH ECX
  13099. PUSH EAX
  13100. PUSH dword ptr [EBP-4] //DC
  13101. @@stretch3:
  13102. CALL StretchBlt
  13103. JMP ESI
  13104. @@exit:
  13105. POP ESI
  13106. POP EBX
  13107. MOV ESP, EBP
  13108. end;
  13109. procedure DetachBitmapFromCanvas( Sender: PBitmap );
  13110. asm
  13111. XOR ECX, ECX
  13112. XCHG ECX, [EAX].TBitmap.fCanvasAttached
  13113. JECXZ @@exit
  13114. PUSH ECX
  13115. MOV EAX, [EAX].TBitmap.fCanvas
  13116. PUSH [EAX].TCanvas.fHandle
  13117. CALL SelectObject
  13118. @@exit:
  13119. end;
  13120. function TBitmap.GetCanvas: PCanvas;
  13121. asm
  13122. PUSH EBX
  13123. MOV EBX, EAX
  13124. CALL GetEmpty
  13125. JZ @@exit
  13126. MOV EAX, EBX
  13127. CALL GetHandle
  13128. TEST EAX, EAX
  13129. JZ @@exit
  13130. MOV ECX, [EBX].fCanvas
  13131. INC ECX
  13132. LOOP @@ret_Canvas
  13133. MOV [EBX].fApplyBkColor2Canvas, offset[ApplyBitmapBkColor2Canvas]
  13134. PUSH 0
  13135. CALL CreateCompatibleDC
  13136. CALL NewCanvas
  13137. MOV [EBX].fCanvas, EAX
  13138. MOV [EAX].TCanvas.fOnChange.TMethod.Code, offset[CanvasChanged]
  13139. MOV [EAX].TCanvas.fOnChange.TMethod.Data, EBX
  13140. CALL TCanvas.GetBrush
  13141. XOR EDX, EDX
  13142. MOV ECX, [EBX].fBkColor
  13143. JECXZ @@ret_Canvas
  13144. CALL TGraphicTool.SetInt
  13145. @@ret_Canvas:
  13146. MOV EAX, [EBX].fCanvas
  13147. MOV ECX, [EAX].TCanvas.fHandle
  13148. INC ECX
  13149. LOOP @@attach_Canvas
  13150. PUSH EAX
  13151. MOV [EBX].fCanvasAttached, ECX
  13152. PUSH ECX
  13153. CALL CreateCompatibleDC
  13154. XCHG EDX, EAX
  13155. POP EAX
  13156. CALL TCanvas.SetHandle
  13157. @@attach_Canvas:
  13158. MOV ECX, [EBX].fCanvasAttached
  13159. INC ECX
  13160. LOOP @@2
  13161. PUSH [EBX].fHandle
  13162. MOV EAX, [EBX].fCanvas
  13163. CALL TCanvas.GetHandle
  13164. PUSH EAX
  13165. CALL SelectObject
  13166. MOV [EBX].fCanvasAttached, EAX
  13167. @@2: MOV [EBX].fDetachCanvas, offset[DetachBitmapFromCanvas]
  13168. MOV EAX, [EBX].fCanvas
  13169. @@exit: POP EBX
  13170. end;
  13171. function TBitmap.GetEmpty: Boolean;
  13172. asm
  13173. PUSH ECX
  13174. MOV ECX, [EAX].fWidth
  13175. JECXZ @@1
  13176. MOV ECX, [EAX].fHeight
  13177. @@1: TEST ECX, ECX
  13178. POP ECX
  13179. SETZ AL
  13180. end;
  13181. procedure TBitmap.LoadFromFile(const Filename: KOLString);
  13182. asm
  13183. PUSH EAX
  13184. XCHG EAX, EDX
  13185. CALL NewReadFileStream
  13186. XCHG EDX, EAX
  13187. POP EAX
  13188. PUSH EDX
  13189. CALL LoadFromStream
  13190. POP EAX
  13191. CALL TObj.RefDec
  13192. end;
  13193. {$IFDEF ASM_UNICODE}
  13194. procedure TBitmap.LoadFromResourceName(Inst: DWORD; ResName: PChar);
  13195. asm
  13196. PUSH EBX
  13197. MOV EBX, EAX
  13198. PUSHAD
  13199. CALL Clear
  13200. POPAD
  13201. XOR EAX, EAX
  13202. PUSH ECX
  13203. MOVZX ECX, [EBX].fHandleType
  13204. INC ECX
  13205. LOOP @@1
  13206. MOV AH, LR_CREATEDIBSECTION shr 8 // = $2000
  13207. @@1: MOV AL, LR_DEFAULTSIZE // = $40
  13208. POP ECX
  13209. PUSH EAX
  13210. PUSH 0
  13211. PUSH 0
  13212. PUSH IMAGE_BITMAP
  13213. PUSH ECX
  13214. PUSH EDX
  13215. CALL LoadImage
  13216. TEST EAX, EAX
  13217. JZ @@exit
  13218. XCHG EDX, EAX
  13219. XCHG EAX, EBX
  13220. CALL SetHandle
  13221. @@exit: POP EBX
  13222. end;
  13223. {$ENDIF ASM_UNICODE}
  13224. function TBitmap.ReleaseHandle: HBitmap;
  13225. asm
  13226. PUSH EBX
  13227. MOV EBX, EAX
  13228. XOR EDX, EDX
  13229. CALL SetHandleType
  13230. MOV EAX, EBX
  13231. CALL GetHandle
  13232. TEST EAX, EAX
  13233. JZ @@exit
  13234. CMP [EBX].fDIBAutoFree, 0
  13235. JZ @@1
  13236. MOV EAX, [EBX].fDIBSize
  13237. PUSH EAX
  13238. PUSH EAX
  13239. PUSH GMEM_FIXED {or GMEM_ZEROINIT}
  13240. CALL GlobalAlloc
  13241. MOV EDX, EAX
  13242. XCHG EAX, [EBX].fDIBBits
  13243. POP ECX
  13244. CALL System.Move
  13245. @@1:
  13246. XOR EAX, EAX
  13247. MOV [EBX].fDIBAutoFree, AL
  13248. XCHG EAX, [EBX].fHandle
  13249. @@exit: POP EBX
  13250. end;
  13251. procedure TBitmap.SaveToFile(const Filename: KOLString);
  13252. asm
  13253. PUSH EAX
  13254. PUSH EDX
  13255. CALL GetEmpty
  13256. POP EAX
  13257. JZ @@exit
  13258. CALL NewWriteFileStream
  13259. XCHG EDX, EAX
  13260. POP EAX
  13261. PUSH EDX
  13262. CALL SaveToStream
  13263. POP EAX
  13264. CALL TObj.RefDec
  13265. PUSH EAX
  13266. @@exit: POP EAX
  13267. end;
  13268. procedure TBitmap.SaveToStream(Strm: PStream);
  13269. type tBFH = TBitmapFileHeader;
  13270. tBIH = TBitmapInfoHeader;
  13271. const szBIH = Sizeof( tBIH );
  13272. szBFH = Sizeof( tBFH );
  13273. asm
  13274. PUSH EBX
  13275. PUSH ESI
  13276. MOV EBX, EAX
  13277. MOV ESI, EDX
  13278. CALL GetEmpty
  13279. JZ @@exit
  13280. MOV EAX, ESI
  13281. CALL TStream.GetPosition
  13282. PUSH EAX
  13283. MOV EAX, EBX
  13284. XOR EDX, EDX // EDX = bmDIB
  13285. CALL SetHandleType
  13286. XOR EAX, EAX
  13287. MOV EDX, [EBX].fDIBHeader
  13288. MOVZX ECX, [EDX].TBitmapInfoHeader.biBitCount
  13289. CMP CL, 8
  13290. JG @@1
  13291. MOV AL, 4
  13292. SHL EAX, CL
  13293. @@1:
  13294. PUSH EAX // ColorsSize
  13295. LEA ECX, [EAX + szBFH + szBIH]
  13296. CMP [EDX].TBitmapInfoHeader.biCompression, 0
  13297. JZ @@10
  13298. ADD ECX, 74
  13299. @@10:
  13300. PUSH ECX // BFH.bfOffBits
  13301. PUSH 0
  13302. ADD ECX, [EBX].fDIBSize
  13303. PUSH ECX
  13304. MOV CX, $4D42
  13305. PUSH CX
  13306. XOR ECX, ECX
  13307. MOV EDX, ESP
  13308. MOV CL, szBFH
  13309. PUSH ECX
  13310. MOV EAX, ESI
  13311. CALL TStream.Write
  13312. POP ECX
  13313. ADD ESP, szBFH
  13314. XOR EAX, ECX
  13315. POP ECX // ColorsSize
  13316. JNZ @@ewrite
  13317. MOV EDX, [EBX].fDIBHeader
  13318. CMP [EDX].TBitmapInfoHeader.biCompression, 0
  13319. JZ @@11
  13320. ADD ECX, 74
  13321. @@11:
  13322. ADD ECX, szBIH
  13323. PUSH ECX
  13324. MOV EAX, ESI
  13325. CALL TStream.Write
  13326. POP ECX
  13327. XOR EAX, ECX
  13328. JNZ @@ewrite
  13329. MOV ECX, [EBX].fDIBSize
  13330. MOV EDX, [EBX].fDIBBits
  13331. MOV EAX, ESI
  13332. PUSH ECX
  13333. CALL TStream.Write
  13334. POP ECX
  13335. XOR EAX, ECX
  13336. @@ewrite:
  13337. POP EDX
  13338. JZ @@exit
  13339. XCHG EAX, ESI
  13340. XOR ECX, ECX
  13341. CALL TStream.Seek
  13342. @@exit:
  13343. POP ESI
  13344. POP EBX
  13345. end;
  13346. procedure TBitmap.SetHandle(const Value: HBitmap);
  13347. const szB = sizeof( tagBitmap );
  13348. szDIB = sizeof( TDIBSection );
  13349. szBIH = sizeof( TBitmapInfoHeader ); // = 40
  13350. asm
  13351. PUSH EBX
  13352. MOV EBX, EAX
  13353. PUSH EDX
  13354. CALL Clear
  13355. POP ECX
  13356. TEST ECX, ECX
  13357. JZ @@exit
  13358. PUSH ECX
  13359. ADD ESP, -szDIB
  13360. CALL WinVer
  13361. CMP AL, wvNT
  13362. JB @@ddb
  13363. PUSH ESP
  13364. PUSH szDIB
  13365. PUSH ECX
  13366. CALL GetObject
  13367. CMP EAX, szDIB
  13368. JNZ @@ddb
  13369. MOV [EBX].fHandleType, 0
  13370. MOV EAX, [ESP].TDIBSection.dsBm.bmWidth
  13371. MOV [EBX].fWidth, EAX
  13372. MOV EDX, [ESP].TDIBSection.dsBm.bmHeight
  13373. MOV [EBX].fHeight, EDX
  13374. MOVZX ECX, [ESP].TDIBSection.dsBm.bmBitsPixel
  13375. CALL PrepareBitmapHeader
  13376. MOV [EBX].fDIBHeader, EAX
  13377. LEA EDX, [EAX].TBitmapInfo.bmiColors
  13378. LEA EAX, [ESP].TDIBSection.dsBitfields
  13379. XOR ECX, ECX
  13380. MOV CL, 12
  13381. CALL System.Move
  13382. MOV EDX, [ESP].TDIBSection.dsBm.bmBits
  13383. MOV [EBX].fDIBBits, EDX
  13384. MOV EDX, [ESP].TDIBSection.dsBmih.biSizeImage
  13385. MOV [EBX].fDIBSize, EDX
  13386. MOV [EBX].fDIBAutoFree, 1
  13387. ADD ESP, szDIB
  13388. POP [EBX].fHandle
  13389. JMP @@exit
  13390. @@ddb:
  13391. MOV ECX, [ESP+szDIB]
  13392. PUSH ESP
  13393. PUSH szB
  13394. PUSH ECX
  13395. CALL GetObject
  13396. POP EDX
  13397. POP EDX // bmWidth
  13398. POP ECX // bmHeight
  13399. ADD ESP, szDIB-12
  13400. TEST EAX, EAX
  13401. JZ @@exit
  13402. MOV [EBX].fWidth, EDX
  13403. MOV [EBX].fHeight, ECX
  13404. POP dword ptr [EBX].fHandle
  13405. MOV [EBX].fHandleType, 1
  13406. @@exit: POP EBX
  13407. end;
  13408. procedure TBitmap.SetHeight(const Value: Integer);
  13409. asm
  13410. CMP EDX, [EAX].fHeight
  13411. JE @@exit
  13412. PUSHAD
  13413. XOR EDX, EDX
  13414. INC EDX
  13415. CALL SetHandleType
  13416. POPAD
  13417. MOV [EAX].fHeight, EDX
  13418. CALL FormatChanged
  13419. @@exit:
  13420. end;
  13421. procedure TBitmap.SetPixelFormat(Value: TPixelFormat);
  13422. asm
  13423. PUSH EBX
  13424. MOV EBX, EAX
  13425. CALL GetEmpty // if Empty then Exit;
  13426. JZ @@exit //
  13427. MOV EAX, EBX //
  13428. PUSH EDX
  13429. CALL GetPixelFormat
  13430. POP EDX
  13431. CMP EAX, EDX
  13432. JE @@exit
  13433. TEST EDX, EDX
  13434. MOV EAX, EBX
  13435. JNE @@2
  13436. POP EBX
  13437. INC EDX // EDX = bmDDB
  13438. JMP SetHandleType
  13439. @@2:
  13440. MOV [EBX].fNewPixelFormat, DL
  13441. @@3:
  13442. XOR EDX, EDX
  13443. CALL SetHandleType
  13444. XCHG EAX, EBX
  13445. CMP EAX, 0
  13446. @@exit:
  13447. POP EBX
  13448. JNE FormatChanged
  13449. end;
  13450. function CalcScanLineSize( Header: PBitmapInfoHeader ): Integer;
  13451. asm
  13452. MOVZX EDX, [EAX].TBitmapInfoHeader.biBitCount
  13453. MOV EAX, [EAX].TBitmapInfoHeader.biWidth
  13454. MUL EDX
  13455. ADD EAX, 31
  13456. SHR EAX, 3
  13457. AND EAX, -4
  13458. end;
  13459. procedure FillBmpWithBkColor( Bmp: PBitmap; DC2: HDC; oldWidth, oldHeight: Integer );
  13460. asm
  13461. PUSH EBX
  13462. PUSH ESI
  13463. XCHG EAX, EBX
  13464. PUSH EDX // [EBP-12] = DC2
  13465. PUSH ECX // [EBP-16] = oldWidth
  13466. MOV EAX, [EBX].TBitmap.fBkColor
  13467. CALL Color2RGB
  13468. TEST EAX, EAX
  13469. JZ @@exit
  13470. XCHG ESI, EAX // ESI = Color2RGB( Bmp.fBkColor )
  13471. MOV EAX, EBX
  13472. CALL TBitmap.GetHandle
  13473. TEST EAX, EAX
  13474. JZ @@exit
  13475. PUSH EAX //fHandle
  13476. PUSH dword ptr [EBP-12] //DC2
  13477. CALL SelectObject
  13478. PUSH EAX // [EBP-20] = oldBmp
  13479. PUSH ESI
  13480. CALL CreateSolidBrush
  13481. XCHG ESI, EAX // ESI = Br
  13482. PUSH [EBX].TBitmap.fHeight
  13483. PUSH [EBX].TBitmap.fWidth
  13484. MOV EAX, [oldHeight]
  13485. MOV EDX, [EBP-16] //oldWidth
  13486. CMP EAX, [EBX].TBitmap.fHeight
  13487. JL @@fill
  13488. CMP EDX, [EBX].TBitmap.fWidth
  13489. JGE @@nofill
  13490. @@fill: CMP EAX, [EBX].TBitmap.fHeight
  13491. JNE @@1
  13492. XOR EAX, EAX
  13493. @@1:
  13494. CMP EDX, [EBX].TBitmap.fWidth
  13495. JNZ @@2
  13496. CDQ
  13497. @@2: PUSH EAX
  13498. PUSH EDX
  13499. MOV EDX, ESP
  13500. PUSH ESI
  13501. PUSH EDX
  13502. PUSH dword ptr [EBP-12] //DC2
  13503. CALL Windows.FillRect
  13504. POP ECX
  13505. POP ECX
  13506. @@nofill:
  13507. POP ECX
  13508. POP ECX
  13509. PUSH ESI //Br
  13510. CALL DeleteObject
  13511. PUSH dword ptr [EBP-12] //DC2
  13512. CALL SelectObject
  13513. @@exit:
  13514. POP ECX
  13515. POP EDX
  13516. POP ESI
  13517. POP EBX
  13518. end;
  13519. procedure TBitmap.FormatChanged;
  13520. type tBIH = TBitmapInfoHeader;
  13521. tBmp = tagBitmap;
  13522. const szBIH = Sizeof( tBIH );
  13523. szBmp = Sizeof( tBmp );
  13524. asm
  13525. PUSH EAX
  13526. CALL GetEmpty
  13527. POP EAX
  13528. JZ @@exit
  13529. PUSHAD
  13530. MOV EBX, EAX
  13531. CALL [EBX].fDetachCanvas
  13532. XOR EAX, EAX
  13533. MOV [EBX].fScanLineSize, EAX
  13534. MOV [EBX].fGetDIBPixels, EAX
  13535. MOV [EBX].fSetDIBPixels, EAX
  13536. MOV ESI, [EBX].fWidth // ESI := oldWidth
  13537. MOV EDI, [EBX].fHeight // EDI := oldHeight
  13538. MOV ECX, [EBX].fDIBBits
  13539. JECXZ @@noDIBBits
  13540. MOV EAX, [EBX].fDIBHeader
  13541. MOV ESI, [EAX].TBitmapInfo.bmiHeader.biWidth
  13542. MOV EDI, [EAX].TBitmapInfo.bmiHeader.biHeight
  13543. TEST EDI, EDI
  13544. JGE @@1
  13545. NEG EDI
  13546. @@1: JMP @@createDC2
  13547. @@noDIBBits:
  13548. MOV ECX, [EBX].fHandle
  13549. JECXZ @@createDC2
  13550. ADD ESP, -24 // -szBmp
  13551. PUSH ESP
  13552. PUSH 24 //szBmp
  13553. PUSH ECX
  13554. CALL GetObject
  13555. XCHG ECX, EAX
  13556. JECXZ @@2
  13557. MOV ESI, [ESP].tBmp.bmWidth
  13558. MOV EDI, [ESP].tBmp.bmHeight
  13559. @@2: ADD ESP, 24 //szBmp
  13560. @@createDC2:
  13561. PUSH 0
  13562. CALL CreateCompatibleDC
  13563. PUSH EAX // > DC2
  13564. CMP [EBX].fHandleType, bmDDB
  13565. JNE @@DIB_handle_type
  13566. PUSH 0
  13567. CALL GetDC
  13568. PUSH EAX // > DC0
  13569. PUSH [EBX].fHeight
  13570. PUSH [EBX].fWidth
  13571. PUSH EAX
  13572. CALL CreateCompatibleBitmap
  13573. XCHG EBP, EAX // EBP := NewHandle
  13574. PUSH 0
  13575. CALL ReleaseDC // <
  13576. POP EDX
  13577. PUSH EDX // EDX := DC2
  13578. PUSH EBP
  13579. PUSH EDX
  13580. CALL SelectObject
  13581. PUSH EAX // > OldBmp
  13582. PUSH [EBX].fHeight // prepare Rect(0,0,fWidth,fHeight)
  13583. PUSH [EBX].fWidth
  13584. PUSH 0
  13585. PUSH 0
  13586. MOV EAX, [EBX].fBkColor
  13587. CALL Color2RGB
  13588. PUSH EAX
  13589. CALL CreateSolidBrush
  13590. MOV EDX, ESP
  13591. PUSH EAX // > Br
  13592. PUSH EAX
  13593. PUSH EDX
  13594. PUSH dword ptr [ESP+32] // (DC2)
  13595. CALL Windows.FillRect
  13596. CALL DeleteObject // <
  13597. ADD ESP, 16 // remove Rect
  13598. MOV ECX, [EBX].fDIBBits
  13599. JECXZ @@draw
  13600. PUSH dword ptr [ESP+4] // (DC2)
  13601. CALL SelectObject // < (OldBmp)
  13602. PUSH DIB_RGB_COLORS // : DIB_RGB_COLORS
  13603. PUSH [EBX].fDIBHeader // : fDIBHeader
  13604. PUSH [EBX].fDIBBits // : fDIBBits
  13605. PUSH [EBX].fHeight // : fHeight
  13606. PUSH 0 // : 0
  13607. PUSH EBP // : NewHandle
  13608. PUSH dword ptr [ESP+24] // (DC2)
  13609. CALL SetDIBits
  13610. JMP @@clearData
  13611. @@draw:
  13612. MOV EDX, [ESP+4]
  13613. PUSH EDX // prepare DC2 for SelectObject
  13614. MOV EAX, EBX
  13615. XOR ECX, ECX
  13616. PUSH ECX
  13617. CALL Draw
  13618. CALL SelectObject
  13619. @@clearData:
  13620. MOV EAX, EBX
  13621. CALL ClearData
  13622. MOV [EBX].fHandle, EBP
  13623. JMP @@fillBkColor
  13624. @@DIB_handle_type: // [ESP] = DC2
  13625. MOVZX EAX, [EBX].fNewPixelFormat
  13626. @@getBitsPixel:
  13627. XCHG ECX, EAX
  13628. MOV CL, [ECX] + offset BitCounts
  13629. MOVZX EAX, [DefaultPixelFormat]
  13630. JECXZ @@getBitsPixel
  13631. XOR EBP, EBP // NewHandle := 0
  13632. MOV EAX, [EBX].fWidth // EAX := fWidth
  13633. MOV EDX, [EBX].fHeight // EDX := fHeight
  13634. CALL PrepareBitmapHeader
  13635. PUSH EAX // > NewHeader
  13636. CMP [EBX].fNewPixelFormat, pf16bit
  13637. JNE @@newHeaderReady
  13638. CALL PreparePF16bit
  13639. @@newHeaderReady:
  13640. POP EAX
  13641. PUSH EAX
  13642. CALL CalcScanLineSize
  13643. MOV EDX, [EBX].fHeight
  13644. MUL EDX
  13645. PUSH EAX // > sizeBits
  13646. PUSH EAX
  13647. PUSH GMEM_FIXED
  13648. CALL GlobalAlloc
  13649. PUSH EAX // > NewBits
  13650. PUSH DIB_RGB_COLORS
  13651. PUSH dword ptr [ESP+12] // (NewHeader)
  13652. PUSH EAX
  13653. MOV EAX, [EBX].fHeight
  13654. CMP EAX, EDI
  13655. {$IFDEF USE_CMOV}
  13656. CMOVG EAX, EDI
  13657. {$ELSE}
  13658. JLE @@3
  13659. MOV EAX, EDI
  13660. @@3: {$ENDIF}
  13661. PUSH EAX
  13662. PUSH 0
  13663. MOV EAX, EBX
  13664. CALL GetHandle
  13665. PUSH EAX
  13666. PUSH dword ptr [ESP+36] // (DC2)
  13667. CALL GetDIBits
  13668. MOV EDX, [EBX].fHeight
  13669. CMP EDX, EDI
  13670. {$IFDEF USE_CMOV}
  13671. CMOVG EDX, EDI
  13672. {$ELSE}
  13673. JLE @@30
  13674. MOV EDX, EDI
  13675. @@30: {$ENDIF}
  13676. CMP EAX, EDX
  13677. JE @@2clearData
  13678. CALL GlobalFree
  13679. XOR EAX, EAX
  13680. PUSH EAX
  13681. MOV EDX, ESP // EDX = @NewBits
  13682. MOV ECX, [ESP+8] // ECX = @NewHeader
  13683. PUSH EAX // -> 0
  13684. PUSH EAX // -> 0
  13685. PUSH EDX // -> @NewBits
  13686. PUSH DIB_RGB_COLORS // -> DIB_RGB_COLORS
  13687. PUSH ECX // -> @NewHeader
  13688. PUSH dword ptr [ESP+32] // -> DC2
  13689. CALL CreateDIBSection
  13690. XOR ESI, -1 // use OldWidth to store NewDIBAutoFree flag
  13691. XCHG EBP, EAX // EBP := NewHandle
  13692. PUSH EBP
  13693. PUSH dword ptr [ESP+16] // -> DC2
  13694. CALL SelectObject
  13695. PUSH EAX // save oldBmp
  13696. MOV EDX, [ESP+16] // DC2 -> EDX (DC)
  13697. XOR ECX, ECX // 0 -> ECX (X)
  13698. PUSH ECX // 0 -> stack (Y)
  13699. MOV EAX, EBX
  13700. CALL TBitmap.Draw
  13701. PUSH dword ptr [ESP+16] // -> DC2
  13702. CALL SelectObject
  13703. @@2clearData:
  13704. MOV EAX, EBX
  13705. CALL ClearData
  13706. POP [EBX].fDIBBits
  13707. POP [EBX].fDIBSize
  13708. POP [EBX].fDIBHeader
  13709. MOV [EBX].fHandle, EBP
  13710. TEST ESI, ESI
  13711. MOV [EBX].fDIBAutoFree, 0
  13712. JGE @@noDIBautoFree
  13713. INC [EBX].fDIBAutoFree
  13714. @@noDIBautoFree:
  13715. @@fillBkColor:
  13716. MOV ECX, [EBX].fFillWithBkColor
  13717. JECXZ @@deleteDC2
  13718. POP EDX // (DC2)
  13719. PUSH EDX
  13720. PUSH EDI
  13721. XCHG ECX, ESI
  13722. XCHG EAX, EBX
  13723. CALL ESI
  13724. @@deleteDC2:
  13725. CALL DeleteDC
  13726. POPAD
  13727. @@exit:
  13728. end;
  13729. function TBitmap.GetScanLine(Y: Integer): Pointer;
  13730. asm
  13731. MOV ECX, [EAX].fDIBHeader
  13732. JECXZ @@exit
  13733. MOV ECX, [ECX].TBitmapInfoHeader.biHeight
  13734. TEST ECX, ECX
  13735. JL @@1
  13736. SUB ECX, EDX
  13737. DEC ECX
  13738. MOV EDX, ECX
  13739. @@1: MOV ECX, [EAX].fScanLineSize
  13740. INC ECX
  13741. PUSH [EAX].fDIBBits
  13742. LOOP @@2
  13743. PUSH EDX
  13744. CALL GetScanLineSize
  13745. POP EDX
  13746. XCHG ECX, EAX
  13747. @@2: XCHG EAX, ECX
  13748. MUL EDX
  13749. POP ECX
  13750. ADD ECX, EAX
  13751. @@exit: XCHG EAX, ECX
  13752. end;
  13753. function TBitmap.GetScanLineSize: Integer;
  13754. asm
  13755. MOV ECX, [EAX].fDIBHeader
  13756. JECXZ @@exit
  13757. PUSH EAX
  13758. XCHG EAX, ECX
  13759. CALL CalcScanLineSize
  13760. XCHG ECX, EAX
  13761. POP EAX
  13762. MOV [EAX].fScanLineSize, ECX
  13763. @@exit: XCHG EAX, ECX
  13764. end;
  13765. procedure TBitmap.CanvasChanged( Sender : PObj );
  13766. asm
  13767. PUSH EAX
  13768. XCHG EAX, EDX
  13769. CALL TCanvas.GetBrush
  13770. MOV EDX, [EAX].TGraphicTool.fData.Color
  13771. POP EAX
  13772. MOV [EAX].fBkColor, EAX
  13773. CALL ClearTransImage
  13774. end;
  13775. procedure TBitmap.Dormant;
  13776. asm
  13777. PUSH EAX
  13778. CALL RemoveCanvas
  13779. POP EAX
  13780. MOV ECX, [EAX].fHandle
  13781. JECXZ @@exit
  13782. CALL ReleaseHandle
  13783. PUSH EAX
  13784. CALL DeleteObject
  13785. @@exit:
  13786. end;
  13787. procedure TBitmap.SetBkColor(const Value: TColor);
  13788. asm
  13789. CMP [EAX].fBkColor, EDX
  13790. JE @@exit
  13791. MOV [EAX].fBkColor, EDX
  13792. MOV [EAX].fFillWithBkColor, offset[FillBmpWithBkColor]
  13793. MOV ECX, [EAX].fApplyBkColor2Canvas
  13794. JECXZ @@exit
  13795. CALL ECX
  13796. @@exit:
  13797. end;
  13798. function TBitmap.Assign(SrcBmp: PBitmap): Boolean;
  13799. const szBIH = sizeof(TBitmapInfoHeader);
  13800. asm
  13801. PUSHAD
  13802. XCHG EBX, EAX
  13803. @@clear:
  13804. MOV ESI, EDX
  13805. MOV EAX, EBX
  13806. CALL Clear
  13807. MOV EAX, ESI
  13808. OR EAX, EAX
  13809. JZ @@exit
  13810. CALL GetEmpty
  13811. JZ @@exit
  13812. MOV EAX, [ESI].fWidth
  13813. MOV [EBX].fWidth, EAX
  13814. MOV EAX, [ESI].fHeight
  13815. MOV [EBX].fHeight, EAX
  13816. MOVZX ECX, [ESI].fHandleType
  13817. MOV [EBX].fHandleType, CL
  13818. JECXZ @@fmtDIB
  13819. DEC ECX // ECX = 0
  13820. PUSH ECX
  13821. PUSH ECX
  13822. PUSH ECX
  13823. PUSH ECX //IMAGE_BITMAP=0
  13824. PUSH [ESI].fHandle
  13825. CALL CopyImage
  13826. MOV [EBX].fHandle, EAX
  13827. TEST EAX, EAX
  13828. XCHG EDX, EAX
  13829. JZ @@clear
  13830. JMP @@exit
  13831. @@fmtDIB:
  13832. XCHG EAX, ECX
  13833. MOV AX, szBIH+1024
  13834. PUSH EAX
  13835. CALL System.@GetMem
  13836. MOV [EBX].fDIBHeader, EAX
  13837. XCHG EDX, EAX
  13838. POP ECX
  13839. MOV EAX, [ESI].fDIBHeader
  13840. CALL System.Move
  13841. MOV EAX, [ESI].fDIBSize
  13842. MOV [EBX].fDIBSize, EAX
  13843. PUSH EAX
  13844. PUSH EAX
  13845. PUSH GMEM_FIXED
  13846. CALL GlobalAlloc
  13847. MOV [EBX].fDIBBits, EAX
  13848. XCHG EDX, EAX
  13849. POP ECX
  13850. MOV EAX, [ESI].fDIBBits
  13851. CALL System.Move
  13852. INC EBX // reset "ZF"
  13853. @@exit:
  13854. POPAD
  13855. SETNZ AL
  13856. end;
  13857. procedure TBitmap.RemoveCanvas;
  13858. asm
  13859. PUSH EAX
  13860. CALL [EAX].fDetachCanvas
  13861. POP EDX
  13862. XOR EAX, EAX
  13863. XCHG EAX, [EDX].fCanvas
  13864. CALL TObj.RefDec
  13865. end;
  13866. function TBitmap.DIBPalNearestEntry(Color: TColor): Integer;
  13867. const szBIH = sizeof(TBitmapInfoHeader);
  13868. asm
  13869. PUSH EBX
  13870. PUSH ESI
  13871. PUSH EDI
  13872. XCHG ESI, EAX
  13873. XCHG EAX, EDX
  13874. CALL Color2RGBQuad
  13875. XCHG EDI, EAX
  13876. MOV EAX, ESI
  13877. CALL GetDIBPalEntryCount
  13878. XCHG ECX, EAX
  13879. XOR EAX, EAX
  13880. JECXZ @@exit
  13881. MOV ESI, [ESI].fDIBHeader
  13882. ADD ESI, szBIH
  13883. XOR EDX, EDX
  13884. PUSH EDX
  13885. DEC DX
  13886. @@loo: LODSD
  13887. XOR EAX, EDI
  13888. MOV EBX, EAX
  13889. SHR EBX, 16
  13890. MOV BH, 0
  13891. ADD AL, AH
  13892. MOV AH, 0
  13893. ADC AX, BX
  13894. CMP AX, DX
  13895. JAE @@1
  13896. MOV DX, AX
  13897. POP EBX
  13898. PUSH EDX // save better index (in high order word)
  13899. @@1: ADD EDX, $10000 // increment index
  13900. LOOP @@loo
  13901. XCHG EAX, ECX
  13902. POP AX
  13903. POP AX
  13904. @@exit:
  13905. POP EDI
  13906. POP ESI
  13907. POP EBX
  13908. end;
  13909. function TBitmap.GetDIBPalEntries(Idx: Integer): TColor;
  13910. const szBIH = sizeof(TBitmapInfoHeader);
  13911. asm
  13912. MOV ECX, [EAX].fDIBHeader
  13913. JECXZ @@exit
  13914. MOV ECX, [ECX+szBIH+EDX*4]
  13915. INC ECX
  13916. @@exit: DEC ECX
  13917. XCHG EAX, ECX
  13918. end;
  13919. function TBitmap.GetDIBPalEntryCount: Integer;
  13920. asm
  13921. PUSH EAX
  13922. CALL GetEmpty
  13923. POP EAX
  13924. JZ @@ret0
  13925. CALL GetPixelFormat
  13926. MOVZX ECX, AL
  13927. MOV EAX, ECX
  13928. LOOP @@1
  13929. // pf1bit:
  13930. INC EAX
  13931. RET
  13932. @@1:
  13933. LOOP @@2
  13934. // pf4bit:
  13935. MOV AL, 16
  13936. RET
  13937. @@2:
  13938. LOOP @@ret0
  13939. // pf8bit:
  13940. XOR EAX, EAX
  13941. INC AH
  13942. RET
  13943. @@ret0:
  13944. XOR EAX, EAX
  13945. end;
  13946. procedure TBitmap.ClearTransImage;
  13947. asm
  13948. OR [EAX].fTransColor, -1
  13949. XOR EDX, EDX
  13950. XCHG [EAX].fTransMaskBmp, EDX
  13951. XCHG EAX, EDX
  13952. CALL TObj.RefDec
  13953. end;
  13954. {$IFDEF USE_OLDCONVERT2MASK}
  13955. procedure TBitmap.Convert2Mask(TranspColor: TColor);
  13956. asm
  13957. PUSH EBX
  13958. PUSH ESI
  13959. MOV EBX, EAX
  13960. MOV ESI, EDX
  13961. CALL GetHandle
  13962. TEST EAX, EAX
  13963. JZ @@exit
  13964. PUSH 0
  13965. PUSH 1
  13966. PUSH 1
  13967. PUSH [EBX].fHeight
  13968. PUSH [EBX].fWidth
  13969. CALL CreateBitmap
  13970. PUSH EAX // MonoHandle
  13971. PUSH 0
  13972. CALL CreateCompatibleDC
  13973. POP EDX
  13974. PUSH EDX
  13975. PUSH EAX // MonoDC
  13976. PUSH EDX
  13977. PUSH EAX
  13978. CALL SelectObject
  13979. PUSH EAX // SaveMono
  13980. CALL StartDC // DCfrom, SaveFrom
  13981. XCHG EAX, ESI
  13982. CALL Color2RGB
  13983. PUSH EAX // Color2RGB(TranspColor)
  13984. PUSH dword ptr [ESP+8] //DCfrom
  13985. CALL Windows.SetBkColor
  13986. PUSH EAX // SaveBkColor
  13987. PUSH SRCCOPY
  13988. PUSH 0
  13989. PUSH 0
  13990. PUSH dword ptr [ESP+12+4+4] //DCfrom
  13991. PUSH [EBX].fHeight
  13992. PUSH [EBX].fWidth
  13993. PUSH 0
  13994. PUSH 0
  13995. PUSH dword ptr [ESP+32+16] //MonoDC
  13996. CALL BitBlt
  13997. PUSH dword ptr [ESP+8] //DCfrom
  13998. CALL Windows.SetBkColor // ESP-> SaveFrom
  13999. CALL FinishDC // ESP-> SaveMono
  14000. CALL FinishDC // ESP-> MonoHandle
  14001. MOV EAX, EBX
  14002. CALL ClearData
  14003. POP [EBX].fHandle
  14004. MOV [EBX].fHandleType, bmDDB
  14005. @@exit:
  14006. POP ESI
  14007. POP EBX
  14008. end;
  14009. {$ELSE USE_OLDCONVERT2MASK} //Pascal
  14010. procedure TBitmap.Convert2Mask(TranspColor: TColor);
  14011. asm
  14012. PUSH EBX
  14013. PUSH ESI
  14014. PUSH EBP
  14015. PUSH EDI
  14016. XCHG EBP, EAX // EBP = @ Self
  14017. XCHG EAX, EDX // EAX = TranspColor
  14018. CALL Color2RGB
  14019. XCHG EBX, EAX // EBX := Color2RGB( TranspColor );
  14020. MOV EAX, EBP // EAX := @ Self;
  14021. CALL GetPixelFormat
  14022. CMP AL, pf15bit
  14023. JB @@SwapRB
  14024. CMP AL, pf24bit
  14025. JB @@noSwapRB
  14026. @@SwapRB:
  14027. BSWAP EBX
  14028. SHR EBX, 8
  14029. @@noSwapRB:
  14030. MOV DL, pf4bit
  14031. CMP AL, DL
  14032. JB @@setpixelformat
  14033. @@1: MOV DL, pf32bit
  14034. CMP AL, DL
  14035. JBE @@translate
  14036. @@setpixelformat:
  14037. MOV EAX, EBP
  14038. CALL SetPixelFormat
  14039. @@translate:
  14040. MOV EAX, [EBP].fWidth
  14041. MOV EDX, [EBP].fHeight
  14042. MOV CL, pf1bit
  14043. CALL NewDibBitmap
  14044. PUSH EAX
  14045. XOR EDX, EDX
  14046. INC EDX
  14047. MOV ECX, $FFFFFF
  14048. CALL SetDIBPalEntries
  14049. XOR EDX, EDX
  14050. @@Yloop:CMP EDX, [EBP].fHeight
  14051. JGE @@exit
  14052. PUSH EDX
  14053. MOV EAX, EBP
  14054. CALL GetScanLine
  14055. XCHG ESI, EAX
  14056. MOV EAX, [ESP+4]
  14057. POP EDX
  14058. PUSH EDX
  14059. CALL GetScanLine
  14060. XCHG EDI, EAX
  14061. MOV EAX, EBP
  14062. CALL GetPixelFormat
  14063. MOVZX ECX, AL
  14064. SUB ECX, pf4bit
  14065. MOV DL, 8
  14066. JNE @@chk_pf8bit
  14067. //-------- pf4bit:
  14068. CMP dword ptr [ESP], 0
  14069. JNZ @@4_0
  14070. XOR EDX, EDX
  14071. @@4_searchentry:
  14072. PUSH EDX
  14073. MOV EAX, EBP //[ESP+8]
  14074. CALL GetDIBPalEntries
  14075. CMP EAX, EBX
  14076. POP EDX
  14077. JZ @@4_foundentry
  14078. INC EDX
  14079. CMP EDX, 16
  14080. JB @@4_searchentry
  14081. @@4_foundentry:
  14082. XCHG EBX, EDX
  14083. MOV DL, 8
  14084. @@4_0: MOV ECX, [EBP].fWidth
  14085. INC ECX
  14086. SHR ECX, 1
  14087. @@Xloop_pf4bit:
  14088. MOV AH, [ESI]
  14089. SHR AH, 4
  14090. CMP AH, BL
  14091. SETZ AH
  14092. SHL AL, 1
  14093. OR AL, AH
  14094. MOV AH, [ESI]
  14095. AND AH, $0F
  14096. CMP AH, BL
  14097. SETZ AH
  14098. SHL AL, 1
  14099. OR AL, AH
  14100. DEC DL
  14101. DEC DL
  14102. JNZ @@4_1
  14103. STOSB
  14104. MOV DL, 8
  14105. @@4_1: INC ESI
  14106. LOOP @@Xloop_pf4bit
  14107. JMP @@nextline
  14108. @@chk_pf8bit:
  14109. LOOP @@chk_pf15bit
  14110. //-------- pf4bit:
  14111. CMP dword ptr [ESP], 0
  14112. JNZ @@8_0
  14113. XOR EDX, EDX
  14114. @@8_searchentry:
  14115. PUSH EDX
  14116. MOV EAX, EBP //[ESP+8]
  14117. CALL GetDIBPalEntries
  14118. CMP EAX, EBX
  14119. POP EDX
  14120. JZ @@8_foundentry
  14121. INC DL
  14122. JNZ @@8_searchentry
  14123. @@8_foundentry:
  14124. XCHG EBX, EDX
  14125. MOV DL, 8
  14126. @@8_0: MOV ECX, [EBP].fWidth
  14127. INC ECX
  14128. @@Xloop_pf8bit:
  14129. CMP BL, [ESI]
  14130. SETZ AH
  14131. SHL AL, 1
  14132. OR AL, AH
  14133. DEC DL
  14134. JNZ @@8_1
  14135. STOSB
  14136. MOV DL, 8
  14137. @@8_1: INC ESI
  14138. LOOP @@Xloop_pf8bit
  14139. JMP @@nextline
  14140. @@chk_pf15bit:
  14141. LOOP @@chk_pf16bit
  14142. //-------- pf15bit:
  14143. CMP dword ptr [ESP], 0
  14144. JNZ @@15_0
  14145. XCHG EAX, EBX
  14146. PUSH EDX
  14147. CALL Color2Color15
  14148. POP EDX
  14149. XCHG EBX, EAX
  14150. @@15_0: MOV ECX, [EBP].fWidth
  14151. @@Xloop_pf15bit:
  14152. CMP word ptr [ESI], BX
  14153. SETZ AH
  14154. SHL AL, 1
  14155. OR AL, AH
  14156. DEC DL
  14157. JNZ @@15_1
  14158. STOSB
  14159. MOV DL, 8
  14160. @@15_1: ADD ESI, 2
  14161. LOOP @@Xloop_pf15bit
  14162. JMP @@nextline
  14163. @@chk_pf16bit:
  14164. LOOP @@chk_pf24bit
  14165. //-------- pf16bit:
  14166. CMP dword ptr [ESP], 0
  14167. JNZ @@16_0
  14168. XCHG EAX, EBX
  14169. PUSH EDX
  14170. CALL Color2Color16
  14171. POP EDX
  14172. XCHG EBX, EAX
  14173. @@16_0: MOV ECX, [EBP].fWidth
  14174. @@Xloop_pf16bit:
  14175. CMP word ptr [ESI], BX
  14176. SETZ AH
  14177. SHL AL, 1
  14178. OR AL, AH
  14179. DEC DL
  14180. JNZ @@16_1
  14181. STOSB
  14182. MOV DL, 8
  14183. @@16_1: ADD ESI, 2
  14184. LOOP @@Xloop_pf16bit
  14185. JMP @@nextline
  14186. @@chk_pf24bit:
  14187. LOOP @@chk_pf32bit
  14188. //-------- pf24bit:
  14189. MOV ECX, [EBP].fWidth
  14190. PUSH EBP
  14191. //AND EBX, $FFFFFF
  14192. @@Xloop_pf24bit:
  14193. MOV EBP, dword ptr [ESI]
  14194. AND EBP, $FFFFFF
  14195. CMP EBP, EBX
  14196. SETZ AH
  14197. SHL AL, 1
  14198. OR AL, AH
  14199. DEC DL
  14200. JNZ @@24_1
  14201. STOSB
  14202. MOV DL, 8
  14203. @@24_1: ADD ESI, 3
  14204. LOOP @@Xloop_pf24bit
  14205. POP EBP
  14206. JMP @@nextline
  14207. @@chk_pf32bit:
  14208. //-------- pf32bit:
  14209. MOV ECX, [EBP].fWidth
  14210. @@Xloop_pf32bit:
  14211. and dword ptr [ESI], $FFFFFF
  14212. CMP EBX, dword ptr [ESI]
  14213. SETZ AH
  14214. SHL AL, 1
  14215. OR AL, AH
  14216. DEC DL
  14217. JNZ @@32_1
  14218. STOSB
  14219. MOV DL, 8
  14220. @@32_1: ADD ESI, 4
  14221. LOOP @@Xloop_pf32bit
  14222. @@nextline:
  14223. TEST DL, DL
  14224. JZ @@nx1
  14225. CMP DL, 8
  14226. JE @@nx1
  14227. @@finloop1:
  14228. SHL AL, 1
  14229. DEC DL
  14230. JNZ @@finloop1
  14231. STOSB
  14232. @@nx1:
  14233. POP EDX
  14234. INC EDX
  14235. JMP @@Yloop
  14236. @@exit:
  14237. POP EDX
  14238. PUSH EDX
  14239. XCHG EAX, EBP
  14240. CALL Assign
  14241. POP EAX
  14242. CALL TObj.RefDec
  14243. POP EDI
  14244. POP EBP
  14245. POP ESI
  14246. POP EBX
  14247. end;
  14248. {$ENDIF USE_OLDCONVERT2MASK} //Pascal
  14249. procedure _PrepareBmp2Rotate;
  14250. const szBIH = sizeof(TBitmapInfoHeader);
  14251. asm
  14252. { <- BL = increment to height }
  14253. XCHG EDI, EAX
  14254. MOV ESI, EDX // ESI = SrcBmp
  14255. XCHG EAX, EDX
  14256. CALL TBitmap.GetPixelFormat
  14257. MOVZX ECX, AL
  14258. PUSH ECX
  14259. MOV EDX, [ESI].TBitmap.fWidth
  14260. MOVZX EBX, BL
  14261. ADD EDX, EBX
  14262. MOV EAX, [ESI].TBitmap.fHeight
  14263. CALL NewDIBBitmap
  14264. STOSD
  14265. XCHG EDI, EAX
  14266. MOV EAX, [ESI].TBitmap.fDIBHeader
  14267. ADD EAX, szBIH
  14268. MOV EDX, [EDI].TBitmap.fDIBHeader
  14269. ADD EDX, szBIH
  14270. XOR ECX, ECX
  14271. MOV CH, 4
  14272. CALL System.Move
  14273. MOV EAX, EDI
  14274. XOR EDX, EDX
  14275. CALL TBitmap.GetScanLine
  14276. MOV EBX, [EDI].TBitmap.fWidth
  14277. DEC EBX // EBX = DstBmp.fWidth - 1
  14278. XCHG EDI, EAX // EDI = DstBmp.ScanLine[ 0 ]
  14279. XOR EDX, EDX
  14280. INC EDX
  14281. CALL TBitmap.GetScanLine
  14282. XCHG EDX, EAX
  14283. SUB EDX, EDI // EDX = BytesPerDstLine
  14284. MOV EBP, [ESI].TBitmap.fWidth
  14285. DEC EBP // EBP = SrcBmp.fWidth - 1
  14286. POP ECX // ECX = PixelFormat
  14287. end;
  14288. procedure _RotateBitmapMono( var DstBmp: PBitmap; SrcBmp: PBitmap );
  14289. const szBIH = sizeof(TBitmapInfoHeader);
  14290. asm
  14291. PUSHAD
  14292. MOV BL, 7
  14293. CALL _PrepareBmp2Rotate
  14294. SHR EBP, 3
  14295. SHL EBP, 8 // EBP = (WBytes-1) * 256
  14296. MOV ECX, EBX // ECX and 7 = Shf
  14297. SHR EBX, 3
  14298. ADD EDI, EBX // EDI = Dst
  14299. XOR EBX, EBX // EBX = temp mask
  14300. XOR EAX, EAX // Y = 0
  14301. @@looY:
  14302. PUSH EAX
  14303. PUSH EDI // Dst1 = Dst (Dst1 in EDI, Dst saved)
  14304. PUSH ESI // SrcBmp
  14305. PUSH EDX //BytesPerDstLine
  14306. PUSH ECX //Shf
  14307. XCHG EDX, EAX
  14308. XCHG EAX, ESI
  14309. CALL TBitmap.GetScanLine
  14310. XCHG ESI, EAX // ESI = Src
  14311. POP ECX // CL = Shf
  14312. AND ECX, 7 // ECX = Shf
  14313. OR ECX, EBP // ECX = (Wbytes-1)*8 + Shf
  14314. POP EDX // EDX = BytesPerDstLine
  14315. MOV BH, $80
  14316. SHR EBX, CL // BH = mask, BL = mask & Tmp
  14317. @@looX:
  14318. XOR EAX, EAX
  14319. LODSB
  14320. MOV AH, AL
  14321. SHR EAX, CL
  14322. OR EAX,$01000000
  14323. @@looBits:
  14324. MOV BL, AH
  14325. AND BL, BH
  14326. OR [EDI], BL
  14327. ADD EDI, EDX
  14328. ADD EAX, EAX
  14329. JNC @@looBits
  14330. SUB ECX, 256
  14331. JGE @@looX
  14332. POP ESI // ESI = SrcBmp
  14333. POP EDI // EDI = Dst
  14334. POP EAX // EAX = Y
  14335. ADD ECX, 256-1
  14336. JGE @@1
  14337. DEC EDI
  14338. @@1:
  14339. INC EAX
  14340. CMP EAX, [ESI].TBitmap.fHeight
  14341. JL @@looY
  14342. POPAD
  14343. end;
  14344. procedure _RotateBitmap4bit( var DstBmp: PBitmap; SrcBmp: PBitmap );
  14345. const szBIH = sizeof(TBitmapInfoHeader);
  14346. asm
  14347. PUSHAD
  14348. MOV BL, 1
  14349. CALL _PrepareBmp2Rotate
  14350. SHR EBP, 1 // EBP = WBytes - 1
  14351. SHL EBP, 8 // EBP = (WBytes - 1) * 256
  14352. // EBX = DstBmp.fWidth - 1
  14353. MOV ECX, EBX
  14354. SHL ECX, 2 // ECX and 7 = Shf (0 or 4)
  14355. SHR EBX, 1
  14356. ADD EDI, EBX // EDI = Dst
  14357. XOR EAX, EAX // Y = 0
  14358. XOR EBX, EBX
  14359. @@looY:
  14360. PUSH EAX // save Y
  14361. PUSH EDI // Dst1 = Dst (Dst1 in EDI, Dst saved)
  14362. PUSH ESI // SrcBmp
  14363. PUSH EDX // BytesPerDstLine
  14364. PUSH ECX // Shf
  14365. XCHG EDX, EAX
  14366. XCHG EAX, ESI
  14367. CALL TBitmap.GetScanLine
  14368. XCHG ESI, EAX // ESI = Src
  14369. POP ECX
  14370. AND ECX, 7 // CL = Shf
  14371. OR ECX, EBP // ECX = (WBytes-1)*256 + Shf
  14372. POP EDX // EDX = BytesPerDstLine
  14373. MOV BH, $F0
  14374. SHR EBX, CL // shift mask right 4 or 0
  14375. @@looX:
  14376. XOR EAX, EAX
  14377. LODSB
  14378. MOV AH, AL
  14379. SHR EAX, CL
  14380. MOV BL, AH
  14381. AND BL, BH
  14382. OR [EDI], BL
  14383. ADD EDI, EDX
  14384. SHL EAX, 4
  14385. AND AH, BH
  14386. OR [EDI], AH
  14387. ADD EDI, EDX
  14388. SUB ECX, 256
  14389. JGE @@looX
  14390. POP ESI // ESI = SrcBmp
  14391. POP EDI // EDI = Dst
  14392. POP EAX // EAX = Y
  14393. ADD ECX, 256 - 4
  14394. JGE @@1
  14395. DEC EDI
  14396. @@1:
  14397. INC EAX
  14398. CMP EAX, [ESI].TBitmap.fHeight
  14399. JL @@looY
  14400. POPAD
  14401. end;
  14402. procedure _RotateBitmap8bit( var DstBmp: PBitmap; SrcBmp: PBitmap );
  14403. const szBIH = sizeof(TBitmapInfoHeader);
  14404. asm
  14405. PUSHAD
  14406. XOR EBX, EBX
  14407. CALL _PrepareBmp2Rotate
  14408. ADD EDI, EBX // EDI = Dst
  14409. MOV EBX, EDX // EBX = BytesPerDstLine
  14410. DEC EBX
  14411. MOV EBP, ESI // EBP = SrcBmp
  14412. XOR EDX, EDX // Y = 0
  14413. @@looY:
  14414. PUSH EDX
  14415. PUSH EDI
  14416. MOV EAX, EBP
  14417. CALL TBitmap.GetScanLine
  14418. XCHG ESI, EAX
  14419. MOV ECX, [EBP].TBitmap.fWidth
  14420. @@looX:
  14421. MOVSB
  14422. ADD EDI, EBX
  14423. LOOP @@looX
  14424. POP EDI
  14425. POP EDX
  14426. DEC EDI
  14427. INC EDX
  14428. CMP EDX, [EBP].TBitmap.fHeight
  14429. JL @@looY
  14430. POPAD
  14431. end;
  14432. procedure _RotateBitmap16bit( var DstBmp: PBitmap; SrcBmp: PBitmap );
  14433. asm
  14434. PUSHAD
  14435. XOR EBX, EBX
  14436. CALL _PrepareBmp2Rotate
  14437. ADD EBX, EBX
  14438. ADD EDI, EBX // EDI = Dst
  14439. MOV EBX, EDX // EBX = BytesPerDstLine
  14440. DEC EBX
  14441. DEC EBX
  14442. MOV EBP, ESI // EBP = SrcBmp
  14443. XOR EDX, EDX // Y = 0
  14444. @@looY:
  14445. PUSH EDX
  14446. PUSH EDI
  14447. MOV EAX, EBP
  14448. CALL TBitmap.GetScanLine
  14449. XCHG ESI, EAX
  14450. MOV ECX, [EBP].TBitmap.fWidth
  14451. @@looX:
  14452. MOVSW
  14453. ADD EDI, EBX
  14454. LOOP @@looX
  14455. POP EDI
  14456. POP EDX
  14457. DEC EDI
  14458. DEC EDI
  14459. INC EDX
  14460. CMP EDX, [EBP].TBitmap.fHeight
  14461. JL @@looY
  14462. POPAD
  14463. end;
  14464. procedure _RotateBitmap2432bit( var DstBmp: PBitmap; SrcBmp: PBitmap );
  14465. asm
  14466. PUSHAD
  14467. XOR EBX, EBX
  14468. CALL _PrepareBmp2Rotate
  14469. SUB ECX, pf24bit
  14470. JNZ @@10
  14471. LEA EBX, [EBX+EBX*2]
  14472. JMP @@11
  14473. @@10:
  14474. LEA EBX, [EBX*4]
  14475. @@11: ADD EDI, EBX // EDI = Dst
  14476. MOV EBX, EDX // EBX = BytesPerDstLine
  14477. DEC EBX
  14478. DEC EBX
  14479. DEC EBX
  14480. MOV EBP, ESI // EBP = SrcBmp
  14481. XOR EDX, EDX // Y = 0
  14482. @@looY:
  14483. PUSH EDX
  14484. PUSH EDI
  14485. PUSH ECX // ECX = 0 if pf24bit (1 if pf32bit)
  14486. MOV EAX, EBP
  14487. CALL TBitmap.GetScanLine
  14488. XCHG ESI, EAX
  14489. MOV ECX, [EBP].TBitmap.fWidth
  14490. POP EAX
  14491. PUSH EAX
  14492. @@looX:
  14493. MOVSW
  14494. MOVSB
  14495. ADD ESI, EAX
  14496. ADD EDI, EBX
  14497. LOOP @@looX
  14498. POP ECX
  14499. POP EDI
  14500. POP EDX
  14501. DEC EDI
  14502. DEC EDI
  14503. DEC EDI
  14504. SUB EDI, ECX
  14505. INC EDX
  14506. CMP EDX, [EBP].TBitmap.fHeight
  14507. JL @@looY
  14508. POPAD
  14509. end;
  14510. procedure _RotateBitmapRight( SrcBmp: PBitmap );
  14511. asm
  14512. PUSH EBX
  14513. PUSH EDI
  14514. MOV EBX, EAX
  14515. CMP [EBX].TBitmap.fHandleType, bmDIB
  14516. JNZ @@exit
  14517. CALL TBitmap.GetPixelFormat
  14518. MOVZX ECX, AL
  14519. LOOP @@not1bit
  14520. MOV EAX, [RotateProcs.proc_RotateBitmapMono]
  14521. @@not1bit:
  14522. LOOP @@not4bit
  14523. MOV EAX, [RotateProcs.proc_RotateBitmap4bit]
  14524. @@not4bit:
  14525. LOOP @@not8bit
  14526. MOV EAX, [RotateProcs.proc_RotateBitmap8bit]
  14527. @@not8bit:
  14528. LOOP @@not15bit
  14529. INC ECX
  14530. @@not15bit:
  14531. LOOP @@not16bit
  14532. MOV EAX, [RotateProcs.proc_RotateBitmap16bit]
  14533. @@not16bit:
  14534. LOOP @@not24bit
  14535. INC ECX
  14536. @@not24bit:
  14537. LOOP @@not32bit
  14538. MOV EAX, [RotateProcs.proc_RotateBitmap2432bit]
  14539. @@not32bit:
  14540. TEST EAX, EAX
  14541. JZ @@exit
  14542. PUSH ECX
  14543. XCHG ECX, EAX
  14544. MOV EAX, ESP
  14545. MOV EDX, EBX
  14546. CALL ECX
  14547. POP EDI
  14548. MOV EAX, [EBX].TBitmap.fWidth
  14549. CMP EAX, [EDI].TBitmap.fHeight
  14550. JGE @@noCutHeight
  14551. MOV EDX, [EDI].TBitmap.fScanLineSize
  14552. MUL EDX
  14553. MOV [EDI].TBitmap.fDIBSize, EAX
  14554. MOV EDX, [EDI].TBitmap.fDIBHeader
  14555. MOV EDX, [EDX].TBitmapInfoHeader.biHeight
  14556. TEST EDX, EDX
  14557. JL @@noCorrectImg
  14558. PUSH EAX
  14559. MOV EDX, [EDI].TBitmap.fHeight
  14560. DEC EDX
  14561. MOV EAX, EDI
  14562. CALL TBitmap.GetScanLine
  14563. PUSH EAX
  14564. MOV EDX, [EBX].TBitmap.fWidth
  14565. DEC EDX
  14566. MOV EAX, EDI
  14567. CALL TBitmap.GetScanLine
  14568. POP EDX
  14569. POP ECX
  14570. CALL System.Move
  14571. @@noCorrectImg:
  14572. MOV EAX, [EBX].TBitmap.fWidth
  14573. MOV [EDI].TBitmap.fHeight, EAX
  14574. MOV EDX, [EDI].TBitmap.fDIBHeader
  14575. MOV [EDX].TBitmapInfoHeader.biHeight, EAX
  14576. @@noCutHeight:
  14577. MOV EAX, EBX
  14578. CALL TBitmap.ClearData
  14579. XOR EAX, EAX
  14580. XCHG EAX, [EDI].TBitmap.fDIBHeader
  14581. XCHG [EBX].TBitmap.fDIBHeader, EAX
  14582. XCHG EAX, [EDI].TBitmap.fDIBBits
  14583. XCHG [EBX].TBitmap.fDIBBits, EAX
  14584. MOV AL, [EDI].TBitmap.fDIBAutoFree
  14585. MOV [EBX].TBitmap.fDIBAutoFree, AL
  14586. MOV EAX, [EDI].TBitmap.fDIBSize
  14587. MOV [EBX].TBitmap.fDIBSize, EAX
  14588. MOV EAX, [EDI].TBitmap.fWidth
  14589. MOV [EBX].TBitmap.fWidth, EAX
  14590. MOV EAX, [EDI].TBitmap.fHeight
  14591. MOV [EBX].TBitmap.fHeight, EAX
  14592. XCHG EAX, EDI
  14593. CALL TObj.RefDec
  14594. @@exit:
  14595. POP EDI
  14596. POP EBX
  14597. end;
  14598. function TBitmap.GetPixels(X, Y: Integer): TColor;
  14599. asm
  14600. PUSH EBX
  14601. MOV EBX, EAX
  14602. PUSH ECX
  14603. PUSH EDX
  14604. CALL GetEmpty
  14605. PUSHFD
  14606. OR EAX, -1
  14607. POPFD
  14608. JZ @@exit
  14609. CALL StartDC
  14610. PUSH dword ptr [ESP+12]
  14611. PUSH dword ptr [ESP+12]
  14612. PUSH EAX
  14613. CALL Windows.GetPixel
  14614. XCHG EBX, EAX
  14615. CALL FinishDC
  14616. XCHG EAX, EBX
  14617. @@exit:
  14618. POP EDX
  14619. POP EDX
  14620. POP EBX
  14621. end;
  14622. procedure TBitmap.SetPixels(X, Y: Integer; const Value: TColor);
  14623. asm
  14624. PUSH EBX
  14625. MOV EBX, EAX
  14626. PUSH ECX
  14627. PUSH EDX
  14628. CALL GetEmpty
  14629. JZ @@exit
  14630. CALL StartDC
  14631. MOV EAX, Value
  14632. CALL Color2RGB
  14633. PUSH EAX
  14634. PUSH dword ptr [ESP+16]
  14635. PUSH dword ptr [ESP+16]
  14636. PUSH dword ptr [ESP+16]
  14637. CALL Windows.SetPixel
  14638. CALL FinishDC
  14639. @@exit:
  14640. POP EDX
  14641. POP ECX
  14642. POP EBX
  14643. end;
  14644. function _GetDIBPixelsPalIdx( Bmp: PBitmap; X, Y: Integer ): TColor;
  14645. const szBIH = Sizeof(TBitmapInfoHeader);
  14646. asm
  14647. PUSH EBX
  14648. PUSH EDI
  14649. PUSH EDX
  14650. XCHG EBX, EAX
  14651. XCHG EAX, EDX
  14652. MOV EDI, [EBX].TBitmap.fPixelsPerByteMask
  14653. INC EDI
  14654. CDQ
  14655. DIV EDI
  14656. DEC EDI
  14657. XCHG ECX, EAX // EAX = Y, ECX = X div (Bmp.fPixeldPerByteMask+1)
  14658. MOV EDX, [EBX].TBitmap.fScanLineDelta
  14659. IMUL EDX
  14660. ADD EAX, [EBX].TBitmap.fScanLine0
  14661. MOVZX EAX, byte ptr[EAX+ECX]
  14662. POP EDX
  14663. MOV ECX, [EBX].TBitmap.fPixelsPerByteMask
  14664. AND EDX, ECX
  14665. SUB ECX, EDX
  14666. PUSH EAX
  14667. MOV EDI, [EBX].TBitmap.fDIBHeader
  14668. MOVZX EAX, [EDI].TBitmapInfoHeader.biBitCount
  14669. MUL ECX
  14670. XCHG ECX, EAX
  14671. POP EAX
  14672. SHR EAX, CL
  14673. AND EAX, [EBX].TBitmap.fPixelMask
  14674. MOV EAX, [EDI+szBIH+EAX*4]
  14675. CALL Color2RGBQuad
  14676. POP EDI
  14677. POP EBX
  14678. end;
  14679. function _GetDIBPixels16bit( Bmp: PBitmap; X, Y: Integer ): TColor;
  14680. asm
  14681. PUSH [EAX].TBitmap.fPixelMask
  14682. PUSH EDX // X
  14683. PUSH EAX
  14684. MOV EAX, [EAX].TBitmap.fScanLineDelta
  14685. IMUL ECX
  14686. POP EDX
  14687. ADD EAX, [EDX].TBitmap.fScanLine0
  14688. POP ECX
  14689. MOVZX EAX, word ptr [EAX+ECX*2]
  14690. POP EDX
  14691. CMP DL, 15
  14692. JNE @@16bit
  14693. MOV EDX, EAX
  14694. SHR EDX, 7
  14695. SHL EAX, 6
  14696. MOV DH, AH
  14697. AND DH, $F8
  14698. SHL EAX, 13
  14699. JMP @@1516bit
  14700. @@16bit:
  14701. MOV DL, AH
  14702. SHL EAX, 5
  14703. MOV DH, AH
  14704. SHL EAX, 14
  14705. @@1516bit:
  14706. AND EAX, $F80000
  14707. OR EAX, EDX
  14708. AND AX, $FCF8
  14709. end;
  14710. function _GetDIBPixelsTrueColor( Bmp: PBitmap; X, Y: Integer ): TColor;
  14711. asm
  14712. PUSH EBX
  14713. XCHG EBX, EAX
  14714. PUSH EDX
  14715. MOV EAX, [EBX].TBitmap.fScanLineDelta
  14716. IMUL ECX
  14717. XCHG ECX, EAX
  14718. POP EDX
  14719. MOV EAX, [EBX].TBitmap.fBytesPerPixel
  14720. MUL EDX
  14721. ADD EAX, [EBX].TBitmap.fScanLine0
  14722. MOV EAX, [EAX+ECX]
  14723. AND EAX, $FFFFFF
  14724. CALL Color2RGBQuad
  14725. POP EBX
  14726. end;
  14727. function TBitmap.GetDIBPixels(X, Y: Integer): TColor;
  14728. asm
  14729. CMP word ptr [EAX].fGetDIBPixels+2, 0
  14730. JNZ @@assigned
  14731. // if not assigned, this preparing will be performed for first call:
  14732. CMP [EAX].fHandleType, bmDDB
  14733. JZ @@GetPixels
  14734. PUSHAD
  14735. MOV EBX, EAX
  14736. XOR EDX, EDX
  14737. CALL GetScanLine
  14738. MOV [EBX].fScanLine0, EAX
  14739. XOR EDX, EDX
  14740. INC EDX
  14741. MOV EAX, EBX
  14742. CALL GetScanLine
  14743. SUB EAX, [EBX].fScanLine0
  14744. MOV [EBX].fScanLineDelta, EAX
  14745. MOV EAX, EBX
  14746. CALL GetPixelFormat
  14747. MOVZX ECX, AL
  14748. MOV DX, $0F00
  14749. MOV byte ptr [EBX].fBytesPerPixel, 4
  14750. XOR EAX, EAX
  14751. LOOP @@if4bit
  14752. MOV DX, $0107
  14753. JMP @@1bit4bit8bit
  14754. @@if4bit:
  14755. LOOP @@if8bit
  14756. INC EDX // MOV DX, $0F01
  14757. JMP @@1bit4bit8bit
  14758. @@if8bit:
  14759. LOOP @@if15bit
  14760. MOV DH, $FF //MOV DX, $FF00
  14761. @@1bit4bit8bit:
  14762. MOV EAX, offset[_GetDIBPixelsPalIdx]
  14763. @@if15bit:
  14764. LOOP @@if16bit
  14765. //MOV DH, $0F
  14766. DEC DH
  14767. INC ECX
  14768. @@if16bit:
  14769. LOOP @@if24bit
  14770. INC DH
  14771. MOV EAX, offset[_GetDIBPixels16bit]
  14772. @@if24bit:
  14773. LOOP @@if32bit
  14774. DEC [EBX].fBytesPerPixel
  14775. INC ECX
  14776. DEC EDX
  14777. @@if32bit:
  14778. LOOP @@iffin
  14779. INC EDX
  14780. MOV EAX, offset[_GetDIBPixelsTrueColor]
  14781. @@iffin:
  14782. MOV byte ptr [EBX].fPixelMask, DH
  14783. MOV byte ptr [EBX].fPixelsPerByteMask, DL
  14784. MOV [EBX].fGetDIBPixels, EAX
  14785. TEST EAX, EAX
  14786. POPAD
  14787. @@GetPixels:
  14788. JZ GetPixels
  14789. @@assigned:
  14790. JMP [EAX].fGetDIBPixels
  14791. end;
  14792. procedure _SetDIBPixels1bit( Bmp: PBitmap; X, Y: Integer; Value: TColor );
  14793. asm
  14794. PUSH EDX
  14795. PUSH [EAX].TBitmap.fScanLine0
  14796. PUSH ECX
  14797. PUSH [EAX].TBitmap.fScanLineDelta
  14798. MOV EAX, Value
  14799. CALL Color2RGB
  14800. MOV EDX, EAX
  14801. SHR EAX, 16
  14802. ADD AL, DL
  14803. ADC AL, DH
  14804. CMP EAX, 170
  14805. SETGE CL
  14806. AND ECX, 1
  14807. SHL ECX, 7
  14808. POP EAX
  14809. POP EDX
  14810. IMUL EDX
  14811. POP EDX
  14812. ADD EAX, EDX
  14813. POP EDX
  14814. PUSH ECX
  14815. MOV ECX, EDX
  14816. SHR EDX, 3
  14817. ADD EAX, EDX
  14818. AND ECX, 7
  14819. MOV DX, $FF7F
  14820. SHR EDX, CL
  14821. AND byte ptr [EAX], DL
  14822. POP EDX
  14823. SHR EDX, CL
  14824. OR byte ptr [EAX], DL
  14825. end;
  14826. procedure _SetDIBPixelsPalIdx( Bmp: PBitmap; X, Y: Integer; Value: TColor );
  14827. asm
  14828. XCHG EAX, EBP
  14829. PUSH EDX // -> X
  14830. PUSH ECX // -> Y
  14831. MOV ECX, [EBP].TBitmap.fPixelsPerByteMask
  14832. INC ECX
  14833. XCHG EAX, EDX
  14834. CDQ
  14835. DIV ECX
  14836. XCHG ECX, EAX // ECX = X div (fPixelsPerByteMask+1)
  14837. POP EAX // <- Y
  14838. MOV EDX, [EBP].TBitmap.fScanLineDelta
  14839. IMUL EDX
  14840. ADD ECX, EAX
  14841. ADD ECX, [EBP].TBitmap.fScanLine0 // ECX = Pos
  14842. PUSH ECX // -> Pos
  14843. MOV EDX, [ESP+16] // Value
  14844. MOV EAX, EBP
  14845. CALL TBitmap.DIBPalNearestEntry // EAX = Pixel
  14846. POP ECX // <- Pos
  14847. POP EDX // <- X
  14848. PUSH EAX // -> Pixel
  14849. MOV EAX, [EBP].TBitmap.fPixelsPerByteMask
  14850. AND EDX, EAX
  14851. SUB EAX, EDX
  14852. MOV EDX, [EBP].TBitmap.fDIBHeader
  14853. MOVZX EDX, [EDX].TBitmapInfoHeader.biBitCount
  14854. MUL EDX // EAX = Shf
  14855. XCHG ECX, EAX // ECX = Shf, EAX = Pos
  14856. MOV EDX, [EBP].TBitmap.fPixelMask
  14857. SHL EDX, CL
  14858. NOT EDX
  14859. AND byte ptr [EAX], DL
  14860. POP EDX // <- Pixel
  14861. SHL EDX, CL
  14862. OR byte ptr [EAX], DL
  14863. end;
  14864. procedure _SetDIBPixels16bit( Bmp: PBitmap; X, Y: Integer; Value: TColor );
  14865. asm
  14866. ADD EDX, EDX
  14867. ADD EDX, [EAX].TBitmap.fScanLine0
  14868. PUSH EDX // -> X*2 + Bmp.fScanLine0
  14869. PUSH [EAX].TBitmap.fPixelMask
  14870. MOV EAX, [EAX].TBitmap.fScanLineDelta
  14871. IMUL ECX
  14872. PUSH EAX // -> Y* Bmp.fScanLineDelta
  14873. MOV EAX, Value
  14874. CALL Color2RGB
  14875. POP EBP // <- Y* Bmp.fScanLineDelta
  14876. POP EDX
  14877. XOR ECX, ECX
  14878. SUB DL, 16
  14879. JZ @@16bit
  14880. MOV CH, AL
  14881. SHR CH, 1
  14882. SHR EAX, 6
  14883. MOV EDX, EAX
  14884. AND DX, $3E0
  14885. SHR EAX, 13
  14886. JMP @@1516
  14887. @@16bit:
  14888. {$IFDEF PARANOIA} DB $24, $F8 {$ELSE} AND AL, $F8 {$ENDIF}
  14889. MOV CH, AL
  14890. SHR EAX, 5
  14891. MOV EDX, EAX
  14892. AND DX, $7E0
  14893. SHR EAX, 14
  14894. @@1516:
  14895. MOV AH, CH
  14896. AND AX, $FC1F
  14897. OR AX, DX
  14898. POP EDX
  14899. MOV [EBP+EDX], AX
  14900. end;
  14901. procedure _SetDIBPixelsTrueColor( Bmp: PBitmap; X, Y: Integer; Value: TColor );
  14902. asm
  14903. PUSH [EAX].TBitmap.fScanLineDelta
  14904. PUSH [EAX].TBitmap.fScanLine0
  14905. MOV EAX, [EAX].TBitmap.fBytesPerPixel
  14906. MUL EDX
  14907. POP EDX
  14908. ADD EDX, EAX
  14909. POP EAX
  14910. PUSH EDX
  14911. IMUL ECX
  14912. POP EDX
  14913. ADD EDX, EAX
  14914. PUSH EDX
  14915. MOV EAX, Value
  14916. CALL Color2RGBQuad
  14917. POP EDX
  14918. AND dword ptr [EDX], $FF000000
  14919. OR [EDX], EAX
  14920. end;
  14921. procedure TBitmap.SetDIBPixels(X, Y: Integer; const Value: TColor);
  14922. asm
  14923. CMP word ptr [EAX].fSetDIBPixels+2, 0
  14924. JNZ @@assigned
  14925. PUSHAD
  14926. MOV EBX, EAX
  14927. XOR EDX, EDX
  14928. CMP [EBX].fHandleType, DL // bmDIB = 0
  14929. JNE @@ddb
  14930. CALL GetScanLine
  14931. MOV [EBX].fScanLine0, EAX
  14932. XOR EDX, EDX
  14933. INC EDX
  14934. MOV EAX, EBX
  14935. CALL GetScanLine
  14936. SUB EAX, [EBX].fScanLine0
  14937. MOV [EBX].fScanLineDelta, EAX
  14938. MOV EAX, EBX
  14939. CALL GetPixelFormat
  14940. MOVZX ECX, AL
  14941. MOV DX, $0F01
  14942. MOV EAX, offset[_SetDIBPixelsPalIdx]
  14943. MOV byte ptr [EBX].fBytesPerPixel, 4
  14944. LOOP @@if4bit
  14945. MOV EAX, offset[_SetDIBPixels1bit]
  14946. @@if4bit:
  14947. LOOP @@if8bit
  14948. @@if8bit:
  14949. LOOP @@if15bit
  14950. DEC DL
  14951. MOV DH, $FF
  14952. @@if15bit:
  14953. LOOP @@if16bit
  14954. DEC DH
  14955. INC ECX
  14956. @@if16bit:
  14957. LOOP @@if24bit
  14958. INC DH
  14959. MOV EAX, offset[_SetDIBPixels16bit]
  14960. @@if24bit:
  14961. LOOP @@if32bit
  14962. DEC EDX
  14963. DEC [EBX].fBytesPerPixel
  14964. INC ECX
  14965. @@if32bit:
  14966. LOOP @@ifend
  14967. INC EDX
  14968. MOV EAX, offset[_SetDIBPixelsTrueColor]
  14969. @@ifend:
  14970. MOV byte ptr [EBX].fPixelMask, DH
  14971. MOV byte ptr [EBX].fPixelsPerByteMask, DL
  14972. MOV [EBX].fSetDIBPixels, EAX
  14973. TEST EAX, EAX
  14974. @@ddb:
  14975. POPAD
  14976. JNZ @@assigned
  14977. PUSH Value
  14978. CALL SetPixels
  14979. JMP @@exit
  14980. @@assigned:
  14981. PUSH Value
  14982. CALL [EAX].fSetDIBPixels
  14983. @@exit:
  14984. end;
  14985. procedure TBitmap.FlipVertical;
  14986. asm
  14987. PUSH EBX
  14988. MOV EBX, EAX
  14989. MOV ECX, [EBX].fHandle
  14990. JECXZ @@noHandle
  14991. CALL StartDC
  14992. PUSH SrcCopy
  14993. MOV EDX, [EBX].fHeight
  14994. PUSH EDX
  14995. MOV ECX, [EBX].fWidth
  14996. PUSH ECX
  14997. PUSH 0
  14998. PUSH 0
  14999. PUSH EAX
  15000. NEG EDX
  15001. PUSH EDX
  15002. PUSH ECX
  15003. NEG EDX
  15004. DEC EDX
  15005. PUSH EDX
  15006. PUSH 0
  15007. PUSH EAX
  15008. CALL StretchBlt
  15009. CALL FinishDC
  15010. POP EBX
  15011. RET
  15012. @@noHandle:
  15013. MOV ECX, [EBX].fDIBBits
  15014. JECXZ @@exit
  15015. PUSHAD //----------------------------------------\
  15016. XOR EBP, EBP // Y = 0
  15017. //+++++++++++++++++++++++++++ provide fScanLineSize
  15018. MOV EAX, EBX
  15019. MOV EDX, EBP
  15020. CALL GetScanLine //
  15021. SUB ESP, [EBX].fScanLineSize
  15022. @@loo: LEA EAX, [EBP*2]
  15023. CMP EAX, [EBX].fHeight
  15024. JG @@finloo
  15025. MOV EAX, EBX
  15026. MOV EDX, EBP
  15027. CALL GetScanLine
  15028. MOV ESI, EAX // ESI = ScanLine[ Y ]
  15029. MOV EDX, ESP
  15030. MOV ECX, [EBX].fScanLineSize
  15031. PUSH ECX
  15032. CALL System.Move
  15033. MOV EAX, EBX
  15034. MOV EDX, [EBX].fHeight
  15035. SUB EDX, EBP
  15036. DEC EDX
  15037. CALL GetScanLine
  15038. MOV EDI, EAX
  15039. MOV EDX, ESI
  15040. POP ECX
  15041. PUSH ECX
  15042. CALL System.Move
  15043. POP ECX
  15044. MOV EAX, ESP
  15045. MOV EDX, EDI
  15046. CALL System.Move
  15047. INC EBP
  15048. JMP @@loo
  15049. @@finloo:
  15050. ADD ESP, [EBX].fScanLineSize
  15051. POPAD
  15052. @@exit:
  15053. POP EBX
  15054. end;
  15055. procedure TBitmap.FlipHorizontal;
  15056. asm
  15057. PUSH EBX
  15058. MOV EBX, EAX
  15059. CALL GetHandle
  15060. TEST EAX, EAX
  15061. JZ @@exit
  15062. CALL StartDC
  15063. PUSH SrcCopy
  15064. MOV EDX, [EBX].fHeight
  15065. PUSH EDX
  15066. MOV ECX, [EBX].fWidth
  15067. PUSH ECX
  15068. PUSH 0
  15069. PUSH 0
  15070. PUSH EAX
  15071. PUSH EDX
  15072. NEG ECX
  15073. PUSH ECX
  15074. PUSH 0
  15075. NEG ECX
  15076. DEC ECX
  15077. PUSH ECX
  15078. PUSH EAX
  15079. CALL StretchBlt
  15080. CALL FinishDC
  15081. @@exit:
  15082. POP EBX
  15083. end;
  15084. (*
  15085. procedure TBitmap.CopyRect(const DstRect: TRect; SrcBmp: PBitmap;
  15086. const SrcRect: TRect);
  15087. asm
  15088. PUSHAD
  15089. MOV EBX, EAX
  15090. MOV ESI, ECX
  15091. MOV EDI, EDX
  15092. CALL GetHandle
  15093. TEST EAX, EAX
  15094. JZ @@exit
  15095. MOV EAX, ESI
  15096. CALL GetHandle
  15097. TEST EAX, EAX
  15098. JZ @@exit
  15099. CALL StartDC
  15100. XCHG EBX, ESI
  15101. CMP EBX, ESI
  15102. JNZ @@diff1
  15103. PUSH EAX
  15104. PUSH 0
  15105. JMP @@nodiff1
  15106. @@diff1:
  15107. CALL StartDC
  15108. @@nodiff1:
  15109. PUSH SrcCopy // ->
  15110. MOV EBP, [SrcRect]
  15111. MOV EAX, [EBP].TRect.Bottom
  15112. MOV EDX, [EBP].TRect.Top
  15113. SUB EAX, EDX
  15114. PUSH EAX // ->
  15115. MOV EAX, [EBP].TRect.Right
  15116. MOV ECX, [EBP].TRect.Left
  15117. SUB EAX, ECX
  15118. PUSH EAX // ->
  15119. PUSH EDX // ->
  15120. PUSH ECX // ->
  15121. PUSH dword ptr [ESP+24] // -> DCsrc
  15122. MOV EAX, [EDI].TRect.Bottom
  15123. MOV EDX, [EDI].TRect.Top
  15124. SUB EAX, EDX
  15125. PUSH EAX // ->
  15126. MOV EAX, [EDI].TRect.Right
  15127. MOV ECX, [EDI].TRect.Left
  15128. SUB EAX, ECX
  15129. PUSH EAX // ->
  15130. PUSH EDX // ->
  15131. PUSH ECX // ->
  15132. PUSH dword ptr [ESP+13*4] // -> DCdst
  15133. CALL StretchBlt
  15134. CMP EBX, ESI
  15135. JNE @@diff2
  15136. POP ECX
  15137. POP ECX
  15138. JMP @@nodiff2
  15139. @@diff2:
  15140. CALL FinishDC
  15141. @@nodiff2:
  15142. CALL FinishDC
  15143. @@exit:
  15144. POPAD
  15145. end;
  15146. *)
  15147. procedure asmIconEmpty( Icon: PIcon );
  15148. asm
  15149. CMP [EAX].TIcon.fHandle, 0
  15150. end;
  15151. procedure TIcon.Clear;
  15152. asm //cmd //opd
  15153. XOR ECX, ECX
  15154. XCHG ECX, [EAX].fHandle
  15155. JECXZ @@1
  15156. CMP [EAX].fShareIcon, 0
  15157. JNZ @@1
  15158. PUSH EAX
  15159. PUSH ECX
  15160. CALL DestroyIcon
  15161. POP EAX
  15162. @@1: MOV [EAX].fShareIcon, 0
  15163. end;
  15164. {$IFNDEF ICON_DIFF_WH}
  15165. function TIcon.Convert2Bitmap(TranColor: TColor): HBitmap;
  15166. asm //cmd //opd
  15167. PUSH EBX
  15168. PUSH ESI
  15169. PUSH EDI
  15170. PUSH EBP
  15171. MOV EBX, EAX
  15172. MOV EBP, EDX
  15173. XOR EDX, EDX
  15174. CALL asmIconEmpty
  15175. JZ @@ret_0
  15176. PUSH 0
  15177. CALL GetDC
  15178. PUSH EAX //> DC0
  15179. PUSH EAX
  15180. CALL CreateCompatibleDC
  15181. XCHG EDI, EAX
  15182. MOV EDX, [EBX].fSize
  15183. POP EAX
  15184. PUSH EAX
  15185. PUSH EDX //>Bottom
  15186. PUSH EDX //>Right
  15187. PUSH 0 //>Top
  15188. PUSH 0 //>Left
  15189. PUSH EDX
  15190. PUSH EDX
  15191. PUSH EAX
  15192. CALL CreateCompatibleBitmap
  15193. XCHG EBP, EAX
  15194. CALL Color2RGB
  15195. PUSH EAX
  15196. PUSH EBP
  15197. PUSH EDI
  15198. CALL SelectObject
  15199. XCHG ESI, EAX
  15200. CALL CreateSolidBrush
  15201. MOV EDX, ESP
  15202. PUSH EAX
  15203. PUSH EAX
  15204. PUSH EDX
  15205. PUSH EDI
  15206. CALL Windows.FillRect
  15207. CALL DeleteObject
  15208. XCHG EAX, EBX
  15209. MOV EDX, EDI
  15210. XOR ECX, ECX
  15211. PUSH ECX
  15212. CALL Draw
  15213. PUSH EDI
  15214. PUSH ESI
  15215. CALL FinishDC
  15216. ADD ESP, 16
  15217. PUSH 0
  15218. CALL ReleaseDC
  15219. MOV EDX, EBP
  15220. @@ret_0:
  15221. XCHG EAX, EDX
  15222. POP EBP
  15223. POP EDI
  15224. POP ESI
  15225. POP EBX
  15226. end;
  15227. {$ENDIF}
  15228. destructor TIcon.Destroy;
  15229. asm //cmd //opd
  15230. PUSH EAX
  15231. CALL Clear
  15232. POP EAX
  15233. CALL TObj.Destroy
  15234. end;
  15235. procedure TIcon.Draw(DC: HDC; X, Y: Integer);
  15236. asm //cmd //opd
  15237. CALL asmIconEmpty
  15238. JZ @@exit
  15239. PUSH DI_NORMAL
  15240. PUSH 0
  15241. PUSH 0
  15242. {$IFDEF ICON_DIFF_WH}
  15243. PUSH [EAX].fHeight
  15244. PUSH [EAX].fWidth
  15245. {$ELSE}
  15246. PUSH [EAX].fSize
  15247. PUSH [EAX].fSize
  15248. {$ENDIF}
  15249. PUSH [EAX].fHandle
  15250. PUSH Y
  15251. PUSH ECX
  15252. PUSH EDX
  15253. CALL DrawIconEx
  15254. @@exit:
  15255. end;
  15256. procedure TIcon.StretchDraw(DC: HDC; Dest: TRect);
  15257. asm //cmd //opd
  15258. CALL asmIconEmpty
  15259. JZ @@exit
  15260. PUSH DI_NORMAL
  15261. PUSH 0
  15262. PUSH 0
  15263. PUSH ECX
  15264. PUSH ECX
  15265. PUSH [EAX].fHandle
  15266. PUSH [ECX].TRect.Top
  15267. PUSH [ECX].TRect.Left
  15268. PUSH EDX
  15269. MOV EAX, [ECX].TRect.Bottom
  15270. SUB EAX, [ECX].TRect.Top
  15271. MOV [ESP+20], EAX
  15272. MOV EAX, [ECX].TRect.Right
  15273. SUB EAX, [ECX].TRect.Left
  15274. MOV [ESP+16], EAX
  15275. CALL DrawIconEx
  15276. @@exit:
  15277. end;
  15278. procedure TIcon.SaveToFile(const FileName: KOLString);
  15279. asm //cmd //opd
  15280. PUSH EAX
  15281. MOV EAX, ESP
  15282. MOV ECX, EDX
  15283. XOR EDX, EDX
  15284. CALL SaveIcons2File
  15285. POP EAX
  15286. end;
  15287. procedure TIcon.SaveToStream(Strm: PStream);
  15288. asm //cmd //opd
  15289. PUSH EAX
  15290. MOV EAX, ESP
  15291. MOV ECX, EDX
  15292. XOR EDX, EDX
  15293. CALL SaveIcons2Stream
  15294. POP EAX
  15295. end;
  15296. function ColorBits( ColorsCount : Integer ) : Integer;
  15297. asm //cmd //opd
  15298. PUSH EBX
  15299. MOV EDX, offset[PossibleColorBits]
  15300. @@loop: MOVZX ECX, byte ptr [EDX]
  15301. JECXZ @@e_loop
  15302. INC EDX
  15303. XOR EBX, EBX
  15304. INC EBX
  15305. SHL EBX, CL
  15306. CMP EBX, EAX
  15307. JL @@loop
  15308. @@e_loop:
  15309. XCHG EAX, ECX
  15310. POP EBX
  15311. end;
  15312. {$IFNDEF OLD_ALIGN}
  15313. {$IFDEF ASM_VERSION}
  15314. procedure AlignChildrenProc(Sender: PObj);
  15315. const AlignModes = (1 shl byte(caBottom))+(1 shl byte(caTop))+
  15316. (((1 shl byte(caRight)) +(1 shl byte(caLeft)))shl 8)+
  15317. (((1 shl byte(caClient))+(1 shl byte(caNone)))shl 16);
  15318. asm //cmd //opd
  15319. TEST EAX,EAX
  15320. JZ @@21
  15321. CMP [EAX].TControl.fParent,0
  15322. SETZ DL
  15323. OR DL,[EAX].TControl.fisForm
  15324. BTR dword ptr[EAX].TControl.fAligning,oaFromSelf
  15325. JA @@20
  15326. OR byte ptr[EAX].TControl.fAligning,(1 shl oaWaitAlign)
  15327. MOV EAX,[EAX].TControl.fParent
  15328. @@20: CALL @@ToBeAlign
  15329. JNZ @@DoAlign
  15330. @@21: RETN
  15331. @@ToBeAlign:
  15332. MOV DL,[EAX].TControl.fVisible
  15333. OR DL,[EAX].TControl.fCreateHidden
  15334. JE @@10
  15335. AND DL,[EAX].TControl.fisForm
  15336. JNE @@12
  15337. CMP dword ptr[EAX].TControl.fParent,0
  15338. JE @@11
  15339. PUSH EAX
  15340. MOV EAX,[EAX].TControl.fParent
  15341. CALL @@ToBeAlign
  15342. POP EAX
  15343. @@10: XOR DL,1
  15344. //!!! Important: oaWaitAlign=0
  15345. OR [EAX].TControl.fAligning,DL
  15346. @@11: XOR DL,1
  15347. @@12: RETN
  15348. @@DoAlign:
  15349. //CALL AlignChildrenProc_
  15350. //RET
  15351. PUSH EBP
  15352. PUSH EBX
  15353. PUSH ESI
  15354. PUSH EDI
  15355. PUSH AlignModes //00210A14h
  15356. SUB ESP,030h
  15357. MOV EBX,EAX
  15358. AND byte ptr[EBX].TControl.fAligning,not(1 shl oaWaitAlign)
  15359. OR byte ptr[EBX].TControl.fAligning,(1 shl oaAligning)
  15360. LEA EDX,[ESP+20h] //@CR
  15361. CALL TControl.ClientRect
  15362. @@Main:
  15363. MOV EAX,[EBX].TControl.fChildren
  15364. MOV EDI,[EAX].TList.fCount
  15365. MOV EBP,[EAX].TList.fItems
  15366. JMP @@entry
  15367. @@loop:
  15368. MOV ESI,[EBP]
  15369. MOV AL,[ESI].TControl.fVisible
  15370. OR AL,[ESI].TControl.fCreateHidden
  15371. JZ @@continue
  15372. MOVZX EAX,[ESI].TControl.fAlign
  15373. BT [ESP+30h],EAX //Allowed
  15374. JNC @@continue
  15375. CMP byte ptr[ESI].TControl.fNotUseAlign,0
  15376. JNE @@align
  15377. MOV EDX,ESP //@R
  15378. MOV EAX,ESI //C
  15379. CALL TControl.GetBoundsRect
  15380. MOV EAX,[ESP+0Ch] //R.Bottom
  15381. MOV [ESP+1Ch],EAX //H
  15382. MOV EAX,[ESP+08h] //R.Right
  15383. MOV [ESP+18h],EAX //W
  15384. MOV EAX,[ESP+04h] //R.Top
  15385. MOV [ESP+14h],EAX //R1.Top
  15386. SUB [ESP+1Ch],EAX //H
  15387. MOV EAX,[ESP] //R.Left
  15388. MOV [ESP+10h],EAX //R1.Left
  15389. SUB [ESP+18h],EAX //W
  15390. MOV EDX,[EBX].TControl.fMargin
  15391. MOVZX ECX,byte ptr[ESI].TControl.fAlign
  15392. //!!! Order of caXXX-constants is important
  15393. LOOP @@caTop
  15394. MOV EAX,[ESP+20h] //CR.Left
  15395. SUB EAX,[ESP] //R.Left
  15396. ADD EAX,EDX //+Margin
  15397. MOV ECX,[ESP+18h] //W
  15398. ADD ECX,EDX //+Margin
  15399. ADD [ESP+20h],ECX //CR.Left
  15400. JMP @@00
  15401. @@caTop:
  15402. LOOP @@caRight
  15403. MOV EAX,[ESP+24h] //CR.Top
  15404. SUB EAX,[ESP+04h] //R.Top
  15405. ADD EAX,EDX //+Margin
  15406. MOV ECX,[ESP+1Ch] //H
  15407. ADD ECX,EDX //+Margin
  15408. ADD [ESP+24h],ECX //CR.Top
  15409. JMP @@01
  15410. @@caRight:
  15411. LOOP @@caBottom
  15412. MOV EAX,[ESP+28h] //CR.Right
  15413. SUB EAX,[ESP+08h] //R.Right
  15414. SUB EAX,EDX //-Margin
  15415. MOV ECX,[ESP+18h] //W
  15416. ADD ECX,EDX //+Margin
  15417. SUB [ESP+28h],ECX //CR.Right
  15418. @@00: ADD [ESP],EAX //R.Left
  15419. ADD [ESP+08h],EAX //R.Right
  15420. MOV EAX,[ESP+2Ch] //CR.Bottom
  15421. SUB EAX,EDX //+Margin
  15422. MOV [ESP+0Ch],EAX //R.Bottom
  15423. ADD EDX,[esp+24h] //Margin+CR.Top
  15424. MOV [ESP+04h],edx //R.Top
  15425. JMP @@caNone
  15426. @@caBottom:
  15427. LOOP @@caClient
  15428. MOV EAX,[ESP+2Ch] //CR.Bottom
  15429. SUB EAX,[ESP+0Ch] //R.Bottom
  15430. SUB EAX,EDX //-Margin
  15431. MOV ECX,[ESP+1Ch] //H
  15432. ADD ECX,EDX //+Margin
  15433. SUB [ESP+2Ch],ECX //CR.Bottom
  15434. @@01: ADD [ESP+04h],EAX //R.Top
  15435. ADD [ESP+0Ch],EAX //R.Bottom
  15436. MOV EAX,[ESP+28h] //CR.Right
  15437. SUB EAX,EDX //-Margin
  15438. MOV [esp+08h],EAX //R.Right
  15439. ADD EDX,[ESP+20h] //Margin+CR.Left
  15440. MOV [ESP],EDX //R.Left
  15441. JMP @@caNone
  15442. @@caClient:
  15443. LOOP @@caNone
  15444. MOV EAX,[ESP+2Ch] //CR.Bottom
  15445. SUB EAX,EDX //-Margin
  15446. MOV [ESP+0Ch],EAX //R.Bottom
  15447. MOV EAX,[ESP+28h] //CR.Right
  15448. SUB EAX,EDX //-Margin
  15449. MOV [ESP+08h],EAX //R.Right
  15450. MOV EAX,[ESP+24h] //CR.Top
  15451. ADD EAX,EDX //+Margin
  15452. MOV [ESP+04h],EAX //R.Top
  15453. ADD EDX,[ESP+20h] //Margin+CR.Left
  15454. MOV [ESP],EDX //R.Left
  15455. @@caNone:
  15456. MOV EAX,[ESP] //R.Left
  15457. CMP EAX,[ESP+08h] //R.Right
  15458. JLE @@02 //CMOVG ???
  15459. MOV [ESP+08h],EAX //R.Right
  15460. @@02: MOV EAX,[ESP+04h] //R.Top
  15461. CMP EAX,[ESP+0Ch] //R.Bottom
  15462. JLE @@03 //CMOVG ???
  15463. MOV [ESP+0Ch],EAX //R.Bottom
  15464. @@03: MOV EDX,[ESP] //R.Left
  15465. SUB EDX,[ESP+10h] //R1.Left
  15466. MOV EAX,[ESP+04h] //R.Top
  15467. SUB EAX,[ESP+14h] //R1.Top
  15468. OR EDX,EAX //ChgPos
  15469. MOV ECX,[ESP+08h] //R.Right
  15470. SUB ECX,[ESP] //R.Left
  15471. SUB ECX,[ESP+18h] //W
  15472. MOV EAX,[ESP+0Ch] //R.Bottom
  15473. SUB EAX,[ESP+04h] //R.Top
  15474. SUB EAX,[ESP+1Ch] //H
  15475. OR EAX,ECX
  15476. JZ @@04
  15477. AND byte ptr[ESI].TControl.fAligning,not(1 shl oaWaitAlign)
  15478. OR byte ptr[ESI].TControl.fAligning,(1 shl oaFromSelf)
  15479. @@04: OR EAX,EDX
  15480. JZ @@align
  15481. MOV EDX,ESP //@R
  15482. MOV EAX,ESI //C
  15483. CALL TControl.SetBoundsRect
  15484. @@align:
  15485. TEST byte ptr[ESI].TControl.fAligning,(1 shl oaWaitAlign)
  15486. JZ @@continue
  15487. MOV EAX,ESI //C
  15488. CALL @@DoAlign
  15489. @@continue:
  15490. TEST byte ptr[EBX].TControl.fAligning,(1 shl oaAligning)
  15491. JZ @@exit
  15492. ADD EBP,4
  15493. @@entry:
  15494. DEC EDI
  15495. JGE @@loop
  15496. SHR dword ptr[ESP+30h],8 //Allowed
  15497. JNZ @@Main
  15498. AND byte ptr[EBX].TControl.fAligning,not(1 shl oaAligning)
  15499. @@exit:
  15500. ADD ESP,34h
  15501. POP EDI
  15502. POP ESI
  15503. POP EBX
  15504. POP EBP
  15505. end;
  15506. {$ENDIF ASM_VERSION}
  15507. {$ENDIF OLD_ALIGN}
  15508. function WndProcUpdate( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  15509. asm //cmd //opd
  15510. PUSH EBX
  15511. XCHG EBX, EAX
  15512. MOV EAX, [EBX].TControl.fUpdateCount
  15513. TEST EAX, EAX
  15514. JZ @@exit
  15515. XOR EAX, EAX
  15516. MOV EDX, [EDX].TMsg.message
  15517. CMP DX, WM_PAINT
  15518. JNE @@chk_erasebkgnd
  15519. MOV [ECX], EAX
  15520. PUSH EAX
  15521. PUSH [EBX].TControl.fHandle
  15522. CALL ValidateRect
  15523. JMP @@rslt_1
  15524. @@chk_erasebkgnd:
  15525. CMP DX, WM_ERASEBKGND
  15526. JNE @@exit
  15527. INC EAX
  15528. MOV [ECX], EAX
  15529. @@rslt_1:
  15530. MOV AL, 1
  15531. @@exit:
  15532. POP EBX
  15533. end;
  15534. function EnumDynHandlers( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
  15535. asm //cmd //opd
  15536. CMP [EAX].TControl.fRefCount, 0
  15537. JL @@fin_false
  15538. PUSHAD
  15539. MOV EBX, EAX
  15540. MOV EBP, ECX
  15541. MOV ECX, [EBX].TControl.fDynHandlers
  15542. JECXZ @@ret_false
  15543. MOV ESI, ECX
  15544. MOV ECX, [ESI].TList.fCount
  15545. JECXZ @@ret_false
  15546. MOV EDI, ECX
  15547. SHR EDI, 1
  15548. CALL TControl.RefInc
  15549. @@loo: DEC EDI
  15550. JS @@e_loo
  15551. PUSH EDX
  15552. PUSH EBX
  15553. {$IFNDEF SMALLEST_CODE}
  15554. {$IFNDEF ENUM_DYN_HANDLERS_AFTER_RUN}
  15555. XOR EAX, EAX
  15556. CMP [AppletTerminated], AL
  15557. JZ @@do_call
  15558. MOV ECX, [ESI].TList.fItems
  15559. MOV ECX, [ECX+EDI*8+4]
  15560. JECXZ @@skip_call
  15561. {$ENDIF}
  15562. {$ENDIF}
  15563. @@do_call:
  15564. MOV EAX, [ESI].TList.fItems
  15565. MOV EAX, [EAX+EDI*8]
  15566. XCHG EAX, EBX
  15567. MOV ECX, EBP
  15568. CALL EBX
  15569. @@skip_call:
  15570. POP EBX
  15571. POP EDX
  15572. TEST AL, AL
  15573. JZ @@loo
  15574. @@ret_true:
  15575. MOV EAX, EBX
  15576. CALL TControl.RefDec
  15577. POPAD
  15578. MOV AL, 1
  15579. RET
  15580. @@e_loo:
  15581. XOR EAX, EAX
  15582. INC EAX
  15583. CMP [EBX].TControl.fRefCount, EAX
  15584. JE @@ret_true
  15585. MOV EAX, EBX
  15586. CALL TControl.RefDec
  15587. @@ret_false:
  15588. POPAD
  15589. @@fin_false:
  15590. XOR EAX, EAX
  15591. end;
  15592. procedure TControl.AttachProcEx( Proc: TWindowFunc; ExecuteAfterAppletTerminated: Boolean );
  15593. asm PUSH EBX
  15594. PUSH EDI
  15595. PUSH ECX
  15596. XCHG EBX, EAX
  15597. MOV EDI, EDX
  15598. MOV [EBX].fOnDynHandlers, offset[EnumDynHandlers]
  15599. MOV EAX, [EBX].fDynHandlers
  15600. MOV EDX, EDI
  15601. CALL TList.IndexOf
  15602. TEST EAX, EAX
  15603. JGE @@exit
  15604. MOV EAX, [EBX].fDynHandlers
  15605. PUSH EAX
  15606. MOV EDX, EDI
  15607. CALL TList.Add
  15608. POP EAX
  15609. POP EDX
  15610. PUSH EDX
  15611. CALL TList.Add
  15612. @@exit: {$IFNDEF SMALLEST_CODE}
  15613. MOV EAX, [EBX].fDynHandlers
  15614. CALL [Global_AttachProcExtension]
  15615. {$ENDIF}
  15616. POP ECX
  15617. POP EDI
  15618. POP EBX
  15619. end;
  15620. function TControl.IsProcAttached(Proc: TWindowFunc): Boolean;
  15621. asm //cmd //opd
  15622. //MOV ECX, [EAX].TControl.fDynHandlers
  15623. MOV EAX, [EAX].TControl.fDynHandlers
  15624. //JECXZ @@exit
  15625. //XCHG EAX, ECX
  15626. CALL TList.IndexOf
  15627. TEST EAX, EAX
  15628. //SETGE CL
  15629. SETGE AL
  15630. //@@exit: XCHG EAX, ECX
  15631. end;
  15632. function WinVer : TWindowsVersion;
  15633. asm
  15634. MOVSX EAX, byte ptr [SaveWinVer]
  15635. INC AH // åñëè <> 0 ïîñëå èíêðåìåíòà, òî AL ñîäåðæèò âû÷èñëåííóþ âåðñèþ
  15636. JNZ @@exit
  15637. CALL GetVersion // EAX < 0 äëÿ ïëàòôîðìû 9õ, èíà÷å NT; AL=MajorVersion; AH=MinorVersion
  15638. XCHG EDX, EAX
  15639. XOR EAX, EAX
  15640. TEST EDX, EDX
  15641. XCHG DL, DH // DH=MajorVersion; DL=MinorVersion
  15642. JL @@platform_9x
  15643. MOV AL, wvNT
  15644. CMP DH, 5
  15645. JB @@save_exit
  15646. INC AL // wvY2K
  15647. CMP DX, $0501
  15648. JB @@save_exit
  15649. INC AL // wvXP
  15650. DEC DL
  15651. JZ @@save_exit
  15652. INC AL // wvServer2003
  15653. CMP DH, 6
  15654. JB @@save_exit
  15655. INC AL // wvVista
  15656. JMP @@save_exit
  15657. @@platform_9x:
  15658. CMP DH, 4
  15659. JB @@save_exit // wv31
  15660. INC AL // wv95
  15661. CMP DX, $040A
  15662. JB @@save_exit
  15663. INC AL // wv98
  15664. CMP DX, $045A
  15665. JB @@save_exit
  15666. INC AL // wvME
  15667. @@save_exit:
  15668. MOV byte ptr [SaveWinVer], AL
  15669. @@exit:
  15670. end;
  15671. //======================================== THE END OF FILE KOL_ASM.inc