1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
   |  
// ajoute la couche colorée sur une image
  public static void drawAdditionnalGradient(Graphics2D g, BufferedImage i, Color[] c, int x, int y) {
    int w = i.getWidth();
    int h = i.getHeight();
    BufferedImage b0 = DirectBufferIO.createBuffer(w, h, Transparency.TRANSLUCENT);
    BufferedImage b1 = DirectBufferIO.createBuffer(w, h, Transparency.TRANSLUCENT);
    Graphics2D g0 = b0.createGraphics();
    Graphics2D g1 = b1.createGraphics();
 
    int alpha = c[0].getAlpha();
    if (alpha < 255)
      g0.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)alpha / 255f));
    g0.drawImage(i, 0, 0, null);
    PaintToolkit.fillOpaqueGradient(g1, c, new Rectangle(0, 0, w, h));
    b1.getAlphaRaster().setRect(b0.getAlphaRaster());
    g.drawImage(b1, x, y, null);
 
    g0 = null;
    g1 = null;
    DirectBufferIO.flushBuffer(b0);
    DirectBufferIO.flushBuffer(b1);
  }
 
// remplit un rectangle avec un tableau de dégradés rendus opaques
  public static void fillOpaqueGradient(Graphics2D g, Color[] c0, Rectangle b) {
    Color[] c = new Color[c0.length];
    for (int i = 0 ; i  < c0.length ; i++)
      c[i] = ColorToolkit.setAlpha(c0[i], 255);
    fillGradient(g, c, b);
  }
 
// remplit un rectangle avec un tableau de dégradés
  public static void fillGradient(Graphics2D g, Color[] c, Rectangle b) {
    int n = c.length - 1;
    if (n == 0) {
      fillGradient(g, c[0], c[0], b);
      return;
    }
    int h = b.height / n;
    n--;
    Rectangle r = new Rectangle(b.x, b.y, b.width, h);
    for (int i = 0 ; i < n ; i++) {
      fillGradient(g, c[i], c[i + 1], r);
      r.y += h;
    }
    r.height = b.y + b.height - r.y;
    fillGradient(g, c[n], c[n + 1], r);
  }
 
// remplit un rectangle avec un dégradé de c0 à c1
  private static void fillGradient(Graphics2D g, Color c0, Color c1, Rectangle r) {
    Paint p = g.getPaint();
    if (c0.getRGB() != c1.getRGB())
      g.setPaint(new GradientPaint(r.x, r.y, c0, r.x, r.y + r.height, c1));
    else
      g.setColor(c0);
    g.fillRect(r.x, r.y, r.width, r.height);
    g.setPaint(p);
  } |