sc: use ComplexColor for font color (+others) in OOXML export

Change-Id: I2544c7ece152323d84faafe1a544e4f89ca466d5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152014
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
This commit is contained in:
Tomaž Vajngerl 2023-05-19 23:01:58 +09:00 committed by Tomaž Vajngerl
parent ba29922dcc
commit 7501f89282
19 changed files with 180 additions and 132 deletions

View file

@ -133,13 +133,19 @@ public:
meType = ColorType::CRGB;
}
void setColor(Color const& rColor)
{
mnComponent1 = rColor.GetRed();
mnComponent2 = rColor.GetGreen();
mnComponent3 = rColor.GetBlue();
maFinalColor = rColor;
meType = ColorType::RGB;
}
void setRGB(sal_Int32 nRGB)
{
::Color aColor(ColorTransparency, nRGB);
mnComponent1 = aColor.GetRed();
mnComponent2 = aColor.GetGreen();
mnComponent3 = aColor.GetBlue();
meType = ColorType::RGB;
setColor(aColor);
}
void setHSL(sal_Int32 nH, sal_Int32 nS, sal_Int32 nL)

View file

@ -45,6 +45,7 @@ $(eval $(call gb_Library_use_libraries,scqahelper,\
comphelper \
cppu \
cppuhelper \
docmodel \
editeng \
for \
sal \

View file

@ -30,6 +30,7 @@
#include "fonthelper.hxx"
namespace vcl { class Font; }
namespace model { class ComplexColor; }
class OutputDevice;
class Fraction;
class ScStyleSheet;
@ -107,19 +108,23 @@ public:
SvtScriptType nScript = SvtScriptType::NONE, const Color* pBackConfigColor = nullptr,
const Color* pTextConfigColor = nullptr);
static void fillColor(Color& rColor, const SfxItemSet& rItemSet, ScAutoFontColorMode eAutoMode, const SfxItemSet* pCondSet = nullptr,
const Color* pBackConfigColor = nullptr, const Color* pTextConfigColor = nullptr);
static void fillColor(model::ComplexColor& rComplexColor,
const SfxItemSet& rItemSet,
ScAutoFontColorMode eAutoMode,
const SfxItemSet* pCondSet = nullptr,
const Color* pBackConfigColor = nullptr,
const Color* pTextConfigColor = nullptr);
static ScDxfFont GetDxfFont(const SfxItemSet& rSet, SvtScriptType nScript);
void fillColor(Color& rColor,
void fillColor(model::ComplexColor& rComplexColor,
ScAutoFontColorMode eAutoMode,
const SfxItemSet* pCondSet = nullptr,
const Color* pBackConfigColor = nullptr,
const Color* pTextConfigColor = nullptr) const
{
fillColor(rColor, GetItemSet(), eAutoMode, pCondSet, pBackConfigColor, pTextConfigColor);
fillColor(rComplexColor, GetItemSet(), eAutoMode, pCondSet, pBackConfigColor, pTextConfigColor);
}
void fillFontOnly(vcl::Font& rFont,

View file

@ -177,12 +177,12 @@ void ScModelTestBase::testFormats(ScDocument* pDoc,std::u16string_view sFormat)
//test Sheet2
const ScPatternAttr* pPattern = pDoc->GetPattern(0, 0, 1);
vcl::Font aFont;
Color aColor;
model::ComplexColor aComplexColor;
pPattern->fillFontOnly(aFont);
pPattern->fillColor(aColor, ScAutoFontColorMode::Raw);
pPattern->fillColor(aComplexColor, ScAutoFontColorMode::Raw);
CPPUNIT_ASSERT_EQUAL_MESSAGE("font size should be 10", tools::Long(200), aFont.GetFontSize().getHeight());
CPPUNIT_ASSERT_EQUAL_MESSAGE("font color should be black", COL_AUTO, aColor);
CPPUNIT_ASSERT_EQUAL_MESSAGE("font color should be black", COL_AUTO, aComplexColor.getFinalColor());
pPattern = pDoc->GetPattern(0,1,1);
pPattern->fillFontOnly(aFont);
CPPUNIT_ASSERT_EQUAL_MESSAGE("font size should be 12", tools::Long(240), aFont.GetFontSize().getHeight());
@ -194,8 +194,8 @@ void ScModelTestBase::testFormats(ScDocument* pDoc,std::u16string_view sFormat)
CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be bold", WEIGHT_BOLD, aFont.GetWeight());
pPattern = pDoc->GetPattern(1,0,1);
pPattern->fillFontOnly(aFont);
pPattern->fillColor(aColor, ScAutoFontColorMode::Raw);
CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be blue", COL_BLUE, aColor);
pPattern->fillColor(aComplexColor, ScAutoFontColorMode::Raw);
CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be blue", COL_BLUE, aComplexColor.getFinalColor());
pPattern = pDoc->GetPattern(1,1,1);
pPattern->fillFontOnly(aFont);
CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be striked out with a single line", STRIKEOUT_SINGLE, aFont.GetStrikeout());
@ -227,7 +227,7 @@ void ScModelTestBase::testFormats(ScDocument* pDoc,std::u16string_view sFormat)
CPPUNIT_ASSERT_EQUAL( aKnownGoodStr, aTestStr );
}
pPattern = pDoc->GetPattern(1,4,1);
aColor = pPattern->GetItem(ATTR_BACKGROUND).GetColor();
Color aColor = pPattern->GetItem(ATTR_BACKGROUND).GetColor();
CPPUNIT_ASSERT_EQUAL_MESSAGE("background color should be green", COL_LIGHTGREEN, aColor);
pPattern = pDoc->GetPattern(2,0,1);
SvxCellHorJustify eHorJustify = pPattern->GetItem(ATTR_HOR_JUSTIFY).GetValue();

View file

@ -253,14 +253,14 @@ void ScPatternAttr::fillFont(
const SfxItemSet* pCondSet, SvtScriptType nScript,
const Color* pBackConfigColor, const Color* pTextConfigColor)
{
Color aColor;
model::ComplexColor aComplexColor;
// determine effective font color
ScPatternAttr::fillFontOnly(rFont, rItemSet, pOutDev, pScale, pCondSet, nScript);
ScPatternAttr::fillColor(aColor, rItemSet, eAutoMode, pCondSet, pBackConfigColor, pTextConfigColor);
ScPatternAttr::fillColor(aComplexColor, rItemSet, eAutoMode, pCondSet, pBackConfigColor, pTextConfigColor);
// set font effects
rFont.SetColor(aColor);
rFont.SetColor(aComplexColor.getFinalColor());
}
void ScPatternAttr::fillFontOnly(
@ -432,9 +432,11 @@ void ScPatternAttr::fillFontOnly(
rFont.SetTransparent( true );
}
void ScPatternAttr::fillColor(Color& rColor, const SfxItemSet& rItemSet, ScAutoFontColorMode eAutoMode, const SfxItemSet* pCondSet, const Color* pBackConfigColor, const Color* pTextConfigColor)
void ScPatternAttr::fillColor(model::ComplexColor& rComplexColor, const SfxItemSet& rItemSet, ScAutoFontColorMode eAutoMode, const SfxItemSet* pCondSet, const Color* pBackConfigColor, const Color* pTextConfigColor)
{
Color aColor = COL_TRANSPARENT;
model::ComplexColor aComplexColor;
Color aColor;
SvxColorItem const* pColorItem = nullptr;
@ -445,15 +447,24 @@ void ScPatternAttr::fillColor(Color& rColor, const SfxItemSet& rItemSet, ScAutoF
pColorItem = &rItemSet.Get(ATTR_FONT_COLOR);
if (pColorItem)
{
aComplexColor = pColorItem->getComplexColor();
aColor = pColorItem->GetValue();
}
if (aComplexColor.getType() == model::ColorType::Unused)
{
aComplexColor.setColor(aColor);
}
if ((aColor == COL_AUTO && eAutoMode != ScAutoFontColorMode::Raw)
|| eAutoMode == ScAutoFontColorMode::IgnoreFont
|| eAutoMode == ScAutoFontColorMode::IgnoreAll)
{
if ( eAutoMode == ScAutoFontColorMode::Black )
if (eAutoMode == ScAutoFontColorMode::Black)
{
aColor = COL_BLACK;
}
else
{
// get background color from conditional or own set
@ -503,9 +514,11 @@ void ScPatternAttr::fillColor(Color& rColor, const SfxItemSet& rItemSet, ScAutoF
// get system text color for comparison
Color aSysTextColor;
if ( eAutoMode == ScAutoFontColorMode::Print )
if (eAutoMode == ScAutoFontColorMode::Print)
{
aSysTextColor = COL_BLACK;
else if ( pTextConfigColor )
}
else if (pTextConfigColor)
{
// pTextConfigColor can be used to avoid repeated lookup of the configured color
aSysTextColor = *pTextConfigColor;
@ -533,8 +546,8 @@ void ScPatternAttr::fillColor(Color& rColor, const SfxItemSet& rItemSet, ScAutoF
}
}
}
rColor = aColor;
aComplexColor.setFinalColor(aColor);
rComplexColor = aComplexColor;
}
ScDxfFont ScPatternAttr::GetDxfFont(const SfxItemSet& rItemSet, SvtScriptType nScript)

View file

@ -801,7 +801,7 @@ void XclExpAutofilter::AddColorEntry(const ScQueryEntry& rEntry)
// Ensure that selected color(s) will be added to dxf: selection can be not in list
// of already added to dfx colors taken from filter range
if (GetDxfs().GetDxfByColor(rItem.maColor) == -1)
GetDxfs().AddColor(rItem.maColor);
GetDxfs().addColor(rItem.maColor);
}
}

View file

@ -1130,8 +1130,8 @@ void XclExpChFontBase::ConvertFontBase( const XclExpChRoot& rRoot, sal_uInt16 nF
{
if( const XclExpFont* pFont = rRoot.GetFontBuffer().GetFont( nFontIdx ) )
{
XclExpChFontRef xFont = new XclExpChFont( nFontIdx );
SetFont( xFont, pFont->GetFontData().maColor, pFont->GetFontColorId() );
XclExpChFontRef xFont = new XclExpChFont(nFontIdx);
SetFont(xFont, pFont->GetFontData().maComplexColor, pFont->GetFontColorId());
}
}
@ -1152,11 +1152,11 @@ XclExpChText::XclExpChText( const XclExpChRoot& rRoot ) :
{
}
void XclExpChText::SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId )
void XclExpChText::SetFont( XclExpChFontRef xFont, model::ComplexColor const& rComplexColor, sal_uInt32 nColorId )
{
mxFont = xFont;
maData.maTextColor = rColor;
::set_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, rColor == COL_AUTO );
maData.maTextComplexColor = rComplexColor;
::set_flag(maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, rComplexColor.getFinalColor() == COL_AUTO);
mnTextColorId = nColorId;
}
@ -1386,7 +1386,7 @@ void XclExpChText::WriteBody( XclExpStream& rStrm )
rStrm << maData.mnHAlign
<< maData.mnVAlign
<< maData.mnBackMode
<< maData.maTextColor
<< maData.maTextComplexColor.getFinalColor()
<< maData.maRect
<< maData.mnFlags;
@ -2845,10 +2845,10 @@ void XclExpChTick::Convert( const ScfPropertySet& rPropSet, const XclChExtTypeIn
}
}
void XclExpChTick::SetFontColor( const Color& rColor, sal_uInt32 nColorId )
void XclExpChTick::SetFontColor(model::ComplexColor const& rComplexColor, sal_uInt32 nColorId )
{
maData.maTextColor = rColor;
::set_flag( maData.mnFlags, EXC_CHTICK_AUTOCOLOR, rColor == COL_AUTO );
maData.maTextComplexColor = rComplexColor;
::set_flag(maData.mnFlags, EXC_CHTICK_AUTOCOLOR, rComplexColor.getFinalColor() == COL_AUTO);
mnTextColorId = nColorId;
}
@ -2866,7 +2866,7 @@ void XclExpChTick::WriteBody( XclExpStream& rStrm )
<< maData.mnLabelPos
<< maData.mnBackMode;
rStrm.WriteZeroBytes( 16 );
rStrm << maData.maTextColor
rStrm << maData.maTextComplexColor.getFinalColor()
<< maData.mnFlags;
if( GetBiff() == EXC_BIFF8 )
rStrm << GetPalette().GetColorIndex( mnTextColorId ) << maData.mnRotation;
@ -2922,11 +2922,11 @@ XclExpChAxis::XclExpChAxis( const XclExpChRoot& rRoot, sal_uInt16 nAxisType ) :
maData.mnType = nAxisType;
}
void XclExpChAxis::SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId )
void XclExpChAxis::SetFont( XclExpChFontRef xFont, model::ComplexColor const& rComplexColor, sal_uInt32 nColorId )
{
mxFont = xFont;
if( mxTick )
mxTick->SetFontColor( rColor, nColorId );
mxTick->SetFontColor(rComplexColor, nColorId);
}
void XclExpChAxis::SetRotation( sal_uInt16 nRotation )

View file

@ -668,11 +668,11 @@ XclExpCFImpl::XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rF
if( mbFontUsed )
{
vcl::Font aFont;
::Color aColor;
model::ComplexColor aComplexColor;
ScPatternAttr::fillFontOnly(aFont, rItemSet);
ScPatternAttr::fillColor(aColor, rItemSet, ScAutoFontColorMode::Raw);
maFontData.FillFromVclFont(aFont, aColor);
mnFontColorId = GetPalette().InsertColor(maFontData.maColor, EXC_COLOR_CELLTEXT);
ScPatternAttr::fillColor(aComplexColor, rItemSet, ScAutoFontColorMode::Raw);
maFontData.FillFromVclFont(aFont, aComplexColor);
mnFontColorId = GetPalette().InsertColor(maFontData.maComplexColor.getFinalColor(), EXC_COLOR_CELLTEXT);
}
// border

View file

@ -389,8 +389,8 @@ XclExpStringRef lclCreateFormattedString(
// construct font from current text portion
SvxFont aFont(XclExpFontHelper::GetFontFromItemSet(rRoot, rItemSet, nScript));
Color aColor;
ScPatternAttr::fillColor(aColor, rItemSet, ScAutoFontColorMode::Raw);
model::ComplexColor aComplexColor;
ScPatternAttr::fillColor(aComplexColor, rItemSet, ScAutoFontColorMode::Raw);
// Excel start position of this portion
sal_Int32 nXclPortionStart = xString->Len();
@ -399,7 +399,7 @@ XclExpStringRef lclCreateFormattedString(
if( nXclPortionStart < xString->Len() )
{
// insert font into buffer
sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aColor, EXC_COLOR_CELLTEXT);
sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aComplexColor, EXC_COLOR_CELLTEXT);
// insert font index into format run vector
xString->AppendFormat( nXclPortionStart, nFontIdx );
}
@ -503,8 +503,8 @@ XclExpStringRef lclCreateFormattedString(
if( nScript == ApiScriptType::WEAK )
nScript = nLastScript;
SvxFont aFont( XclExpFontHelper::GetFontFromItemSet(rRoot, aItemSet, nScript));
Color aColor;
ScPatternAttr::fillColor(aColor, aItemSet, ScAutoFontColorMode::Raw);
model::ComplexColor aComplexColor;
ScPatternAttr::fillColor(aComplexColor, aItemSet, ScAutoFontColorMode::Raw);
nLastScript = nScript;
@ -512,10 +512,10 @@ XclExpStringRef lclCreateFormattedString(
aFont.SetEscapement( nEsc );
// modify automatic font color for hyperlinks
if (bIsHyperlink && aItemSet.Get(ATTR_FONT_COLOR).GetValue() == COL_AUTO)
aColor = COL_LIGHTBLUE;
aComplexColor.setFinalColor(COL_LIGHTBLUE);
// insert font into buffer
sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aColor, EXC_COLOR_CELLTEXT);
sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aComplexColor, EXC_COLOR_CELLTEXT);
// insert font index into format run vector
xString->AppendFormat( nXclPortionStart, nFontIdx );
}
@ -731,12 +731,12 @@ void XclExpHFConverter::AppendPortion( const EditTextObject* pTextObj, sal_Unico
// --- font attributes ---
vcl::Font aFont;
Color aColor;
model::ComplexColor aComplexColor;
aItemSet.ClearItem();
SfxItemSet aEditSet( mrEE.GetAttribs( aSel ) );
ScPatternAttr::GetFromEditItemSet( aItemSet, aEditSet );
ScPatternAttr::fillFontOnly(aFont, aItemSet);
ScPatternAttr::fillColor(aColor, aItemSet, ScAutoFontColorMode::Raw);
ScPatternAttr::fillColor(aComplexColor, aItemSet, ScAutoFontColorMode::Raw);
// font name and style
aNewData.maName = XclTools::GetXclFontName( aFont.GetFamilyName() );
@ -789,10 +789,12 @@ void XclExpHFConverter::AppendPortion( const EditTextObject* pTextObj, sal_Unico
}
// font color
aNewData.maColor = aColor;
if ( !aFontData.maColor.IsRGBEqual( aNewData.maColor ) )
aNewData.maComplexColor = aComplexColor;
Color aNewColor = aNewData.maComplexColor.getFinalColor();
if (!aFontData.maComplexColor.getFinalColor().IsRGBEqual(aNewColor))
{
aParaText.append("&K" + aNewData.maColor.AsRGBHexString());
aParaText.append("&K" + aNewColor.AsRGBHexString());
}
// strikeout

View file

@ -883,14 +883,17 @@ sax_fastparser::FSHelperPtr XclXmlUtils::WriteFontData( sax_fastparser::FSHelper
if (bHaveVertAlign)
pStream->singleElement(XML_vertAlign, XML_val, pVertAlign);
pStream->singleElement(XML_sz, XML_val, OString::number( rFontData.mnHeight / 20.0 )); // Twips->Pt
if( rFontData.maColor != Color( ColorAlpha, 0, 0xFF, 0xFF, 0xFF ) )
pStream->singleElement( XML_color,
if (rFontData.maComplexColor.getFinalColor() != Color( ColorAlpha, 0, 0xFF, 0xFF, 0xFF))
{
pStream->singleElement(XML_color,
// OOXTODO: XML_auto, bool
// OOXTODO: XML_indexed, uint
XML_rgb, XclXmlUtils::ToOString(rFontData.maColor)
XML_rgb, XclXmlUtils::ToOString(rFontData.maComplexColor.getFinalColor())
// OOXTODO: XML_theme, index into <clrScheme/>
// OOXTODO: XML_tint, double
);
}
pStream->singleElement(nFontId, XML_val, rFontData.maName);
pStream->singleElement(XML_family, XML_val, OString::number( rFontData.mnFamily ));
if (rFontData.mnCharSet != 0)

View file

@ -938,21 +938,22 @@ bool XclExpFontHelper::CheckItems( const XclExpRoot& rRoot, const SfxItemSet& rI
namespace {
sal_uInt32 lclCalcHash( const XclFontData& rFontData )
std::size_t lclCalcHash( const XclFontData& rFontData )
{
sal_uInt32 nHash = rFontData.maName.getLength();
nHash += sal_uInt32(rFontData.maColor) * 2;
nHash += rFontData.mnWeight * 3;
nHash += rFontData.mnCharSet * 5;
nHash += rFontData.mnFamily * 7;
nHash += rFontData.mnHeight * 11;
nHash += rFontData.mnUnderline * 13;
nHash += rFontData.mnEscapem * 17;
if( rFontData.mbItalic ) nHash += 19;
if( rFontData.mbStrikeout ) nHash += 23;
if( rFontData.mbOutline ) nHash += 29;
if( rFontData.mbShadow ) nHash += 31;
return nHash;
std::size_t seed = 0;
o3tl::hash_combine(seed, rFontData.maName);
o3tl::hash_combine(seed, rFontData.maComplexColor);
o3tl::hash_combine(seed, rFontData.mnWeight);
o3tl::hash_combine(seed, rFontData.mnCharSet);
o3tl::hash_combine(seed, rFontData.mnFamily);
o3tl::hash_combine(seed, rFontData.mnHeight);
o3tl::hash_combine(seed, rFontData.mnUnderline);
o3tl::hash_combine(seed, rFontData.mnEscapem);
o3tl::hash_combine(seed, rFontData.mbItalic);
o3tl::hash_combine(seed, rFontData.mbStrikeout);
o3tl::hash_combine(seed, rFontData.mbOutline);
o3tl::hash_combine(seed, rFontData.mbShadow);
return seed;
}
} // namespace
@ -964,7 +965,7 @@ XclExpFont::XclExpFont( const XclExpRoot& rRoot,
maData( rFontData )
{
// insert font color into palette
mnColorId = rRoot.GetPalette().InsertColor( rFontData.maColor, eColorType, EXC_COLOR_FONTAUTO );
mnColorId = rRoot.GetPalette().InsertColor(rFontData.maComplexColor.getFinalColor(), eColorType, EXC_COLOR_FONTAUTO);
// hash value for faster comparison
mnHash = lclCalcHash( maData );
// record size
@ -1222,18 +1223,18 @@ sal_uInt16 XclExpFontBuffer::Insert(
return static_cast< sal_uInt16 >( nPos );
}
sal_uInt16 XclExpFontBuffer::Insert(const SvxFont& rFont, Color const& rColor, XclExpColorType eColorType )
sal_uInt16 XclExpFontBuffer::Insert(const SvxFont& rFont, model::ComplexColor const& rComplexColor, XclExpColorType eColorType )
{
return Insert(XclFontData(rFont, rColor), eColorType);
return Insert(XclFontData(rFont, rComplexColor), eColorType);
}
sal_uInt16 XclExpFontBuffer::Insert(const SfxItemSet& rItemSet, sal_Int16 nScript, XclExpColorType eColorType, bool bAppFont )
{
// #i17050# script type now provided by caller
vcl::Font aFont = XclExpFontHelper::GetFontFromItemSet(GetRoot(), rItemSet, nScript);
Color aColor;
ScPatternAttr::fillColor(aColor, rItemSet, ScAutoFontColorMode::Raw);
return Insert(XclFontData(aFont, aColor), eColorType, bAppFont );
model::ComplexColor aComplexColor;
ScPatternAttr::fillColor(aComplexColor, rItemSet, ScAutoFontColorMode::Raw);
return Insert(XclFontData(aFont, aComplexColor), eColorType, bAppFont );
}
void XclExpFontBuffer::Save( XclExpStream& rStrm )
@ -3208,7 +3209,7 @@ sal_Int32 XclExpDxfs::GetDxfByColor(Color aColor) const
return -1;
}
void XclExpDxfs::AddColor(Color aColor)
void XclExpDxfs::addColor(Color aColor)
{
maColorToDxfId.emplace(aColor, maDxf.size());

View file

@ -949,14 +949,19 @@ void XclImpChText::ReadHeaderRecord( XclImpStream& rStrm )
maData.mnHAlign = rStrm.ReaduInt8();
maData.mnVAlign = rStrm.ReaduInt8();
maData.mnBackMode = rStrm.ReaduInt16();
rStrm >> maData.maTextColor
>> maData.maRect;
Color aColor;
rStrm >> aColor;
maData.maTextComplexColor.setColor(aColor);
rStrm >> maData.maRect;
maData.mnFlags = rStrm.ReaduInt16();
if( GetBiff() == EXC_BIFF8 )
{
// BIFF8: index into palette used instead of RGB data
maData.maTextColor = GetPalette().GetColor( rStrm.ReaduInt16() );
aColor = GetPalette().GetColor(rStrm.ReaduInt16());
maData.maTextComplexColor.setColor(aColor);
// placement and rotation
maData.mnFlags2 = rStrm.ReaduInt16();
maData.mnRotation = rStrm.ReaduInt16();
@ -1015,7 +1020,7 @@ sal_uInt16 XclImpChText::GetFontIndex() const
Color XclImpChText::GetFontColor() const
{
return ::get_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR ) ? GetFontAutoColor() : maData.maTextColor;
return ::get_flag(maData.mnFlags, EXC_CHTEXT_AUTOCOLOR) ? GetFontAutoColor() : maData.maTextComplexColor.getFinalColor();
}
sal_uInt16 XclImpChText::GetRotation() const
@ -1042,8 +1047,8 @@ void XclImpChText::UpdateText( const XclImpChText* pParentText )
{
mxFont = pParentText->mxFont;
// text color is taken from CHTEXT record, not from font in CHFONT
::set_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, ::get_flag( pParentText->maData.mnFlags, EXC_CHTEXT_AUTOCOLOR ) );
maData.maTextColor = pParentText->maData.maTextColor;
::set_flag(maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, ::get_flag(pParentText->maData.mnFlags, EXC_CHTEXT_AUTOCOLOR));
maData.maTextComplexColor = pParentText->maData.maTextComplexColor;
}
}
@ -3193,13 +3198,15 @@ void XclImpChTick::ReadChTick( XclImpStream& rStrm )
maData.mnLabelPos = rStrm.ReaduInt8();
maData.mnBackMode = rStrm.ReaduInt8();
rStrm.Ignore( 16 );
rStrm >> maData.maTextColor;
Color aColor;
rStrm >> aColor;
maData.maTextComplexColor.setColor(aColor);
maData.mnFlags = rStrm.ReaduInt16();
if( GetBiff() == EXC_BIFF8 )
{
// BIFF8: index into palette used instead of RGB data
maData.maTextColor = GetPalette().GetColor( rStrm.ReaduInt16() );
maData.maTextComplexColor.setColor(GetPalette().GetColor(rStrm.ReaduInt16()));
// rotation
maData.mnRotation = rStrm.ReaduInt16();
}
@ -3213,7 +3220,7 @@ void XclImpChTick::ReadChTick( XclImpStream& rStrm )
Color XclImpChTick::GetFontColor() const
{
return ::get_flag( maData.mnFlags, EXC_CHTICK_AUTOCOLOR ) ? GetFontAutoColor() : maData.maTextColor;
return ::get_flag(maData.mnFlags, EXC_CHTICK_AUTOCOLOR) ? GetFontAutoColor() : maData.maTextComplexColor.getFinalColor();
}
sal_uInt16 XclImpChTick::GetRotation() const

View file

@ -309,7 +309,7 @@ void XclImpFont::ReadCFFontBlock( XclImpStream& rStrm )
if( (mbUnderlUsed = !::get_flag( nFontFlags3, EXC_CF_FONT_UNDERL ) && (nUnderl <= 0x7F)) )
maData.mnUnderline = nUnderl;
if( (mbColorUsed = (nColor <= 0x7FFF)) )
maData.maColor = GetPalette().GetColor( static_cast< sal_uInt16 >( nColor ) );
maData.maComplexColor.setColor(GetPalette().GetColor(sal_uInt16(nColor)));
if( (mbStrikeUsed = !::get_flag( nFontFlags1, EXC_CF_FONT_STRIKEOUT )) )
maData.mbStrikeout = ::get_flag( nStyle, EXC_CF_FONT_STRIKEOUT );
}
@ -368,7 +368,7 @@ void XclImpFont::FillToItemSet( SfxItemSet& rItemSet, XclFontItemType eType, boo
// Font color - pass AUTO_COL to item
if( mbColorUsed )
PUTITEM( SvxColorItem( maData.maColor, ATTR_FONT_COLOR ), ATTR_FONT_COLOR, EE_CHAR_COLOR );
PUTITEM(SvxColorItem(maData.maComplexColor.getFinalColor(), maData.maComplexColor, ATTR_FONT_COLOR ), ATTR_FONT_COLOR, EE_CHAR_COLOR);
// Font weight (for all script types)
if( mbWeightUsed )
@ -455,7 +455,7 @@ void XclImpFont::ReadFontData5( XclImpStream& rStrm )
void XclImpFont::ReadFontColor( XclImpStream& rStrm )
{
maData.maColor = GetPalette().GetColor( rStrm.ReaduInt16() );
maData.maComplexColor.setColor(GetPalette().GetColor(rStrm.ReaduInt16()));
}
void XclImpFont::ReadFontName2( XclImpStream& rStrm )

View file

@ -153,7 +153,6 @@ XclChFrLabelProps::XclChFrLabelProps() :
}
XclChText::XclChText() :
maTextColor( COL_BLACK ),
mnHAlign( EXC_CHTEXT_ALIGN_CENTER ),
mnVAlign( EXC_CHTEXT_ALIGN_CENTER ),
mnBackMode( EXC_CHTEXT_TRANSPARENT ),
@ -161,6 +160,7 @@ XclChText::XclChText() :
mnFlags2( EXC_CHTEXT_POS_DEFAULT ),
mnRotation( EXC_ROT_NONE )
{
maTextComplexColor.setColor(COL_BLACK);
}
// Data series ================================================================
@ -303,7 +303,6 @@ XclChValueRange::XclChValueRange() :
}
XclChTick::XclChTick() :
maTextColor( COL_BLACK ),
mnMajor( EXC_CHTICK_INSIDE | EXC_CHTICK_OUTSIDE ),
mnMinor( 0 ),
mnLabelPos( EXC_CHTICK_NEXT ),
@ -311,6 +310,7 @@ XclChTick::XclChTick() :
mnFlags( EXC_CHTICK_AUTOCOLOR | EXC_CHTICK_AUTOROT ),
mnRotation( EXC_ROT_NONE )
{
maTextComplexColor.setColor(COL_BLACK);
}
XclChAxis::XclChAxis() :

View file

@ -174,22 +174,22 @@ XclFontData::XclFontData()
Clear();
}
XclFontData::XclFontData(const vcl::Font& rFont, Color const& rColor)
XclFontData::XclFontData(const vcl::Font& rFont, model::ComplexColor const& rComplexColor)
{
Clear();
FillFromVclFont(rFont, rColor);
FillFromVclFont(rFont, rComplexColor);
}
XclFontData::XclFontData(const SvxFont& rFont, Color const& rColor)
XclFontData::XclFontData(const SvxFont& rFont, model::ComplexColor const& rComplexColor)
{
FillFromSvxFont(rFont, rColor);
FillFromSvxFont(rFont, rComplexColor);
}
void XclFontData::Clear()
{
maName.clear();
maStyle.clear();
maColor = COL_AUTO;
maComplexColor.setColor(COL_AUTO);
mnHeight = 0;
mnWeight = EXC_FONTWGHT_DONTKNOW;
mnEscapem = EXC_FONTESC_NONE;
@ -199,11 +199,10 @@ void XclFontData::Clear()
mbItalic = mbStrikeout = mbOutline = mbShadow = false;
}
void XclFontData::FillFromVclFont(const vcl::Font& rFont, Color const& rColor)
void XclFontData::FillFromVclFont(const vcl::Font& rFont, model::ComplexColor const& rComplexColor)
{
maName = XclTools::GetXclFontName( rFont.GetFamilyName() ); // substitute with MS fonts
maStyle.clear();
maColor = rColor;
SetScUnderline( rFont.GetUnderline() );
mnEscapem = EXC_FONTESC_NONE;
SetScHeight( rFont.GetFontSize().Height() );
@ -214,11 +213,13 @@ void XclFontData::FillFromVclFont(const vcl::Font& rFont, Color const& rColor)
SetScStrikeout( rFont.GetStrikeout() );
mbOutline = rFont.IsOutline();
mbShadow = rFont.IsShadow();
maComplexColor = rComplexColor;
}
void XclFontData::FillFromSvxFont(const SvxFont& rFont, Color const& rColor)
void XclFontData::FillFromSvxFont(const SvxFont& rFont, model::ComplexColor const& rComplexColor)
{
FillFromVclFont(rFont, rColor);
FillFromVclFont(rFont, rComplexColor);
SetScEscapement(rFont.GetEscapement());
}
@ -520,7 +521,7 @@ bool operator==( const XclFontData& rLeft, const XclFontData& rRight )
(rLeft.mnHeight == rRight.mnHeight) &&
(rLeft.mnWeight == rRight.mnWeight) &&
(rLeft.mnUnderline == rRight.mnUnderline) &&
(rLeft.maColor == rRight.maColor) &&
(rLeft.maComplexColor == rRight.maComplexColor) &&
(rLeft.mnEscapem == rRight.mnEscapem) &&
(rLeft.mnFamily == rRight.mnFamily) &&
(rLeft.mnCharSet == rRight.mnCharSet) &&
@ -638,11 +639,13 @@ void XclFontPropSetHelper::ReadFontProperties( XclFontData& rFontData,
rPropSetHlp >> aApiFontName >> fApiHeight >> eApiPosture >> fApiWeight;
// read common properties
maHlpChCommon.ReadFromPropertySet( rPropSet );
maHlpChCommon >> nApiUnderl
>> nApiStrikeout
>> rFontData.maColor
>> rFontData.mbOutline
>> rFontData.mbShadow;
maHlpChCommon >> nApiUnderl;
maHlpChCommon >> nApiStrikeout;
Color aColor;
maHlpChCommon >> aColor;
rFontData.maComplexColor.setColor(aColor);
maHlpChCommon >> rFontData.mbOutline;
maHlpChCommon >> rFontData.mbShadow;
// convert API property values to Excel settings
lclSetApiFontSettings( rFontData, aApiFontName,
@ -667,15 +670,17 @@ void XclFontPropSetHelper::ReadFontProperties( XclFontData& rFontData,
// read font properties
maHlpControl.ReadFromPropertySet( rPropSet );
maHlpControl >> aApiFontName
>> nApiFamily
>> nApiCharSet
>> fApiHeight
>> nApiPosture
>> fApiWeight
>> nApiUnderl
>> nApiStrikeout
>> rFontData.maColor;
maHlpControl >> aApiFontName;
maHlpControl >> nApiFamily;
maHlpControl >> nApiCharSet;
maHlpControl >> fApiHeight;
maHlpControl >> nApiPosture;
maHlpControl >> fApiWeight;
maHlpControl >> nApiUnderl;
maHlpControl >> nApiStrikeout;
Color aColor;
maHlpControl >> aColor;
rFontData.maComplexColor.setColor(aColor);
// convert API property values to Excel settings
Awt::FontSlant eApiPosture = static_cast< Awt::FontSlant >( nApiPosture );
@ -699,10 +704,10 @@ void XclFontPropSetHelper::WriteFontProperties(
{
// write common properties
maHlpChCommon.InitializeWrite();
const Color& rColor = pFontColor ? *pFontColor : rFontData.maColor;
Color aColor = pFontColor ? *pFontColor : rFontData.maComplexColor.getFinalColor();
maHlpChCommon << rFontData.GetApiUnderline()
<< rFontData.GetApiStrikeout()
<< rColor
<< aColor
<< rFontData.mbOutline
<< rFontData.mbShadow;
maHlpChCommon.WriteToPropertySet( rPropSet );
@ -733,7 +738,7 @@ void XclFontPropSetHelper::WriteFontProperties(
<< rFontData.GetApiWeight()
<< rFontData.GetApiUnderline()
<< rFontData.GetApiStrikeout()
<< rFontData.maColor;
<< rFontData.maComplexColor.getFinalColor();
maHlpControl.WriteToPropertySet( rPropSet );
}
break;

View file

@ -473,7 +473,7 @@ public:
virtual ~XclExpChFontBase();
/** Derived classes set font color and color identifier to internal data structures. */
virtual void SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId ) = 0;
virtual void SetFont( XclExpChFontRef xFont, const model::ComplexColor& rComplexColor, sal_uInt32 nColorId ) = 0;
/** Derived classes set text rotation to internal data structures. */
virtual void SetRotation( sal_uInt16 nRotation ) = 0;
@ -496,7 +496,7 @@ public:
explicit XclExpChText( const XclExpChRoot& rRoot );
/** Sets font color and color identifier to internal data structures. */
virtual void SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId ) override;
virtual void SetFont( XclExpChFontRef xFont, model::ComplexColor const& rComplexColor, sal_uInt32 nColorId ) override;
/** Sets text rotation to internal data structures. */
virtual void SetRotation( sal_uInt16 nRotation ) override;
@ -993,7 +993,8 @@ public:
/** Converts axis tick mark settings. */
void Convert( const ScfPropertySet& rPropSet, const XclChExtTypeInfo& rTypeInfo, sal_uInt16 nAxisType );
/** Sets font color and color identifier to internal data structures. */
void SetFontColor( const Color& rColor, sal_uInt32 nColorId );
void SetFontColor(model::ComplexColor const& rComplexColor, sal_uInt32 nColorId);
/** Sets text rotation to internal data structures. */
void SetRotation( sal_uInt16 nRotation );
@ -1019,7 +1020,7 @@ public:
explicit XclExpChAxis( const XclExpChRoot& rRoot, sal_uInt16 nAxisType );
/** Sets font color and color identifier to internal data structures. */
virtual void SetFont( XclExpChFontRef xFont, const Color& rColor, sal_uInt32 nColorId ) override;
virtual void SetFont( XclExpChFontRef xFont, model::ComplexColor const& rComplexColor, sal_uInt32 nColorId ) override;
/** Sets text rotation to internal data structures. */
virtual void SetRotation( sal_uInt16 nRotation ) override;

View file

@ -221,7 +221,7 @@ public:
sal_uInt16 Insert(const XclFontData& rFontData, XclExpColorType eColorType, bool bAppFont = false );
/** Inserts the SvxFont into the buffer if not present, e.g. where escapements are used.
@return The resulting Excel font index. */
sal_uInt16 Insert(const SvxFont& rFont, Color const& rColor, XclExpColorType eColorType);
sal_uInt16 Insert(const SvxFont& rFont, model::ComplexColor const& rComplexColor, XclExpColorType eColorType);
/** Inserts the font contained in the passed item set into the buffer, if not present.
@param nScript The script type of the font properties to be used.
@param bAppFont true = Sets the application font; false = Inserts a new font.
@ -756,7 +756,7 @@ public:
sal_Int32 GetDxfId(const OUString& rName) const;
sal_Int32 GetDxfByColor(Color aColor) const;
void AddColor(Color aColor);
void addColor(Color aColor);
virtual void SaveXml( XclExpXmlStream& rStrm) override;
void Finalize();

View file

@ -20,6 +20,7 @@
#pragma once
#include <tools/gen.hxx>
#include <docmodel/color/ComplexColor.hxx>
#include "fapihelper.hxx"
#include <map>
#include <memory>
@ -870,7 +871,8 @@ struct XclChFrLabelProps
struct XclChText
{
XclChRectangle maRect; /// Position of the text object.
Color maTextColor; /// Text color.
//Color maTextColor; /// Text color.
model::ComplexColor maTextComplexColor;
sal_uInt8 mnHAlign; /// Horizontal alignment.
sal_uInt8 mnVAlign; /// Vertical alignment.
sal_uInt16 mnBackMode; /// Background mode: transparent, opaque.
@ -1042,7 +1044,7 @@ struct XclChValueRange
struct XclChTick
{
Color maTextColor; /// Tick labels color.
model::ComplexColor maTextComplexColor; /// Tick labels color.
sal_uInt8 mnMajor; /// Type of tick marks of major grid.
sal_uInt8 mnMinor; /// Type of tick marks of minor grid.
sal_uInt8 mnLabelPos; /// Position of labels relative to axis.

View file

@ -21,6 +21,7 @@
#include <map>
#include <com/sun/star/awt/FontSlant.hpp>
#include <docmodel/color/ComplexColor.hxx>
#include <tools/color.hxx>
#include <tools/fontenum.hxx>
#include <editeng/svxenum.hxx>
@ -284,7 +285,6 @@ struct XclFontData
{
OUString maName; /// Font name.
OUString maStyle; /// String with styles (bold, italic).
Color maColor; /// Font color.
sal_uInt16 mnHeight; /// Font height in twips (1/20 of a point).
sal_uInt16 mnWeight; /// Boldness: 400=normal, 700=bold.
sal_uInt16 mnEscapem; /// Escapement type.
@ -296,19 +296,21 @@ struct XclFontData
bool mbOutline; /// true = Outlined.
bool mbShadow; /// true = Shadowed.
model::ComplexColor maComplexColor; /// Font color.
/** Constructs an empty font data structure. */
explicit XclFontData();
explicit XclFontData();
/** Constructs a font data structure and fills it with the passed font attributes (except color). */
explicit XclFontData(const vcl::Font& rFont, Color const& aColor);
explicit XclFontData(const vcl::Font& rFont, model::ComplexColor const& rComplexColor);
/** As directly above but also fills in the escapement member. */
explicit XclFontData(const SvxFont& rFont, Color const& aColor);
explicit XclFontData(const SvxFont& rFont, model::ComplexColor const& rComplexColor);
/** Resets all members to default (empty) values. */
void Clear();
/** Fills all members (except color and escapement) from the passed font. */
void FillFromVclFont(const vcl::Font& rFont, Color const& rColor);
void FillFromVclFont(const vcl::Font& rFont, model::ComplexColor const& rComplexColor);
/** Fills all members (except color) from the passed SVX font. */
void FillFromSvxFont(const SvxFont& rFont, Color const& rColor);
void FillFromSvxFont(const SvxFont& rFont, model::ComplexColor const& rComplexColor);
// *** conversion of VCL/SVX constants *** ------------------------------------