fixed shadows on hidpi (we do not have x2 icons and scaled regular icons, which must...
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / ui / impl / ShadowPainter.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.ui.impl;
17
18 import com.intellij.util.IconUtil;
19 import org.jetbrains.annotations.Nullable;
20
21 import javax.swing.*;
22 import java.awt.*;
23 import java.awt.image.BufferedImage;
24
25 /**
26  * @author Konstantin Bulenkov
27  */
28 public class ShadowPainter {
29   private final Icon myTop;
30   private final Icon myTopRight;
31   private final Icon myRight;
32   private final Icon myBottomRight;
33   private final Icon myBottom;
34   private final Icon myBottomLeft;
35   private final Icon myLeft;
36   private final Icon myTopLeft;
37   @Nullable
38   private Color myBorderColor;
39
40   public ShadowPainter(Icon top, Icon topRight, Icon right, Icon bottomRight, Icon bottom, Icon bottomLeft, Icon left, Icon topLeft) {
41     myTop = IconUtil.cropIcon(top, 1, Integer.MAX_VALUE);
42     myTopRight = topRight;
43     myRight = IconUtil.cropIcon(right, Integer.MAX_VALUE, 1);
44     myBottomRight = bottomRight;
45     myBottom = IconUtil.cropIcon(bottom, 1, Integer.MAX_VALUE);
46     myBottomLeft = bottomLeft;
47     myLeft = IconUtil.cropIcon(left, Integer.MAX_VALUE, 1);
48     myTopLeft = topLeft;
49   }
50
51   public ShadowPainter(Icon top, Icon topRight, Icon right, Icon bottomRight, Icon bottom, Icon bottomLeft, Icon left, Icon topLeft, @Nullable Color borderColor) {
52     this(top, topRight, right, bottomRight, bottom, bottomLeft, left, topLeft);
53     myBorderColor = borderColor;
54   }
55
56   public void setBorderColor(@Nullable Color borderColor) {
57     myBorderColor = borderColor;
58   }
59
60   public BufferedImage createShadow(final JComponent c, final int width, final int height) {
61     final GraphicsConfiguration graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment().
62       getDefaultScreenDevice().getDefaultConfiguration();
63
64     final BufferedImage image = graphicsConfiguration.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
65     final Graphics2D g = image.createGraphics();
66
67     paintShadow(c, g, 0, 0, width, height);
68
69     g.dispose();
70     return image;
71   }
72
73   public void paintShadow(Component c, Graphics2D g, int x, int y, int width, int height) {
74     final int leftSize = myLeft.getIconWidth();
75     final int rightSize = myRight.getIconWidth();
76     final int bottomSize = myBottom.getIconHeight();
77     final int topSize = myTop.getIconHeight();
78
79
80     myTopLeft.paintIcon(c, g, x, y);
81     myTopRight.paintIcon(c, g, x + width - myTopRight.getIconWidth(), y);
82     myBottomRight.paintIcon(c, g, x + width - myBottomRight.getIconWidth(), y + height - myBottomRight.getIconHeight());
83     myBottomLeft.paintIcon(c, g, x, y + height - myBottomLeft.getIconHeight());
84
85     for (int _x = myTopLeft.getIconWidth(); _x < width - myTopRight.getIconWidth(); _x++) {
86       myTop.paintIcon(c, g, _x + x, y);
87     }
88     for (int _x = myBottomLeft.getIconWidth(); _x < width - myBottomLeft.getIconWidth(); _x++) {
89       myBottom.paintIcon(c, g, _x + x, y + height - bottomSize);
90     }
91     for (int _y = myTopLeft.getIconHeight(); _y < height - myBottomLeft.getIconHeight(); _y++) {
92       myLeft.paintIcon(c, g, x, _y + y);
93     }
94     for (int _y = myTopRight.getIconHeight(); _y < height - myBottomRight.getIconHeight(); _y++) {
95       myRight.paintIcon(c, g, x + width - rightSize, _y + y);
96     }
97
98     if (myBorderColor != null) {
99       g.setColor(myBorderColor);
100       g.drawRect(x + leftSize - 1, y + topSize - 1, width - leftSize - rightSize + 1, height - topSize - bottomSize + 1);
101     }
102   }
103 }