One time use code to find the largest possible multiplier without overflowing a DWORD in text color weighting worst case. The worst case being white (RGB og &h00FFFFFF). I have since figured out how I could have started closer to the final result, but this brute force method has served its purpose.
One thing I have done is convert it from a console to a TXT.WINDOW so it can be compiled and run in PBWin or PBCC.
#compile exe #dim all %UNICODE = 1 #if %def(%pb_cc32) #console off #endif ' function pbmain () as long local testWSum, MaxDword as quad 'local MUT as extended local RIW, GIW, BIW as dword 'multiplied integer weights for each color local hTWin, MUT, MaxRedI, MaxGrnI, MaxBluI, TransPt as dword local ResultStr as string ' txt.window ("Largest possible multiplied weights", 200, 150, 20, 68) to hTWin txt.print "any key to start" txt.waitkey$ txt.cls MaxDword = int(2^32## - 1##) 'integer QUAD MUT = round((2^32## - 1##) / (255## * 3##), 0) ' txt.print format$(MUT); " Starting multiplier" ' do RIW = round(MUT * 0.76245##, 0) GIW = round(MUT * 1.49685##, 0) BIW = round(MUT * 0.2907##, 0) MaxRedI = RIW * 255??? MaxGrnI = GIW * 255??? MaxBluI = BIW * 255??? testWSum = MaxRedI + MaxGrnI + MaxBluI ' if testWSum >= MaxDword then decr MUT RIW = round(MUT * 0.76245##, 0) GIW = round(MUT * 1.49685##, 0) BIW = round(MUT * 0.2907##, 0) MaxRedI = RIW * 255??? MaxGrnI = GIW * 255??? MaxBluI = BIW * 255??? testWSum = MaxRedI + MaxGrnI + MaxBluI TransPt = round(MUT * 474.3##, 0) exit do else incr MUT end if loop ' txt.print format$(MUT); " Multipier used." txt.print txt.print "Use in function Text_BlackOrWhite." txt.print " Red multiplier: "; dec$(RIW) txt.print " Green multiplier: "; dec$(GIW) txt.print " Blue multiplier: "; dec$(BIW) txt.print " Transition point: "; dec$(TransPt) txt.print txt.print "FYI:" txt.print " "; dec$(testWSum); " sum of max colors" txt.print " "; dec$(MaxDword); " dword max" txt.print " "; format$(MaxDword / testWSum); " Just barely over 1 is good. txt.print txt.print "The numbers needed are in the clipboard as:" ResultStr = " R-" + dec$(RIW) + " | G-" + dec$(GIW) + " | B-" + dec$(BIW) + _ " | TP-" + dec$(TransPt) + " | mult-" + dec$(MUT) clipboard set text ResultStr txt.print ResultStr ' txt.print txt.print "any key to exit" txt.waitkey$ txt.end end function '
Full copyleft (ɔ), 2024 by Dale Yarker in source or compiled form. Complete license in new tab or window.
Created on 01 June 2024.
Done with this window?