diff options
author | Krisztian Pinter <pin.terminator@gmail.com> | 2014-07-01 23:56:25 +0200 |
---|---|---|
committer | Krisztian Pinter <pin.terminator@gmail.com> | 2014-07-25 17:14:11 +0200 |
commit | 1cff66591f531f2acc40a4400c704f8708d8027d (patch) | |
tree | 11ed4fafa21c01271061ea95a59bbd07088484e3 | |
parent | ba5e1e45dcf15e0b7b1c8373b8ebc5b0d36a0cfc (diff) |
Add GIMP palette loading code
Change-Id: Ie0d0787342bc806a1848cb904114f0ca16c9df69
-rw-r--r-- | include/svx/SvxColorValueSet.hxx | 13 | ||||
-rw-r--r-- | svx/source/tbxctrls/SvxColorValueSet.cxx | 110 |
2 files changed, 118 insertions, 5 deletions
diff --git a/include/svx/SvxColorValueSet.hxx b/include/svx/SvxColorValueSet.hxx index 7502d93f6104..77ad9b294ff6 100644 --- a/include/svx/SvxColorValueSet.hxx +++ b/include/svx/SvxColorValueSet.hxx @@ -24,6 +24,16 @@ class XColorList; +struct Palette +{ + typedef std::pair<Color, OString> NamedColor; + typedef std::vector< NamedColor > ColorList; + Palette(){}; + Palette(const OUString &rFname); + OString maName; + ColorList maColors; +}; + class SVX_DLLPUBLIC SvxColorValueSet : public ValueSet { private: @@ -39,7 +49,8 @@ public: sal_uInt32 getColumnCount() const; void addEntriesForXColorList(const XColorList& rXColorList, sal_uInt32 nStartIndex = 1); - void addEntriesForColorVector(const std::vector<Color>& rColorVector, sal_uInt32 nStartIndex = 1); + void loadColorVector(const std::vector<Color>& rColorVector, const OUString& rNamePrefix, sal_uInt32 nStartIndex = 1); + void loadPalette(const Palette& rPalette); Size layoutAllVisible(sal_uInt32 nEntryCount); Size layoutToGivenHeight(sal_uInt32 nHeight, sal_uInt32 nEntryCount); }; diff --git a/svx/source/tbxctrls/SvxColorValueSet.cxx b/svx/source/tbxctrls/SvxColorValueSet.cxx index b2ada21150e3..dc2f2c23d89e 100644 --- a/svx/source/tbxctrls/SvxColorValueSet.cxx +++ b/svx/source/tbxctrls/SvxColorValueSet.cxx @@ -24,6 +24,83 @@ #include <vcl/settings.hxx> +// finds first token in rStr from index, separated by whitespace +// returns position of next token in index +OString lcl_getToken(const OString& rStr, sal_Int32& index) +{ + sal_Int32 substart, toklen = 0; + + while(index < rStr.getLength() && + (rStr[index] == ' ' || rStr[index] == '\n' || rStr[index] == '\t')) + ++index; + if(index == rStr.getLength()) + { + index = -1; + return OString(); + } + substart = index; + + while(index < rStr.getLength() && + !(rStr[index] == ' ' || rStr[index] == '\n' || rStr[index] == '\t')) + { + ++index; + ++toklen; + } + + while(index < rStr.getLength() && + (rStr[index] == ' ' || rStr[index] == '\n' || rStr[index] == '\t')) + ++index; + if(index == rStr.getLength()) + index = -1; + + return rStr.copy(substart, toklen); +} + +Palette::Palette(const OUString &rFname) +{ + // TODO add error handling!!! + SvFileStream aFile(rFname, STREAM_READ); + + OString aPaletteName; + OString aLine; + + aFile.ReadLine(aLine); + if( !aLine.startsWith("GIMP Palette") ) return; + aFile.ReadLine(aLine); + if( aLine.startsWith("Name: ", &aPaletteName) ) + { + aFile.ReadLine(aLine); + if( aLine.startsWith("Columns: ")) + aFile.ReadLine(aLine); // we can ignore this + } + + do { + if (aLine[0] != '#' && aLine[0] != '\n') + { + // TODO check if r,g,b are 0<= x <=255, or just clamp? + sal_Int32 nIndex = 0; + OString token; + + token = lcl_getToken(aLine, nIndex); + if(token == "" || nIndex == -1) continue; + sal_Int32 r = token.toInt32(); + + token = lcl_getToken(aLine, nIndex); + if(token == "" || nIndex == -1) continue; + sal_Int32 g = token.toInt32(); + + token = lcl_getToken(aLine, nIndex); + if(token == "") continue; + sal_Int32 b = token.toInt32(); + + OString name; + if(nIndex != -1) + name = aLine.copy(nIndex); + + maColors.push_back(std::make_pair(Color(r, g, b), name)); + } + } while (aFile.ReadLine(aLine)); +} SvxColorValueSet::SvxColorValueSet(Window* _pParent, WinBits nWinStyle) : ValueSet(_pParent, nWinStyle) @@ -88,12 +165,37 @@ void SvxColorValueSet::addEntriesForXColorList(const XColorList& rXColorList, sa } } -void SvxColorValueSet::addEntriesForColorVector(const std::vector<Color>& rColorVector, sal_uInt32 nStartIndex) +void SvxColorValueSet::loadColorVector(const std::vector<Color>& rColorVector, const OUString& rNamePrefix, sal_uInt32 nStartIndex) +{ + if(rNamePrefix.getLength() != 0) + { + for(std::vector<Color>::const_iterator it = rColorVector.begin(); + it != rColorVector.end(); it++, nStartIndex++) + { + InsertItem(nStartIndex, *it, rNamePrefix + OUString::number(nStartIndex)); + } + } + else + { + for(std::vector<Color>::const_iterator it = rColorVector.begin(); + it != rColorVector.end(); it++, nStartIndex++) + { + InsertItem(nStartIndex, *it, ""); + } + } +} + + +void SvxColorValueSet::loadPalette(const Palette& rPalette) { - for(std::vector<Color>::const_iterator it = rColorVector.begin(); - it != rColorVector.end(); it++, nStartIndex++) + const Palette::ColorList &rColors = rPalette.maColors; + Clear(); + int nIx = 1; + for(Palette::ColorList::const_iterator it = rColors.begin(); + it != rColors.end(); ++it) { - InsertItem(nStartIndex, *it, ""); + InsertItem(nIx, it->first, OStringToOUString(it->second, RTL_TEXTENCODING_ASCII_US)); + ++nIx; } } |