changeset 169:32b1c41e194a

Implement smooth scaling of buttons.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 02 Mar 2017 14:18:21 +0200
parents 159252f9480d
children b9bc493ae53c
files game/IDMButton.java
diffstat 1 files changed, 31 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/game/IDMButton.java	Thu Mar 02 12:30:19 2017 +0200
+++ b/game/IDMButton.java	Thu Mar 02 14:18:21 2017 +0200
@@ -16,7 +16,8 @@
 {
     enum State { FOCUSED, PRESSED, NORMAL }
     State state;
-    static BufferedImage imgUp, imgPressed;
+    static BufferedImage imgOrigUnpressed, imgOrigPressed;
+    static BufferedImage imgUnpressed, imgPressed;
     Font font;
     FontMetrics metrics;
     String text;
@@ -26,7 +27,8 @@
     {
         super(pos);
         loadImages();
-        setSize(imgUp.getWidth(), imgUp.getHeight());
+        setSize(imgOrigUnpressed.getWidth(), imgOrigUnpressed.getHeight());
+        setScale(1, 1);
 
         this.font = font;
         this.keyCode = keyCode;
@@ -43,16 +45,16 @@
 
     private static void loadImages()
     {
-        if (imgUp != null && imgPressed != null)
+        if (imgUnpressed != null && imgPressed != null)
             return;
 
         try
         {
             ResourceLoader res = new ResourceLoader("graphics/button1_up.png");
-            imgUp = ImageIO.read(res.getStream());
+            imgOrigUnpressed = ImageIO.read(res.getStream());
 
             res = new ResourceLoader("graphics/button1_down.png");
-            imgPressed = ImageIO.read(res.getStream());
+            imgOrigPressed = ImageIO.read(res.getStream());
         }
         catch (IOException e)
         {
@@ -60,8 +62,29 @@
         }
     }
 
-    public void scale()
+    public BufferedImage scaleImage(BufferedImage src)
     {
+        BufferedImage dst = new BufferedImage(getScaledWidth(), getScaledHeight(), BufferedImage.TYPE_INT_ARGB);
+        Graphics2D gimg = dst.createGraphics();
+
+        gimg.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                              RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+
+        gimg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                            RenderingHints.VALUE_ANTIALIAS_ON);
+
+        gimg.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
+                            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
+        gimg.drawImage(src, 0, 0, getScaledWidth(), getScaledHeight(), null);
+        return dst;
+    }
+
+    public void setScale(IDMPoint scale)
+    {
+        super.setScale(scale);
+        imgPressed    = scaleImage(imgOrigPressed);
+        imgUnpressed  = scaleImage(imgOrigUnpressed);
     }
 
     public void paint(Graphics2D g)
@@ -77,18 +100,14 @@
         else
         {
             xoffs = yoffs = 0;
-            img = imgUp;
+            img = imgUnpressed;
         }
 
         if (metrics == null)
             metrics = g.getFontMetrics(font);
 
         int textWidth = metrics.stringWidth(text);
-        g.drawImage(img,
-            getScaledX() + xoffs, getScaledY() + yoffs,
-            getScaledWidth(), getScaledHeight(),
-            null);
-
+        g.drawImage(img, getScaledX() + xoffs, getScaledY() + yoffs, null);
         g.setFont(font);
         g.setPaint(Color.black);
         g.drawString(text,