src/demo/share/jfc/J2Ddemo/java2d/demos/Clipping/Text.java
changeset 50146 0bb0e464ee76
child 52252 de9486d74a74
equal deleted inserted replaced
50145:752645a158ff 50146:0bb0e464ee76
       
     1 /*
       
     2  *
       
     3  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
       
     4  *
       
     5  * Redistribution and use in source and binary forms, with or without
       
     6  * modification, are permitted provided that the following conditions
       
     7  * are met:
       
     8  *
       
     9  *   - Redistributions of source code must retain the above copyright
       
    10  *     notice, this list of conditions and the following disclaimer.
       
    11  *
       
    12  *   - Redistributions in binary form must reproduce the above copyright
       
    13  *     notice, this list of conditions and the following disclaimer in the
       
    14  *     documentation and/or other materials provided with the distribution.
       
    15  *
       
    16  *   - Neither the name of Oracle nor the names of its
       
    17  *     contributors may be used to endorse or promote products derived
       
    18  *     from this software without specific prior written permission.
       
    19  *
       
    20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    31  */
       
    32 package java2d.demos.Clipping;
       
    33 
       
    34 
       
    35 import static java.awt.Color.BLACK;
       
    36 import static java.awt.Color.BLUE;
       
    37 import static java.awt.Color.CYAN;
       
    38 import static java.awt.Color.GRAY;
       
    39 import static java.awt.Color.RED;
       
    40 import static java.awt.Color.WHITE;
       
    41 import static java.awt.Color.YELLOW;
       
    42 import java.awt.BasicStroke;
       
    43 import java.awt.Component;
       
    44 import java.awt.Dimension;
       
    45 import java.awt.Font;
       
    46 import java.awt.GradientPaint;
       
    47 import java.awt.Graphics2D;
       
    48 import java.awt.Image;
       
    49 import java.awt.Rectangle;
       
    50 import java.awt.Shape;
       
    51 import java.awt.TexturePaint;
       
    52 import java.awt.event.ActionEvent;
       
    53 import java.awt.event.ActionListener;
       
    54 import java.awt.font.FontRenderContext;
       
    55 import java.awt.font.TextLayout;
       
    56 import java.awt.geom.AffineTransform;
       
    57 import java.awt.geom.Line2D;
       
    58 import java.awt.image.BufferedImage;
       
    59 import java2d.ControlsSurface;
       
    60 import java2d.CustomControls;
       
    61 import javax.swing.AbstractButton;
       
    62 import javax.swing.JToggleButton;
       
    63 import javax.swing.JToolBar;
       
    64 
       
    65 
       
    66 /**
       
    67  * Clipping an image, lines, text, texture and gradient with text.
       
    68  */
       
    69 @SuppressWarnings("serial")
       
    70 public class Text extends ControlsSurface {
       
    71 
       
    72     /**
       
    73      *
       
    74      */
       
    75     static Image img;
       
    76     static TexturePaint texturePaint;
       
    77 
       
    78     static {
       
    79         BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
       
    80         Graphics2D big = bi.createGraphics();
       
    81         big.setBackground(YELLOW);
       
    82         big.clearRect(0, 0, 5, 5);
       
    83         big.setColor(RED);
       
    84         big.fillRect(0, 0, 3, 3);
       
    85         texturePaint = new TexturePaint(bi, new Rectangle(0, 0, 5, 5));
       
    86     }
       
    87     private String clipType = "Lines";
       
    88     protected boolean doClip = true;
       
    89 
       
    90     public Text() {
       
    91         setBackground(WHITE);
       
    92         img = getImage("clouds.jpg");
       
    93         setControls(new Component[] { new DemoControls(this) });
       
    94     }
       
    95 
       
    96     @Override
       
    97     public void render(int w, int h, Graphics2D g2) {
       
    98 
       
    99         FontRenderContext frc = g2.getFontRenderContext();
       
   100         Font f = new Font(Font.SANS_SERIF, Font.BOLD, 32);
       
   101         String s = "JDK";
       
   102         TextLayout tl = new TextLayout(s, f, frc);
       
   103         double sw = tl.getBounds().getWidth();
       
   104         double sh = tl.getBounds().getHeight();
       
   105         double sx = (w - 40) / sw;
       
   106         double sy = (h - 40) / sh;
       
   107         AffineTransform Tx = AffineTransform.getScaleInstance(sx, sy);
       
   108         Shape shape = tl.getOutline(Tx);
       
   109         sw = shape.getBounds().getWidth();
       
   110         sh = shape.getBounds().getHeight();
       
   111         Tx =
       
   112                 AffineTransform.getTranslateInstance(w / 2 - sw / 2, h / 2 + sh
       
   113                 / 2);
       
   114         shape = Tx.createTransformedShape(shape);
       
   115         Rectangle r = shape.getBounds();
       
   116 
       
   117         if (doClip) {
       
   118             g2.clip(shape);
       
   119         }
       
   120 
       
   121         if (clipType.equals("Lines")) {
       
   122             g2.setColor(BLACK);
       
   123             g2.fill(r);
       
   124             g2.setColor(YELLOW);
       
   125             g2.setStroke(new BasicStroke(1.5f));
       
   126             for (int j = r.y; j < r.y + r.height; j = j + 3) {
       
   127                 Line2D line = new Line2D.Float(r.x, j,
       
   128                         (r.x + r.width), j);
       
   129                 g2.draw(line);
       
   130             }
       
   131         } else if (clipType.equals("Image")) {
       
   132             g2.drawImage(img, r.x, r.y, r.width, r.height, null);
       
   133         } else if (clipType.equals("TP")) {
       
   134             g2.setPaint(texturePaint);
       
   135             g2.fill(r);
       
   136         } else if (clipType.equals("GP")) {
       
   137             g2.setPaint(new GradientPaint(0, 0, BLUE, w, h, YELLOW));
       
   138             g2.fill(r);
       
   139         } else if (clipType.equals("Text")) {
       
   140             g2.setColor(BLACK);
       
   141             g2.fill(shape.getBounds());
       
   142             g2.setColor(CYAN);
       
   143             f = new Font(Font.SERIF, Font.BOLD, 10);
       
   144             tl = new TextLayout("OpenJDK", f, frc);
       
   145             sw = tl.getBounds().getWidth();
       
   146 
       
   147             int x = r.x;
       
   148             int y = (int) (r.y + tl.getAscent());
       
   149             sh = r.y + r.height;
       
   150             while (y < sh) {
       
   151                 tl.draw(g2, x, y);
       
   152                 if ((x += (int) sw) > (r.x + r.width)) {
       
   153                     x = r.x;
       
   154                     y += (int) tl.getAscent();
       
   155                 }
       
   156             }
       
   157         }
       
   158         g2.setClip(new Rectangle(0, 0, w, h));
       
   159 
       
   160         g2.setColor(GRAY);
       
   161         g2.draw(shape);
       
   162     }
       
   163 
       
   164     public static void main(String s[]) {
       
   165         createDemoFrame(new Text());
       
   166     }
       
   167 
       
   168 
       
   169     @SuppressWarnings("serial")
       
   170     static final class DemoControls extends CustomControls implements
       
   171             ActionListener {
       
   172 
       
   173         Text demo;
       
   174         JToolBar toolbar;
       
   175 
       
   176         public DemoControls(Text demo) {
       
   177             super(demo.name);
       
   178             this.demo = demo;
       
   179             add(toolbar = new JToolBar());
       
   180             toolbar.setFloatable(false);
       
   181             addTool("Clip", true);
       
   182             addTool("Lines", true);
       
   183             addTool("Image", false);
       
   184             addTool("TP", false);
       
   185             addTool("GP", false);
       
   186             addTool("Text", false);
       
   187         }
       
   188 
       
   189         public void addTool(String str, boolean state) {
       
   190             JToggleButton b =
       
   191                     (JToggleButton) toolbar.add(new JToggleButton(str));
       
   192             b.setFocusPainted(false);
       
   193             b.setSelected(state);
       
   194             b.addActionListener(this);
       
   195             int width = b.getPreferredSize().width;
       
   196             Dimension prefSize = new Dimension(width, 21);
       
   197             b.setPreferredSize(prefSize);
       
   198             b.setMaximumSize(prefSize);
       
   199             b.setMinimumSize(prefSize);
       
   200         }
       
   201 
       
   202         @Override
       
   203         public void actionPerformed(ActionEvent e) {
       
   204             if (e.getSource().equals(toolbar.getComponentAtIndex(0))) {
       
   205                 JToggleButton b = (JToggleButton) e.getSource();
       
   206                 demo.doClip = b.isSelected();
       
   207             } else {
       
   208                 for (Component comp : toolbar.getComponents()) {
       
   209                     ((JToggleButton) comp).setSelected(false);
       
   210                 }
       
   211                 JToggleButton b = (JToggleButton) e.getSource();
       
   212                 b.setSelected(true);
       
   213                 demo.clipType = b.getText();
       
   214             }
       
   215             demo.repaint();
       
   216         }
       
   217 
       
   218         @Override
       
   219         public Dimension getPreferredSize() {
       
   220             return new Dimension(200, 40);
       
   221         }
       
   222 
       
   223         @Override
       
   224         @SuppressWarnings("SleepWhileHoldingLock")
       
   225         public void run() {
       
   226             try {
       
   227                 Thread.sleep(1111);
       
   228             } catch (Exception e) {
       
   229                 return;
       
   230             }
       
   231             Thread me = Thread.currentThread();
       
   232             while (thread == me) {
       
   233                 for (int i = 1; i < toolbar.getComponentCount() - 1; i++) {
       
   234                     ((AbstractButton) toolbar.getComponentAtIndex(i)).doClick();
       
   235                     try {
       
   236                         Thread.sleep(4444);
       
   237                     } catch (InterruptedException e) {
       
   238                         return;
       
   239                     }
       
   240                 }
       
   241             }
       
   242             thread = null;
       
   243         }
       
   244     } // End DemoControls
       
   245 } // End Text
       
   246