1 /*
2  * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package sun.awt.X11;
27 
28 import java.awt.*;
29 import java.io.*;
30 import sun.security.action.GetPropertyAction;
31 import java.security.AccessController;
32 import sun.awt.OSInfo;
33 
34 /**
35   *
36   *  This class contains code that is need to mimic the
37   *  Motif Color selection and color defaults code.
38   *
39   *  Portions of this code have been ported to java from
40   *  Motif sources (Color.c) (ColorP.h) etc.
41   *
42   *  Author: Bino George
43   *
44   */
45 
46 class MotifColorUtilities {
47 
48 
49     static final float XmRED_LUMINOSITY=0.30f;
50     static final float XmGREEN_LUMINOSITY=0.59f;
51     static final float XmBLUE_LUMINOSITY=0.11f;
52     static final int XmINTENSITY_FACTOR=75;
53     static final int XmLIGHT_FACTOR=0;
54     static final int XmLUMINOSITY_FACTOR=25;
55 
56     static final int XmMAX_SHORT=65535;
57 
58 
59     static final int XmCOLOR_PERCENTILE=(XmMAX_SHORT / 100);
60 
61     static final int XmDEFAULT_DARK_THRESHOLD=20;
62     static final int XmDEFAULT_LIGHT_THRESHOLD=93;
63     static final int XmDEFAULT_FOREGROUND_THRESHOLD=70;
64 
65     static final int BLACK = 0xFF000000;
66     static final int WHITE = 0xFFFFFFFF;
67     static final int MOTIF_WINDOW_COLOR= 0xFFDFDFDF;
68 
69     static final int DEFAULT_COLOR =  0xFFC4C4C4;
70 
71     static final int  XmCOLOR_LITE_THRESHOLD = XmDEFAULT_LIGHT_THRESHOLD * XmCOLOR_PERCENTILE;
72     static final int  XmCOLOR_DARK_THRESHOLD = XmDEFAULT_DARK_THRESHOLD * XmCOLOR_PERCENTILE;
73     static final int  XmFOREGROUND_THRESHOLD = XmDEFAULT_FOREGROUND_THRESHOLD * XmCOLOR_PERCENTILE;
74 
75     /* LITE color model
76        percent to interpolate RGB towards black for SEL, BS, TS */
77 
78     static final int XmCOLOR_LITE_SEL_FACTOR = 15;
79     static final int XmCOLOR_LITE_BS_FACTOR =  40;
80     static final int XmCOLOR_LITE_TS_FACTOR =  20;
81 
82     /* DARK color model
83        percent to interpolate RGB towards white for SEL, BS, TS */
84 
85     static final int XmCOLOR_DARK_SEL_FACTOR=  15;
86     static final int XmCOLOR_DARK_BS_FACTOR =  30;
87     static final int XmCOLOR_DARK_TS_FACTOR =  50;
88 
89     /* STD color model
90        percent to interpolate RGB towards black for SEL, BS
91        percent to interpolate RGB towards white for TS
92        HI values used for high brightness (within STD)
93        LO values used for low brightness (within STD)
94        Interpolate factors between HI & LO values based on brightness */
95 
96     static final int XmCOLOR_HI_SEL_FACTOR = 15;
97     static final int XmCOLOR_HI_BS_FACTOR =  40;
98     static final int XmCOLOR_HI_TS_FACTOR =  60;
99 
100     static final int XmCOLOR_LO_SEL_FACTOR=  15;
101     static final int XmCOLOR_LO_BS_FACTOR =  60;
102     static final int XmCOLOR_LO_TS_FACTOR =  50;
103 
brightness( int red, int green, int blue )104     static int brightness( int red, int green, int blue )
105     {
106         float brightness;
107         float intensity;
108         float light;
109         float luminosity, maxprimary, minprimary;
110 
111         // To mimix Motif logic, we need to convert to 16 bit color values.
112 
113         red = red << 8;
114         green = green << 8;
115         blue = blue << 8;
116 
117 
118         intensity = (red + green + blue) / 3;
119 
120 
121         /*
122          * The casting nonsense below is to try to control the point at
123          * the truncation occurs.
124          */
125 
126         luminosity = (int) ((XmRED_LUMINOSITY * (float) red)
127                 + (XmGREEN_LUMINOSITY * (float) green)
128                 + (XmBLUE_LUMINOSITY * (float) blue));
129 
130         maxprimary = ( (red > green) ?
131                 ( (red > blue) ? red : blue ) :
132                 ( (green > blue) ? green : blue ) );
133 
134         minprimary = ( (red < green) ?
135                 ( (red < blue) ? red : blue ) :
136                 ( (green < blue) ? green : blue ) );
137 
138         light = (minprimary + maxprimary) / 2;
139 
140         brightness = ( (intensity * XmINTENSITY_FACTOR) +
141                 (light * XmLIGHT_FACTOR) +
142                 (luminosity * XmLUMINOSITY_FACTOR) ) / 100;
143         return Math.round(brightness);
144     }
145 
calculateForegroundFromBackground(int r, int g, int b)146     static int calculateForegroundFromBackground(int r, int g, int b) {
147 
148         int foreground = WHITE;
149         int  brightness = brightness(r,g,b);
150 
151         if (brightness >  XmFOREGROUND_THRESHOLD) {
152             foreground = BLACK;
153         }
154         else foreground = WHITE;
155 
156         return foreground;
157     }
158 
calculateTopShadowFromBackground(int r, int g, int b)159     static int calculateTopShadowFromBackground(int r, int g, int b) {
160 
161         float color_value,f;
162 
163         int br = r << 8;
164         int bg = g << 8;
165         int bb = b << 8;
166 
167         int brightness = brightness(r,g,b);
168 
169         float red;
170         float green;
171         float blue;
172 
173         if (brightness < XmCOLOR_DARK_THRESHOLD) {
174             // dark background
175 
176             color_value = br;
177             color_value += XmCOLOR_DARK_TS_FACTOR *
178                 (XmMAX_SHORT - color_value) / 100;
179             red = color_value;
180 
181             color_value = bg;
182             color_value += XmCOLOR_DARK_TS_FACTOR *
183                 (XmMAX_SHORT - color_value) / 100;
184             green = color_value;
185 
186             color_value = bb;
187             color_value += XmCOLOR_DARK_TS_FACTOR *
188                 (XmMAX_SHORT - color_value) / 100;
189             blue = color_value;
190         }
191         else if (brightness > XmCOLOR_LITE_THRESHOLD) {
192             // lite background
193 
194             color_value = br;
195             color_value -= (color_value * XmCOLOR_LITE_TS_FACTOR) / 100;
196             red = color_value;
197 
198             color_value = bg;
199             color_value -= (color_value * XmCOLOR_LITE_TS_FACTOR) / 100;
200             green = color_value;
201 
202             color_value = bb;
203             color_value -= (color_value * XmCOLOR_LITE_TS_FACTOR) / 100;
204             blue = color_value;
205 
206         }
207         else {
208             // medium
209             f = XmCOLOR_LO_TS_FACTOR + (brightness
210                     * ( XmCOLOR_HI_TS_FACTOR - XmCOLOR_LO_TS_FACTOR )
211                     / XmMAX_SHORT);
212 
213             color_value = br;
214             color_value += f * ( XmMAX_SHORT - color_value ) / 100;
215             red = color_value;
216 
217             color_value = bg;
218             color_value += f * ( XmMAX_SHORT - color_value ) / 100;
219             green = color_value;
220 
221             color_value = bb;
222             color_value += f * ( XmMAX_SHORT - color_value ) / 100;
223             blue = color_value;
224 
225 
226         }
227 
228 
229         int ired = ((int)red) >> 8;
230         int igreen = ((int)green) >> 8;
231         int iblue = ((int)blue) >> 8;
232 
233         int ret = 0xff000000 | ired <<16 | igreen<<8 | iblue;
234 
235         return ret;
236     }
237 
238 
calculateBottomShadowFromBackground(int r, int g, int b)239     static int calculateBottomShadowFromBackground(int r, int g, int b) {
240 
241         float color_value,f;
242 
243         int br = r << 8;
244         int bg = g << 8;
245         int bb = b << 8;
246 
247         int brightness = brightness(r,g,b);
248 
249         float red;
250         float green;
251         float blue;
252 
253         if (brightness < XmCOLOR_DARK_THRESHOLD) {
254             // dark background
255             color_value = br;
256             color_value += XmCOLOR_DARK_BS_FACTOR *
257                 (XmMAX_SHORT - color_value) / 100;
258             red = color_value;
259 
260             color_value = bg;
261             color_value += XmCOLOR_DARK_BS_FACTOR *
262                 (XmMAX_SHORT - color_value) / 100;
263             green = color_value;
264 
265             color_value = bb;
266             color_value += XmCOLOR_DARK_BS_FACTOR *
267                 (XmMAX_SHORT - color_value) / 100;
268             blue = color_value;
269 
270         }
271         else if (brightness > XmCOLOR_LITE_THRESHOLD) {
272             // lite background
273             color_value = br;
274             color_value -= (color_value * XmCOLOR_LITE_BS_FACTOR) / 100;
275             red = color_value;
276 
277             color_value = bg;
278             color_value -= (color_value * XmCOLOR_LITE_BS_FACTOR) / 100;
279             green = color_value;
280 
281             color_value = bb;
282             color_value -= (color_value * XmCOLOR_LITE_BS_FACTOR) / 100;
283             blue = color_value;
284 
285         }
286         else {
287             // medium
288             f = XmCOLOR_LO_BS_FACTOR + (brightness
289                     * ( XmCOLOR_HI_BS_FACTOR - XmCOLOR_LO_BS_FACTOR )
290                     / XmMAX_SHORT);
291 
292             color_value = br;
293             color_value -= (color_value * f) / 100;
294             red = color_value;
295 
296             color_value = bg;
297             color_value -= (color_value * f) / 100;
298             green = color_value;
299 
300             color_value = bb;
301             color_value -= (color_value * f) / 100;
302             blue = color_value;
303         }
304 
305 
306         int ired = ((int)red) >> 8;
307         int igreen = ((int)green) >> 8;
308         int iblue = ((int)blue) >> 8;
309 
310         int ret = 0xff000000 | ired <<16 | igreen<<8 | iblue;
311 
312         return ret;
313     }
314 
calculateSelectFromBackground(int r, int g, int b)315     static int calculateSelectFromBackground(int r, int g, int b) {
316 
317         float color_value,f;
318 
319         int br = r << 8;
320         int bg = g << 8;
321         int bb = b << 8;
322 
323         int brightness = brightness(r,g,b);
324 
325         float red;
326         float green;
327         float blue;
328 
329         if (brightness < XmCOLOR_DARK_THRESHOLD) {
330             // dark background
331             color_value = br;
332             color_value += XmCOLOR_DARK_SEL_FACTOR *
333                 (XmMAX_SHORT - color_value) / 100;
334             red = color_value;
335 
336             color_value = bg;
337             color_value += XmCOLOR_DARK_SEL_FACTOR *
338                 (XmMAX_SHORT - color_value) / 100;
339             green = color_value;
340 
341             color_value = bb;
342             color_value += XmCOLOR_DARK_SEL_FACTOR *
343                 (XmMAX_SHORT - color_value) / 100;
344             blue = color_value;
345 
346         }
347         else if (brightness > XmCOLOR_LITE_THRESHOLD) {
348             // lite background
349             color_value = br;
350             color_value -= (color_value * XmCOLOR_LITE_SEL_FACTOR) / 100;
351             red = color_value;
352 
353             color_value = bg;
354             color_value -= (color_value * XmCOLOR_LITE_SEL_FACTOR) / 100;
355             green = color_value;
356 
357             color_value = bb;
358             color_value -= (color_value * XmCOLOR_LITE_SEL_FACTOR) / 100;
359             blue = color_value;
360 
361         }
362         else {
363             // medium
364             f = XmCOLOR_LO_SEL_FACTOR + (brightness
365                     * ( XmCOLOR_HI_SEL_FACTOR - XmCOLOR_LO_SEL_FACTOR )
366                     / XmMAX_SHORT);
367 
368             color_value = br;
369             color_value -= (color_value * f) / 100;
370             red = color_value;
371 
372             color_value = bg;
373             color_value -= (color_value * f) / 100;
374             green = color_value;
375 
376             color_value = bb;
377             color_value -= (color_value * f) / 100;
378             blue = color_value;
379         }
380 
381 
382         int ired = ((int)red) >> 8;
383         int igreen = ((int)green) >> 8;
384         int iblue = ((int)blue) >> 8;
385 
386         int ret = 0xff000000 | ired <<16 | igreen<<8 | iblue;
387 
388         return ret;
389     }
390 
loadSystemColorsForCDE(int[] systemColors)391    static void loadSystemColorsForCDE(int[] systemColors) throws Exception  {
392         // System.out.println("loadSystemColorsForCDE");
393         XAtom resourceManager = XAtom.get("RESOURCE_MANAGER");
394 
395         String resourceString = resourceManager.getProperty(XToolkit.getDefaultRootWindow());
396 
397         int index = resourceString.indexOf("ColorPalette:");
398         int len = resourceString.length();
399         while ( (index < len) && (resourceString.charAt(index) != ':')) index++;
400         index++; // skip :
401         if (resourceString.charAt(index) == '\t') index++; // skip \t
402 
403         String paletteFile = resourceString.substring(index,resourceString.indexOf("\n",index));
404 
405         //System.out.println("Palette File = " + paletteFile);
406 
407         // Check if palette is a user palette.
408 
409         String  paletteFilePath = System.getProperty("user.home") + "/.dt/palettes/" + paletteFile;
410 
411         File pFile = new File(paletteFilePath);
412         if (!pFile.exists())
413         {
414             // Must be a system palette
415             paletteFilePath = "/usr/dt/palettes/" + paletteFile;
416             pFile = new File(paletteFilePath);
417             if (!pFile.exists())
418             {
419                 throw new FileNotFoundException("Could not open : "+ paletteFilePath);
420             }
421         }
422         BufferedReader bfr = new BufferedReader(new FileReader(pFile));
423 
424         int[] colors = new int[8];
425         int r,g,b;
426         String temp,color;
427 
428         for (int i=0;i<8;i++) {
429             temp = bfr.readLine();
430             color = temp.substring(1,temp.length());
431             r = Integer.valueOf(color.substring(0,4),16).intValue() >> 8;
432             g = Integer.valueOf(color.substring(4,8),16).intValue() >> 8;
433             b = Integer.valueOf(color.substring(8,12),16).intValue() >> 8;
434             colors[i] = 0xff000000 | r<<16 | g<<8 | b;
435             //  System.out.println("color["+i+"]="+Integer.toHexString(colors[i]) + "r = " +r + "g="+g+"b="+b);
436         }
437 
438         // Solaris's default color is MEDIUM_COLOR (4)
439         // AIX's default color is HIGH_COLOR (8)
440         int numOfColor = OSInfo.getOSType() == OSInfo.OSType.AIX ? 8 : 4;
441 
442         int idx = resourceString.indexOf("ColorUse:");
443         if (idx > -1) {
444             while ( (idx < len) && (resourceString.charAt(idx) != ':')) idx++;
445             idx++; // skip :
446             if (resourceString.charAt(idx) == '\t') idx++; // skip \t
447             String colorUse = resourceString.substring(idx,resourceString.indexOf("\n",idx));
448             if ("HIGH_COLOR".equalsIgnoreCase(colorUse)) {
449                 numOfColor = 8;
450             } else if ("MEDIUM_COLOR".equalsIgnoreCase(colorUse)) {
451                 numOfColor = 4;
452             }
453         }
454 
455         if (4 == numOfColor)
456             loadSystemColorsForCDE4(systemColors, colors);
457         else
458             loadSystemColorsForCDE8(systemColors, colors);
459    }
460 
loadSystemColorsForCDE4(int[] systemColors, int[] colors)461    private static void loadSystemColorsForCDE4(int[] systemColors, int[] colors) throws Exception {
462         int r,g,b;
463         systemColors[SystemColor.ACTIVE_CAPTION] = colors[0];
464         systemColors[SystemColor.ACTIVE_CAPTION_BORDER] = colors[0];
465 
466         systemColors[SystemColor.INACTIVE_CAPTION] = colors[1];
467         systemColors[SystemColor.INACTIVE_CAPTION_BORDER] = colors[1];
468 
469         systemColors[SystemColor.WINDOW] = colors[1];
470 
471         systemColors[SystemColor.WINDOW_BORDER] = colors[1];
472         systemColors[SystemColor.MENU] = colors[1];
473 
474         systemColors[SystemColor.TEXT] = colors[3];
475 
476         systemColors[SystemColor.SCROLLBAR] = colors[1];
477         systemColors[SystemColor.CONTROL] = colors[1];
478 
479         int activeFore;
480         int inactiveFore;
481         int textFore;
482 
483 
484         r = (colors[0] & 0x00FF0000) >> 16;
485         g = (colors[0] & 0x0000FF00) >> 8;
486         b = (colors[0] & 0x000000FF);
487 
488         activeFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
489 
490         r = (colors[1] & 0x00FF0000) >> 16;
491         g = (colors[1] & 0x0000FF00) >> 8;
492         b = (colors[1] & 0x000000FF);
493 
494         inactiveFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
495 
496         int top_shadow = MotifColorUtilities.calculateTopShadowFromBackground(r,g,b);
497         int bottom_shadow = MotifColorUtilities.calculateBottomShadowFromBackground(r,g,b);
498 
499 
500         r = (colors[3] & 0x00FF0000) >> 16;
501         g = (colors[3] & 0x0000FF00) >> 8;
502         b = (colors[3] & 0x000000FF);
503 
504         textFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
505 
506 
507         systemColors[SystemColor.ACTIVE_CAPTION_TEXT] = activeFore;
508         systemColors[SystemColor.INACTIVE_CAPTION_TEXT] = inactiveFore;
509         systemColors[SystemColor.WINDOW_TEXT] = inactiveFore;
510         systemColors[SystemColor.MENU_TEXT] = inactiveFore;
511         systemColors[SystemColor.TEXT_TEXT] = textFore;
512         systemColors[SystemColor.TEXT_HIGHLIGHT] = MotifColorUtilities.BLACK;
513         systemColors[SystemColor.TEXT_HIGHLIGHT_TEXT] = MotifColorUtilities.DEFAULT_COLOR;
514         systemColors[SystemColor.CONTROL_TEXT] = inactiveFore;
515         Color tmp = new Color(top_shadow);
516         systemColors[SystemColor.CONTROL_HIGHLIGHT] =  top_shadow;
517         systemColors[SystemColor.CONTROL_LT_HIGHLIGHT] =  tmp.brighter().getRGB();
518 
519         tmp = new Color(bottom_shadow);
520         systemColors[SystemColor.CONTROL_SHADOW] =  bottom_shadow;
521         systemColors[SystemColor.CONTROL_DK_SHADOW] = tmp.darker().getRGB();
522 
523     }
524 
loadSystemColorsForCDE8(int[] systemColors, int[] colors)525     private static void loadSystemColorsForCDE8(int[] systemColors, int[] colors) throws Exception {
526         int r,g,b;
527         systemColors[SystemColor.ACTIVE_CAPTION] = colors[0];
528         systemColors[SystemColor.ACTIVE_CAPTION_BORDER] = colors[0];
529 
530         systemColors[SystemColor.INACTIVE_CAPTION] = colors[1];
531         systemColors[SystemColor.INACTIVE_CAPTION_BORDER] = colors[1];
532 
533         systemColors[SystemColor.WINDOW] = colors[4];
534 
535         systemColors[SystemColor.MENU] = colors[5];
536 
537         systemColors[SystemColor.TEXT] = colors[3];
538         systemColors[SystemColor.TEXT_HIGHLIGHT_TEXT] = colors[3];
539 
540         systemColors[SystemColor.SCROLLBAR] = colors[4];
541         systemColors[SystemColor.CONTROL] = colors[4];
542         systemColors[SystemColor.INFO] =  colors[4];
543 
544         int activeFore;
545         int inactiveFore;
546         int textFore;
547 
548 
549         r = (colors[0] & 0x00FF0000) >> 16;
550         g = (colors[0] & 0x0000FF00) >> 8;
551         b = (colors[0] & 0x000000FF);
552 
553         activeFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
554 
555         r = (colors[1] & 0x00FF0000) >> 16;
556         g = (colors[1] & 0x0000FF00) >> 8;
557         b = (colors[1] & 0x000000FF);
558 
559         inactiveFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
560 
561         r = (colors[3] & 0x00FF0000) >> 16;
562         g = (colors[3] & 0x0000FF00) >> 8;
563         b = (colors[3] & 0x000000FF);
564 
565         textFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
566 
567         r = (colors[4] & 0x00FF0000) >> 16;
568         g = (colors[4] & 0x0000FF00) >> 8;
569         b = (colors[4] & 0x000000FF);
570 
571         int windowFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
572 
573         int top_shadow = MotifColorUtilities.calculateTopShadowFromBackground(r,g,b);
574         int bottom_shadow = MotifColorUtilities.calculateBottomShadowFromBackground(r,g,b);
575 
576 
577         r = (colors[5] & 0x00FF0000) >> 16;
578         g = (colors[5] & 0x0000FF00) >> 8;
579         b = (colors[5] & 0x000000FF);
580 
581         int menuFore = MotifColorUtilities.calculateForegroundFromBackground(r,g,b);
582 
583         systemColors[SystemColor.ACTIVE_CAPTION_TEXT] = activeFore;
584         systemColors[SystemColor.INACTIVE_CAPTION_TEXT] = inactiveFore;
585         systemColors[SystemColor.WINDOW_BORDER] = MotifColorUtilities.BLACK;
586         systemColors[SystemColor.WINDOW_TEXT] = windowFore;
587         systemColors[SystemColor.MENU_TEXT] = menuFore;
588         systemColors[SystemColor.TEXT_TEXT] = textFore;
589         systemColors[SystemColor.TEXT_HIGHLIGHT] = textFore;
590         systemColors[SystemColor.CONTROL_TEXT] = windowFore;
591         Color tmp = new Color(top_shadow);
592         systemColors[SystemColor.CONTROL_HIGHLIGHT] =  top_shadow;
593         systemColors[SystemColor.CONTROL_LT_HIGHLIGHT] =  tmp.brighter().getRGB();
594 
595         tmp = new Color(bottom_shadow);
596         systemColors[SystemColor.CONTROL_SHADOW] =  bottom_shadow;
597         systemColors[SystemColor.CONTROL_DK_SHADOW] = tmp.darker().getRGB();
598 
599         systemColors[SystemColor.INFO_TEXT] = windowFore;
600 
601     }
602 
loadMotifDefaultColors(int[] systemColors)603     static void loadMotifDefaultColors(int[] systemColors) {
604         //fix for 5092883. WINDOW should be light gray and TEXT should be WHITE to look similar to Motif
605         systemColors[SystemColor.WINDOW] = MotifColorUtilities.MOTIF_WINDOW_COLOR;
606         systemColors[SystemColor.TEXT] = MotifColorUtilities.WHITE;
607         systemColors[SystemColor.WINDOW_TEXT] = MotifColorUtilities.BLACK;
608         systemColors[SystemColor.MENU_TEXT] = MotifColorUtilities.BLACK;
609         systemColors[SystemColor.ACTIVE_CAPTION_TEXT] = MotifColorUtilities.BLACK;
610         systemColors[SystemColor.INACTIVE_CAPTION_TEXT] = MotifColorUtilities.BLACK;
611         systemColors[SystemColor.TEXT_TEXT] = MotifColorUtilities.BLACK;
612         systemColors[SystemColor.TEXT_HIGHLIGHT] = MotifColorUtilities.BLACK;
613         systemColors[SystemColor.TEXT_HIGHLIGHT_TEXT] = MotifColorUtilities.DEFAULT_COLOR;
614         systemColors[SystemColor.CONTROL_TEXT] = MotifColorUtilities.BLACK;
615         systemColors[SystemColor.WINDOW_BORDER] = MotifColorUtilities.DEFAULT_COLOR;
616         systemColors[SystemColor.MENU] = MotifColorUtilities.DEFAULT_COLOR;
617         systemColors[SystemColor.SCROLLBAR] = MotifColorUtilities.DEFAULT_COLOR;
618         systemColors[SystemColor.CONTROL] = MotifColorUtilities.MOTIF_WINDOW_COLOR;
619 
620         int r = (MotifColorUtilities.DEFAULT_COLOR & 0x00FF0000) >> 16;
621         int g = (MotifColorUtilities.DEFAULT_COLOR & 0x0000FF00) >> 8;
622         int b = (MotifColorUtilities.DEFAULT_COLOR & 0x000000FF);
623 
624 
625         int top_shadow = MotifColorUtilities.calculateTopShadowFromBackground(r,g,b);
626         int bottom_shadow = MotifColorUtilities.calculateBottomShadowFromBackground(r,g,b);
627 
628         Color tmp = new Color(top_shadow);
629         systemColors[SystemColor.CONTROL_HIGHLIGHT] =  top_shadow;
630         systemColors[SystemColor.CONTROL_LT_HIGHLIGHT] =  tmp.brighter().getRGB();
631 
632         tmp = new Color(bottom_shadow);
633         systemColors[SystemColor.CONTROL_SHADOW] =  bottom_shadow;
634         systemColors[SystemColor.CONTROL_DK_SHADOW] = tmp.darker().getRGB();
635 
636     }
637 
638 
loadSystemColors(int[] systemColors)639     static void loadSystemColors(int[] systemColors) {
640         if ("Linux".equals(AccessController.doPrivileged(new GetPropertyAction("os.name")))) { // Load motif default colors on Linux.
641             loadMotifDefaultColors(systemColors);
642         }
643         else
644         {
645             try {
646                 loadSystemColorsForCDE(systemColors);
647             }
648             catch (Exception e) // Failure to load CDE colors.
649             {
650                 loadMotifDefaultColors(systemColors);
651             }
652         }
653     }
654 }
655