view src/nabble/view/web/util/GradientImage.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.view.web.util;

import fschmidt.util.java.IoUtils;
import fschmidt.util.servlet.JtpContext;
import nabble.view.lib.UrlMappable;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Hugo Teixeira
 */
public class GradientImage extends HttpServlet implements UrlMappable {

	private static final Pattern URL_PATTERN = Pattern.compile("/gradients/(v|h)(\\d+)_([A-Fa-f0-9]{6})([A-Fa-f0-9]{2})?_([A-Fa-f0-9]{6})([A-Fa-f0-9]{2})?$");

	public Map<String,String[]> getParameterMapFromUrl(HttpServletRequest request,String mappedUrl) {
		Matcher m = URL_PATTERN.matcher(mappedUrl);
		if( !m.find() )
			throw new RuntimeException();
		Map<String,String[]> params = new HashMap<String,String[]>();
		String direction = m.group(1);
		params.put("direction",new String[]{"v".equals(direction)? "vertical" : "horizontal"});
		String size = m.group(2);
		params.put("size",new String[]{size});
		String fromColor = m.group(3) + (m.group(4) == null? "" : m.group(4));
		params.put( "from", new String[]{fromColor} );
		String toColor = m.group(5) + (m.group(6) == null? "" : m.group(6));
		params.put( "to", new String[]{toColor} );
		return params;
	}

	public Pattern getUrlPattern() {
		return URL_PATTERN;
	}

	protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException
	{
		OutputStream out = response.getOutputStream();
		response.setContentType("image/png");

		JtpContext jtpContext = (JtpContext)getServletContext().getAttribute(JtpContext.attrName);
		jtpContext.setEtag(request,response);

		String direction = request.getParameter("direction");
		String size = request.getParameter("size");
		String fromColor = request.getParameter("from");
		String toColor = request.getParameter("to");

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ImageIO.write(createImage(direction, size, fromColor, toColor), "png", baos);
		final byte[] bytes = baos.toByteArray();

		InputStream in = new ByteArrayInputStream(bytes);
		try {
			IoUtils.copyAll(in,out);
		} finally {
			in.close();
		}
	}

	private RenderedImage createImage(String direction, String size, String fromColor, String toColor) {
		boolean isVertical = "vertical".equals(direction);
		int width = isVertical? 1 : Integer.valueOf(size);
		int height = isVertical? Integer.valueOf(size) : 1;
		Color from = parseColor(fromColor);
		Color to = parseColor(toColor);
		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = img.createGraphics();
		GradientPaint paint;
		if (isVertical)
			paint = new GradientPaint(0, 0, from, 0, height, to);
		else
			paint = new GradientPaint(0, 0, from, width, 0, to);
		g2.setPaint(paint);
		g2.fillRect(0, 0, width, height);
		g2.dispose();
		return img;
	}

	private Color parseColor(String c) {
		if (c.length() == 6)
			return Color.decode("0x"+c);
		int r = Integer.parseInt(c.substring(0,2), 16);
		int g = Integer.parseInt(c.substring(2,4), 16);
		int b = Integer.parseInt(c.substring(4,6), 16);
		int a = Integer.parseInt(c.substring(6,8), 16);
		return new Color(r, g, b, a);
	}
}