Kaydet (Commit) cfe658c2 authored tarafından Zolnai Tamás's avatar Zolnai Tamás

bnc#584721: invisible text because of wrong color (white)

Color::getColor() method uses some caching mechanism which
works wrong when the result depend on one of the input parameters.
So avoid caching in these cases.

Change-Id: Ifa9221e21e685715454de86d5cec09ff6c266307
üst cf86b343
...@@ -435,13 +435,10 @@ void Color::clearTransparence() ...@@ -435,13 +435,10 @@ void Color::clearTransparence()
sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr ) const sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr ) const
{ {
/* Special handling for theme style list placeholder colors (state const sal_Int32 nTempC1 = mnC1;
COLOR_PH), Color::getColor() may be called with different placeholder const sal_Int32 nTempC2 = mnC2;
colors in the nPhClr parameter. Therefore, the resolved color will not const sal_Int32 nTempC3 = mnC3;
be stored in this object, thus the state COLOR_FINAL will not be const ColorMode eTempMode = meMode;
reached and the transformation container will not be cleared, but the
original COLOR_PH state will be restored instead. */
bool bIsPh = false;
switch( meMode ) switch( meMode )
{ {
...@@ -454,7 +451,7 @@ sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr ...@@ -454,7 +451,7 @@ sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr
case COLOR_SCHEME: setResolvedRgb( rGraphicHelper.getSchemeColor( mnC1 ) ); break; case COLOR_SCHEME: setResolvedRgb( rGraphicHelper.getSchemeColor( mnC1 ) ); break;
case COLOR_PALETTE: setResolvedRgb( rGraphicHelper.getPaletteColor( mnC1 ) ); break; case COLOR_PALETTE: setResolvedRgb( rGraphicHelper.getPaletteColor( mnC1 ) ); break;
case COLOR_SYSTEM: setResolvedRgb( rGraphicHelper.getSystemColor( mnC1, mnC2 ) ); break; case COLOR_SYSTEM: setResolvedRgb( rGraphicHelper.getSystemColor( mnC1, mnC2 ) ); break;
case COLOR_PH: setResolvedRgb( nPhClr ); bIsPh = true; break; case COLOR_PH: setResolvedRgb( nPhClr ); break;
case COLOR_FINAL: return mnC1; case COLOR_FINAL: return mnC1;
} }
...@@ -590,10 +587,23 @@ sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr ...@@ -590,10 +587,23 @@ sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr
mnC1 = API_RGB_TRANSPARENT; mnC1 = API_RGB_TRANSPARENT;
} }
meMode = bIsPh ? COLOR_PH : COLOR_FINAL; sal_Int32 nRet = mnC1;
// Restore the original values when the color depends on one of the input
// parameters (rGraphicHelper or nPhClr)
if( eTempMode >= COLOR_SCHEME && eTempMode <= COLOR_PH )
{
mnC1 = nTempC1;
mnC2 = nTempC2;
mnC3 = nTempC3;
meMode = eTempMode;
}
else
{
meMode = COLOR_FINAL;
}
if( meMode == COLOR_FINAL ) if( meMode == COLOR_FINAL )
maTransforms.clear(); maTransforms.clear();
return mnC1; return nRet;
} }
bool Color::hasTransparency() const bool Color::hasTransparency() const
......
...@@ -83,6 +83,7 @@ public: ...@@ -83,6 +83,7 @@ public:
void testBnc584721_1(); void testBnc584721_1();
void testBnc584721_2(); void testBnc584721_2();
void testBnc584721_3(); void testBnc584721_3();
void testBnc584721_4();
CPPUNIT_TEST_SUITE(SdFiltersTest); CPPUNIT_TEST_SUITE(SdFiltersTest);
CPPUNIT_TEST(testDocumentLayout); CPPUNIT_TEST(testDocumentLayout);
...@@ -109,6 +110,7 @@ public: ...@@ -109,6 +110,7 @@ public:
CPPUNIT_TEST(testBnc584721_1); CPPUNIT_TEST(testBnc584721_1);
CPPUNIT_TEST(testBnc584721_2); CPPUNIT_TEST(testBnc584721_2);
CPPUNIT_TEST(testBnc584721_3); CPPUNIT_TEST(testBnc584721_3);
CPPUNIT_TEST(testBnc584721_4);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
}; };
...@@ -822,6 +824,45 @@ void SdFiltersTest::testBnc591147() ...@@ -822,6 +824,45 @@ void SdFiltersTest::testBnc591147()
xDocShRef->DoClose(); xDocShRef->DoClose();
} }
void SdFiltersTest::testBnc584721_4()
{
// Black text was imported as white because of wrong caching mechanism
::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("/sd/qa/unit/data/pptx/bnc584721_4.pptx"), PPTX);
uno::Reference< drawing::XDrawPagesSupplier > xDoc(
xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
uno::Reference< drawing::XDrawPage > xPage(
xDoc->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW );
uno::Reference< beans::XPropertySet > xShape(
xPage->getByIndex(1), uno::UNO_QUERY );
CPPUNIT_ASSERT_MESSAGE( "no text shape", xShape.is() );
// Get first paragraph of the text
uno::Reference<text::XText> xText = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY)->getText();
CPPUNIT_ASSERT_MESSAGE( "no text shape", xText.is() );
uno::Reference<container::XEnumerationAccess> paraEnumAccess;
paraEnumAccess.set(xText, uno::UNO_QUERY);
uno::Reference<container::XEnumeration> paraEnum = paraEnumAccess->createEnumeration();
uno::Reference<text::XTextRange> const xParagraph(paraEnum->nextElement(),
uno::UNO_QUERY_THROW);
// Get first run of the paragraph
uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParagraph, uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
uno::Reference<text::XTextRange> xRun(xRunEnum->nextElement(), uno::UNO_QUERY);
uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
sal_Int32 nCharColor;
xPropSet->getPropertyValue( "CharColor" ) >>= nCharColor;
// Color should be black
CPPUNIT_ASSERT_EQUAL( sal_Int32(COL_BLACK), nCharColor );
xDocShRef->DoClose();
}
CPPUNIT_TEST_SUITE_REGISTRATION(SdFiltersTest); CPPUNIT_TEST_SUITE_REGISTRATION(SdFiltersTest);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment