Hue, luma and color mix procedures

Bare metal programming in PureBasic, for experienced users
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Hue, luma and color mix procedures

Post by wilbert »

Asm routine for hue calculation using a lookup table.
Output is an integer from 0 - 359

Code: Select all

Procedure Hue(Color.l); Hue [0-359]
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !lea r8, [hue_lut]
  CompilerEndIf
  
  !movzx eax, byte [p.v_Color    ]  ; r
  !movzx ecx, byte [p.v_Color + 1]  ; g
  !movzx edx, byte [p.v_Color + 2]  ; b
  
  !cmp eax, ecx; r >= g
  !jc hue_l3
  !cmp ecx, edx; g >= b
  !jc hue_l0
  
  ; max = r, min = b; hue = 60*(g-b)/(r-b)
  !sub eax, edx; r-b
  !sub ecx, edx; g-b
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rax * 4]
  CompilerElse
    !mov eax, [hue_lut + eax * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0x008000
  !shr eax, 16
  ProcedureReturn  
    
  !hue_l0:
  !cmp eax, edx; r >= b
  !jc hue_l2
  
  ; max = r, min = g; hue = 60*(g-b)/(r-g)
  !sub eax, ecx; r-g
  !sub ecx, edx; g-b
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rax * 4]
  CompilerElse
    !mov eax, [hue_lut + eax * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0x008000
  !jc hue_l1
  !add eax, 0x1680000
  !hue_l1:
  !shr eax, 16
  ProcedureReturn
  
  !hue_l2:
  
  ; max = b, min = g; hue = 240+60*(r-g)/(b-g)
  !sub eax, ecx; r-g
  !sub edx, ecx; b-g
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov ecx, [r8 + rdx * 4]
  CompilerElse
    !mov ecx, [hue_lut + edx * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0xf08000
  !shr eax, 16
  ProcedureReturn
  
  !hue_l3:
  !cmp ecx, edx; g >= b
  !jc hue_l5
  !cmp eax, edx; r >= b
  !jc hue_l4
  
  ; max = g, min = b; hue = 120+60*(b-r)/(g-b)
  !sub ecx, edx; g-b
  !sub edx, eax; b-r
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rcx * 4]
  CompilerElse
    !mov eax, [hue_lut + ecx * 4]
  CompilerEndIf
  !imul eax, edx
  !add eax, 0x788000
  !shr eax, 16
  ProcedureReturn
  
  !hue_l4:
  
  ; max = g, min = r; hue = 120+60*(b-r)/(g-r)
  !sub ecx, eax; g-r
  !sub edx, eax; b-r
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rcx * 4]
  CompilerElse
    !mov eax, [hue_lut + ecx * 4]
  CompilerEndIf
  !imul eax, edx
  !add eax, 0x788000
  !shr eax, 16
  ProcedureReturn
  
  !hue_l5:
  
  ; max = b, min = r; hue = 240+60*(r-g)/(b-r)
  !sub edx, eax; b-r
  !sub eax, ecx; r-g
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov ecx, [r8 + rdx * 4]
  CompilerElse
    !mov ecx, [hue_lut + edx * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0xf08000
  !shr eax, 16
  ProcedureReturn
  
  ; hue lookup table
  !hue_lut:
  !dd 0,3932160,1966080,1310720,983040,786432,655360,561737,491520,436906,393216,357469,327680,302473,280868,262144
  !dd 245760,231303,218453,206955,196608,187245,178734,170963,163840,157286,151236,145635,140434,135591,131072,126843
  !dd 122880,119156,115651,112347,109226,106274,103477,100824,98304,95906,93622,91445,89367,87381,85481,83662
  !dd 81920,80248,78643,77101,75618,74191,72817,71493,70217,68985,67795,66646,65536,64461,63421,62415
  !dd 61440,60494,59578,58688,57825,56987,56173,55382,54613,53865,53137,52428,51738,51067,50412,49774
  !dd 49152,48545,47953,47375,46811,46260,45722,45197,44683,44181,43690,43210,42740,42281,41831,41391
  !dd 40960,40537,40124,39718,39321,38932,38550,38176,37809,37449,37095,36749,36408,36074,35746,35424
  !dd 35108,34797,34492,34192,33897,33608,33323,33043,32768,32497,32230,31968,31710,31457,31207,30961
  !dd 30720,30481,30247,30016,29789,29565,29344,29127,28912,28701,28493,28288,28086,27887,27691,27497
  !dd 27306,27118,26932,26749,26568,26390,26214,26040,25869,25700,25533,25368,25206,25045,24887,24730
  !dd 24576,24423,24272,24123,23976,23831,23687,23545,23405,23267,23130,22995,22861,22729,22598,22469
  !dd 22341,22215,22090,21967,21845,21724,21605,21487,21370,21254,21140,21027,20915,20805,20695,20587
  !dd 20480,20373,20268,20164,20062,19960,19859,19759,19660,19562,19466,19370,19275,19181,19088,18995
  !dd 18904,18814,18724,18635,18547,18460,18374,18289,18204,18120,18037,17955,17873,17792,17712,17633
  !dd 17554,17476,17398,17322,17246,17171,17096,17022,16948,16876,16804,16732,16661,16591,16521,16452
  !dd 16384,16316,16248,16181,16115,16049,15984,15919,15855,15791,15728,15665,15603,15542,15480,15420
EndProcedure

Alternative version with range scaled to [0,255] instead of [0,359]

Code: Select all

Procedure Hue256(Color.l); Hue [0-255]
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !lea r8, [hue256_lut]
  CompilerEndIf
  
  !movzx eax, byte [p.v_Color    ]  ; r
  !movzx ecx, byte [p.v_Color + 1]  ; g
  !movzx edx, byte [p.v_Color + 2]  ; b
  
  !cmp eax, ecx; r >= g
  !jc hue256_l2
  !cmp ecx, edx; g >= b
  !jc hue256_l0
  
  ; max = r, min = b; hue = 42.67 * (g-b)/(r-b)
  !sub eax, edx; r-b
  !sub ecx, edx; g-b
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rax * 4]
  CompilerElse
    !mov eax, [hue256_lut + eax * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0x00800000
  !shr eax, 24
  ProcedureReturn  
    
  !hue256_l0:
  !cmp eax, edx; r >= b
  !jc hue256_l1
  
  ; max = r, min = g; hue = 42.67 * (g-b)/(r-g)
  !sub eax, ecx; r-g
  !sub ecx, edx; g-b
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rax * 4]
  CompilerElse
    !mov eax, [hue256_lut + eax * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0x00800000
  !shr eax, 24
  ProcedureReturn
  
  !hue256_l1:
  
  ; max = b, min = g; hue = 170.67 + 42.67 * (r-g)/(b-g)
  !sub eax, ecx; r-g
  !sub edx, ecx; b-g
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov ecx, [r8 + rdx * 4]
  CompilerElse
    !mov ecx, [hue256_lut + edx * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0xab2aaaaa
  !shr eax, 24
  ProcedureReturn
  
  !hue256_l2:
  !cmp ecx, edx; g >= b
  !jc hue256_l4
  !cmp eax, edx; r >= b
  !jc hue256_l3
  
  ; max = g, min = b; hue = 85.33 + 42.67 * (b-r)/(g-b)
  !sub ecx, edx; g-b
  !sub edx, eax; b-r
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rcx * 4]
  CompilerElse
    !mov eax, [hue256_lut + ecx * 4]
  CompilerEndIf
  !imul eax, edx
  !add eax, 0x55d55555
  !shr eax, 24
  ProcedureReturn
  
  !hue256_l3:
  
  ; max = g, min = r; hue = 85.33 + 42.67 * (b-r)/(g-r)
  !sub ecx, eax; g-r
  !sub edx, eax; b-r
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov eax, [r8 + rcx * 4]
  CompilerElse
    !mov eax, [hue256_lut + ecx * 4]
  CompilerEndIf
  !imul eax, edx
  !add eax, 0x55d55555
  !shr eax, 24
  ProcedureReturn
  
  !hue256_l4:
  
  ; max = b, min = r; hue = 170.67 + 42.67 * (r-g)/(b-r)
  !sub edx, eax; b-r
  !sub eax, ecx; r-g
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov ecx, [r8 + rdx * 4]
  CompilerElse
    !mov ecx, [hue256_lut + edx * 4]
  CompilerEndIf
  !imul eax, ecx
  !add eax, 0xab2aaaaa
  !shr eax, 24
  ProcedureReturn
  
  ; hue lookup table
  !hue256_lut:
  !dd 0x00000000,0x2aaaaaaa,0x15555555,0x0e38e38e,0x0aaaaaaa,0x08888888,0x071c71c7,0x06186186
  !dd 0x05555555,0x04bda12f,0x04444444,0x03e0f83e,0x038e38e3,0x03483483,0x030c30c3,0x02d82d82
  !dd 0x02aaaaaa,0x02828282,0x025ed097,0x023ee08f,0x02222222,0x02082082,0x01f07c1f,0x01dae607
  !dd 0x01c71c71,0x01b4e81b,0x01a41a41,0x01948b0f,0x01861861,0x0178a4c8,0x016c16c1,0x01605816
  !dd 0x01555555,0x014afd6a,0x01414141,0x01381381,0x012f684b,0x0127350b,0x011f7047,0x01181181
  !dd 0x01111111,0x010a6810,0x01041041,0x00fe03f8,0x00f83e0f,0x00f2b9d6,0x00ed7303,0x00e865ac
  !dd 0x00e38e38,0x00dee95c,0x00da740d,0x00d62b80,0x00d20d20,0x00ce168a,0x00ca4587,0x00c6980c
  !dd 0x00c30c30,0x00bfa02f,0x00bc5264,0x00b92143,0x00b60b60,0x00b30f63,0x00b02c0b,0x00ad602b
  !dd 0x00aaaaaa,0x00a80a80,0x00a57eb5,0x00a3065e,0x00a0a0a0,0x009e4cad,0x009c09c0,0x0099d722
  !dd 0x0097b425,0x0095a025,0x00939a85,0x0091a2b3,0x008fb823,0x008dda52,0x008c08c0,0x008a42f8
  !dd 0x00888888,0x0086d905,0x00853408,0x00839930,0x00820820,0x00808080,0x007f01fc,0x007d8c42
  !dd 0x007c1f07,0x007aba01,0x00795ceb,0x00780780,0x0076b981,0x007572b2,0x007432d6,0x0072f9b6
  !dd 0x0071c71c,0x00709ad4,0x006f74ae,0x006e5478,0x006d3a06,0x006c252c,0x006b15c0,0x006a0b99
  !dd 0x00690690,0x00680680,0x00670b45,0x006614bc,0x006522c3,0x0064353c,0x00634c06,0x00626703
  !dd 0x00618618,0x0060a928,0x005fd017,0x005eface,0x005e2932,0x005d5b2b,0x005c90a1,0x005bc980
  !dd 0x005b05b0,0x005a451c,0x005987b1,0x0058cd5a,0x00581605,0x0057619f,0x0056b015,0x00560158
  !dd 0x00555555,0x0054abfd,0x00540540,0x0053610e,0x0052bf5a,0x00522014,0x0051832f,0x0050e89c
  !dd 0x00505050,0x004fba3d,0x004f2656,0x004e9490,0x004e04e0,0x004d7739,0x004ceb91,0x004c61dd
  !dd 0x004bda12,0x004b5428,0x004ad012,0x004a4dc9,0x0049cd42,0x00494e75,0x0048d159,0x004855e6
  !dd 0x0047dc11,0x004763d5,0x0046ed29,0x00467804,0x00460460,0x00459235,0x0045217c,0x0044b22e
  !dd 0x00444444,0x0043d7b7,0x00436c82,0x0043029e,0x00429a04,0x004232ae,0x0041cc98,0x004167ba
  !dd 0x00410410,0x0040a193,0x00404040,0x003fe00f,0x003f80fe,0x003f2305,0x003ec621,0x003e6a4d
  !dd 0x003e0f83,0x003db5c1,0x003d5d00,0x003d053e,0x003cae75,0x003c58a2,0x003c03c0,0x003bafcb
  !dd 0x003b5cc0,0x003b0a9b,0x003ab959,0x003a68f4,0x003a196b,0x0039cab9,0x00397cdb,0x00392fcd
  !dd 0x0038e38e,0x00389818,0x00384d6a,0x00380380,0x0037ba57,0x003771ec,0x00372a3c,0x0036e345
  !dd 0x00369d03,0x00365774,0x00361296,0x0035ce65,0x00358ae0,0x00354803,0x003505cc,0x0034c439
  !dd 0x00348348,0x003442f5,0x00340340,0x0033c425,0x003385a2,0x003347b6,0x00330a5e,0x0032cd98
  !dd 0x00329161,0x003255ba,0x00321a9e,0x0031e00c,0x0031a603,0x00316c80,0x00313381,0x0030fb06
  !dd 0x0030c30c,0x00308b91,0x00305494,0x00301e12,0x002fe80b,0x002fb27d,0x002f7d67,0x002f48c6
  !dd 0x002f1499,0x002ee0de,0x002ead95,0x002e7abc,0x002e4850,0x002e1652,0x002de4c0,0x002db397
  !dd 0x002d82d8,0x002d5280,0x002d228e,0x002cf301,0x002cc3d8,0x002c9512,0x002c66ad,0x002c38a8
  !dd 0x002c0b02,0x002bddba,0x002bb0cf,0x002b843f,0x002b580a,0x002b2c2f,0x002b00ac,0x002ad580
EndProcedure

Luma with lookup table

Code: Select all

Procedure Luma(Color.l)
  !movzx eax, byte [p.v_Color]; r
  !movzx ecx, byte [p.v_Color + 1]; g
  !movzx edx, byte [p.v_Color + 2]; b
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !lea r8, [luma_lut]
    !mov ax, [r8 + rax*2]
    !add ax, [r8 + rcx*2 + 512]
    !add ax, [r8 + rdx*2 + 1024]
    !movzx eax, byte [r8 + rax + 1536]
  CompilerElse
    !mov ax, [luma_lut + eax*2]
    !add ax, [luma_lut + ecx*2 + 512]
    !add ax, [luma_lut + edx*2 + 1024]
    !movzx eax, byte [luma_lut + eax + 1536]    
  CompilerEndIf
  ProcedureReturn
  !luma_lut:
  !dd 0x00000000,0x00010001,0x00010001,0x00020002,0x00020002,0x00030003,0x00040003,0x00040004
  !dd 0x00050005,0x00060005,0x00070006,0x00070007,0x00080008,0x000a0009,0x000b000a,0x000c000b
  !dd 0x000d000d,0x000f000e,0x0010000f,0x00120011,0x00130012,0x00150014,0x00170016,0x00190018
  !dd 0x001b001a,0x001d001c,0x001f001e,0x00210020,0x00240022,0x00260025,0x00290027,0x002b002a
  !dd 0x002e002d,0x0031002f,0x00340032,0x00370035,0x003a0038,0x003d003c,0x0041003f,0x00440042
  !dd 0x00480046,0x004b0049,0x004f004d,0x00530051,0x00570055,0x005b0059,0x005f005d,0x00640061
  !dd 0x00680066,0x006d006a,0x0071006f,0x00760074,0x007b0079,0x0080007d,0x00850083,0x008a0088
  !dd 0x0090008d,0x00950092,0x009b0098,0x00a1009e,0x00a600a4,0x00ac00a9,0x00b300af,0x00b900b6
  !dd 0x00bf00bc,0x00c600c2,0x00cc00c9,0x00d300d0,0x00da00d6,0x00e100dd,0x00e800e4,0x00ef00eb
  !dd 0x00f700f3,0x00fe00fa,0x01060102,0x010d010a,0x01150111,0x011d0119,0x01260121,0x012e012a
  !dd 0x01360132,0x013f013b,0x01480143,0x0150014c,0x01590155,0x0163015e,0x016c0167,0x01750170
  !dd 0x017f017a,0x01880184,0x0192018d,0x019c0197,0x01a601a1,0x01b101ab,0x01bb01b6,0x01c601c0
  !dd 0x01d001cb,0x01db01d6,0x01e601e1,0x01f101ec,0x01fc01f7,0x02080202,0x0213020e,0x021f0219
  !dd 0x022b0225,0x02370231,0x0243023d,0x02500249,0x025c0256,0x02690262,0x0275026f,0x0282027c
  !dd 0x02900289,0x029d0296,0x02aa02a3,0x02b802b1,0x02c502bf,0x02d302cc,0x02e102da,0x02ef02e8
  !dd 0x02fe02f7,0x030c0305,0x031b0314,0x032a0322,0x03390331,0x03480340,0x0357034f,0x0366035f
  !dd 0x00010000,0x00030002,0x00040004,0x00060005,0x00080007,0x000a0009,0x000c000b,0x000e000d
  !dd 0x0010000f,0x00130012,0x00160014,0x00190017,0x001c001b,0x0020001e,0x00240022,0x00280026
  !dd 0x002d002a,0x0031002f,0x00360034,0x003b0039,0x0041003e,0x00470044,0x004d004a,0x00530050
  !dd 0x005a0057,0x0061005d,0x00680065,0x0070006c,0x00780074,0x0080007c,0x00890084,0x0092008d
  !dd 0x009b0096,0x00a400a0,0x00ae00a9,0x00b900b3,0x00c300be,0x00ce00c9,0x00d900d4,0x00e500df
  !dd 0x00f100eb,0x00fd00f7,0x010a0104,0x01170111,0x0125011e,0x0132012b,0x01410139,0x014f0148
  !dd 0x015e0157,0x016d0166,0x017d0175,0x018d0185,0x019e0195,0x01af01a6,0x01c001b7,0x01d201c9
  !dd 0x01e401db,0x01f601ed,0x020901ff,0x021c0213,0x02300226,0x0244023a,0x0259024e,0x026e0263
  !dd 0x02830278,0x0299028e,0x02af02a4,0x02c602ba,0x02dd02d1,0x02f402e8,0x030c0300,0x03240318
  !dd 0x033d0331,0x0357034a,0x03700363,0x038a037d,0x03a50398,0x03c003b2,0x03db03ce,0x03f703e9
  !dd 0x04140406,0x04310422,0x044e043f,0x046c045d,0x048a047b,0x04a90499,0x04c804b8,0x04e804d8
  !dd 0x050804f8,0x05280518,0x05490539,0x056b055a,0x058d057c,0x05af059e,0x05d205c1,0x05f605e4
  !dd 0x061a0608,0x063e062c,0x06630651,0x06890676,0x06af069c,0x06d506c2,0x06fc06e8,0x07230710
  !dd 0x074b0737,0x07740760,0x079d0788,0x07c607b1,0x07f007db,0x081b0805,0x08460830,0x0871085b
  !dd 0x089d0887,0x08ca08b3,0x08f708e0,0x0924090e,0x0952093b,0x0981096a,0x09b00999,0x09e009c8
  !dd 0x0a1009f8,0x0a410a28,0x0a720a5a,0x0aa40a8b,0x0ad60abd,0x0b090af0,0x0b3d0b23,0x0b710b57
  !dd 0x00000000,0x00000000,0x00010000,0x00010001,0x00010001,0x00010001,0x00010001,0x00010001
  !dd 0x00020002,0x00020002,0x00020002,0x00030002,0x00030003,0x00030003,0x00040003,0x00040004
  !dd 0x00040004,0x00050005,0x00050005,0x00060006,0x00070006,0x00070007,0x00080007,0x00080008
  !dd 0x00090009,0x000a0009,0x000b000a,0x000b000b,0x000c000c,0x000d000d,0x000e000d,0x000f000e
  !dd 0x0010000f,0x00110010,0x00120011,0x00130012,0x00140013,0x00150014,0x00160015,0x00170017
  !dd 0x00180018,0x001a0019,0x001b001a,0x001c001c,0x001e001d,0x001f001e,0x00200020,0x00220021
  !dd 0x00230023,0x00250024,0x00260026,0x00280027,0x002a0029,0x002b002b,0x002d002c,0x002f002e
  !dd 0x00310030,0x00330032,0x00350034,0x00370036,0x00390038,0x003b003a,0x003d003c,0x003f003e
  !dd 0x00410040,0x00430042,0x00450044,0x00480046,0x004a0049,0x004c004b,0x004f004e,0x00510050
  !dd 0x00540052,0x00560055,0x00590058,0x005b005a,0x005e005d,0x00610060,0x00640062,0x00670065
  !dd 0x00690068,0x006c006b,0x006f006e,0x00720071,0x00750074,0x00780077,0x007c007a,0x007f007d
  !dd 0x00820080,0x00850084,0x00890087,0x008c008a,0x008f008e,0x00930091,0x00960095,0x009a0098
  !dd 0x009e009c,0x00a100a0,0x00a500a3,0x00a900a7,0x00ad00ab,0x00b100af,0x00b400b3,0x00b800b6
  !dd 0x00bd00ba,0x00c100bf,0x00c500c3,0x00c900c7,0x00cd00cb,0x00d100cf,0x00d600d4,0x00da00d8
  !dd 0x00df00dc,0x00e300e1,0x00e800e5,0x00ec00ea,0x00f100ef,0x00f600f3,0x00fa00f8,0x00ff00fd
  !dd 0x01040102,0x01090107,0x010e010b,0x01130110,0x01180116,0x011d011b,0x01220120,0x01280125
  !dd 0x02020100,0x06050403,0x09080706,0x0c0b0a0a,0x0f0e0d0d,0x1110100f,0x13131212,0x15151414
  !dd 0x17171616,0x19181817,0x1a1a1919,0x1c1b1b1b,0x1d1d1d1c,0x1f1e1e1e,0x20201f1f,0x21212120
  !dd 0x22222222,0x24232323,0x25252424,0x26262525,0x27272626,0x28282827,0x29292928,0x2a2a2a29
  !dd 0x2b2b2b2a,0x2c2c2b2b,0x2d2d2c2c,0x2e2e2d2d,0x2f2e2e2e,0x302f2f2f,0x30303030,0x31313131
  !dd 0x32323231,0x33333232,0x34333333,0x34343434,0x35353535,0x36363635,0x37373636,0x37373737
  !dd 0x38383838,0x39393938,0x3a393939,0x3a3a3a3a,0x3b3b3b3a,0x3c3b3b3b,0x3c3c3c3c,0x3d3d3d3c
  !dd 0x3e3d3d3d,0x3e3e3e3e,0x3f3f3f3e,0x403f3f3f,0x40404040,0x41414040,0x41414141,0x42424242
  !dd 0x43424242,0x43434343,0x44444343,0x44444444,0x45454544,0x45454545,0x46464646,0x47464646
  !dd 0x47474747,0x48484747,0x48484848,0x49494848,0x49494949,0x4a4a4a49,0x4a4a4a4a,0x4b4b4b4a
  !dd 0x4b4b4b4b,0x4c4c4c4b,0x4c4c4c4c,0x4d4d4d4d,0x4d4d4d4d,0x4e4e4e4e,0x4e4e4e4e,0x4f4f4f4e
  !dd 0x4f4f4f4f,0x5050504f,0x50505050,0x51515150,0x51515151,0x52525151,0x52525252,0x53535252
  !dd 0x53535353,0x54535353,0x54545454,0x54545454,0x55555555,0x55555555,0x56565655,0x56565656
  !dd 0x57575656,0x57575757,0x58575757,0x58585858,0x58585858,0x59595958,0x59595959,0x5a5a5959
  !dd 0x5a5a5a5a,0x5a5a5a5a,0x5b5b5b5b,0x5b5b5b5b,0x5c5c5b5b,0x5c5c5c5c,0x5c5c5c5c,0x5d5d5d5d
  !dd 0x5d5d5d5d,0x5e5e5d5d,0x5e5e5e5e,0x5e5e5e5e,0x5f5f5f5f,0x5f5f5f5f,0x60605f5f,0x60606060
  !dd 0x60606060,0x61616160,0x61616161,0x62616161,0x62626262,0x62626262,0x63636262,0x63636363
  !dd 0x63636363,0x64646463,0x64646464,0x64646464,0x65656565,0x65656565,0x66656565,0x66666666
  !dd 0x66666666,0x67676666,0x67676767,0x67676767,0x68686767,0x68686868,0x68686868,0x69696968
  !dd 0x69696969,0x69696969,0x6a6a6a69,0x6a6a6a6a,0x6a6a6a6a,0x6b6b6b6a,0x6b6b6b6b,0x6b6b6b6b
  !dd 0x6c6c6c6b,0x6c6c6c6c,0x6c6c6c6c,0x6d6d6d6c,0x6d6d6d6d,0x6d6d6d6d,0x6e6e6e6d,0x6e6e6e6e
  !dd 0x6e6e6e6e,0x6f6f6f6e,0x6f6f6f6f,0x6f6f6f6f,0x70706f6f,0x70707070,0x70707070,0x71717070
  !dd 0x71717171,0x71717171,0x72717171,0x72727272,0x72727272,0x72727272,0x73737373,0x73737373
  !dd 0x73737373,0x74747473,0x74747474,0x74747474,0x75757474,0x75757575,0x75757575,0x75757575
  !dd 0x76767676,0x76767676,0x76767676,0x77777776,0x77777777,0x77777777,0x78777777,0x78787878
  !dd 0x78787878,0x78787878,0x79797978,0x79797979,0x79797979,0x7a7a7979,0x7a7a7a7a,0x7a7a7a7a
  !dd 0x7a7a7a7a,0x7b7b7b7a,0x7b7b7b7b,0x7b7b7b7b,0x7c7b7b7b,0x7c7c7c7c,0x7c7c7c7c,0x7c7c7c7c
  !dd 0x7d7d7d7c,0x7d7d7d7d,0x7d7d7d7d,0x7d7d7d7d,0x7e7e7e7e,0x7e7e7e7e,0x7e7e7e7e,0x7f7f7e7e
  !dd 0x7f7f7f7f,0x7f7f7f7f,0x7f7f7f7f,0x8080807f,0x80808080,0x80808080,0x80808080,0x81818181
  !dd 0x81818181,0x81818181,0x82818181,0x82828282,0x82828282,0x82828282,0x83838282,0x83838383
  !dd 0x83838383,0x83838383,0x84848383,0x84848484,0x84848484,0x84848484,0x85858584,0x85858585
  !dd 0x85858585,0x85858585,0x86868685,0x86868686,0x86868686,0x86868686,0x87878786,0x87878787
  !dd 0x87878787,0x87878787,0x88888887,0x88888888,0x88888888,0x88888888,0x89898988,0x89898989
  !dd 0x89898989,0x89898989,0x8a8a8a89,0x8a8a8a8a,0x8a8a8a8a,0x8a8a8a8a,0x8b8b8b8a,0x8b8b8b8b
  !dd 0x8b8b8b8b,0x8b8b8b8b,0x8c8c8b8b,0x8c8c8c8c,0x8c8c8c8c,0x8c8c8c8c,0x8d8c8c8c,0x8d8d8d8d
  !dd 0x8d8d8d8d,0x8d8d8d8d,0x8d8d8d8d,0x8e8e8e8e,0x8e8e8e8e,0x8e8e8e8e,0x8e8e8e8e,0x8f8f8f8e
  !dd 0x8f8f8f8f,0x8f8f8f8f,0x8f8f8f8f,0x90908f8f,0x90909090,0x90909090,0x90909090,0x91909090
  !dd 0x91919191,0x91919191,0x91919191,0x91919191,0x92929291,0x92929292,0x92929292,0x92929292
  !dd 0x93939292,0x93939393,0x93939393,0x93939393,0x93939393,0x94949494,0x94949494,0x94949494
  !dd 0x94949494,0x95959494,0x95959595,0x95959595,0x95959595,0x95959595,0x96969696,0x96969696
  !dd 0x96969696,0x96969696,0x97969696,0x97979797,0x97979797,0x97979797,0x97979797,0x98989897
  !dd 0x98989898,0x98989898,0x98989898,0x98989898,0x99999999,0x99999999,0x99999999,0x99999999
  !dd 0x9a9a9999,0x9a9a9a9a,0x9a9a9a9a,0x9a9a9a9a,0x9a9a9a9a,0x9b9b9b9a,0x9b9b9b9b,0x9b9b9b9b
  !dd 0x9b9b9b9b,0x9b9b9b9b,0x9c9c9c9c,0x9c9c9c9c,0x9c9c9c9c,0x9c9c9c9c,0x9c9c9c9c,0x9d9d9d9d
  !dd 0x9d9d9d9d,0x9d9d9d9d,0x9d9d9d9d,0x9e9d9d9d,0x9e9e9e9e,0x9e9e9e9e,0x9e9e9e9e,0x9e9e9e9e
  !dd 0x9f9f9e9e,0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f,0xa0a09f9f,0xa0a0a0a0,0xa0a0a0a0
  !dd 0xa0a0a0a0,0xa0a0a0a0,0xa1a1a0a0,0xa1a1a1a1,0xa1a1a1a1,0xa1a1a1a1,0xa1a1a1a1,0xa2a2a1a1
  !dd 0xa2a2a2a2,0xa2a2a2a2,0xa2a2a2a2,0xa2a2a2a2,0xa3a3a2a2,0xa3a3a3a3,0xa3a3a3a3,0xa3a3a3a3
  !dd 0xa3a3a3a3,0xa4a4a3a3,0xa4a4a4a4,0xa4a4a4a4,0xa4a4a4a4,0xa4a4a4a4,0xa5a4a4a4,0xa5a5a5a5
  !dd 0xa5a5a5a5,0xa5a5a5a5,0xa5a5a5a5,0xa5a5a5a5,0xa6a6a6a6,0xa6a6a6a6,0xa6a6a6a6,0xa6a6a6a6
  !dd 0xa6a6a6a6,0xa7a7a7a7,0xa7a7a7a7,0xa7a7a7a7,0xa7a7a7a7,0xa7a7a7a7,0xa8a8a8a7,0xa8a8a8a8
  !dd 0xa8a8a8a8,0xa8a8a8a8,0xa8a8a8a8,0xa9a8a8a8,0xa9a9a9a9,0xa9a9a9a9,0xa9a9a9a9,0xa9a9a9a9
  !dd 0xa9a9a9a9,0xaaaaaaaa,0xaaaaaaaa,0xaaaaaaaa,0xaaaaaaaa,0xaaaaaaaa,0xabababaa,0xabababab
  !dd 0xabababab,0xabababab,0xabababab,0xacababab,0xacacacac,0xacacacac,0xacacacac,0xacacacac
  !dd 0xacacacac,0xadadadac,0xadadadad,0xadadadad,0xadadadad,0xadadadad,0xaeadadad,0xaeaeaeae
  !dd 0xaeaeaeae,0xaeaeaeae,0xaeaeaeae,0xaeaeaeae,0xafafafae,0xafafafaf,0xafafafaf,0xafafafaf
  !dd 0xafafafaf,0xb0afafaf,0xb0b0b0b0,0xb0b0b0b0,0xb0b0b0b0,0xb0b0b0b0,0xb0b0b0b0,0xb1b1b0b0
  !dd 0xb1b1b1b1,0xb1b1b1b1,0xb1b1b1b1,0xb1b1b1b1,0xb1b1b1b1,0xb2b2b2b2,0xb2b2b2b2,0xb2b2b2b2
  !dd 0xb2b2b2b2,0xb2b2b2b2,0xb3b2b2b2,0xb3b3b3b3,0xb3b3b3b3,0xb3b3b3b3,0xb3b3b3b3,0xb3b3b3b3
  !dd 0xb4b4b3b3,0xb4b4b4b4,0xb4b4b4b4,0xb4b4b4b4,0xb4b4b4b4,0xb4b4b4b4,0xb5b5b5b4,0xb5b5b5b5
  !dd 0xb5b5b5b5,0xb5b5b5b5,0xb5b5b5b5,0xb5b5b5b5,0xb6b6b6b6,0xb6b6b6b6,0xb6b6b6b6,0xb6b6b6b6
  !dd 0xb6b6b6b6,0xb6b6b6b6,0xb7b7b7b7,0xb7b7b7b7,0xb7b7b7b7,0xb7b7b7b7,0xb7b7b7b7,0xb8b7b7b7
  !dd 0xb8b8b8b8,0xb8b8b8b8,0xb8b8b8b8,0xb8b8b8b8,0xb8b8b8b8,0xb9b8b8b8,0xb9b9b9b9,0xb9b9b9b9
  !dd 0xb9b9b9b9,0xb9b9b9b9,0xb9b9b9b9,0xbab9b9b9,0xbabababa,0xbabababa,0xbabababa,0xbabababa
  !dd 0xbabababa,0xbbbababa,0xbbbbbbbb,0xbbbbbbbb,0xbbbbbbbb,0xbbbbbbbb,0xbbbbbbbb,0xbbbbbbbb
  !dd 0xbcbcbcbc,0xbcbcbcbc,0xbcbcbcbc,0xbcbcbcbc,0xbcbcbcbc,0xbcbcbcbc,0xbdbdbdbd,0xbdbdbdbd
  !dd 0xbdbdbdbd,0xbdbdbdbd,0xbdbdbdbd,0xbdbdbdbd,0xbebebebd,0xbebebebe,0xbebebebe,0xbebebebe
  !dd 0xbebebebe,0xbebebebe,0xbfbfbebe,0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf
  !dd 0xc0c0bfbf,0xc0c0c0c0,0xc0c0c0c0,0xc0c0c0c0,0xc0c0c0c0,0xc0c0c0c0,0xc0c0c0c0,0xc1c1c1c1
  !dd 0xc1c1c1c1,0xc1c1c1c1,0xc1c1c1c1,0xc1c1c1c1,0xc1c1c1c1,0xc2c2c2c1,0xc2c2c2c2,0xc2c2c2c2
  !dd 0xc2c2c2c2,0xc2c2c2c2,0xc2c2c2c2,0xc3c3c2c2,0xc3c3c3c3,0xc3c3c3c3,0xc3c3c3c3,0xc3c3c3c3
  !dd 0xc3c3c3c3,0xc3c3c3c3,0xc4c4c4c4,0xc4c4c4c4,0xc4c4c4c4,0xc4c4c4c4,0xc4c4c4c4,0xc4c4c4c4
  !dd 0xc5c5c4c4,0xc5c5c5c5,0xc5c5c5c5,0xc5c5c5c5,0xc5c5c5c5,0xc5c5c5c5,0xc5c5c5c5,0xc6c6c6c6
  !dd 0xc6c6c6c6,0xc6c6c6c6,0xc6c6c6c6,0xc6c6c6c6,0xc6c6c6c6,0xc7c7c6c6,0xc7c7c7c7,0xc7c7c7c7
  !dd 0xc7c7c7c7,0xc7c7c7c7,0xc7c7c7c7,0xc7c7c7c7,0xc8c8c8c8,0xc8c8c8c8,0xc8c8c8c8,0xc8c8c8c8
  !dd 0xc8c8c8c8,0xc8c8c8c8,0xc9c8c8c8,0xc9c9c9c9,0xc9c9c9c9,0xc9c9c9c9,0xc9c9c9c9,0xc9c9c9c9
  !dd 0xc9c9c9c9,0xcacac9c9,0xcacacaca,0xcacacaca,0xcacacaca,0xcacacaca,0xcacacaca,0xcacacaca
  !dd 0xcbcbcbca,0xcbcbcbcb,0xcbcbcbcb,0xcbcbcbcb,0xcbcbcbcb,0xcbcbcbcb,0xcbcbcbcb,0xcccccccc
  !dd 0xcccccccc,0xcccccccc,0xcccccccc,0xcccccccc,0xcccccccc,0xcdcccccc,0xcdcdcdcd,0xcdcdcdcd
  !dd 0xcdcdcdcd,0xcdcdcdcd,0xcdcdcdcd,0xcdcdcdcd,0xcececdcd,0xcececece,0xcececece,0xcececece
  !dd 0xcececece,0xcececece,0xcececece,0xcfcfcece,0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf
  !dd 0xcfcfcfcf,0xcfcfcfcf,0xd0d0cfcf,0xd0d0d0d0,0xd0d0d0d0,0xd0d0d0d0,0xd0d0d0d0,0xd0d0d0d0
  !dd 0xd0d0d0d0,0xd1d1d1d0,0xd1d1d1d1,0xd1d1d1d1,0xd1d1d1d1,0xd1d1d1d1,0xd1d1d1d1,0xd1d1d1d1
  !dd 0xd2d2d1d1,0xd2d2d2d2,0xd2d2d2d2,0xd2d2d2d2,0xd2d2d2d2,0xd2d2d2d2,0xd2d2d2d2,0xd3d3d2d2
  !dd 0xd3d3d3d3,0xd3d3d3d3,0xd3d3d3d3,0xd3d3d3d3,0xd3d3d3d3,0xd3d3d3d3,0xd4d4d3d3,0xd4d4d4d4
  !dd 0xd4d4d4d4,0xd4d4d4d4,0xd4d4d4d4,0xd4d4d4d4,0xd4d4d4d4,0xd5d4d4d4,0xd5d5d5d5,0xd5d5d5d5
  !dd 0xd5d5d5d5,0xd5d5d5d5,0xd5d5d5d5,0xd5d5d5d5,0xd5d5d5d5,0xd6d6d6d6,0xd6d6d6d6,0xd6d6d6d6
  !dd 0xd6d6d6d6,0xd6d6d6d6,0xd6d6d6d6,0xd6d6d6d6,0xd7d7d7d6,0xd7d7d7d7,0xd7d7d7d7,0xd7d7d7d7
  !dd 0xd7d7d7d7,0xd7d7d7d7,0xd7d7d7d7,0xd8d8d7d7,0xd8d8d8d8,0xd8d8d8d8,0xd8d8d8d8,0xd8d8d8d8
  !dd 0xd8d8d8d8,0xd8d8d8d8,0xd9d8d8d8,0xd9d9d9d9,0xd9d9d9d9,0xd9d9d9d9,0xd9d9d9d9,0xd9d9d9d9
  !dd 0xd9d9d9d9,0xd9d9d9d9,0xdadadad9,0xdadadada,0xdadadada,0xdadadada,0xdadadada,0xdadadada
  !dd 0xdadadada,0xdbdbdada,0xdbdbdbdb,0xdbdbdbdb,0xdbdbdbdb,0xdbdbdbdb,0xdbdbdbdb,0xdbdbdbdb
  !dd 0xdbdbdbdb,0xdcdcdcdc,0xdcdcdcdc,0xdcdcdcdc,0xdcdcdcdc,0xdcdcdcdc,0xdcdcdcdc,0xdcdcdcdc
  !dd 0xdddddcdc,0xdddddddd,0xdddddddd,0xdddddddd,0xdddddddd,0xdddddddd,0xdddddddd,0xdddddddd
  !dd 0xdedededd,0xdededede,0xdededede,0xdededede,0xdededede,0xdededede,0xdededede,0xdfdedede
  !dd 0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf,0xe0e0dfdf
  !dd 0xe0e0e0e0,0xe0e0e0e0,0xe0e0e0e0,0xe0e0e0e0,0xe0e0e0e0,0xe0e0e0e0,0xe0e0e0e0,0xe1e1e1e1
  !dd 0xe1e1e1e1,0xe1e1e1e1,0xe1e1e1e1,0xe1e1e1e1,0xe1e1e1e1,0xe1e1e1e1,0xe2e1e1e1,0xe2e2e2e2
  !dd 0xe2e2e2e2,0xe2e2e2e2,0xe2e2e2e2,0xe2e2e2e2,0xe2e2e2e2,0xe2e2e2e2,0xe3e3e2e2,0xe3e3e3e3
  !dd 0xe3e3e3e3,0xe3e3e3e3,0xe3e3e3e3,0xe3e3e3e3,0xe3e3e3e3,0xe3e3e3e3,0xe4e4e3e3,0xe4e4e4e4
  !dd 0xe4e4e4e4,0xe4e4e4e4,0xe4e4e4e4,0xe4e4e4e4,0xe4e4e4e4,0xe4e4e4e4,0xe5e5e5e4,0xe5e5e5e5
  !dd 0xe5e5e5e5,0xe5e5e5e5,0xe5e5e5e5,0xe5e5e5e5,0xe5e5e5e5,0xe5e5e5e5,0xe6e6e6e5,0xe6e6e6e6
  !dd 0xe6e6e6e6,0xe6e6e6e6,0xe6e6e6e6,0xe6e6e6e6,0xe6e6e6e6,0xe6e6e6e6,0xe7e7e7e6,0xe7e7e7e7
  !dd 0xe7e7e7e7,0xe7e7e7e7,0xe7e7e7e7,0xe7e7e7e7,0xe7e7e7e7,0xe7e7e7e7,0xe8e8e8e7,0xe8e8e8e8
  !dd 0xe8e8e8e8,0xe8e8e8e8,0xe8e8e8e8,0xe8e8e8e8,0xe8e8e8e8,0xe8e8e8e8,0xe9e9e9e8,0xe9e9e9e9
  !dd 0xe9e9e9e9,0xe9e9e9e9,0xe9e9e9e9,0xe9e9e9e9,0xe9e9e9e9,0xe9e9e9e9,0xeaeae9e9,0xeaeaeaea
  !dd 0xeaeaeaea,0xeaeaeaea,0xeaeaeaea,0xeaeaeaea,0xeaeaeaea,0xeaeaeaea,0xebebeaea,0xebebebeb
  !dd 0xebebebeb,0xebebebeb,0xebebebeb,0xebebebeb,0xebebebeb,0xebebebeb,0xecebebeb,0xecececec
  !dd 0xecececec,0xecececec,0xecececec,0xecececec,0xecececec,0xecececec,0xecececec,0xedededed
  !dd 0xedededed,0xedededed,0xedededed,0xedededed,0xedededed,0xedededed,0xedededed,0xeeeeeeed
  !dd 0xeeeeeeee,0xeeeeeeee,0xeeeeeeee,0xeeeeeeee,0xeeeeeeee,0xeeeeeeee,0xeeeeeeee,0xefefeeee
  !dd 0xefefefef,0xefefefef,0xefefefef,0xefefefef,0xefefefef,0xefefefef,0xefefefef,0xefefefef
  !dd 0xf0f0f0f0,0xf0f0f0f0,0xf0f0f0f0,0xf0f0f0f0,0xf0f0f0f0,0xf0f0f0f0,0xf0f0f0f0,0xf0f0f0f0
  !dd 0xf1f1f0f0,0xf1f1f1f1,0xf1f1f1f1,0xf1f1f1f1,0xf1f1f1f1,0xf1f1f1f1,0xf1f1f1f1,0xf1f1f1f1
  !dd 0xf1f1f1f1,0xf2f2f2f2,0xf2f2f2f2,0xf2f2f2f2,0xf2f2f2f2,0xf2f2f2f2,0xf2f2f2f2,0xf2f2f2f2
  !dd 0xf2f2f2f2,0xf3f3f2f2,0xf3f3f3f3,0xf3f3f3f3,0xf3f3f3f3,0xf3f3f3f3,0xf3f3f3f3,0xf3f3f3f3
  !dd 0xf3f3f3f3,0xf3f3f3f3,0xf4f4f4f4,0xf4f4f4f4,0xf4f4f4f4,0xf4f4f4f4,0xf4f4f4f4,0xf4f4f4f4
  !dd 0xf4f4f4f4,0xf4f4f4f4,0xf5f5f4f4,0xf5f5f5f5,0xf5f5f5f5,0xf5f5f5f5,0xf5f5f5f5,0xf5f5f5f5
  !dd 0xf5f5f5f5,0xf5f5f5f5,0xf5f5f5f5,0xf6f6f6f5,0xf6f6f6f6,0xf6f6f6f6,0xf6f6f6f6,0xf6f6f6f6
  !dd 0xf6f6f6f6,0xf6f6f6f6,0xf6f6f6f6,0xf6f6f6f6,0xf7f7f7f7,0xf7f7f7f7,0xf7f7f7f7,0xf7f7f7f7
  !dd 0xf7f7f7f7,0xf7f7f7f7,0xf7f7f7f7,0xf7f7f7f7,0xf8f7f7f7,0xf8f8f8f8,0xf8f8f8f8,0xf8f8f8f8
  !dd 0xf8f8f8f8,0xf8f8f8f8,0xf8f8f8f8,0xf8f8f8f8,0xf8f8f8f8,0xf9f9f8f8,0xf9f9f9f9,0xf9f9f9f9
  !dd 0xf9f9f9f9,0xf9f9f9f9,0xf9f9f9f9,0xf9f9f9f9,0xf9f9f9f9,0xf9f9f9f9,0xfafafaf9,0xfafafafa
  !dd 0xfafafafa,0xfafafafa,0xfafafafa,0xfafafafa,0xfafafafa,0xfafafafa,0xfafafafa,0xfbfbfbfa
  !dd 0xfbfbfbfb,0xfbfbfbfb,0xfbfbfbfb,0xfbfbfbfb,0xfbfbfbfb,0xfbfbfbfb,0xfbfbfbfb,0xfbfbfbfb
  !dd 0xfcfcfcfb,0xfcfcfcfc,0xfcfcfcfc,0xfcfcfcfc,0xfcfcfcfc,0xfcfcfcfc,0xfcfcfcfc,0xfcfcfcfc
  !dd 0xfcfcfcfc,0xfdfdfdfc,0xfdfdfdfd,0xfdfdfdfd,0xfdfdfdfd,0xfdfdfdfd,0xfdfdfdfd,0xfdfdfdfd
  !dd 0xfdfdfdfd,0xfdfdfdfd,0xfefefefd,0xfefefefe,0xfefefefe,0xfefefefe,0xfefefefe,0xfefefefe
  !dd 0xfefefefe,0xfefefefe,0xfefefefe,0xfffffffe,0xffffffff,0xffffffff,0xffffffff,0xffffffff
EndProcedure

Mix two colors

Code: Select all

Procedure MixColors(c1, c2, mix); mix [0, 255]
  !movzx ecx, byte [p.v_mix]
  !mov eax, [p.v_c1]
  !bt ecx, 7
  !adc ecx, 0
  !jz mix_colors_l0
  !mov edx, eax
  !mov eax, [p.v_c2]
  !cmp ecx, 256
  !jz mix_colors_l0
  !and eax, 0x00ff00ff
  !imul eax, ecx
  !mov [p.v_mix], ecx
  !neg ecx
  !add ecx, 256
  !and edx, 0x00ff00ff
  !imul edx, ecx
  !lea eax, [eax + edx + 0x00800080]
  !and eax, 0xff00ff00
  !shr eax, 8
  !mov edx, [p.v_c1]
  !mov [p.v_c1], eax
  !shr edx, 8
  !and edx, 0x00ff00ff
  !imul edx, ecx
  !mov eax, [p.v_c2]
  !shr eax, 8
  !and eax, 0x00ff00ff
  !imul eax, [p.v_mix]
  !lea eax, [eax + edx + 0x00800080]
  !and eax, 0xff00ff00
  !or eax, [p.v_c1]
  !mix_colors_l0:
  ProcedureReturn 
EndProcedure

Mix two colors, SSE2 version

Code: Select all

Procedure MixColorsSSE2(c1, c2, mix); mix [0, 255]
  !movd xmm0, [p.v_c1]
  !movd xmm1, [p.v_c2]
  !movd xmm2, [p.v_mix]
  !punpcklbw xmm0, xmm0
  !punpcklbw xmm1, xmm1
  !punpcklbw xmm2, xmm2
  !pcmpeqw xmm3, xmm3
  !pshuflw xmm2, xmm2, 0
  !pxor xmm3, xmm2
  !pmulhuw xmm1, xmm2
  !pmulhuw xmm0, xmm3
  !paddw xmm0, xmm1
  !psrlw xmm0, 8
  !packuswb xmm0, xmm0
  !movd eax, xmm0
  ProcedureReturn
EndProcedure

White blend (remove alpha as if composited onto white background)

Code: Select all

Procedure WhiteBlend(Color.l)
  !mov eax, [p.v_Color]
  !xor eax, 0x00ffffff
  !mov ecx, eax
  !mov edx, eax
  !and eax, 0x00ff00ff
  !and ecx, 0x0000ff00
  !shr edx, 24
  !bt edx, 7
  !adc edx, 0
  !imul eax, edx
  !imul ecx, edx
  !and eax, 0xff00ff00
  !and ecx, 0x00ff0000
  !or eax, ecx
  !shr eax, 8  
  !not eax
  ProcedureReturn
EndProcedure
Last edited by wilbert on Mon Sep 19, 2016 12:42 pm, edited 10 times in total.
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
Crusiatus Black
Enthusiast
Enthusiast
Posts: 389
Joined: Mon May 12, 2008 1:25 pm
Location: The Netherlands
Contact:

Re: Hue calculation

Post by Crusiatus Black »

Thanks for sharing!
Image
Bas Groothedde,
Imagine Programming

I live in a philosophical paradoxal randome filled with enigma's!
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: Hue, luma and color mix procedures

Post by wilbert »

I added a procedure MixColors(c1, c2, mix) to my first post to mix two colors based on a mixing value (0-255).
It's fast and pretty accurate :)
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
Crusiatus Black
Enthusiast
Enthusiast
Posts: 389
Joined: Mon May 12, 2008 1:25 pm
Location: The Netherlands
Contact:

Re: Hue, luma and color mix procedures

Post by Crusiatus Black »

wilbert wrote:I added a procedure MixColors(c1, c2, mix) to my first post to mix two colors based on a mixing value (0-255).
It's fast and pretty accurate :)
Very valuable to me, thanks!
Image
Bas Groothedde,
Imagine Programming

I live in a philosophical paradoxal randome filled with enigma's!
Post Reply