Author: jkuhnert
Date: Thu Aug 16 13:38:00 2007
New Revision: 566836
URL: http://svn.apache.org/viewvc?view=rev&rev=566836
Log:
Fixes TAPESTRY-1706.
GIF formats aren't supported in the sun jre until version 1.6 so refactored to
iterate over the supported formats of the running jre to fall back to jpeg when
gif isn't available.
Modified:
tapestry/tapestry4/trunk/tapestry-contrib/src/descriptor/META-INF/hivemodule.xml
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerGenerator.java
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerService.java
Modified:
tapestry/tapestry4/trunk/tapestry-contrib/src/descriptor/META-INF/hivemodule.xml
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-contrib/src/descriptor/META-INF/hivemodule.xml?view=diff&rev=566836&r1=566835&r2=566836
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-contrib/src/descriptor/META-INF/hivemodule.xml
(original)
+++
tapestry/tapestry4/trunk/tapestry-contrib/src/descriptor/META-INF/hivemodule.xml
Thu Aug 16 13:38:00 2007
@@ -62,7 +62,8 @@
<service-point id="RoundedCornerService"
interface="org.apache.tapestry.engine.IEngineService">
<invoke-factory>
- <construct
class="org.apache.tapestry.contrib.services.impl.RoundedCornerService" >
+ <construct
class="org.apache.tapestry.contrib.services.impl.RoundedCornerService"
+ initialize-method="initialize">
<set-object property="exceptionReporter"
value="infrastructure:requestExceptionReporter"/>
<set-object property="response"
value="infrastructure:response"/>
<set-object property="linkFactory"
value="infrastructure:linkFactory"/>
Modified:
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerGenerator.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerGenerator.java?view=diff&rev=566836&r1=566835&r2=566836
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerGenerator.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerGenerator.java
Thu Aug 16 13:38:00 2007
@@ -61,7 +61,7 @@
public BufferedImage buildCorner(String color, String backgroundColor, int
width, int height,
String angle, int shadowWidth, float
endOpacity)
- throws Exception
+ throws Exception
{
width = width * 2;
height = height * 2;
@@ -75,17 +75,17 @@
Arc2D.Float arcArea = new Arc2D.Float(0, 0, width, height,
startAngle, 90, Arc2D.PIE);
if (bgColor != null) {
-
+
ret = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D)ret.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
-
+
g2.setColor(bgColor);
g2.fill(arcArea.getBounds2D());
g2.drawImage(arc, 0, 0, null);
-
+
g2.dispose();
ret = convertType(ret, BufferedImage.TYPE_INT_RGB);
@@ -139,7 +139,7 @@
g2.drawImage(arc, 0, 0, null);
return convertType(ret,
BufferedImage.TYPE_INT_RGB).getSubimage((int)arcArea.getBounds2D().getX(),
(int)arcArea.getBounds2D().getY(),
- (int)arcArea.getBounds2D().getWidth(),
(int)arcArea.getBounds2D().getHeight());
+
(int)arcArea.getBounds2D().getWidth(), (int)arcArea.getBounds2D().getHeight());
}
static BufferedImage convertType(BufferedImage image, int type) {
@@ -183,9 +183,9 @@
startX -= shadowSize;
startY += shadowSize;
-
+
} else if (startAngle == ANGLE_BOTTOM_RIGHT) {
-
+
startX -= shadowSize;
startY -= shadowSize;
}
@@ -196,13 +196,13 @@
float extent = 90;
if (masking) {
-
+
extent = 120;
startAngle -= 20;
}
-
+
Arc2D.Float fillArea = new Arc2D.Float(startX, startY, width, height,
startAngle, extent, Arc2D.PIE);
-
+
// draw arc
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
@@ -257,7 +257,7 @@
BufferedImage img = new BufferedImage( (width * 4), (height * 4),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) img.createGraphics();
-
+
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setComposite(AlphaComposite.Src);
g2.drawImage(dropShadow, 0, 0, null);
@@ -278,7 +278,7 @@
Graphics2D g2 = mask.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
-
+
RoundRectangle2D.Float fillArea = new RoundRectangle2D.Float(0, 0,
width, height, arcHeight, arcWidth);
g2.setColor(fgColor);
g2.fill(fillArea);
@@ -299,7 +299,7 @@
g2.setClip(clip);
g2.drawImage(dropShadow, 0, 0, null);
g2.dispose();
-
+
// draw everything
BufferedImage img = new BufferedImage( width + (shadowWidth * 2),
height + (shadowWidth * 2), BufferedImage.TYPE_INT_ARGB);
@@ -328,10 +328,10 @@
}
public BufferedImage buildSideShadow(String side, int size, float opacity)
- throws Exception
+ throws Exception
{
Defense.notNull(side, "side");
-
+
if (opacity <= 0)
opacity = DEFAULT_OPACITY;
@@ -350,7 +350,7 @@
sampleWidth = size * 2;
sampleHeight = 2;
} else if (RIGHT.equals(side)) {
-
+
maskWidth = size * 4;
maskHeight = size * 4;
sampleY = maskHeight / 2;
@@ -374,7 +374,7 @@
sampleWidth = 2;
sampleHeight = size * 2;
}
-
+
BufferedImage mask = new BufferedImage( maskWidth, maskHeight,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) mask.createGraphics();
@@ -390,12 +390,12 @@
g2 = (Graphics2D)render.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
-
+
Rectangle2D.Float clip = new Rectangle2D.Float(sampleX, sampleY,
sampleWidth, sampleHeight);
g2.setColor(Color.white);
g2.fill(clip);
-
+
g2.drawImage(dropShadow, 0, 0, null);
g2.dispose();
@@ -427,7 +427,7 @@
/**
* Decodes the specified input color string into a compatible awt color
object. Valid inputs
* are any in the css2 color spec or hex strings.
- *
+ *
* @param color The color to match.
* @return The decoded color object, may be black if decoding fails.
*/
@@ -438,7 +438,7 @@
return specColor;
String hexColor = color.startsWith("0x") ? color : "0x" + color;
-
+
return Color.decode(hexColor);
}
}
Modified:
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerService.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerService.java?view=diff&rev=566836&r1=566835&r2=566836
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerService.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-contrib/src/java/org/apache/tapestry/contrib/services/impl/RoundedCornerService.java
Thu Aug 16 13:38:00 2007
@@ -62,6 +62,30 @@
private Log _log;
+ /** The ImageIO format name to encode images in that don't need alpha
transparency */
+ private String _nonTransparentFormatName = "gif";
+
+ public void initialize()
+ {
+ String[] names = ImageIO.getWriterFormatNames();
+
+ boolean supportsGif = false;
+
+ for (int i=0; i < names.length; i++)
+ {
+ if (names[i].toLowerCase().equals("gif"))
+ {
+ supportsGif = true;
+ break;
+ }
+ }
+
+ if (!supportsGif)
+ {
+ _nonTransparentFormatName = "jpeg";
+ }
+ }
+
public ILink getLink(boolean post, Object parameter)
{
Defense.notNull(parameter, "parameter");
@@ -105,7 +129,7 @@
try {
- String type = (bgColor != null) ? "gif" : "png";
+ String type = (bgColor != null) ? _nonTransparentFormatName :
"png";
byte[] data = (byte[])_imageCache.get(hashKey);
if (data != null)
@@ -129,13 +153,13 @@
bo = new ByteArrayOutputStream();
- ImageIO.write(image, type, bo);
+ boolean success = ImageIO.write(image, type, bo);
data = bo.toByteArray();
- if (data == null || data.length < 1)
+ if (!success || data == null || data.length < 1)
{
- _log.error("Image generated had zero length byte array from
parameters of:\n"
+ _log.error("Image generated had zero length byte array or
failed to convert from parameters of:\n"
+ "[color:" + color + ", bgColor:" + bgColor
+ ", width:" + width + ", height:" + height
+ ", angle:" + angle + ", shadowWidth:" +
shadowWidth