summaryrefslogtreecommitdiffstats
path: root/oox/source/ppt/pptfilterhelpers.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'oox/source/ppt/pptfilterhelpers.cxx')
-rw-r--r--oox/source/ppt/pptfilterhelpers.cxx422
1 files changed, 422 insertions, 0 deletions
diff --git a/oox/source/ppt/pptfilterhelpers.cxx b/oox/source/ppt/pptfilterhelpers.cxx
new file mode 100644
index 000000000..054bf6260
--- /dev/null
+++ b/oox/source/ppt/pptfilterhelpers.cxx
@@ -0,0 +1,422 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <com/sun/star/animations/TransitionType.hpp>
+#include <com/sun/star/animations/TransitionSubType.hpp>
+#include <com/sun/star/animations/ValuePair.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <oox/ppt/pptfilterhelpers.hxx>
+#include <tools/color.hxx>
+#include <o3tl/string_view.hxx>
+
+namespace {
+ int lcl_gethex(int nChar)
+ {
+ if (nChar >= '0' && nChar <= '9')
+ return nChar - '0';
+ else if (nChar >= 'a' && nChar <= 'f')
+ return nChar - 'a' + 10;
+ else if (nChar >= 'A' && nChar <= 'F')
+ return nChar - 'A' + 10;
+ else
+ return 0;
+ }
+}
+
+namespace oox::ppt {
+
+ const ImplAttributeNameConversion *getAttributeConversionList()
+ {
+ static const ImplAttributeNameConversion aList[] =
+ {
+ { AnimationAttributeEnum::PPT_X, "ppt_x", "X" },
+ { AnimationAttributeEnum::PPT_Y, "ppt_y", "Y" },
+ { AnimationAttributeEnum::PPT_W, "ppt_w", "Width" },
+ { AnimationAttributeEnum::PPT_H, "ppt_h", "Height" },
+ { AnimationAttributeEnum::PPT_C, "ppt_c", "DimColor" },
+ { AnimationAttributeEnum::R, "r", "Rotate" },
+ { AnimationAttributeEnum::XSHEAR, "xshear", "SkewX" },
+ { AnimationAttributeEnum::FILLCOLOR, "fillcolor", "FillColor" },
+ { AnimationAttributeEnum::FILLCOLOR, "fillColor", "FillColor" },
+ { AnimationAttributeEnum::FILLTYPE, "fill.type", "FillStyle" },
+ { AnimationAttributeEnum::FILLON, "fill.on", "FillOn" },
+ { AnimationAttributeEnum::STROKECOLOR, "stroke.color", "LineColor" },
+ { AnimationAttributeEnum::STROKEON, "stroke.on", "LineStyle" },
+ { AnimationAttributeEnum::STYLECOLOR, "style.color", "CharColor" },
+ { AnimationAttributeEnum::STYLEROTATION, "style.rotation", "Rotate" },
+ { AnimationAttributeEnum::FONTWEIGHT, "style.fontWeight", "CharWeight" },
+ { AnimationAttributeEnum::STYLEUNDERLINE, "style.textDecorationUnderline","CharUnderline" },
+ { AnimationAttributeEnum::STYLEFONTFAMILY, "style.fontFamily", "CharFontName" },
+ { AnimationAttributeEnum::STYLEFONTSIZE, "style.fontSize", "CharHeight" },
+ { AnimationAttributeEnum::STYLEFONTSTYLE, "style.fontStyle", "CharPosture" },
+ { AnimationAttributeEnum::STYLEVISIBILITY, "style.visibility", "Visibility" },
+ { AnimationAttributeEnum::STYLEOPACITY, "style.opacity", "Opacity" },
+ { AnimationAttributeEnum::UNKNOWN, nullptr, nullptr }
+ };
+
+ return aList;
+ }
+
+ const transition* transition::getList()
+ {
+ static const transition aList[] =
+ {
+ { "wipe(up)", css::animations::TransitionType::BARWIPE, css::animations::TransitionSubType::TOPTOBOTTOM, true },
+ { "wipe(right)", css::animations::TransitionType::BARWIPE, css::animations::TransitionSubType::LEFTTORIGHT, false },
+ { "wipe(left)", css::animations::TransitionType::BARWIPE, css::animations::TransitionSubType::LEFTTORIGHT, true },
+ { "wipe(down)", css::animations::TransitionType::BARWIPE, css::animations::TransitionSubType::TOPTOBOTTOM, false },
+ { "wheel(1)", css::animations::TransitionType::PINWHEELWIPE, css::animations::TransitionSubType::ONEBLADE, true },
+ { "wheel(2)", css::animations::TransitionType::PINWHEELWIPE, css::animations::TransitionSubType::TWOBLADEVERTICAL, true },
+ { "wheel(3)", css::animations::TransitionType::PINWHEELWIPE, css::animations::TransitionSubType::THREEBLADE, true },
+ { "wheel(4)", css::animations::TransitionType::PINWHEELWIPE, css::animations::TransitionSubType::FOURBLADE, true },
+ { "wheel(8)", css::animations::TransitionType::PINWHEELWIPE, css::animations::TransitionSubType::EIGHTBLADE, true },
+ { "strips(downLeft)", css::animations::TransitionType::WATERFALLWIPE, css::animations::TransitionSubType::HORIZONTALRIGHT, true },
+ { "strips(upLeft)", css::animations::TransitionType::WATERFALLWIPE, css::animations::TransitionSubType::HORIZONTALLEFT, false },
+ { "strips(downRight)", css::animations::TransitionType::WATERFALLWIPE, css::animations::TransitionSubType::HORIZONTALLEFT, true },
+ { "strips(upRight)", css::animations::TransitionType::WATERFALLWIPE, css::animations::TransitionSubType::HORIZONTALRIGHT, false },
+ { "barn(inVertical)", css::animations::TransitionType::BARNDOORWIPE, css::animations::TransitionSubType::VERTICAL, false },
+ { "barn(outVertical)", css::animations::TransitionType::BARNDOORWIPE, css::animations::TransitionSubType::VERTICAL, true },
+ { "barn(inHorizontal)", css::animations::TransitionType::BARNDOORWIPE, css::animations::TransitionSubType::HORIZONTAL, false },
+ { "barn(outHorizontal)", css::animations::TransitionType::BARNDOORWIPE, css::animations::TransitionSubType::HORIZONTAL, true },
+ { "randombar(vertical)", css::animations::TransitionType::RANDOMBARWIPE, css::animations::TransitionSubType::VERTICAL, true},
+ { "randombar(horizontal)", css::animations::TransitionType::RANDOMBARWIPE, css::animations::TransitionSubType::HORIZONTAL, true },
+ { "checkerboard(down)", css::animations::TransitionType::CHECKERBOARDWIPE, css::animations::TransitionSubType::DOWN, true},
+ { "checkerboard(across)", css::animations::TransitionType::CHECKERBOARDWIPE, css::animations::TransitionSubType::ACROSS, true },
+ { "plus(out)", css::animations::TransitionType::FOURBOXWIPE, css::animations::TransitionSubType::CORNERSIN, false },
+ { "plus(in)", css::animations::TransitionType::FOURBOXWIPE, css::animations::TransitionSubType::CORNERSIN, true },
+ { "diamond(out)", css::animations::TransitionType::IRISWIPE, css::animations::TransitionSubType::DIAMOND, true },
+ { "diamond(in)", css::animations::TransitionType::IRISWIPE, css::animations::TransitionSubType::DIAMOND, false },
+ { "circle(out)", css::animations::TransitionType::ELLIPSEWIPE, css::animations::TransitionSubType::HORIZONTAL, true },
+ { "circle(in)", css::animations::TransitionType::ELLIPSEWIPE, css::animations::TransitionSubType::HORIZONTAL, false },
+ { "box(out)", css::animations::TransitionType::IRISWIPE, css::animations::TransitionSubType::RECTANGLE, true },
+ { "box(in)", css::animations::TransitionType::IRISWIPE, css::animations::TransitionSubType::RECTANGLE, false },
+ { "wedge", css::animations::TransitionType::FANWIPE, css::animations::TransitionSubType::CENTERTOP, true },
+ { "blinds(vertical)", css::animations::TransitionType::BLINDSWIPE, css::animations::TransitionSubType::VERTICAL, true },
+ { "blinds(horizontal)", css::animations::TransitionType::BLINDSWIPE, css::animations::TransitionSubType::HORIZONTAL, true },
+ { "fade", css::animations::TransitionType::FADE, css::animations::TransitionSubType::CROSSFADE, true },
+ { "slide(fromTop)", css::animations::TransitionType::SLIDEWIPE, css::animations::TransitionSubType::FROMTOP, true },
+ { "slide(fromRight)", css::animations::TransitionType::SLIDEWIPE, css::animations::TransitionSubType::FROMRIGHT, true },
+ { "slide(fromLeft)", css::animations::TransitionType::SLIDEWIPE, css::animations::TransitionSubType::FROMLEFT, true },
+ { "slide(fromBottom)", css::animations::TransitionType::SLIDEWIPE, css::animations::TransitionSubType::FROMBOTTOM, true },
+ { "dissolve", css::animations::TransitionType::DISSOLVE, css::animations::TransitionSubType::DEFAULT, true },
+ { "image", css::animations::TransitionType::DISSOLVE, css::animations::TransitionSubType::DEFAULT, true }, // TODO
+ { nullptr, 0, 0, false }
+ };
+
+ return aList;
+ }
+
+ const transition* transition::find( std::u16string_view rName )
+ {
+ const transition* p = transition::getList();
+
+ while( p->mpName )
+ {
+ if( o3tl::equalsAscii( rName, p->mpName ) )
+ return p;
+
+ p++;
+ }
+
+ return nullptr;
+ }
+
+ bool convertMeasure(OUString& rString)
+ {
+ bool bRet = false;
+
+ const char* pSource[] = { "ppt_x", "ppt_y", "ppt_w", "ppt_h", nullptr };
+ const char* pDest[] = { "x", "y", "width", "height", nullptr };
+
+ /* here we want to substitute all occurrences of
+ * [#]ppt_[xyhw] with
+ * x,y,height and width respectively
+ */
+ sal_Int32 nIndex = 0;
+
+ const char** ps = pSource;
+ const char** pd = pDest;
+
+ while (*ps)
+ {
+ const OUString aSearch(OUString::createFromAscii(*ps));
+ while ((nIndex = rString.indexOf(aSearch, nIndex)) != -1)
+ {
+ sal_Int32 nLength = aSearch.getLength();
+ if (nIndex && (rString[nIndex - 1] == '#'))
+ {
+ nIndex--;
+ nLength++;
+ }
+
+ const OUString aNew(OUString::createFromAscii(*pd));
+ rString = rString.replaceAt(nIndex, nLength, aNew);
+ nIndex += aNew.getLength();
+ bRet = true;
+ }
+ ps++;
+ pd++;
+ }
+
+ return bRet;
+ }
+
+ bool convertAnimationValue(AnimationAttributeEnum eAttribute, css::uno::Any& rValue)
+ {
+ using css::animations::ValuePair;
+ bool bRet = false;
+ switch (eAttribute)
+ {
+ case AnimationAttributeEnum::PPT_X:
+ case AnimationAttributeEnum::PPT_Y:
+ case AnimationAttributeEnum::PPT_W:
+ case AnimationAttributeEnum::PPT_H:
+ {
+ OUString aString;
+
+ if (rValue.getValueType() == cppu::UnoType<ValuePair>::get())
+ {
+ ValuePair aValuePair;
+ if (rValue >>= aValuePair)
+ {
+ if (aValuePair.First >>= aString)
+ {
+ if (convertMeasure(aString))
+ {
+ aValuePair.First <<= aString;
+ bRet = true;
+ }
+ }
+
+ if (aValuePair.Second >>= aString)
+ {
+ if (convertMeasure(aString))
+ {
+ aValuePair.Second <<= aString;
+ bRet = true;
+ }
+ }
+ }
+ }
+ else if (rValue.getValueType() == cppu::UnoType<OUString>::get())
+ {
+ if (rValue >>= aString)
+ {
+ bRet = convertMeasure(aString);
+
+ if (bRet)
+ rValue <<= aString;
+ }
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::XSHEAR:
+ case AnimationAttributeEnum::R:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString.toDouble();
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::STYLEROTATION:
+ {
+ if (rValue.getValueType() == cppu::UnoType<OUString>::get())
+ {
+ OUString aString;
+ rValue >>= aString;
+ rValue <<= static_cast<sal_Int16>(aString.toDouble());
+ bRet = true;
+ }
+ else if (rValue.getValueType() == cppu::UnoType<double>::get())
+ {
+ double fValue = 0.0;
+ rValue >>= fValue;
+ rValue <<= static_cast<sal_Int16>(fValue);
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::FILLCOLOR:
+ case AnimationAttributeEnum::STROKECOLOR:
+ case AnimationAttributeEnum::STYLECOLOR:
+ case AnimationAttributeEnum::PPT_C:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ if (aString.getLength() >= 7 && aString[0] == '#')
+ {
+ Color aColor;
+ aColor.SetRed(static_cast<sal_uInt8>(lcl_gethex(aString[1]) * 16
+ + lcl_gethex(aString[2])));
+ aColor.SetGreen(static_cast<sal_uInt8>(lcl_gethex(aString[3]) * 16
+ + lcl_gethex(aString[4])));
+ aColor.SetBlue(static_cast<sal_uInt8>(lcl_gethex(aString[5]) * 16
+ + lcl_gethex(aString[6])));
+ rValue <<= aColor;
+ bRet = true;
+ }
+ else if (aString.startsWith("rgb("))
+ {
+ aString = aString.copy(4, aString.getLength() - 5);
+ Color aColor;
+ sal_Int32 index = 0;
+ aColor.SetRed(
+ static_cast<sal_uInt8>(o3tl::toInt32(o3tl::getToken(aString, 0, ',', index))));
+ aColor.SetGreen(
+ static_cast<sal_uInt8>(o3tl::toInt32(o3tl::getToken(aString, 0, ',', index))));
+ aColor.SetRed(
+ static_cast<sal_uInt8>(o3tl::toInt32(o3tl::getToken(aString, 0, ',', index))));
+ rValue <<= aColor;
+ bRet = true;
+ }
+ else if (aString.startsWith("hsl("))
+ {
+ sal_Int32 index = 0;
+ sal_Int32 nA = o3tl::toInt32(o3tl::getToken(aString, 0, ',', index));
+ sal_Int32 nB = o3tl::toInt32(o3tl::getToken(aString, 0, ',', index));
+ sal_Int32 nC = o3tl::toInt32(o3tl::getToken(aString, 0, ',', index));
+ css::uno::Sequence<double> aHSL
+ {
+ nA * 360.0 / 255.0,
+ nB / 255.0,
+ nC / 255.0
+ };
+ rValue <<= aHSL;
+ bRet = true;
+ }
+ }
+ }
+ break;
+ case AnimationAttributeEnum::FILLON:
+ {
+ // Slideshow doesn't support FillOn, but we need to convert the value type
+ // so it can be written out again.
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString == "true";
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::FILLTYPE:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString == "solid" ? css::drawing::FillStyle_SOLID
+ : css::drawing::FillStyle_NONE;
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::STROKEON:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString == "true" ? css::drawing::LineStyle_SOLID
+ : css::drawing::LineStyle_NONE;
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::FONTWEIGHT:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString == "bold" ? css::awt::FontWeight::BOLD
+ : css::awt::FontWeight::NORMAL;
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::STYLEFONTSTYLE:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue
+ <<= aString == "italic" ? css::awt::FontSlant_ITALIC : css::awt::FontSlant_NONE;
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::STYLEUNDERLINE:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString == "true" ? css::awt::FontUnderline::SINGLE
+ : css::awt::FontUnderline::NONE;
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::STYLEOPACITY:
+ case AnimationAttributeEnum::STYLEFONTSIZE:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= static_cast<float>(aString.toDouble());
+ bRet = true;
+ }
+ }
+ break;
+
+ case AnimationAttributeEnum::STYLEVISIBILITY:
+ {
+ OUString aString;
+ if (rValue >>= aString)
+ {
+ rValue <<= aString == "visible";
+ bRet = true;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return bRet;
+ }
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */