[Libreoffice-commits] core.git: starmath/inc starmath/source
dante (via logerrit)
logerrit at kemper.freedesktop.org
Sat Feb 6 06:53:04 UTC 2021
starmath/inc/mathml/starmathdatabase.hxx | 5 +-
starmath/source/mathml/starmathdatabase.cxx | 51 +++++++++++++++++-----------
starmath/source/parse.cxx | 2 -
3 files changed, 35 insertions(+), 23 deletions(-)
New commits:
commit 4b055a51c501cec3f71600c1b87aa1fad85dd5af
Author: dante <dante19031999 at gmail.com>
AuthorDate: Fri Feb 5 13:33:24 2021 +0100
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Sat Feb 6 07:52:25 2021 +0100
Optimize starmath color search
Needs Jenkins resume.
Details:
Uses ordered search
Avoid useless data copy.
Change-Id: I100dc08451788e705a0109f6c73172cb6964306b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110473
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/starmath/inc/mathml/starmathdatabase.hxx b/starmath/inc/mathml/starmathdatabase.hxx
index 096a38b1e4c2..b40a932809a4 100644
--- a/starmath/inc/mathml/starmathdatabase.hxx
+++ b/starmath/inc/mathml/starmathdatabase.hxx
@@ -203,6 +203,7 @@ extern const SmColorTokenTableEntry aColorTokenTableParse[159];
extern const SmColorTokenTableEntry aColorTokenTableHTML[148];
extern const SmColorTokenTableEntry aColorTokenTableMATHML[16];
extern const SmColorTokenTableEntry aColorTokenTableDVIPS[5];
+extern const SmColorTokenTableEntry aColorTokenTableERROR[1];
/**
* Identifies operator chars tokens for importing mathml.
@@ -301,7 +302,7 @@ std::unique_ptr<SmColorTokenTableEntry> Identify_Color_DVIPSNAMES(sal_uInt32 cCo
* @param cColor
* @param parser color
*/
-std::unique_ptr<SmColorTokenTableEntry> Identify_ColorName_Parser(const OUString& colorname);
+const SmColorTokenTableEntry* Identify_ColorName_Parser(const OUString& colorname);
/**
* Identifies color from color name.
@@ -325,5 +326,5 @@ std::unique_ptr<SmColorTokenTableEntry> Identify_ColorName_HTML(const OUString&
* @param cColor
* @param parser color
*/
-std::unique_ptr<SmColorTokenTableEntry> Identify_ColorName_DVIPSNAMES(const OUString& colorname);
+const SmColorTokenTableEntry* Identify_ColorName_DVIPSNAMES(const OUString& colorname);
}
diff --git a/starmath/source/mathml/starmathdatabase.cxx b/starmath/source/mathml/starmathdatabase.cxx
index 630fb343840d..f358a37be72c 100644
--- a/starmath/source/mathml/starmathdatabase.cxx
+++ b/starmath/source/mathml/starmathdatabase.cxx
@@ -692,6 +692,9 @@ const SmColorTokenTableEntry starmathdatabase::aColorTokenTableMATHML[] = {
// clang-format on
};
+const SmColorTokenTableEntry starmathdatabase::aColorTokenTableERROR[]
+ = { { "", TERROR, COL_SM_BLACK } };
+
std::unique_ptr<SmColorTokenTableEntry> starmathdatabase::Identify_Color_Parser(sal_uInt32 cColor)
{
for (auto i = std::begin(aColorTokenTableParse); i < std::end(aColorTokenTableParse); ++i)
@@ -748,46 +751,54 @@ starmathdatabase::Identify_Color_DVIPSNAMES(sal_uInt32 cColor)
new SmColorTokenTableEntry("", TRGBA, cColor));
}
-std::unique_ptr<SmColorTokenTableEntry>
-starmathdatabase::Identify_ColorName_Parser(const OUString& colorname)
+const SmColorTokenTableEntry* starmathdatabase::Identify_ColorName_Parser(const OUString& colorname)
{
if (colorname.isEmpty())
- return std::unique_ptr<SmColorTokenTableEntry>(
- new SmColorTokenTableEntry("", TERROR, COL_SM_BLACK));
+ return &aColorTokenTableERROR[0];
for (auto i = std::begin(aColorTokenTableParse); i < std::end(aColorTokenTableParse); ++i)
- if (i->equals(colorname))
- return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i));
- return std::unique_ptr<SmColorTokenTableEntry>(
- new SmColorTokenTableEntry("", TERROR, COL_SM_BLACK));
+ {
+ sal_Int32 matches = colorname.compareToIgnoreAsciiCaseAscii(i->pIdent);
+ if (matches == 0)
+ return i;
+ if (matches < 0)
+ break;
+ }
+ return &aColorTokenTableERROR[0];
}
-
std::unique_ptr<SmColorTokenTableEntry>
starmathdatabase::Identify_ColorName_HTML(const OUString& colorname)
{
if (colorname.isEmpty())
return std::unique_ptr<SmColorTokenTableEntry>(
new SmColorTokenTableEntry("", TERROR, COL_SM_BLACK));
- for (auto i = std::begin(aColorTokenTableHTML); i < std::end(aColorTokenTableHTML); ++i)
- if (i->equals(colorname))
- return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i));
if (colorname[0] == '#')
{
Color col = Color::STRtoRGB(colorname);
return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry("", TRGB, col));
}
+ for (auto i = std::begin(aColorTokenTableHTML); i < std::end(aColorTokenTableHTML); ++i)
+ {
+ sal_Int32 matches = colorname.compareToIgnoreAsciiCaseAscii(i->pIdent);
+ if (matches == 0)
+ return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i));
+ if (matches < 0)
+ break;
+ }
return std::unique_ptr<SmColorTokenTableEntry>(
new SmColorTokenTableEntry("", TERROR, COL_SM_BLACK));
}
-
-std::unique_ptr<SmColorTokenTableEntry>
+const SmColorTokenTableEntry*
starmathdatabase::Identify_ColorName_DVIPSNAMES(const OUString& colorname)
{
if (colorname.isEmpty())
- return std::unique_ptr<SmColorTokenTableEntry>(
- new SmColorTokenTableEntry("", TERROR, COL_SM_BLACK));
+ return &aColorTokenTableERROR[0];
for (auto i = std::begin(aColorTokenTableDVIPS); i < std::end(aColorTokenTableDVIPS); ++i)
- if (i->equals(colorname))
- return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i));
- return std::unique_ptr<SmColorTokenTableEntry>(
- new SmColorTokenTableEntry("", TERROR, COL_SM_BLACK));
+ {
+ sal_Int32 matches = colorname.compareToIgnoreAsciiCaseAscii(i->pIdent);
+ if (matches == 0)
+ return i;
+ if (matches < 0)
+ break;
+ }
+ return &aColorTokenTableERROR[0];
}
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index 5bb152f68607..8bd06070c268 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -1008,7 +1008,7 @@ void SmParser::NextTokenColor(bool dvipload)
sal_Int32 n = aRes.EndPos - nRealStart;
assert(n >= 0);
OUString aName( m_aBufferString.copy( nRealStart, n ) );
- std::unique_ptr<SmColorTokenTableEntry> aSmColorTokenTableEntry;
+ const SmColorTokenTableEntry* aSmColorTokenTableEntry;
if(dvipload) aSmColorTokenTableEntry = starmathdatabase::Identify_ColorName_DVIPSNAMES( aName );
else aSmColorTokenTableEntry = starmathdatabase::Identify_ColorName_Parser( aName );
m_aCurToken = aSmColorTokenTableEntry;
More information about the Libreoffice-commits
mailing list