| <test title="AttributedCharacterIterator"> |
| <description> |
| This test validates the convertion of Java 2D AttributedCharacterIterator |
| to SVG shapes. |
| </description> |
| <import> |
| import java.text.*; |
| </import> |
| <javaCode> |
| <![CDATA[ |
| String fontName = "SunSansCondensed-Demi"; |
| int fontSize = 30; |
| |
| FontRenderContext frc = new FontRenderContext(null, true, true); |
| |
| String text = "Attributed Strings are fun !"; |
| AttributedString styledText = new AttributedString(text); |
| |
| // |
| // Set font family for the whole string |
| // |
| Font font = new Font(fontName, Font.PLAIN, fontSize); |
| styledText.addAttribute(TextAttribute.FAMILY, font.getFamily()); |
| styledText.addAttribute(TextAttribute.SIZE, new Float(font.getSize())); |
| styledText.addAttribute(TextAttribute.FOREGROUND, Color.black); |
| |
| // |
| // Set font style attributes for different part of the string |
| // |
| |
| // "Attributed" is in Bold |
| styledText.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, 0, 10); |
| |
| // "String" is italic |
| // styledText.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, 11, 18); |
| |
| // fun is Bold and underlined |
| styledText.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 23, 28); |
| // styledText.addAttribute(TextAttribute.SWAP_COLORS, TextAttribute.SWAP_COLORS_ON); |
| // styledText.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, 23, 28); |
| |
| /*TextLayout aLayout = new TextLayout("A", font, frc); |
| Shape aShape = aLayout.getOutline(null); |
| |
| ShapeGraphicAttribute aReplacement = new ShapeGraphicAttribute(aShape, GraphicAttribute.ROMAN_BASELINE, true); |
| styledText.addAttribute(TextAttribute.CHAR_REPLACEMENT, aReplacement, 0, 1); |
| |
| |
| // Create a BufferedImage to decorate the Shape |
| { |
| TextLayout aLayout = new TextLayout("A", font, frc); |
| Shape aShape = aLayout.getOutline(null); |
| Rectangle bounds = aShape.getBounds(); |
| |
| int blurWidth = 6; |
| BufferedImage image = new BufferedImage(bounds.width + blurWidth*4, bounds.height + blurWidth*4, |
| BufferedImage.TYPE_INT_ARGB); |
| Graphics2D g2 = image.createGraphics(); |
| int w = image.getWidth(), h = image.getHeight(); |
| g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
| g2.setPaint(Color.black); |
| g2.translate(-bounds.x + (w - bounds.width)/2, -bounds.y + (h - bounds.height)/2); |
| g2.fill(aShape); |
| g2.setStroke(new BasicStroke(blurWidth/2)); |
| g2.draw(aShape); |
| g2.dispose(); |
| |
| float k[] = new float[blurWidth*blurWidth]; |
| for(int i=0; i<k.length; i++) k[i] = 1/(float)k.length; |
| Kernel kernel = new Kernel(blurWidth, blurWidth, k); |
| ConvolveOp blur = new ConvolveOp(kernel); |
| image = blur.filter(image, null); |
| g2 = image.createGraphics(); |
| g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
| g2.translate(-bounds.x + (w - bounds.width)/2, -bounds.y + (h - bounds.height)/2); |
| g2.setComposite(AlphaComposite.Clear); |
| g2.fill(aShape); |
| |
| image = image.getSubimage(blurWidth, blurWidth, image.getWidth() - 2*blurWidth, image.getHeight() - 2*blurWidth); |
| |
| ImageGraphicAttribute aImageReplacement = new ImageGraphicAttribute(image, GraphicAttribute.ROMAN_BASELINE, blurWidth, |
| blurWidth + bounds.height); |
| styledText.addAttribute(TextAttribute.CHAR_REPLACEMENT, aImageReplacement, 0, 1); |
| } |
| */ |
| |
| // |
| // Set text color |
| // |
| |
| // "Attributed" is in dard red |
| styledText.addAttribute(TextAttribute.FOREGROUND, new Color(128, 0, 0), 0, 10); |
| |
| // "String" is blue |
| styledText.addAttribute(TextAttribute.FOREGROUND, new Color(70, 107, 132), 11, 18); |
| |
| // "fun" is yellow on blue background |
| styledText.addAttribute(TextAttribute.FOREGROUND, new Color(236, 214, 70), 23, 28); |
| styledText.addAttribute(TextAttribute.BACKGROUND, new Color(70, 107, 132), 23, 28); |
| |
| AttributedCharacterIterator iter = styledText.getIterator(); |
| TextLayout layout = new TextLayout(iter, frc); |
| |
| Rectangle bounds = layout.getBounds().getBounds(); |
| bounds.width += 50; |
| bounds.height += 50; |
| |
| layout.draw(g, 25, layout.getAscent() + 25); |
| |
| ]]> |
| </javaCode> |
| </test> |