src/demo/share/jfc/J2Ddemo/java2d/demos/Fonts/AttributedStr.java
changeset 50146 0bb0e464ee76
child 52252 de9486d74a74
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/J2Ddemo/java2d/demos/Fonts/AttributedStr.java	Mon May 14 08:58:32 2018 -0700
@@ -0,0 +1,190 @@
+/*
+ *
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package java2d.demos.Fonts;
+
+
+import static java.awt.Font.BOLD;
+import static java.awt.Font.ITALIC;
+import static java.awt.Font.PLAIN;
+import static java.awt.font.TextAttribute.BACKGROUND;
+import static java.awt.font.TextAttribute.CHAR_REPLACEMENT;
+import static java.awt.font.TextAttribute.FONT;
+import static java.awt.font.TextAttribute.FOREGROUND;
+import static java.awt.font.TextAttribute.UNDERLINE;
+import static java.awt.font.TextAttribute.UNDERLINE_ON;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.TexturePaint;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GraphicAttribute;
+import java.awt.font.ImageGraphicAttribute;
+import java.awt.font.LineBreakMeasurer;
+import java.awt.font.ShapeGraphicAttribute;
+import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Ellipse2D;
+import java.awt.image.BufferedImage;
+import java.text.AttributedCharacterIterator;
+import java.text.AttributedString;
+import java2d.Surface;
+
+
+/**
+ * Demonstrates how to build an AttributedString and then render the
+ * string broken over lines.
+ */
+@SuppressWarnings("serial")
+public class AttributedStr extends Surface {
+
+    static final Color black = new Color(20, 20, 20);
+    static final Color blue = new Color(94, 105, 176);
+    static final Color yellow = new Color(255, 255, 140);
+    static final Color red = new Color(149, 43, 42);
+    static final Color white = new Color(240, 240, 255);
+    static final String text =
+            "  A quick brown  fox  jumped  over the lazy duke  ";
+    static final AttributedString as = new AttributedString(text);
+    static AttributedCharacterIterator aci;
+
+    static {
+        Shape shape = new Ellipse2D.Double(0, 25, 12, 12);
+        ShapeGraphicAttribute sga = new ShapeGraphicAttribute(shape,
+                GraphicAttribute.TOP_ALIGNMENT, false);
+        as.addAttribute(CHAR_REPLACEMENT, sga, 0, 1);
+
+
+        Font font = new Font("sanserif", BOLD | ITALIC, 20);
+        int index = text.indexOf("quick");
+        as.addAttribute(FONT, font, index, index + 5);
+
+        index = text.indexOf("brown");
+        font = new Font(Font.SERIF, BOLD, 20);
+        as.addAttribute(FONT, font, index, index + 5);
+        as.addAttribute(FOREGROUND, red, index, index + 5);
+
+        index = text.indexOf("fox");
+        AffineTransform fontAT = new AffineTransform();
+        fontAT.rotate(Math.toRadians(10));
+        Font fx = new Font(Font.SERIF, BOLD, 30).deriveFont(fontAT);
+        as.addAttribute(FONT, fx, index, index + 1);
+        as.addAttribute(FONT, fx, index + 1, index + 2);
+        as.addAttribute(FONT, fx, index + 2, index + 3);
+
+        fontAT.setToRotation(Math.toRadians(-4));
+        fx = font.deriveFont(fontAT);
+        index = text.indexOf("jumped");
+        as.addAttribute(FONT, fx, index, index + 6);
+
+        font = new Font(Font.SERIF, BOLD | ITALIC, 30);
+        index = text.indexOf("over");
+        as.addAttribute(UNDERLINE, UNDERLINE_ON, index, index + 4);
+        as.addAttribute(FOREGROUND, white, index, index + 4);
+        as.addAttribute(FONT, font, index, text.length());
+
+        font = new Font(Font.DIALOG, PLAIN, 20);
+        int i = text.indexOf("duke");
+        as.addAttribute(FONT, font, index, i - 1);
+
+        BufferedImage bi = new BufferedImage(4, 4, BufferedImage.TYPE_INT_ARGB);
+        bi.setRGB(0, 0, 0xffffffff);
+        TexturePaint tp = new TexturePaint(bi, new Rectangle(0, 0, 4, 4));
+        as.addAttribute(BACKGROUND, tp, i, i + 4);
+        font = new Font(Font.SERIF, BOLD, 40);
+        as.addAttribute(FONT, font, i, i + 4);
+    }
+
+    public AttributedStr() {
+        setBackground(Color.white);
+
+        Font font = getFont("A.ttf");
+        if (font != null) {
+            font = font.deriveFont(PLAIN, 70);
+        } else {
+            font = new Font(Font.SERIF, PLAIN, 50);
+        }
+        int index = text.indexOf("A") + 1;
+        as.addAttribute(FONT, font, 0, index);
+        as.addAttribute(FOREGROUND, white, 0, index);
+
+        font = new Font(Font.DIALOG, PLAIN, 40);
+        int size = getFontMetrics(font).getHeight();
+        BufferedImage bi =
+                new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D big = bi.createGraphics();
+        big.drawImage(getImage("snooze.png"), 0, 0, size, size, null);
+        ImageGraphicAttribute iga =
+                new ImageGraphicAttribute(bi, GraphicAttribute.TOP_ALIGNMENT);
+        as.addAttribute(CHAR_REPLACEMENT, iga, text.length() - 1, text.length());
+
+        aci = as.getIterator();
+    }
+
+    @Override
+    public void render(int w, int h, Graphics2D g2) {
+
+        float x = 5, y = 0;
+        FontRenderContext frc = g2.getFontRenderContext();
+        LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
+
+        g2.setPaint(new GradientPaint(0, h, blue, w, 0, black));
+        g2.fillRect(0, 0, w, h);
+
+        g2.setColor(white);
+        String s = "AttributedString LineBreakMeasurer";
+        Font font = new Font(Font.SERIF, PLAIN, 12);
+        TextLayout tl = new TextLayout(s, font, frc);
+
+        tl.draw(g2, 5, y += (float) tl.getBounds().getHeight());
+
+        g2.setColor(yellow);
+
+        while (y < h - tl.getAscent()) {
+            lbm.setPosition(0);
+            while (lbm.getPosition() < text.length()) {
+                tl = lbm.nextLayout(w - x);
+                if (!tl.isLeftToRight()) {
+                    x = w - tl.getAdvance();
+                }
+                tl.draw(g2, x, y += tl.getAscent());
+                y += tl.getDescent() + tl.getLeading();
+            }
+        }
+    }
+
+    public static void main(String s[]) {
+        createDemoFrame(new AttributedStr());
+    }
+}