Code : Tout sélectionner
360, 0.175560231756, 0.005293837011
361, 0.175482527710, 0.005286339106
362, 0.175400022357, 0.005278642043
363, 0.175317049459, 0.005270968794
364, 0.175236739464, 0.005263493923
365, 0.175161218506, 0.005256345915
366, 0.175087794161, 0.005246844528
367, 0.175014938868, 0.005235570329
368, 0.174945189439, 0.005226156911
369, 0.174880124779, 0.005220784940
370, 0.174820607680, 0.005220600938
371, 0.174770252214, 0.005228667217
372, 0.174722036674, 0.005237520177
373, 0.174665367951, 0.005236160663
374, 0.174595050266, 0.005218322253
375, 0.174509720869, 0.005181639770
376, 0.174409249352, 0.005126760898
377, 0.174308458224, 0.005067592520
378, 0.174221772058, 0.005017031536
379, 0.174155594353, 0.004981444911
380, 0.174112234426, 0.004963725981
381, 0.174088307167, 0.004963600065
382, 0.174072590902, 0.004972542618
383, 0.174057024293, 0.004982036139
384, 0.174036270610, 0.004985961429
385, 0.174007917516, 0.004980548623
386, 0.173971929755, 0.004964083096
387, 0.173931678596, 0.004943406649
388, 0.173889035777, 0.004926048511
389, 0.173845256167, 0.004916093071
390, 0.173800772621, 0.004915411905
391, 0.173754438047, 0.004924853695
392, 0.173705352749, 0.004937098371
393, 0.173655189400, 0.004943790983
394, 0.173606018217, 0.004939895271
395, 0.173559906527, 0.004923202577
396, 0.173514449742, 0.004895446713
397, 0.173468498200, 0.004864579139
398, 0.173423666226, 0.004836312122
399, 0.173379996017, 0.004813338324
400, 0.173336865481, 0.004796743447
401, 0.173291285659, 0.004785845648
402, 0.173237920453, 0.004778887932
403, 0.173174238776, 0.004775130800
404, 0.173101012209, 0.004774030674
405, 0.173020965455, 0.004775050362
406, 0.172934256851, 0.004781147172
407, 0.172842756135, 0.004790792949
408, 0.172751152603, 0.004798762099
409, 0.172662105581, 0.004802084356
410, 0.172576550849, 0.004799301920
411, 0.172489477382, 0.004795254364
412, 0.172395603384, 0.004796118589
413, 0.172296001755, 0.004802629473
414, 0.172192360362, 0.004814885214
415, 0.172086630755, 0.004832524218
416, 0.171982445938, 0.004855010169
417, 0.171871019446, 0.004888531922
418, 0.171741213706, 0.004939332457
419, 0.171587239365, 0.005010344207
420, 0.171407433863, 0.005102170974
421, 0.171206113462, 0.005211257777
422, 0.170992574222, 0.005333907762
423, 0.170770596368, 0.005470121247
424, 0.170540661924, 0.005620969933
425, 0.170300988780, 0.005788504996
426, 0.170050158668, 0.005973895108
427, 0.169785868751, 0.006176807488
428, 0.169504602532, 0.006398036907
429, 0.169202921712, 0.006638705918
430, 0.168877520671, 0.006900243888
431, 0.168524660344, 0.007184043888
432, 0.168146145462, 0.007490679666
433, 0.167746219827, 0.007820818488
434, 0.167328325745, 0.008175399675
435, 0.166895290352, 0.008555606361
436, 0.166446327135, 0.008964400418
437, 0.165976758231, 0.009401716227
438, 0.165483299011, 0.009864680972
439, 0.164962663720, 0.010350743541
440, 0.164411756375, 0.010857558277
441, 0.163828432762, 0.011384865616
442, 0.163209895954, 0.011937385815
443, 0.162552139507, 0.012520029918
444, 0.161851438065, 0.013137307095
445, 0.161104579580, 0.013793358822
446, 0.160309595019, 0.014491378166
447, 0.159465945758, 0.015232064644
448, 0.158573111076, 0.016015156416
449, 0.157631165578, 0.016839870972
450, 0.156640932577, 0.017704804991
451, 0.155605095583, 0.018608606524
452, 0.154524612495, 0.019555697805
453, 0.153397229336, 0.020553733530
454, 0.152219236228, 0.021611711021
455, 0.150985408376, 0.022740193292
456, 0.149690564759, 0.023950330196
457, 0.148336817068, 0.025247398432
458, 0.146928226501, 0.026635185858
459, 0.145468371779, 0.028118433330
460, 0.143960396040, 0.029702970297
461, 0.142405090190, 0.031393583986
462, 0.140795646665, 0.033213154606
463, 0.139120682427, 0.035200572827
464, 0.137363757935, 0.037403090444
465, 0.135502671200, 0.039879121472
466, 0.133509340956, 0.042692390011
467, 0.131370635236, 0.045875975223
468, 0.129085786557, 0.049449810660
469, 0.126662156977, 0.053425919773
470, 0.124118476728, 0.057802513374
471, 0.121468583913, 0.062587672067
472, 0.118701276452, 0.067830443532
473, 0.115807358768, 0.073580707973
474, 0.112776054848, 0.079895822896
475, 0.109594323616, 0.086842511183
476, 0.106260735318, 0.094486072204
477, 0.102775862947, 0.102863738818
478, 0.099127599902, 0.112007033037
479, 0.095304056215, 0.121944863255
480, 0.091293507002, 0.132702042487
481, 0.087082431727, 0.144316582680
482, 0.082679534482, 0.156865958077
483, 0.078115985733, 0.170420486477
484, 0.073437259905, 0.185031880527
485, 0.068705921291, 0.200723217728
486, 0.063993023687, 0.217467605405
487, 0.059315827981, 0.235253740241
488, 0.054666522876, 0.254095590747
489, 0.050031497058, 0.274001803220
490, 0.045390734675, 0.294975964606
491, 0.040757315336, 0.316981080840
492, 0.036195109154, 0.339899934414
493, 0.031756470379, 0.363597693246
494, 0.027494190535, 0.387921328281
495, 0.023459942547, 0.412703479094
496, 0.019704636303, 0.437755888652
497, 0.016268471267, 0.462954507989
498, 0.013183041153, 0.488207068412
499, 0.010475700683, 0.513404245160
500, 0.008168028005, 0.538423070512
501, 0.006284851573, 0.563068456322
502, 0.004875429993, 0.587116438045
503, 0.003982425352, 0.610447497639
504, 0.003636384225, 0.633011382751
505, 0.003858520900, 0.654823151125
506, 0.004645713233, 0.675898458599
507, 0.006010913072, 0.696120061336
508, 0.007988395829, 0.715341516256
509, 0.010603290554, 0.733412942652
510, 0.013870246085, 0.750186428039
511, 0.017766124206, 0.765612154434
512, 0.022244205695, 0.779629923201
513, 0.027273262420, 0.792103502831
514, 0.032820357522, 0.802925672990
515, 0.038851802403, 0.812016021362
516, 0.045327984829, 0.819390800456
517, 0.052176690905, 0.825163542583
518, 0.059325533352, 0.829425776297
519, 0.066715886027, 0.832273739284
520, 0.074302424773, 0.833803091340
521, 0.082053395236, 0.834090314505
522, 0.089941739585, 0.833288918896
523, 0.097939750111, 0.831592666499
524, 0.106021107332, 0.829178186631
525, 0.114160719607, 0.826206959781
526, 0.122347367034, 0.822770399564
527, 0.130545668138, 0.818927852909
528, 0.138702349214, 0.814774382595
529, 0.146773215738, 0.810394606548
530, 0.154722061216, 0.805863545426
531, 0.162535424655, 0.801238480414
532, 0.170237195479, 0.796518542245
533, 0.177849528012, 0.791686579060
534, 0.185390757399, 0.786727772821
535, 0.192876097878, 0.781629216363
536, 0.200308798145, 0.776399416051
537, 0.207689989667, 0.771054798660
538, 0.215029550006, 0.765595096061
539, 0.222336603758, 0.760019999741
540, 0.229619672650, 0.754329089903
541, 0.236884720598, 0.748524465175
542, 0.244132556474, 0.742613991681
543, 0.251363408871, 0.736605581362
544, 0.258577508455, 0.730506601910
545, 0.265775084971, 0.724323924930
546, 0.272957603511, 0.718062186417
547, 0.280128942482, 0.711724734569
548, 0.287292409080, 0.705316273888
549, 0.294450280894, 0.698842022022
550, 0.301603799396, 0.692307762372
551, 0.308759923093, 0.685712060607
552, 0.315914394449, 0.679063479991
553, 0.323066265382, 0.672367397969
554, 0.330215545357, 0.665628025417
555, 0.337363332851, 0.658848290140
556, 0.344513198355, 0.652028209218
557, 0.351664411297, 0.645172174245
558, 0.358813686684, 0.638287336538
559, 0.365959357349, 0.631379080900
560, 0.373101543868, 0.624450859797
561, 0.380243835464, 0.617502152174
562, 0.387378977959, 0.610541802455
563, 0.394506548797, 0.603571336792
564, 0.401625918831, 0.596592421963
565, 0.408736255706, 0.589606868860
566, 0.415835774706, 0.582617968057
567, 0.422920926710, 0.575630688323
568, 0.429988626512, 0.568648891271
569, 0.437036422594, 0.561675774049
570, 0.444062463582, 0.554713902809
571, 0.451064940951, 0.547766044129
572, 0.458040665647, 0.540836629164
573, 0.464986332978, 0.533930053057
574, 0.471898743900, 0.527050569219
575, 0.478774791158, 0.520202307211
576, 0.485611587052, 0.513388660962
577, 0.492404982334, 0.506614924421
578, 0.499150668334, 0.499887340438
579, 0.505845283794, 0.493211178108
580, 0.512486366782, 0.486590788061
581, 0.519072510401, 0.480028612176
582, 0.525600488985, 0.473527373976
583, 0.532065599161, 0.467091363704
584, 0.538462761903, 0.460725253841
585, 0.544786505595, 0.454434114569
586, 0.551031050212, 0.448224502910
587, 0.557192906096, 0.442099139484
588, 0.563269312373, 0.436058061737
589, 0.569256824125, 0.430101973605
590, 0.575151311365, 0.424232234925
591, 0.580952605161, 0.418446879817
592, 0.586650186891, 0.412758421192
593, 0.592224800071, 0.407189528585
594, 0.597658162105, 0.401761934972
595, 0.602932785576, 0.396496633573
596, 0.608035111132, 0.391409151708
597, 0.612976999571, 0.386486157332
598, 0.617778725585, 0.381705756829
599, 0.622459295079, 0.377047286381
600, 0.627036599764, 0.372491145218
601, 0.631520942860, 0.368026010822
602, 0.635899819576, 0.363665402433
603, 0.640156159548, 0.359427724304
604, 0.644272960657, 0.355331369772
605, 0.648233106014, 0.351394916305
606, 0.652028235718, 0.347627960748
607, 0.655669179250, 0.344018294844
608, 0.659166134693, 0.340553225412
609, 0.662528222054, 0.337220992607
610, 0.665763576238, 0.334010651155
611, 0.668874143664, 0.330918553002
612, 0.671858667148, 0.327947074300
613, 0.674719511112, 0.325095182004
614, 0.677458888275, 0.322362076689
615, 0.680078849722, 0.319747217069
616, 0.682581574187, 0.317248705962
617, 0.684970601449, 0.314862815015
618, 0.687250454557, 0.312585963996
619, 0.689426303028, 0.310414011286
620, 0.691503972962, 0.308342260557
621, 0.693489634973, 0.306365690818
622, 0.695388638102, 0.304478555200
623, 0.697205569779, 0.302675072704
624, 0.698943910386, 0.300950424979
625, 0.700606060606, 0.299300699301
626, 0.702192588541, 0.297724511863
627, 0.703708691019, 0.296217118054
628, 0.705162853424, 0.294770292086
629, 0.706563246694, 0.293376153173
630, 0.707917791622, 0.292027108935
631, 0.709230985414, 0.290718622165
632, 0.710500394495, 0.289452941203
633, 0.711724146175, 0.288232104799
634, 0.712901231130, 0.287057320364
635, 0.714031597117, 0.285928873546
636, 0.715117053483, 0.284845106129
637, 0.716159198599, 0.283804449182
638, 0.717158613642, 0.282806411931
639, 0.718116142602, 0.281850256563
640, 0.719032941630, 0.280934951519
641, 0.719911552942, 0.280058078207
642, 0.720752706640, 0.279218959823
643, 0.721554522487, 0.278419514685
644, 0.722314915560, 0.277661870368
645, 0.723031602573, 0.276948357748
646, 0.723701916040, 0.276281836244
647, 0.724328018926, 0.275660074921
648, 0.724914405134, 0.275078184055
649, 0.725466776098, 0.274529977978
650, 0.725992317542, 0.274007682458
651, 0.726494726714, 0.273505273286
652, 0.726974970469, 0.273025029531
653, 0.727431838038, 0.272568161962
654, 0.727864310793, 0.272135689207
655, 0.728271728272, 0.271728271728
656, 0.728656487100, 0.271343512900
657, 0.729020030309, 0.270979969691
658, 0.729360950695, 0.270639049305
659, 0.729677783238, 0.270322216762
660, 0.729969012838, 0.270030987162
661, 0.730233949141, 0.269766050859
662, 0.730474165302, 0.269525834698
663, 0.730693306724, 0.269306693276
664, 0.730896252243, 0.269103747757
665, 0.731089395585, 0.268910604415
666, 0.731279635919, 0.268720364081
667, 0.731467050901, 0.268532949099
668, 0.731649970922, 0.268350029078
669, 0.731826333485, 0.268173666515
670, 0.731993299832, 0.268006700168
671, 0.732150422162, 0.267849577838
672, 0.732299831085, 0.267700168915
673, 0.732442822871, 0.267557177129
674, 0.732581493590, 0.267418506410
675, 0.732718894009, 0.267281105991
676, 0.732858647268, 0.267141352732
677, 0.733000205253, 0.266999794747
678, 0.733141671137, 0.266858328863
679, 0.733281178935, 0.266718821065
680, 0.733416967226, 0.266583032774
681, 0.733550585848, 0.266449414152
682, 0.733683296436, 0.266316703564
683, 0.733812716688, 0.266187283312
684, 0.733935690314, 0.266064309686
685, 0.734047300312, 0.265952699688
686, 0.734142556897, 0.265857443103
687, 0.734221470251, 0.265778529749
688, 0.734286446367, 0.265713553633
689, 0.734340919959, 0.265659080041
690, 0.734390164995, 0.265609835005
691, 0.734437712656, 0.265562287344
692, 0.734482170411, 0.265517829589
693, 0.734522930552, 0.265477069448
694, 0.734559518422, 0.265440481578
695, 0.734591661643, 0.265408338357
696, 0.734621094713, 0.265378905287
697, 0.734648896836, 0.265351103164
698, 0.734673378011, 0.265326621989
699, 0.734690045444, 0.265309954556
700, 0.734690023258, 0.265309976742
701, 0.734689987139, 0.265310012861
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <WinAPIFiles.au3>
; --- Lecture des coordonnées chromatiques x,y du spectrum locus ---
; 1. Définition du chemin local
Local $sFileName = "CIExy1931.txt"
Local $sFilePath = @ScriptDir & "\" & $sFileName
; 2. Lecture du contenu du fichier ciexyz31.txt
Local $sRawText = FileRead($sFilePath)
If @error Or $sRawText = "" Then
Exit MsgBox(16, "Erreur", "Impossible de lire le fichier : " & $sFileName & @CRLF & "Vérifiez qu'il est bien dans le même dossier que ce script.")
EndIf
; 3. On découpe sur les sauts de ligne
Local $aLines = StringSplit($sRawText, @LF)
; 4. Initialisation du tableau Global
Global $aSpec[$aLines[0]][3]
; 5. Remplissage du tableau via Expression Régulière
For $i = 1 To $aLines[0]
; \S+ capture tout ce qui n'est pas un espace (les nombres)
Local $aColumns = StringRegExp($aLines[$i], "(\S+)", 3)
If UBound($aColumns) >= 3 Then
$aSpec[$i-1][0] = Number($aColumns[0]) ; Longueur d'onde
$aSpec[$i-1][1] = Number($aColumns[1]) ; x
$aSpec[$i-1][2] = Number($aColumns[2]) ; y
EndIf
Next
; --- CONFIGURATION DES ESPACES ---
Global $aData[4][6] = [ _
[0.64, 0.33, 0.30, 0.60, 0.15, 0.06], _ ; sRGB / BT709
[0.64, 0.33, 0.21, 0.71, 0.15, 0.06], _ ; Adobe RGB
[0.680, 0.320, 0.265, 0.690, 0.150, 0.060], _ ; Display P3-D65
[0.708, 0.292, 0.170, 0.797, 0.131, 0.046] _ ; BT2020
]
; --- NAVIGATION ---
Global $fZoom = 1.0
Global $iOffX = 0
Global $iOffY = 0
Global $iLastIdx = 0
Global $bIsDragging = False
Global $aPrevMouse
; --- INTERFACE ---
Global $iW = 600
Global $iH = 780
Global $hGUI = GUICreate("CIE 1931 - Technical Reference", $iW, $iH)
GUISetBkColor(0x151515)
Global $hCombo = GUICtrlCreateCombo("sRGB (BT 709)", 10, 660, 200, 30)
GUICtrlSetData(-1, "Adobe RGB (1998)|Display P3-D65|BT 2020")
Global $hStatus = GUICtrlCreateLabel("x = 0.0000, y = 0.0000", 220, 665, 200, 20)
GUICtrlSetColor(-1, 0x00FF00)
Global $hBtnSave = GUICtrlCreateButton("Exporter PNG", 430, 660, 150, 25)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
Global $hGraphicGUI = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, 650)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
Global $iMargin = 60
Global $iSize = 480
Global $fMax = 0.9
; --- DONNÉES SPECTRALES ---
GUIRegisterMsg(0x020A, "WM_MOUSEWHEEL")
_Render(0)
While 1
Local $nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_Cleanup()
Exit
Case $hCombo
$iLastIdx = _GetComboIndex(GUICtrlRead($hCombo))
_Render($iLastIdx)
Case $GUI_EVENT_SECONDARYDOWN
$fZoom = 1.0
$iOffX = 0
$iOffY = 0
_Render($iLastIdx)
Case $hBtnSave
_Save()
EndSwitch
Local $aMouse = GUIGetCursorInfo($hGUI)
If IsArray($aMouse) Then
If $aMouse[2] = 1 Then
If $bIsDragging = False Then
$bIsDragging = True
$aPrevMouse = $aMouse
Else
$iOffX = $iOffX + ($aMouse[0] - $aPrevMouse[0])
$iOffY = $iOffY + ($aMouse[1] - $aPrevMouse[1])
$aPrevMouse = $aMouse
_Render($iLastIdx)
EndIf
Else
$bIsDragging = False
EndIf
Local $fDenom = $iSize * $fZoom
Local $fx = (($aMouse[0] - $iMargin - $iOffX) / $fDenom) * $fMax
Local $fy = ($iMargin + $iSize + $iOffY - $aMouse[1]) / $fDenom * $fMax
If $aMouse[1] < 650 Then
GUICtrlSetData($hStatus, StringFormat("x = %.4f, y = %.4f", $fx, $fy))
EndIf
EndIf
_Update()
Sleep(10)
WEnd
Func _Render($idx)
_GDIPlus_GraphicsClear($hBuffer, 0xFF151515)
Local $hBrushLabels = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
Local $hFamily = _GDIPlus_FontFamilyCreate("Arial")
Local $hFont = _GDIPlus_FontCreate($hFamily, 9, 1)
Local $hFontSmall = _GDIPlus_FontCreate($hFamily, 8, 0)
Local $hFontTitle = _GDIPlus_FontCreate($hFamily, 11, 1)
Local $hFormat = _GDIPlus_StringFormatCreate()
; --- RECTANGLE DES PRIMAIRES (HAUT DROITE) ---
Local $hPenRect = _GDIPlus_PenCreate(0xFF444444, 1)
_GDIPlus_GraphicsDrawRect($hBuffer, $iW - 180, 20, 160, 60, $hPenRect)
_GDIPlus_StringFormatSetAlign($hFormat, 0)
Local $tRectInfo = _GDIPlus_RectFCreate($iW - 170, 25, 150, 90)
Local $sInfo = "Gamut: " & GUICtrlRead($hCombo) & @CRLF & _
"R: " & $aData[$idx][0] & " , " & $aData[$idx][1] & @CRLF & _
"G: " & $aData[$idx][2] & " , " & $aData[$idx][3] & @CRLF & _
"B: " & $aData[$idx][4] & " , " & $aData[$idx][5]
_GDIPlus_GraphicsDrawStringEx($hBuffer, $sInfo, $hFontSmall, $tRectInfo, $hFormat, $hBrushLabels)
; Grille
Local $hPenGrid = _GDIPlus_PenCreate(0xFF333333, 1)
For $i = 0 To 8
Local $v = $i / 10
_GDIPlus_GraphicsDrawLine($hBuffer, _ToPx($v), _ToPy(0), _ToPx($v), _ToPy(0.9), $hPenGrid)
_GDIPlus_GraphicsDrawLine($hBuffer, _ToPx(0), _ToPy($v), _ToPx(0.9), _ToPy($v), $hPenGrid)
Next
; Fer à cheval
Local $iMax = UBound($aSpec) - 1
For $i = 0 To $iMax - 1
Local $wl = $aSpec[$i][0]
Local $f_x = $aSpec[$i][1] ; On récupère x réel (entre 0 et 1)
Local $f_y = $aSpec[$i][2] ; On récupère y réel (entre 0 et 1)
Local $x1 = _ToPx($f_x)
Local $y1 = _ToPy($f_y)
Local $x2 = _ToPx($aSpec[$i+1][1])
Local $y2 = _ToPy($aSpec[$i+1][2])
Local $hP = _GDIPlus_PenCreate(GetColorFromXY($f_x, $f_y), 2)
_GDIPlus_GraphicsDrawLine($hBuffer, $x1, $y1, $x2, $y2, $hP)
_GDIPlus_PenDispose($hP)
; --- Détection du marqueur ---
Local $bShowMarker = False
If Mod($wl, 20) = 0 And $wl >= 460 And $wl <= 640 Then $bShowMarker = True
If $wl = 520 Or $wl = 380 Or $wl = 700 Then $bShowMarker = True
If $bShowMarker Then
; 1. Calcul du vecteur tangent et de la normale (longueur 8 px)
Local $fVX = $x2 - $x1
Local $fVY = $y2 - $y1
Local $fLen = Sqrt($fVX^2 + $fVY^2)
If $fLen = 0 Then $fLen = 1
; Vecteur perpendiculaire pointant vers l'extérieur
Local $fNX = (-$fVY / $fLen) * 8
Local $fNY = ($fVX / $fLen) * 8
; 2. Dessin du petit trait en BLANC
Local $hPenTick = _GDIPlus_PenCreate(0xFFFFFFFF, 1.5) ; Blanc pur (Alpha FF + RRGGBB)
_GDIPlus_GraphicsDrawLine($hBuffer, $x1, $y1, $x1 + $fNX, $y1 + $fNY, $hPenTick)
_GDIPlus_PenDispose($hPenTick)
; 3. Positionnement du texte
Local $fDX = -15, $fDY = -28
If $wl = 380 Then
$fDX = -55
$fDY = 0
ElseIf $wl < 520 Then
$fDX = -58
$fDY = -7
ElseIf $wl = 520 Then
$fDX = -15
$fDY = -25
ElseIf $wl > 690 Then
$fDX = -5
$fDY = 10
ElseIf $wl > 520 Then
$fDX = 12
$fDY = -15
EndIf
; Création du rectangle de texte légèrement décalé par la normale
Local $tRect = _GDIPlus_RectFCreate($x1 + $fDX + ($fNX * 0.4), $y1 + $fDY + ($fNY * 0.4), 65, 20)
_GDIPlus_GraphicsDrawStringEx($hBuffer, String(Int($wl)) & " nm", $hFont, $tRect, $hFormat, $hBrushLabels)
EndIf
Next
; 1. Récupération des couleurs réelles aux extrémités du tableau
Local $iColRed = GetColorFromXY($aSpec[$iMax][1], $aSpec[$iMax][2]) ; Couleur à 700nm
Local $iColViolet = GetColorFromXY($aSpec[0][1], $aSpec[0][2]) ; Couleur à 360nm
; --- Tracé de la Ligne des Pourpres ---
; On crée un pinceau dégradé qui va du point final au point initial
Local $hLineBrush = _GDIPlus_LineBrushCreate(_ToPx($aSpec[$iMax][1]), _ToPy($aSpec[$iMax][2]), _ToPx($aSpec[0][1]), _ToPy($aSpec[0][2]), $iColRed, $iColViolet)
Local $hPenP = _GDIPlus_PenCreate(0xFF000000, 2) ; Crée un pen temporaire
_GDIPlus_PenSetCustomEndCap($hPenP, 0) ; Juste pour s'assurer du style
; Pour dessiner une ligne avec un dégradé en GDI+, on utilise le Brush directement avec un Pen
Local $hPenGradient = _GDIPlus_PenCreate(0xFF000000, 2)
DllCall($__g_hGDIPDll, "int", "GdipSetPenBrushFill", "handle", $hPenGradient, "handle", $hLineBrush)
_GDIPlus_GraphicsDrawLine($hBuffer, _ToPx($aSpec[$iMax][1]), _ToPy($aSpec[$iMax][2]), _ToPx($aSpec[0][1]), _ToPy($aSpec[0][2]), $hPenGradient)
; --- Légende ligne des pourpres (bas gauche) ---
Local $tRectPurple = _GDIPlus_RectFCreate(70, 600, 150, 20)
; On crée un dégradé horizontal pour la légende (Violet vers Rouge pour suivre le sens de lecture)
Local $hBrushLegend = _GDIPlus_LineBrushCreate(70, 600, 220, 600, $iColViolet, $iColRed)
_GDIPlus_GraphicsDrawStringEx($hBuffer, "--- Ligne des Pourpres", $hFontSmall, $tRectPurple, $hFormat, $hBrushLegend)
; Dessin du Gamut
Local $hPenG = _GDIPlus_PenCreate(0xFFFFFFFF, 2)
Local $aPoly[4][2] = [[3,0],[_ToPx($aData[$idx][0]),_ToPy($aData[$idx][1])],[_ToPx($aData[$idx][2]),_ToPy($aData[$idx][3])],[_ToPx($aData[$idx][4]),_ToPy($aData[$idx][5])]]
_GDIPlus_GraphicsDrawPolygon($hBuffer, $aPoly, $hPenG)
; Point blanc D65
Local $iPX = _ToPx(0.3127)
Local $iPY = _ToPy(0.3290)
_GDIPlus_GraphicsFillEllipse($hBuffer, $iPX - 4, $iPY - 4, 8, 8, $hBrushLabels)
Local $tRectD65 = _GDIPlus_RectFCreate($iPX + 10, $iPY - 10, 40, 20)
_GDIPlus_GraphicsDrawStringEx($hBuffer, "D65", $hFont, $tRectD65, $hFormat, $hBrushLabels)
; Lieu planckien (à faire)
; --- Nettoyage ---
_GDIPlus_PenDispose($hPenGrid)
_GDIPlus_PenDispose($hPenP)
_GDIPlus_PenDispose($hPenG)
_GDIPlus_PenDispose($hPenRect)
_GDIPlus_PenDispose($hPenGradient)
_GDIPlus_BrushDispose($hBrushLabels)
_GDIPlus_BrushDispose($hLineBrush)
_GDIPlus_BrushDispose($hBrushLegend)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontDispose($hFontSmall)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
EndFunc
Func _ToPx($v)
Return $iMargin + $iOffX + ($v / $fMax * $iSize * $fZoom)
EndFunc
Func _ToPy($v)
Return $iMargin + $iOffY + ($iSize * $fZoom) - ($v / $fMax * $iSize * $fZoom)
EndFunc
Func WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
Local $iDelta = BitShift($wParam, 16)
If $iDelta > 0 Then
$fZoom = $fZoom * 1.1
Else
$fZoom = $fZoom * 0.9
EndIf
If $fZoom < 0.5 Then
$fZoom = 0.5
EndIf
_Render($iLastIdx)
Return $GUI_RUNDEFMSG
EndFunc
Func GetColorFromXY($fInX, $fInY)
; 1. Reconstruction XYZ
Local $fOutY = 1.0 ; Luminance fixée au max
Local $fOutX = 0, $fOutZ = 0
If $fInY > 0 Then
$fOutX = ($fInX * $fOutY) / $fInY
$fOutZ = ((1 - $fInX - $fInY) * $fOutY) / $fInY
EndIf
; 2. Conversion XYZ vers sRGB (Matrice D65)
Local $fRed = $fOutX * 3.2406 + $fOutY * -1.5372 + $fOutZ * -0.4986
Local $fGreen = $fOutX * -0.9689 + $fOutY * 1.8758 + $fOutZ * 0.0415
Local $fBlue = $fOutX * 0.0557 + $fOutY * -0.2040 + $fOutZ * 1.0570
; 3. Normalisation et gestion du Gamut
; On ramène le minimum à 0 (désaturation)
Local $fMin = $fRed
If $fGreen < $fMin Then $fMin = $fGreen
If $fBlue < $fMin Then $fMin = $fBlue
If $fMin < 0 Then
$fRed -= $fMin
$fGreen -= $fMin
$fBlue -= $fMin
EndIf
; On ramène le maximum à 1.0 (luminosité)
Local $fMax = $fRed
If $fGreen > $fMax Then $fMax = $fGreen
If $fBlue > $fMax Then $fMax = $fBlue
If $fMax > 0 Then
$fRed /= $fMax
$fGreen /= $fMax
$fBlue /= $fMax
EndIf
; 4. Correction Gamma sRGB et passage en 8-bit
Local $aRGB[3] = [$fRed, $fGreen, $fBlue]
For $j = 0 To 2
If $aRGB[$j] > 0.0031308 Then
$aRGB[$j] = 1.055 * ($aRGB[$j] ^ (1/2.4)) - 0.055
Else
$aRGB[$j] = 12.92 * $aRGB[$j]
EndIf
$aRGB[$j] = Int($aRGB[$j] * 255)
If $aRGB[$j] < 0 Then $aRGB[$j] = 0
If $aRGB[$j] > 255 Then $aRGB[$j] = 255
Next
; Retourne 0xAARRGGBB
Return BitOR(0xFF000000, BitShift($aRGB[0], -16), BitShift($aRGB[1], -8), $aRGB[2])
EndFunc
Func _GetComboIndex($txt)
If StringInStr($txt, "sRGB") Then Return 0
If StringInStr($txt, "Adobe") Then Return 1
If StringInStr($txt, "Display") Then Return 2
Return 3
EndFunc
Func _Update()
_GDIPlus_GraphicsDrawImage($hGraphicGUI, $hBitmap, 0, 0)
EndFunc
Func _Save()
Local $sFile = FileSaveDialog("Enregistrer", @ScriptDir, "Images (*.png)", 16, "CIE_Export.png")
If Not @error Then
_GDIPlus_ImageSaveToFile($hBitmap, $sFile)
EndIf
EndFunc
Func _Cleanup()
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphicGUI)
_GDIPlus_Shutdown()
EndFunc