예제 #1
0
  /**
   * Returns inner shade nine-patch icon.
   *
   * @param shadeWidth shade width
   * @param round corners round
   * @param shadeOpacity shade opacity
   * @return inner shade nine-patch icon
   */
  public static NinePatchIcon createInnerShadeIcon(
      final int shadeWidth, final int round, final float shadeOpacity) {
    // Calculating width for temprorary image
    final int inner = Math.max(shadeWidth, round);
    int width = shadeWidth * 2 + inner * 2;

    // Creating template image
    final BufferedImage bi = new BufferedImage(width, width, BufferedImage.TYPE_INT_ARGB);
    final Graphics2D ig = bi.createGraphics();
    GraphicsUtils.setupAntialias(ig);
    final Area area = new Area(new Rectangle(0, 0, width, width));
    area.exclusiveOr(
        new Area(
            new RoundRectangle2D.Double(
                shadeWidth,
                shadeWidth,
                width - shadeWidth * 2,
                width - shadeWidth * 2,
                round * 2,
                round * 2)));
    ig.setPaint(Color.BLACK);
    ig.fill(area);
    ig.dispose();

    // Creating shade image
    final ShadowFilter sf = new ShadowFilter(shadeWidth, 0, 0, shadeOpacity);
    final BufferedImage shade = sf.filter(bi, null);

    // Clipping shade image
    final Graphics2D g2d = shade.createGraphics();
    GraphicsUtils.setupAntialias(g2d);
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN));
    g2d.setPaint(FlatLafStyleConstants.transparent);
    g2d.fill(area);
    g2d.dispose();

    final BufferedImage croppedShade =
        shade.getSubimage(shadeWidth, shadeWidth, width - shadeWidth * 2, width - shadeWidth * 2);
    width = croppedShade.getWidth();

    // Creating nine-patch icon
    final NinePatchIcon ninePatchIcon = NinePatchIcon.create(croppedShade);
    ninePatchIcon.addHorizontalStretch(0, inner, true);
    ninePatchIcon.addHorizontalStretch(inner + 1, width - inner - 1, false);
    ninePatchIcon.addHorizontalStretch(width - inner, width, true);
    ninePatchIcon.addVerticalStretch(0, inner, true);
    ninePatchIcon.addVerticalStretch(inner + 1, width - inner - 1, false);
    ninePatchIcon.addVerticalStretch(width - inner, width, true);
    ninePatchIcon.setMargin(shadeWidth);
    return ninePatchIcon;
  }
예제 #2
0
  /**
   * Returns rotated by 180 degrees NinePatchIcon. This method also modifies patches information
   * properly.
   *
   * @param icon NinePatchIcon to rotate
   * @return rotated by 180 degrees NinePatchIcon
   */
  public static NinePatchIcon rotateIcon180(final NinePatchIcon icon) {
    final BufferedImage rawImage = ImageUtils.rotateImage180(icon.getRawImage());
    final NinePatchIcon rotated = NinePatchIcon.create(rawImage);

    // Rotating stretch information
    rotated.setHorizontalStretch(CollectionUtils.copy(icon.getHorizontalStretch()));
    rotated.setVerticalStretch(CollectionUtils.copy(icon.getVerticalStretch()));

    // Rotating margin
    final Insets om = icon.getMargin();
    rotated.setMargin(om.bottom, om.right, om.top, om.left);

    return rotated;
  }