--- /dev/null 2018-05-11 11:35:07.000000000 -0700 +++ new/src/demo/share/jfc/J2Ddemo/java2d/demos/Arcs_Curves/Curves.java 2018-05-11 11:35:06.000000000 -0700 @@ -0,0 +1,142 @@ +/* + * + * 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.Arcs_Curves; + + +import java.awt.*; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.QuadCurve2D; +import java.awt.geom.CubicCurve2D; +import java.awt.geom.PathIterator; +import java.awt.geom.FlatteningPathIterator; +import java.awt.font.TextLayout; +import java.awt.font.FontRenderContext; +import java2d.Surface; +import static java.awt.Color.*; +import static java.awt.geom.PathIterator.*; + + +/** + * CubicCurve2D & QuadCurve2D curves includes FlattenPathIterator example. + */ +@SuppressWarnings("serial") +public class Curves extends Surface { + + private static Color colors[] = { BLUE, GREEN, RED }; + + public Curves() { + setBackground(WHITE); + } + + @Override + public void render(int w, int h, Graphics2D g2) { + + g2.setColor(BLACK); + FontRenderContext frc = g2.getFontRenderContext(); + TextLayout tl = new TextLayout("QuadCurve2D", g2.getFont(), frc); + float xx = (float) (w * .5 - tl.getBounds().getWidth() / 2); + tl.draw(g2, xx, tl.getAscent()); + + tl = new TextLayout("CubicCurve2D", g2.getFont(), frc); + xx = (float) (w * .5 - tl.getBounds().getWidth() / 2); + tl.draw(g2, xx, h * .5f); + g2.setStroke(new BasicStroke(5.0f)); + + float yy = 20; + + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 3; j++) { + Shape shape = null; + + if (i == 0) { + shape = new QuadCurve2D.Float(w * .1f, yy, w * .5f, 50, w + * .9f, yy); + } else { + shape = new CubicCurve2D.Float(w * .1f, yy, w * .4f, yy - 15, + w * .6f, yy + 15, w * .9f, yy); + } + g2.setColor(colors[j]); + if (j != 2) { + g2.draw(shape); + } + + if (j == 1) { + g2.setColor(LIGHT_GRAY); + PathIterator f = shape.getPathIterator(null); + while (!f.isDone()) { + float[] pts = new float[6]; + switch (f.currentSegment(pts)) { + case SEG_MOVETO: + case SEG_LINETO: + g2.fill(new Rectangle2D.Float(pts[0], pts[1], 5, + 5)); + break; + case SEG_CUBICTO: + case SEG_QUADTO: + g2.fill(new Rectangle2D.Float(pts[0], pts[1], 5, + 5)); + if (pts[2] != 0) { + g2.fill(new Rectangle2D.Float(pts[2], pts[3], + 5, 5)); + } + if (pts[4] != 0) { + g2.fill(new Rectangle2D.Float(pts[4], pts[5], + 5, 5)); + } + } + f.next(); + } + } else if (j == 2) { + PathIterator p = shape.getPathIterator(null); + FlatteningPathIterator f = + new FlatteningPathIterator(p, 0.1); + while (!f.isDone()) { + float[] pts = new float[6]; + switch (f.currentSegment(pts)) { + case SEG_MOVETO: + case SEG_LINETO: + g2.fill(new Ellipse2D.Float(pts[0], pts[1], 3, 3)); + } + f.next(); + } + } + yy += h / 6; + } + yy = h / 2 + 15; + } + } + + public static void main(String argv[]) { + createDemoFrame(new Curves()); + } +}