From acdf2ec9815fd01d9a9b9db3752fc70dd3914059 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 30 Jan 2023 12:19:24 +0000 Subject: [PATCH] Bug 62272: Include alpha/transparency value when setting a color-value for a font Use method with returns 4 bytes to use an ARGB value instead of only RGB git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1907105 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFFont.java | 17 ++---- .../poi/xssf/usermodel/TestXSSFFont.java | 52 ++++++++++++++++++ test-data/spreadsheet/62272.xlsx | Bin 0 -> 4966 bytes 3 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 test-data/spreadsheet/62272.xlsx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFont.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFont.java index 0f97f6e4af..41e903907b 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFont.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFont.java @@ -392,17 +392,10 @@ public class XSSFFont implements Font { @Override public void setColor(short color) { CTColor ctColor = _ctFont.sizeOfColorArray() == 0 ? _ctFont.addNewColor() : _ctFont.getColorArray(0); - switch (color) { - case Font.COLOR_NORMAL: { - ctColor.setIndexed(XSSFFont.DEFAULT_FONT_COLOR); - break; - } - case Font.COLOR_RED: { - ctColor.setIndexed(IndexedColors.RED.getIndex()); - break; - } - default: - ctColor.setIndexed(color); + if (color == Font.COLOR_NORMAL) { + ctColor.setIndexed(XSSFFont.DEFAULT_FONT_COLOR); + } else { + ctColor.setIndexed(color); } } @@ -418,7 +411,7 @@ public class XSSFFont implements Font { if (ctColor.isSetIndexed()) { ctColor.unsetIndexed(); } - ctColor.setRgb(color.getRGB()); + ctColor.setRgb(color.getARGB()); } } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFont.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFont.java index 9553d595bb..35bcd75f00 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFont.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFont.java @@ -21,16 +21,20 @@ import static org.apache.poi.ss.usermodel.FontCharset.*; import static org.junit.jupiter.api.Assertions.*; import java.io.IOException; +import java.util.Arrays; import java.util.stream.Stream; import org.apache.poi.common.usermodel.fonts.FontCharset; import org.apache.poi.ooxml.POIXMLException; import org.apache.poi.ss.usermodel.BaseTestFont; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.FontFamily; import org.apache.poi.ss.usermodel.FontScheme; import org.apache.poi.ss.usermodel.FontUnderline; import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.SheetUtil; import org.apache.poi.util.LocaleUtil; @@ -495,4 +499,52 @@ public final class TestXSSFFont extends BaseTestFont { notequ.setThemeColor((short)123); assertNotEquals(font, notequ); } + + @Test + public void testBug62272() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("62272.xlsx")) { + // make sure we read the font-color with alpha + checkFontColor(wb); + } + } + + @Test + public void testBug62272a() throws IOException { + try (XSSFWorkbook wb = new XSSFWorkbook()) { + Sheet sheet = wb.createSheet("test"); + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + + // create a font with alpha + XSSFFont font = wb.createFont(); + font.setColor(new XSSFColor(new byte[] { + 0x7f, 0x33, (byte)0xCC, 0x66 + })); + + XSSFCellStyle style = wb.createCellStyle(); + style.setFont(font); + + cell.setCellStyle(style); + cell.setCellValue("testtext"); + + // make sure the alpha-value was stored properly + checkFontColor(wb); + + /*try (OutputStream out = new FileOutputStream("/tmp/testout.xlsx")) { + wb.write(out); + }*/ + } + } + + private static void checkFontColor(Workbook wb) { + int fontIdx = wb.getSheetAt(0).getRow(0).getCell(0).getCellStyle().getFontIndex(); + Font font = wb.getFontAt(fontIdx); + //System.out.println(font.getColor()); + + CTColor[] colorArray = ((XSSFFont) font).getCTFont().getColorArray(); + //System.out.println(Arrays.toString(colorArray)); + assertArrayEquals(new byte[] { + 0x7f, 0x33, (byte)0xCC, 0x66 + }, colorArray[0].getRgb()); + } } diff --git a/test-data/spreadsheet/62272.xlsx b/test-data/spreadsheet/62272.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9b91105c06f5ef48ce7fa60fa768f9bc91e39cf3 GIT binary patch literal 4966 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 literal 0 HcmV?d00001