Files
Kurt Nordback a07bad0cc8 oox: next step to replace oox::drawingml::Color with ComplexColor
ComplexColor is a replacement for oox::drawingml::Color, so both
share a lot in common, but oox::drawingml::Color is only used to
resolve the colors inside oox. The idea is to replace step by step
oox::drawingml::Color with ComplexColor. In this step a lot of
ComplexColor types are used instead in oox::drawingml::Color types.

Additionally oox::drawingml::Color is not mandatory anymore for
a lot of contexts, so depending on the need ComplexColor can be
used or oox::drawingml::Color.

Change-Id: I6613a0f63cc9b7d070841d4f667363b03e6cbaa8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194645
Code-Style: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Tested-by: Jenkins
2025-11-27 01:33:12 +01:00

229 lines
6.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
#pragma once
#include <oox/drawingml/color.hxx>
#include <docmodel/color/ComplexColor.hxx>
#include <oox/drawingml/shape.hxx>
#include <oox/helper/propertymap.hxx>
#include <comphelper/string.hxx>
#include <rtl/ustring.hxx>
#include <memory>
#include <variant>
namespace model
{
struct FontOrStyleRef
{
enum class StyleColorEnum
{
AUTO
};
// The schema uses 'union' here. Implement with a std::variant for safety.
using StyleColorVal = std::variant<sal_uInt32, enum StyleColorEnum, OUString>;
std::unique_ptr<StyleColorVal> maStyleClr; // optional
// Get a string version of the ColorVal, for output/streaming
OUString getColorValStr() const
{
OUString sV;
if (maStyleClr)
{
switch (maStyleClr->index())
{
case 0: // sal_uInt32, a raw color value
sV = OUString::number(std::get<0>(*maStyleClr));
break;
case 1: // enum; only value "auto"
sV = "auto";
break;
case 2: // arbitrary string
sV = std::get<2>(*maStyleClr);
break;
}
}
return sV;
}
// Convert an input string to ColorVal
void setColorValStr(const std::optional<OUString>& str)
{
// The attribute here can be an integer, a string, or "auto" (which
// of course is also a string, but is considered special). So we
// need to try to convert the input string to an integer, and handle
// it as an int if we can.
if (str)
{
StyleColorVal v;
const sal_Unicode* pRawStr = str->getStr();
if (comphelper::string::isdigitAsciiString(pRawStr))
{
sal_uInt32 nIntVal = str->toUInt32();
v = nIntVal;
}
else
{
// Not an integer, so see if it's the fixed enum
if (*str == "auto")
{
v = StyleColorEnum::AUTO;
}
else
{
v = *str;
}
}
maStyleClr = std::make_unique<StyleColorVal>(v);
}
}
// A child element of cs:CT_FontReference or cs:CT_StyleReference is
// a:EG_ColorChoice. The latter is handled by ColorValueContext.
model::ComplexColor maComplexColor; // needed for ColorValueContext
// There's also an a:EG_ColorTransform member and a 'mods' member for
// FontOrStyleRef. Ignore those for now. TODO
};
struct StyleRef : public FontOrStyleRef
{
sal_Int32 mnIdx = 0; // StyleMatrixColumnIndex
};
struct FontRef : public FontOrStyleRef
{
enum class FontCollectionIndex
{
MAJOR,
MINOR,
NONE
};
FontCollectionIndex meIdx = FontCollectionIndex::MINOR; // required
// Get the string value of the font collection index
const char* getFontCollectionStr() const
{
switch (meIdx)
{
case FontCollectionIndex::MINOR:
return "minor";
case FontCollectionIndex::MAJOR:
return "major";
case FontCollectionIndex::NONE:
return "none";
default:
assert(false);
}
return nullptr;
}
// Set the font collection index from a string
void setFontCollectionIndex(std::u16string_view sIdx)
{
if (sIdx == std::u16string_view(u"major"))
{
meIdx = FontCollectionIndex::MAJOR;
}
else if (sIdx == std::u16string_view(u"minor"))
{
meIdx = FontCollectionIndex::MINOR;
}
else if (sIdx == std::u16string_view(u"none"))
{
meIdx = FontCollectionIndex::NONE;
}
}
};
struct StyleEntry
{
std::shared_ptr<StyleRef> mxLnClr;
double mfLineWidthScale = 1.0;
std::shared_ptr<StyleRef> mxFillClr;
std::shared_ptr<StyleRef> mxEffectClr;
std::shared_ptr<FontRef> mxFontClr;
std::shared_ptr<oox::drawingml::Shape> mxShapePr;
// The following is derived from a TextCharacterProperties
std::shared_ptr<oox::PropertyMap> mrTextCharacterPr;
// The following is derived from a TextBodyProperties
std::shared_ptr<oox::PropertyMap> mxTextBodyPr;
StyleEntry(std::shared_ptr<StyleRef> aLnClr, double fLineScale,
std::shared_ptr<StyleRef> aFillClr, std::shared_ptr<StyleRef> aEffectClr,
std::shared_ptr<FontRef> aFontClr, std::shared_ptr<oox::drawingml::Shape> aShape,
std::shared_ptr<oox::PropertyMap> aCharProps,
std::shared_ptr<oox::PropertyMap> aBodyProps)
: mxLnClr(std::move(aLnClr))
, mfLineWidthScale(fLineScale)
, mxFillClr(std::move(aFillClr))
, mxEffectClr(std::move(aEffectClr))
, mxFontClr(std::move(aFontClr))
, mxShapePr(std::move(aShape))
, mrTextCharacterPr(std::move(aCharProps))
, mxTextBodyPr(std::move(aBodyProps))
{
}
};
struct DOCMODEL_DLLPUBLIC StyleSet
{
enum class StyleEntryType
{
BEGIN = 0, // for iteration
AXISTITLE = BEGIN,
CATEGORYAXIS,
CHARTAREA,
DATALABEL,
DATALABELCALLOUT,
DATAPOINT,
DATAPOINT3D,
DATAPOINTLINE,
DATAPOINTMARKER,
DATAPOINTMARKERLAYOUT,
DATAPOINTWIREFRAME,
DATATABLE,
DOWNBAR,
DROPLINE,
ERRORBAR,
FLOOR,
GRIDLINEMAJOR,
GRIDLINEMINOR,
HILOLINE,
LEADERLINE,
LEGEND,
PLOTAREA,
PLOTAREA3D,
SERIESAXIS,
SERIESLINE,
TITLE,
TRENDLINE,
TRENDLINELABEL,
UPBAR,
VALUEAXIS,
WALL,
END // for iteration
};
std::map<enum StyleEntryType, StyleEntry> maEntryMap;
sal_Int32 mnId = -1;
void addEntry(enum StyleEntryType eType, const StyleEntry& aEntry);
};
} // namespace model
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */