src/demo/share/jfc/J2Ddemo/java2d/demos/Clipping/Text.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/Clipping/Text.java	Mon May 14 08:58:32 2018 -0700
@@ -0,0 +1,246 @@
+/*
+ *
+ * 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.Clipping;
+
+
+import static java.awt.Color.BLACK;
+import static java.awt.Color.BLUE;
+import static java.awt.Color.CYAN;
+import static java.awt.Color.GRAY;
+import static java.awt.Color.RED;
+import static java.awt.Color.WHITE;
+import static java.awt.Color.YELLOW;
+import java.awt.BasicStroke;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.TexturePaint;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Line2D;
+import java.awt.image.BufferedImage;
+import java2d.ControlsSurface;
+import java2d.CustomControls;
+import javax.swing.AbstractButton;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+
+
+/**
+ * Clipping an image, lines, text, texture and gradient with text.
+ */
+@SuppressWarnings("serial")
+public class Text extends ControlsSurface {
+
+    /**
+     *
+     */
+    static Image img;
+    static TexturePaint texturePaint;
+
+    static {
+        BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
+        Graphics2D big = bi.createGraphics();
+        big.setBackground(YELLOW);
+        big.clearRect(0, 0, 5, 5);
+        big.setColor(RED);
+        big.fillRect(0, 0, 3, 3);
+        texturePaint = new TexturePaint(bi, new Rectangle(0, 0, 5, 5));
+    }
+    private String clipType = "Lines";
+    protected boolean doClip = true;
+
+    public Text() {
+        setBackground(WHITE);
+        img = getImage("clouds.jpg");
+        setControls(new Component[] { new DemoControls(this) });
+    }
+
+    @Override
+    public void render(int w, int h, Graphics2D g2) {
+
+        FontRenderContext frc = g2.getFontRenderContext();
+        Font f = new Font(Font.SANS_SERIF, Font.BOLD, 32);
+        String s = "JDK";
+        TextLayout tl = new TextLayout(s, f, frc);
+        double sw = tl.getBounds().getWidth();
+        double sh = tl.getBounds().getHeight();
+        double sx = (w - 40) / sw;
+        double sy = (h - 40) / sh;
+        AffineTransform Tx = AffineTransform.getScaleInstance(sx, sy);
+        Shape shape = tl.getOutline(Tx);
+        sw = shape.getBounds().getWidth();
+        sh = shape.getBounds().getHeight();
+        Tx =
+                AffineTransform.getTranslateInstance(w / 2 - sw / 2, h / 2 + sh
+                / 2);
+        shape = Tx.createTransformedShape(shape);
+        Rectangle r = shape.getBounds();
+
+        if (doClip) {
+            g2.clip(shape);
+        }
+
+        if (clipType.equals("Lines")) {
+            g2.setColor(BLACK);
+            g2.fill(r);
+            g2.setColor(YELLOW);
+            g2.setStroke(new BasicStroke(1.5f));
+            for (int j = r.y; j < r.y + r.height; j = j + 3) {
+                Line2D line = new Line2D.Float(r.x, j,
+                        (r.x + r.width), j);
+                g2.draw(line);
+            }
+        } else if (clipType.equals("Image")) {
+            g2.drawImage(img, r.x, r.y, r.width, r.height, null);
+        } else if (clipType.equals("TP")) {
+            g2.setPaint(texturePaint);
+            g2.fill(r);
+        } else if (clipType.equals("GP")) {
+            g2.setPaint(new GradientPaint(0, 0, BLUE, w, h, YELLOW));
+            g2.fill(r);
+        } else if (clipType.equals("Text")) {
+            g2.setColor(BLACK);
+            g2.fill(shape.getBounds());
+            g2.setColor(CYAN);
+            f = new Font(Font.SERIF, Font.BOLD, 10);
+            tl = new TextLayout("OpenJDK", f, frc);
+            sw = tl.getBounds().getWidth();
+
+            int x = r.x;
+            int y = (int) (r.y + tl.getAscent());
+            sh = r.y + r.height;
+            while (y < sh) {
+                tl.draw(g2, x, y);
+                if ((x += (int) sw) > (r.x + r.width)) {
+                    x = r.x;
+                    y += (int) tl.getAscent();
+                }
+            }
+        }
+        g2.setClip(new Rectangle(0, 0, w, h));
+
+        g2.setColor(GRAY);
+        g2.draw(shape);
+    }
+
+    public static void main(String s[]) {
+        createDemoFrame(new Text());
+    }
+
+
+    @SuppressWarnings("serial")
+    static final class DemoControls extends CustomControls implements
+            ActionListener {
+
+        Text demo;
+        JToolBar toolbar;
+
+        public DemoControls(Text demo) {
+            super(demo.name);
+            this.demo = demo;
+            add(toolbar = new JToolBar());
+            toolbar.setFloatable(false);
+            addTool("Clip", true);
+            addTool("Lines", true);
+            addTool("Image", false);
+            addTool("TP", false);
+            addTool("GP", false);
+            addTool("Text", false);
+        }
+
+        public void addTool(String str, boolean state) {
+            JToggleButton b =
+                    (JToggleButton) toolbar.add(new JToggleButton(str));
+            b.setFocusPainted(false);
+            b.setSelected(state);
+            b.addActionListener(this);
+            int width = b.getPreferredSize().width;
+            Dimension prefSize = new Dimension(width, 21);
+            b.setPreferredSize(prefSize);
+            b.setMaximumSize(prefSize);
+            b.setMinimumSize(prefSize);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (e.getSource().equals(toolbar.getComponentAtIndex(0))) {
+                JToggleButton b = (JToggleButton) e.getSource();
+                demo.doClip = b.isSelected();
+            } else {
+                for (Component comp : toolbar.getComponents()) {
+                    ((JToggleButton) comp).setSelected(false);
+                }
+                JToggleButton b = (JToggleButton) e.getSource();
+                b.setSelected(true);
+                demo.clipType = b.getText();
+            }
+            demo.repaint();
+        }
+
+        @Override
+        public Dimension getPreferredSize() {
+            return new Dimension(200, 40);
+        }
+
+        @Override
+        @SuppressWarnings("SleepWhileHoldingLock")
+        public void run() {
+            try {
+                Thread.sleep(1111);
+            } catch (Exception e) {
+                return;
+            }
+            Thread me = Thread.currentThread();
+            while (thread == me) {
+                for (int i = 1; i < toolbar.getComponentCount() - 1; i++) {
+                    ((AbstractButton) toolbar.getComponentAtIndex(i)).doClick();
+                    try {
+                        Thread.sleep(4444);
+                    } catch (InterruptedException e) {
+                        return;
+                    }
+                }
+            }
+            thread = null;
+        }
+    } // End DemoControls
+} // End Text
+