Mercurial Hosting > nabble
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); } }