// BildMedTextRuta.java

// en klass som definierar en ruta med bild och text


/**********************************************************************

Klassen BildMedTextRuta definierar en ruta med bild och text.

Det går att precisera rutans dimensioner, bild, font och text, och
färger för rutan och texten. Även ramens tjocklek och färg kan anges.

**********************************************************************/


import java.awt.image.*; // BufferedImage
import java.awt.*;       // Graphics2D, BasicStroke, Color, Font, Shape,
                         // RenderingHints, AlphaComposite
import java.awt.geom.*;  // Rectangle2D, Rectangle2D.Double
import java.awt.geom.*;  // AffineTransform
import java.awt.font.*;  // FontRenderContext, TextLayout, LineMetrics


// en klass som definierar en ruta med bild och text
class BildMedTextRuta extends BufferedImage
{
	public BildMedTextRuta (
		int       w,              // rutans bredd
		int       h,              // rutans höjd
		BufferedImage    bild,    // bild
		Font      font,           // font i rutan
		String    text,           // text i rutan
		Color     rutaColor,      // färg för rutan
		Color     textColor,      // färg för texten
		int       ramTj,          // ramens tjocklek
		Color     ramColor)       // ramens färg
	{
		// skicka uppgifter om bildens dimensioner och typ
		// till superklassens konstruktor
		super (w, h, BufferedImage.TYPE_INT_ARGB);

        // verktyg att rita den här bilden
        Graphics2D    g = this.createGraphics ();

        // för att rita med hög kvalitet
        g.setRenderingHint (RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint (RenderingHints.KEY_COLOR_RENDERING,
                            RenderingHints.VALUE_COLOR_RENDER_QUALITY);


        // bakgrundsfärg
        Rectangle2D    bakgrund = new Rectangle2D.Double (0, 0, w, h);
        g.setPaint (rutaColor);
        g.fill (bakgrund);


        // rita bilden
        g.drawImage (bild, null, 0, 0);


        // lägg ramen runt rutan
        Rectangle2D    sida1 =
               new Rectangle2D.Double (0, 0, w, ramTj);
        Rectangle2D    sida2 =
               new Rectangle2D.Double (w - ramTj, 0, ramTj, h);
        Rectangle2D    sida3 =
               new Rectangle2D.Double (0, h - ramTj, w, ramTj);
        Rectangle2D    sida4 =
               new Rectangle2D.Double (0, 0, ramTj, h);
        g.setColor (ramColor);
        g.fill(sida1);
        g.fill(sida2);
        g.fill(sida3);
        g.fill(sida4);


        // representerar rutans text som en figur

        // representera texten som ett grafiskt objekt
        FontRenderContext    kontext = g.getFontRenderContext ();
        TextLayout    layout = new TextLayout (text, font, kontext);

		// omslutande rektangel för texten och dess dimensioner
		Rectangle2D    omslutandeRekt =
		                       font.getStringBounds (text, kontext);
		int    wText = (int) omslutandeRekt.getWidth ();
		int    hText = (int) omslutandeRekt.getHeight ();

		// för att beräkna den vertikala positionen av textens baslinje
        LineMetrics    metrik = font.getLineMetrics (text, kontext);

        // textens position (baslinjens vänstra ändpunkt)
        // (texten ska hamna mitt i rutan)
        AffineTransform    transform =
          AffineTransform.getTranslateInstance ((w - wText) / 2,
                           (h - hText) / 2 + metrik.getAscent ());

        // en figur (en Shape) som representerar texten i rutan
        Shape    figur = layout.getOutline (transform);


        // sätt att kombinera bilden och texten
        AlphaComposite    composite =
            AlphaComposite.getInstance (AlphaComposite.SRC_OVER, 0.6f);
        g.setComposite (composite);


        // rita texten
        g.setPaint (textColor);
        g.fill (figur);
        g.setPaint (Color.BLACK);
        g.setStroke (new BasicStroke (1));
        g.draw (figur);


        // släpp de resurser som den grafiska kontexten tar upp
        g.dispose ();
	}
}
