/*
 * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.text.*;

/* @test
 * @summary verify TextLine advance
 * @bug 6582460
 */

/*
 Sample correct output:
Left-to-right (One style): Advance = 127.30078, Visible advance = 118.30078
Right-to-left (One style): Advance = 127.30078, Visible advance = 118.30078
Left-to-right (Multiple styles): Advance = 127.30078, Visible advance = 118.30078
Right-to-left (Multiple styles): Advance = 127.30078, Visible advance = 118.30078
*/

public class VisibleAdvance
{
    public static void main (String [] args)
    {
        System.out.println ("java.version = " + System.getProperty ("java.version"));

        float advances[] = null;
        advances = showAndCalculateAdvance ("Left-to-right (One style): ", getString (TextAttribute.RUN_DIRECTION_LTR, false), advances);
        advances = showAndCalculateAdvance ("Right-to-left (One style): ", getString (TextAttribute.RUN_DIRECTION_RTL, false), advances);

        advances = showAndCalculateAdvance ("Left-to-right (Multiple styles): ", getString (TextAttribute.RUN_DIRECTION_LTR, true), advances);
        advances = showAndCalculateAdvance ("Right-to-left (Multiple styles): ", getString (TextAttribute.RUN_DIRECTION_RTL, true), advances);
    }

    private static final String textA = "Text with trailing ";
    private static final String textB = "spaces";
    private static final String textC = "   ";
    private static final String text = textA + textB + textC;

    private static final int startOfTextB = textA.length ();
    private static final int endOfTextB = startOfTextB + textB.length ();

    private static final Font font = new Font ("Serif", Font.PLAIN, 12);

    private static AttributedString getString (Boolean direction,
                                               boolean multipleStyles)
    {
        AttributedString as = new AttributedString (text);
        as.addAttribute (TextAttribute.FONT, font);
        as.addAttribute (TextAttribute.RUN_DIRECTION, direction);

        if (multipleStyles)
            as.addAttribute (TextAttribute.FOREGROUND, Color.RED, startOfTextB, endOfTextB);

        return as;
    }

    private static FontRenderContext fontRenderContext =
        new FontRenderContext (new AffineTransform (), true, true);

    /*
     * @param advances on input,  null or float[2]. On output:  { advance, visibleAdvance }
     * @param return new float array
     */
    private static float[] showAndCalculateAdvance (String what,
                                     AttributedString as,
                                     float advances[])
    {
        TextLayout layout = new TextLayout (as.getIterator (), fontRenderContext);

        System.out.println (what + "Advance = " + layout.getAdvance () +
                            ", Visible advance = " + layout.getVisibleAdvance ());
        float advance = layout.getAdvance();
        float visAdvance = layout.getVisibleAdvance();
        if(advances == null) {
           advances = new float[2];
        } else if( Float.compare(advances[0],advance)!=0 || Float.compare(advances[1],visAdvance)!=0) {
                throw new RuntimeException("MISMATCH in advance.. " + what + "Advance = " + layout.getAdvance () +
                            ", Visible advance = " + layout.getVisibleAdvance () + ", previous values were: ["+advances[0]+","+advances[1]+"]");
        }
        advances[0] = advance;
        advances[1] = visAdvance;
        return advances;
    }
}
