Author: lindner
Date: Thu Jun 18 21:35:05 2009
New Revision: 786296

URL: http://svn.apache.org/viewvc?rev=786296&view=rev
Log:
SHINDIG-1091 | Improve open proxy transparent and BGR image handling

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java?rev=786296&r1=786295&r2=786296&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
 Thu Jun 18 21:35:05 2009
@@ -17,9 +17,11 @@
  */
 package org.apache.shindig.gadgets.rewrite.image;
 
+import static java.awt.RenderingHints.KEY_INTERPOLATION;
+import static java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC;
 import static java.lang.Math.abs;
-import static java.lang.Math.min;
 import static java.lang.Math.max;
+import static java.lang.Math.min;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
@@ -36,9 +38,9 @@
 import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageIOOutputter;
 import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageOutputter;
 
+import java.awt.AlphaComposite;
 import java.awt.Color;
 import java.awt.Graphics2D;
-import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.Set;
@@ -269,32 +271,40 @@
       Integer requestedHeight, int extraWidth, int extraHeight) {
     int widthStretch = requestedWidth - extraWidth;
     int heightStretch = requestedHeight - extraHeight;
+    int imageType = ImageUtils.isOpaque(image)
+        ? BufferedImage.TYPE_3BYTE_BGR
+        : BufferedImage.TYPE_INT_ARGB;
+
     image = ImageUtils.getScaledInstance(image, widthStretch, heightStretch,
-        RenderingHints.VALUE_INTERPOLATION_BICUBIC, true /* higherQuality */);
+        VALUE_INTERPOLATION_BICUBIC, true /* higherQuality */, imageType);
 
     if (image.getWidth() != requestedWidth || image.getHeight() != 
requestedHeight) {
-      image = stretchImage(image, requestedWidth, requestedHeight);
+      image = stretchImage(image, requestedWidth, requestedHeight, imageType);
     }
     return image;
   }
 
   private BufferedImage stretchImage(BufferedImage image, Integer 
requestedWidth,
-      Integer requestedHeight) {
-    BufferedImage scaledImage = new BufferedImage(requestedWidth, 
requestedHeight,
-        BufferedImage.TYPE_INT_ARGB_PRE);
+      Integer requestedHeight, int imageType) {
+    BufferedImage scaledImage = new BufferedImage(requestedWidth, 
requestedHeight, imageType);
 
     Graphics2D g2d = scaledImage.createGraphics();
-    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
-        RenderingHints.VALUE_INTERPOLATION_BICUBIC);
-
-    g2d.setColor(COLOR_TRANSPARENT);
-    g2d.fillRect(0, 0, requestedWidth, requestedHeight);
+    g2d.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BICUBIC);
+    fillWithTransparent(g2d, requestedWidth, requestedHeight);
 
     g2d.drawImage(image, 0, 0, requestedWidth, requestedHeight, null);
     image = scaledImage;
     return image;
   }
 
+  private void fillWithTransparent(Graphics2D g2d, Integer requestedWidth,
+      Integer requestedHeight) {
+    g2d.setComposite(AlphaComposite.Clear);
+    g2d.setColor(COLOR_TRANSPARENT);
+    g2d.fillRect(0, 0, requestedWidth, requestedHeight);
+    g2d.setComposite(AlphaComposite.SrcOver);
+  }
+
   private HttpResponse getOptimizer(HttpResponse response, ImageFormat 
imageFormat,
       BufferedImage image) throws IOException {
 
@@ -353,8 +363,8 @@
     return pathExtMatches;
   }
 
-  private boolean isResizeRequired(Integer resize_w, Integer resize_h, 
ImageInfo imageInfo) {
-    return resize_w != imageInfo.getWidth() || resize_h != 
imageInfo.getWidth();
+  private boolean isResizeRequired(int resize_w, int resize_h, ImageInfo 
imageInfo) {
+    return resize_w != imageInfo.getWidth() || resize_h != 
imageInfo.getHeight();
   }
 
   /**

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java?rev=786296&r1=786295&r2=786296&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java
 Thu Jun 18 21:35:05 2009
@@ -152,8 +152,8 @@
       int targetWidth,
       int targetHeight,
       Object hint,
-      boolean higherQuality) {
-    int type = BufferedImage.TYPE_INT_RGB;
+      boolean higherQuality,
+      int imageType) {
     BufferedImage ret = img;
     int w, h;
     if (higherQuality) {
@@ -184,7 +184,7 @@
         }
       }
 
-      BufferedImage tmp = new BufferedImage(w, h, type);
+      BufferedImage tmp = new BufferedImage(w, h, imageType);
       Graphics2D g2 = tmp.createGraphics();
       g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
       g2.drawImage(ret, 0, 0, w, h, null);


Reply via email to