/* * adapted to use in Enonic CMS * changed YOFFSET only * based on James Childers work * * Copyright (c) 2008, James Childers * All rights reserved. */ package com.enonic.cms.core.captcha; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.image.BufferedImage; import java.security.SecureRandom; import java.util.List; import java.util.Random; import nl.captcha.text.renderer.WordRenderer; /** * Renders the answer onto the image. */ final class DefaultWordRenderer implements WordRenderer { private static final Random RAND = new SecureRandom(); private static final double YOFFSET = 0.5; private static final double XOFFSET = 0.05; private final List<Color> colors; private final List<Font> fonts; public DefaultWordRenderer( final List<Color> colors, final List<Font> fonts ) { this.colors = colors; this.fonts = fonts; } @Override public void render( final String word, BufferedImage image ) { Graphics2D g = image.createGraphics(); RenderingHints hints = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); hints.add( new RenderingHints( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY ) ); g.setRenderingHints( hints ); FontRenderContext frc = g.getFontRenderContext(); int xBaseline = (int) Math.round( image.getWidth() * XOFFSET ); int yBaseline = image.getHeight() - (int) Math.round( image.getHeight() * YOFFSET ); char[] chars = new char[1]; for ( char c : word.toCharArray() ) { chars[0] = c; g.setColor( this.colors.get( RAND.nextInt( this.colors.size() ) ) ); int choiceFont = RAND.nextInt( this.fonts.size() ); Font font = this.fonts.get( choiceFont ); g.setFont( font ); GlyphVector gv = font.createGlyphVector( frc, chars ); g.drawChars( chars, 0, chars.length, xBaseline, yBaseline ); int width = (int) ( gv.getVisualBounds().getWidth() * 1.3f ); xBaseline = xBaseline + width; } } }