/* * Copyright 2003-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.ide.util; import java.awt.*; import java.awt.image.BufferedImage; public class ColorAndGraphicsUtil { public static final int WAVE_HEIGHT = 2; public static final int WAVE_SEGMENT_LENGTH = WAVE_HEIGHT * 2; private static final int DASH_SIZE = 8; private static final int STRIPE_SIZE = 6; public static Color saturateColor(Color c, float factor) { float[] hsb = new float[3]; Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), hsb); float saturation = hsb[1]; saturation = saturation * factor; if (saturation > 1.0f) saturation = 1.0f; hsb[1] = saturation; final Color result = Color.getHSBColor(hsb[0], hsb[1], hsb[2]); return new Color(result.getRed(), result.getGreen(), result.getBlue(), c.getAlpha()); } public static Color brightenColor(Color c, float factor) { float[] hsb = new float[3]; Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), hsb); float brightness = hsb[2]; brightness = brightness * factor; if (brightness > 1.0f) brightness = 1.0f; hsb[2] = brightness; final Color result = Color.getHSBColor(hsb[0], hsb[1], hsb[2]); return new Color(result.getRed(), result.getGreen(), result.getBlue(), c.getAlpha()); } public static BasicStroke dashedStroke() { float[] dash = new float[]{3.0f}; return new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, dash, 0.0f); } public static BasicStroke dashedStroke(float dash_phase) { float[] dash = new float[]{4.0f, 4.0f}; return new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, dash, dash_phase); } public static BasicStroke dottedStroke() { float[] dash = new float[]{1.0f, 3.0f}; return new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, dash, 0.0f); } public static void drawWave(Graphics g, int xStart, int xEnd, int y) { int offset = xStart % WAVE_SEGMENT_LENGTH; Graphics gc = g.create(); gc.translate(xStart - offset, y); Graphics2D g2d = (Graphics2D) gc; Paint oldPaint = g2d.getPaint(); g2d.setPaint(createPaintForLine(g.getColor())); g2d.fillRect(0, 0, xEnd - xStart + offset, WAVE_HEIGHT + 1); g2d.setPaint(oldPaint); } public static void fillStripes(Graphics g, int x, int y, int width, int height) { int offsetx = x % STRIPE_SIZE; int offsety = y % STRIPE_SIZE; Graphics gc = g.create(); gc.translate(x - offsetx, y - offsety); Graphics2D g2d = (Graphics2D) gc; Paint oldPaint = g2d.getPaint(); g2d.setPaint(createPaintForStripe(g.getColor())); g2d.fillRect(offsetx, offsety, width, height); g2d.setPaint(oldPaint); } public static void drawDashedRect(Graphics g, int x, int y, int width, int height) { Graphics gc = g.create(); int phase = x % DASH_SIZE; Graphics2D g2d = (Graphics2D) gc; Stroke oldStroke = g2d.getStroke(); g2d.setStroke(dashedStroke((float) phase)); g2d.drawRect(x,y,width,height); g2d.setStroke(oldStroke); } public static void drawWaveOld(Graphics g, int xStart, int xEnd, int y) { int startSegment = xStart / WAVE_SEGMENT_LENGTH; int endSegment = xEnd / WAVE_SEGMENT_LENGTH; for (int i = startSegment; i < endSegment; i++) { drawWaveSegment(g, WAVE_SEGMENT_LENGTH * i, y); } int x = WAVE_SEGMENT_LENGTH * endSegment; g.drawLine(x, y + WAVE_HEIGHT, x + WAVE_SEGMENT_LENGTH / 2, y); } public static void drawWaveSegment(Graphics g, int x, int y) { g.drawLine(x, y + WAVE_HEIGHT, x + WAVE_SEGMENT_LENGTH / 2, y); g.drawLine(x + WAVE_SEGMENT_LENGTH / 2, y, x + WAVE_SEGMENT_LENGTH, y + WAVE_HEIGHT); } private static TexturePaint createPaintForLine(Color c) { BufferedImage image = new BufferedImage(WAVE_SEGMENT_LENGTH, WAVE_HEIGHT + 1, BufferedImage.TYPE_INT_ARGB); Graphics g = image.getGraphics(); g.setColor(new Color(0, 0, 0, 0)); g.fillRect(0, 0, image.getWidth(), image.getHeight()); g.setColor(c); drawWaveSegment(g, 0, 0); return new TexturePaint(image, new Rectangle(0, 0, image.getWidth(), image.getHeight())); } public static Point getCentralPosition(Component parent, Component component) { return new Point(parent.getX() + (parent.getWidth() - component.getWidth()) / 2, parent.getY() + (parent.getHeight() - component.getHeight()) / 2); } private static TexturePaint createPaintForStripe(Color c) { BufferedImage image = new BufferedImage(STRIPE_SIZE, STRIPE_SIZE, BufferedImage.TYPE_INT_ARGB); Graphics g = image.getGraphics(); g.setColor(new Color(0, 0, 0, 0)); g.fillRect(0, 0, image.getWidth(), image.getHeight()); g.setColor(c); g.drawLine(0, 0 + 2, 0 + 2, 0); g.drawLine(0, 0 + 3, 0 + 3, 0); g.drawLine(0 + 3, 0 + 5, 0 + 5, 0 + 3); g.drawLine(0 + 4, 0 + 5, 0 + 5, 0 + 4); return new TexturePaint(image, new Rectangle(0, 0, image.getWidth(), image.getHeight())); } }