@@ -106,10 +106,19 @@ function updateBaselineDropdown() {
106106 var $baseline = $ ( "#baseline" ) ;
107107 var current = $baseline . val ( ) ;
108108 $baseline . find ( "option:not([value='none'])" ) . remove ( ) ;
109+ var enviros = readCheckbox ( "input[name='environments']:checked" ) . split ( "," ) . filter ( Boolean ) ;
110+ var multiEnv = enviros . length > 1 ;
109111 $ ( "input[name='executables']:checked" ) . each ( function ( ) {
110112 var key = $ ( this ) . val ( ) ;
111113 var name = $ ( this ) . next ( 'label' ) . text ( ) . trim ( ) ;
112- $baseline . append ( $ ( '<option>' ) . val ( key ) . text ( name ) ) ;
114+ if ( multiEnv ) {
115+ enviros . forEach ( function ( envId ) {
116+ var envName = $ ( "label[for='env_" + envId + "']" ) . text ( ) . trim ( ) ;
117+ $baseline . append ( $ ( '<option>' ) . val ( key + ':' + envId ) . text ( name + ' @ ' + envName ) ) ;
118+ } ) ;
119+ } else {
120+ $baseline . append ( $ ( '<option>' ) . val ( key ) . text ( name ) ) ;
121+ }
113122 } ) ;
114123 if ( $baseline . find ( "option[value='" + current + "']" ) . length ) {
115124 $baseline . val ( current ) ;
@@ -135,7 +144,21 @@ function loadData() {
135144}
136145
137146function renderComparisonPlot ( plotid , unit , benchmarks , exes , enviros , baseline , chart , horizontal ) {
138- var baselineLabel = baseline !== "none" ? $ ( "label[for='exe_" + baseline + "']" ) . text ( ) . trim ( ) : "" ;
147+ // baseline may be "exe_key" or "exe_key:env_id" (for cross-env normalization)
148+ var baselineExe = baseline , baselineEnv = null ;
149+ if ( baseline !== "none" && baseline . indexOf ( ':' ) !== - 1 ) {
150+ var bparts = baseline . split ( ':' ) ;
151+ baselineExe = bparts [ 0 ] ;
152+ baselineEnv = bparts [ 1 ] ;
153+ }
154+
155+ var baselineLabel = "" ;
156+ if ( baseline !== "none" ) {
157+ baselineLabel = $ ( "label[for='exe_" + baselineExe + "']" ) . text ( ) . trim ( ) ;
158+ if ( baselineEnv !== null ) {
159+ baselineLabel += ' @ ' + $ ( "label[for='env_" + baselineEnv + "']" ) . text ( ) . trim ( ) ;
160+ }
161+ }
139162
140163 var title ;
141164 if ( baseline === "none" ) {
@@ -164,15 +187,17 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
164187 for ( var i = 0 ; i < exes . length ; i ++ ) {
165188 for ( var j = 0 ; j < enviros . length ; j ++ ) {
166189 var exeLabel = $ ( "label[for='exe_" + exes [ i ] + "']" ) . text ( ) . trim ( ) ;
167- if ( chart === "relative bars" && exes [ i ] === baseline ) { continue ; }
190+ if ( chart === "relative bars" && exes [ i ] === baselineExe &&
191+ ( baselineEnv === null || baselineEnv === enviros [ j ] ) ) { continue ; }
168192 var data = [ ] ;
169193 for ( var b = 0 ; b < benchmarks . length ; b ++ ) {
170194 var val = compdata [ exes [ i ] ] && compdata [ exes [ i ] ] [ enviros [ j ] ]
171195 ? compdata [ exes [ i ] ] [ enviros [ j ] ] [ benchmarks [ b ] ]
172196 : null ;
173197 if ( val !== null && baseline !== "none" ) {
174- var baseval = compdata [ baseline ] && compdata [ baseline ] [ enviros [ j ] ]
175- ? compdata [ baseline ] [ enviros [ j ] ] [ benchmarks [ b ] ]
198+ var envForBase = baselineEnv !== null ? baselineEnv : enviros [ j ] ;
199+ var baseval = compdata [ baselineExe ] && compdata [ baselineExe ] [ envForBase ]
200+ ? compdata [ baselineExe ] [ envForBase ] [ benchmarks [ b ] ]
176201 : null ;
177202 val = ( baseval === null || baseval === 0 ) ? null : val / baseval ;
178203 }
@@ -205,8 +230,9 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
205230 ? compdata [ exes [ i ] ] [ enviros [ j ] ] [ benchmarks [ b ] ]
206231 : null ;
207232 if ( val !== null && baseline !== "none" ) {
208- var baseval = compdata [ baseline ] && compdata [ baseline ] [ enviros [ j ] ]
209- ? compdata [ baseline ] [ enviros [ j ] ] [ benchmarks [ b ] ]
233+ var envForBase = baselineEnv !== null ? baselineEnv : enviros [ j ] ;
234+ var baseval = compdata [ baselineExe ] && compdata [ baselineExe ] [ envForBase ]
235+ ? compdata [ baselineExe ] [ envForBase ] [ benchmarks [ b ] ]
210236 : null ;
211237 val = ( baseval === null || baseval === 0 ) ? null : val / baseval ;
212238 }
@@ -220,6 +246,11 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
220246
221247 if ( datasets . length === 0 ) { return ; }
222248
249+ // Mark datasets where all values are null (baseline has no data for that env)
250+ datasets . forEach ( function ( ds ) {
251+ ds . allNull = ds . data . every ( function ( v ) { return v === null ; } ) ;
252+ } ) ;
253+
223254 // Size the container
224255 var wrapWidth = $ ( "#plotwrapper" ) . width ( ) ;
225256 var h = horizontal
@@ -263,7 +294,19 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
263294 font : { size : FONT_SIZE } ,
264295 boxWidth : 20 ,
265296 boxHeight : FONT_SIZE ,
266- padding : 8
297+ padding : 8 ,
298+ generateLabels : function ( chart ) {
299+ var items = Chart . defaults . plugins . legend . labels . generateLabels ( chart ) ;
300+ items . forEach ( function ( item ) {
301+ var ds = chart . data . datasets [ item . datasetIndex ] ;
302+ if ( ds && ds . allNull ) {
303+ // Apply unicode combining strikethrough to each character
304+ item . text = item . text . split ( '' ) . join ( '\u0336' ) + '\u0336' ;
305+ item . fontColor = '#aaa' ;
306+ }
307+ } ) ;
308+ return items ;
309+ }
267310 }
268311 }
269312 } ,
@@ -314,7 +357,11 @@ function init(defaults) {
314357 $ ( "#benchmark .checkall, #benchmark .uncheckall" ) . click ( loadData ) ;
315358
316359 // Re-render without re-fetching for other controls
317- $ ( "#chart_type, #baseline, #direction, input[name='environments']" ) . change ( refreshContent ) ;
360+ $ ( "#chart_type, #baseline, #direction" ) . change ( refreshContent ) ;
361+ $ ( "input[name='environments']" ) . change ( function ( ) {
362+ updateBaselineDropdown ( ) ;
363+ refreshContent ( ) ;
364+ } ) ;
318365
319366 $ . ajaxSetup ( {
320367 cache : false
0 commit comments