]> source.dussan.org Git - poi.git/commitdiff
Hopefully fix bug #51236 - make the xssf colour black/white 3 rgb fix apply for set...
authorNick Burch <nick@apache.org>
Mon, 23 May 2011 19:55:00 +0000 (19:55 +0000)
committerNick Burch <nick@apache.org>
Mon, 23 May 2011 19:55:00 +0000 (19:55 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1126696 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFColor.java

index 2c3ab3fc6f064480d0c583ab2e133cfc08b9475d..cd9a6ede285ac8ca525f781741b794e9281a9df4 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta3" date="2011-??-??">
+           <action dev="poi-developers" type="fix">51236 - XSSF set colour support for black/white to match getter</action>
            <action dev="poi-developers" type="add">51196 - Initial support for Spreadsheet Chart API</action>
            <action dev="poi-developers" type="add">Add support for OOXML Agile Encryption</action>
            <action dev="poi-developers" type="add">51160 - Initial version of SXSSF, a low memory foortprint API to produce xlsx files</action>
index 562837157a93e8af91c4ce52b2adcdb3e47c6ef7..61ed79a325b819e504a2f11cec79a4a1a0f03c0f 100644 (file)
@@ -87,7 +87,8 @@ public class ThemesTable extends POIXMLDocumentPart {
        // Get the theme colour
        XSSFColor themeColor = getThemeColor(color.getTheme());
        // Set the raw colour, not the adjusted one
-       color.setRgb(themeColor.getCTColor().getRgb());
+       // Do a raw set, no adjusting at the XSSFColor layer either
+       color.getCTColor().setRgb(themeColor.getCTColor().getRgb());
        
        // All done
     }
index 46b2ef2361021982bb123b6a39cbc1a23b49175c..b15eaa55bab9f7652b340ed7d6151aa0d45249f1 100644 (file)
@@ -79,6 +79,27 @@ public class XSSFColor implements Color {
        public void setIndexed(int indexed) {
                ctColor.setIndexed(indexed);
        }
+       
+       /**
+    * For RGB colours, but not ARGB (we think...)
+    * Excel gets black and white the wrong way around, so switch them 
+        */
+       private byte[] correctRGB(byte[] rgb) {
+          if(rgb.length == 4) {
+             // Excel doesn't appear to get these wrong
+             // Nothing to change
+             return rgb;
+          } else {
+         // Excel gets black and white the wrong way around, so switch them 
+         if (rgb[0] == 0 && rgb[1] == 0 && rgb[2] == 0) {
+            rgb = new byte[] {-1, -1, -1};
+         }
+         else if (rgb[0] == -1 && rgb[1] == -1 && rgb[2] == -1) {
+            rgb = new byte[] {0, 0, 0};
+         }
+         return rgb;
+          }
+       }
 
    /**
     * Standard Red Green Blue ctColor value (RGB).
@@ -138,20 +159,8 @@ public class XSSFColor implements Color {
          // Grab the colour
          rgb = ctColor.getRgb();
 
-         if(rgb.length == 4) {
-            // Good to go, return it as-is
-            return rgb;
-         }
-         
-         // For RGB colours, but not ARGB (we think...)
-         // Excel gets black and white the wrong way around, so switch them 
-         if (rgb[0] == 0 && rgb[1] == 0 && rgb[2] == 0) {
-            rgb = new byte[] {-1, -1, -1};
-         }
-         else if (rgb[0] == -1 && rgb[1] == -1 && rgb[2] == -1) {
-            rgb = new byte[] {0, 0, 0};
-         }
-         return rgb;
+         // Correct it as needed, and return
+         return correctRGB(rgb);
     }
 
     /**
@@ -211,9 +220,10 @@ public class XSSFColor implements Color {
      * Standard Alpha Red Green Blue ctColor value (ARGB).
      */
        public void setRgb(byte[] rgb) {
-               ctColor.setRgb(rgb);
+          // Correct it and save
+               ctColor.setRgb(correctRGB(rgb));
        }
-
+       
     /**
      * Index into the <clrScheme> collection, referencing a particular <sysClr> or
      *  <srgbClr> value expressed in the Theme part.
index 60dfb4f97d87762aaf50a14ee01debe4b53e6ddc..b2aa11447b32b1f957a0b8e6d549422419a60d81 100644 (file)
@@ -97,6 +97,21 @@ public final class TestXSSFColor extends TestCase {
       assertEquals(0, rgb3.getRgbWithTint()[0]);
       assertEquals(0,  rgb3.getRgbWithTint()[1]);
       assertEquals(0,  rgb3.getRgbWithTint()[2]);
+      
+      // Set the colour to black, will get translated internally
+      // (Excel stores 3 colour white and black wrong!)
+      rgb3.setRgb(new byte[] {-1,-1,-1});
+      assertEquals("FFFFFFFF", rgb3.getARGBHex());
+      assertEquals(0, rgb3.getCTColor().getRgb()[0]);
+      assertEquals(0, rgb3.getCTColor().getRgb()[1]);
+      assertEquals(0, rgb3.getCTColor().getRgb()[2]);
+      
+      // Set another, is fine
+      rgb3.setRgb(new byte[] {16,17,18});
+      assertEquals("FF101112", rgb3.getARGBHex());
+      assertEquals(0x10, rgb3.getCTColor().getRgb()[0]);
+      assertEquals(0x11, rgb3.getCTColor().getRgb()[1]);
+      assertEquals(0x12, rgb3.getCTColor().getRgb()[2]);
    }
    
    public void testARGBColour() throws Exception {