LCOV - code coverage report
Current view: top level - svx/source/tbxctrls - Palette.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 9 181 5.0 %
Date: 2015-06-13 12:38:46 Functions: 5 26 19.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svx/Palette.hxx>
      21             : 
      22             : 
      23       31032 : Palette::~Palette()
      24             : {
      25       31032 : }
      26             : 
      27           0 : PaletteASE::~PaletteASE()
      28             : {
      29           0 : }
      30             : 
      31           0 : PaletteASE::PaletteASE( const OUString &rFPath, const OUString &rFName ) :
      32             :     mbValidPalette( false ),
      33             :     maFPath ( rFPath ),
      34           0 :     maName  ( rFName )
      35             : {
      36           0 :     LoadPalette();
      37           0 : }
      38             : 
      39           0 : void PaletteASE::LoadColorSet( SvxColorValueSet& rColorSet )
      40             : {
      41           0 :     rColorSet.Clear();
      42           0 :     int nIx = 1;
      43           0 :     for (ColorList::const_iterator it = maColors.begin(); it != maColors.end(); ++it)
      44             :     {
      45           0 :         rColorSet.InsertItem(nIx, it->first, it->second);
      46           0 :         ++nIx;
      47             :     }
      48           0 : }
      49             : 
      50           0 : const OUString& PaletteASE::GetName()
      51             : {
      52           0 :     return maName;
      53             : }
      54             : 
      55           0 : bool PaletteASE::IsValid()
      56             : {
      57           0 :     return mbValidPalette;
      58             : }
      59             : 
      60             : // CMYK values from 0 to 1
      61             : // TODO: Deduplicate me (taken from core/cui/source/dialogs/colorpicker.cxx)
      62           0 : static void lcl_CMYKtoRGB( float fCyan, float fMagenta, float fYellow, float fKey, float& dR, float& dG, float& dB )
      63             : {
      64           0 :     fCyan = (fCyan * ( 1.0 - fKey )) + fKey;
      65           0 :     fMagenta = (fMagenta * ( 1.0 - fKey )) + fKey;
      66           0 :     fYellow = (fYellow * ( 1.0 - fKey )) + fKey;
      67             : 
      68           0 :     dR = std::max( std::min( ( 1.0 - fCyan ), 1.0), 0.0 );
      69           0 :     dG = std::max( std::min( ( 1.0 - fMagenta ), 1.0), 0.0 );
      70           0 :     dB = std::max( std::min( ( 1.0 - fYellow ), 1.0), 0.0 );
      71           0 : }
      72             : 
      73           0 : void PaletteASE::LoadPalette()
      74             : {
      75           0 :     SvFileStream aFile(maFPath, StreamMode::READ);
      76           0 :     aFile.SetEndian(SvStreamEndian::BIG);
      77             : 
      78             :     // Verify magic first 4 characters
      79           0 :     sal_Char cMagic[5] = {0};
      80           0 :     if ((aFile.Read(cMagic, 4) != 4) || (strncmp(cMagic, "ASEF", 4) != 0))
      81             :     {
      82           0 :         mbValidPalette = false;
      83           0 :         return;
      84             :     }
      85             : 
      86             :     // Ignore the version number
      87           0 :     aFile.SeekRel(4);
      88             : 
      89           0 :     sal_uInt32 nBlocks = 0;
      90           0 :     aFile.ReadUInt32(nBlocks);
      91           0 :     for (sal_uInt32 nI = 0; nI < nBlocks; nI++) {
      92           0 :         sal_uInt32 nChunkType = 0;
      93           0 :         aFile.ReadUInt32(nChunkType);
      94             :         // End chunk
      95           0 :         if (nChunkType == 0)
      96           0 :            break;
      97             : 
      98             :         // Grab chunk size, name length
      99           0 :         sal_uInt16 nChunkSize = 0;
     100           0 :         sal_uInt16 nChars = 0;
     101           0 :         aFile.ReadUInt16(nChunkSize);
     102           0 :         aFile.ReadUInt16(nChars);
     103             : 
     104           0 :         OUString aName("");
     105           0 :         if (nChars > 1)
     106           0 :             aName = read_uInt16s_ToOUString(aFile, nChars);
     107             :         else
     108           0 :             aFile.SeekRel(2);
     109             : 
     110           0 :         if (nChunkType == 0xC0010000)
     111             :         {
     112             :             // Got a start chunk, so set palette name
     113           0 :             maName = aName;
     114             :             // Is there color data? (shouldn't happen in a start block, but check anyway)
     115           0 :             if (nChunkSize > ((nChars * 2) + 2))
     116           0 :                 aName.clear();
     117             :             else
     118           0 :                 continue;
     119             :         }
     120             : 
     121           0 :         sal_Char cColorModel[5] = {0};
     122           0 :         aFile.Read(cColorModel, 4);
     123           0 :         OString aColorModel(cColorModel);
     124             :         // r, g, and b are floats ranging from 0 to 1
     125           0 :         float r = 0, g = 0, b = 0;
     126             : 
     127           0 :         if (aColorModel.equalsIgnoreAsciiCase("cmyk"))
     128             :         {
     129           0 :             float c = 0, m = 0, y = 0, k = 0;
     130           0 :             aFile.ReadFloat(c);
     131           0 :             aFile.ReadFloat(m);
     132           0 :             aFile.ReadFloat(y);
     133           0 :             aFile.ReadFloat(k);
     134           0 :             lcl_CMYKtoRGB(c, m, y, k, r, g, b);
     135             :         }
     136           0 :         else if (aColorModel.equalsIgnoreAsciiCase("rgb "))
     137             :         {
     138           0 :             aFile.ReadFloat(r);
     139           0 :             aFile.ReadFloat(g);
     140           0 :             aFile.ReadFloat(b);
     141             :         }
     142           0 :         else if (aColorModel.equalsIgnoreAsciiCase("gray"))
     143             :         {
     144           0 :             float nVal = 0;
     145           0 :             aFile.ReadFloat(nVal);
     146           0 :             r = g = b = nVal;
     147             :         }
     148             :         else
     149             :         {
     150           0 :             float nL = 0, nA = 0, nB = 0;
     151           0 :             aFile.ReadFloat(nL);
     152           0 :             aFile.ReadFloat(nA);
     153           0 :             aFile.ReadFloat(nB);
     154             :             // TODO: How to convert LAB to RGB?
     155           0 :             r = g = b = 0;
     156             :         }
     157             : 
     158             :         // Ignore color type
     159           0 :         aFile.SeekRel(2);
     160           0 :         maColors.push_back(std::make_pair(Color(r * 255, g * 255, b * 255), aName));
     161           0 :     }
     162             : 
     163           0 :     mbValidPalette = true;
     164             : }
     165             : 
     166             : // PaletteGPL ------------------------------------------------------------------
     167             : 
     168             : OString lcl_getToken(const OString& rStr, sal_Int32& index);
     169             : 
     170           0 : PaletteGPL::PaletteGPL( const OUString &rFPath, const OUString &rFName ) :
     171             :     mbLoadedPalette( false ),
     172             :     mbValidPalette( false ),
     173             :     maFName( rFName ),
     174           0 :     maFPath( rFPath )
     175             : {
     176           0 :     LoadPaletteHeader();
     177           0 : }
     178             : 
     179           0 : PaletteGPL::~PaletteGPL()
     180             : {
     181           0 : }
     182             : 
     183           0 : const OUString& PaletteGPL::GetName()
     184             : {
     185           0 :     return maName;
     186             : }
     187             : 
     188           0 : void PaletteGPL::LoadColorSet( SvxColorValueSet& rColorSet )
     189             : {
     190           0 :     LoadPalette();
     191             : 
     192           0 :     rColorSet.Clear();
     193           0 :     int nIx = 1;
     194           0 :     for (ColorList::const_iterator it = maColors.begin(); it != maColors.end(); ++it)
     195             :     {
     196           0 :         rColorSet.InsertItem(nIx, it->first, it->second);
     197           0 :         ++nIx;
     198             :     }
     199           0 : }
     200             : 
     201           0 : bool PaletteGPL::IsValid()
     202             : {
     203           0 :     return mbValidPalette;
     204             : }
     205             : 
     206           0 : bool PaletteGPL::ReadPaletteHeader(SvFileStream& rFileStream)
     207             : {
     208           0 :     OString aLine;
     209           0 :     OString aName;
     210             : 
     211           0 :     rFileStream.ReadLine(aLine);
     212           0 :     if( !aLine.startsWith("GIMP Palette") ) return false;
     213           0 :     rFileStream.ReadLine(aLine);
     214           0 :     if( aLine.startsWith("Name: ", &aName) )
     215             :     {
     216           0 :         maName = OStringToOUString(aName, RTL_TEXTENCODING_ASCII_US);
     217           0 :         rFileStream.ReadLine(aLine);
     218           0 :         if( aLine.startsWith("Columns: "))
     219           0 :             rFileStream.ReadLine(aLine); // we can ignore this
     220             :     }
     221             :     else
     222             :     {
     223           0 :         maName = maFName;
     224             :     }
     225           0 :     return true;
     226             : }
     227             : 
     228           0 : void PaletteGPL::LoadPaletteHeader()
     229             : {
     230           0 :     SvFileStream aFile(maFPath, StreamMode::READ);
     231           0 :     mbValidPalette = ReadPaletteHeader( aFile );
     232           0 : }
     233             : 
     234           0 : void PaletteGPL::LoadPalette()
     235             : {
     236           0 :     if( mbLoadedPalette ) return;
     237           0 :     mbLoadedPalette = true;
     238             : 
     239             :     // TODO add error handling!!!
     240           0 :     SvFileStream aFile(maFPath, StreamMode::READ);
     241           0 :     mbValidPalette = ReadPaletteHeader( aFile );
     242             : 
     243           0 :     if( !mbValidPalette ) return;
     244             : 
     245           0 :     OString aLine;
     246           0 :     do {
     247           0 :         if (aLine[0] != '#' && aLine[0] != '\n')
     248             :         {
     249             :             // TODO check if r,g,b are 0<= x <=255, or just clamp?
     250           0 :             sal_Int32 nIndex = 0;
     251           0 :             OString token;
     252             : 
     253           0 :             token = lcl_getToken(aLine, nIndex);
     254           0 :             if(token.isEmpty() || nIndex == -1) continue;
     255           0 :             sal_Int32 r = token.toInt32();
     256             : 
     257           0 :             token = lcl_getToken(aLine, nIndex);
     258           0 :             if(token.isEmpty() || nIndex == -1) continue;
     259           0 :             sal_Int32 g = token.toInt32();
     260             : 
     261           0 :             token = lcl_getToken(aLine, nIndex);
     262           0 :             if(token.isEmpty()) continue;
     263           0 :             sal_Int32 b = token.toInt32();
     264             : 
     265           0 :             OString name;
     266           0 :             if(nIndex != -1)
     267           0 :                 name = aLine.copy(nIndex);
     268             : 
     269             :             maColors.push_back(std::make_pair(
     270             :                 Color(r, g, b),
     271           0 :                 OStringToOUString(name, RTL_TEXTENCODING_ASCII_US)));
     272             :         }
     273           0 :     } while (aFile.ReadLine(aLine));
     274             : }
     275             : 
     276             : // finds first token in rStr from index, separated by whitespace
     277             : // returns position of next token in index
     278           0 : OString lcl_getToken(const OString& rStr, sal_Int32& index)
     279             : {
     280           0 :     sal_Int32 substart, toklen = 0;
     281           0 :     OUString aWhitespaceChars( " \n\t" );
     282             : 
     283           0 :     while(index < rStr.getLength() &&
     284           0 :             aWhitespaceChars.indexOf( rStr[index] ) != -1)
     285           0 :         ++index;
     286           0 :     if(index == rStr.getLength())
     287             :     {
     288           0 :         index = -1;
     289           0 :         return OString();
     290             :     }
     291           0 :     substart = index;
     292             : 
     293             :     //counts length of token
     294           0 :     while(index < rStr.getLength() &&
     295           0 :             aWhitespaceChars.indexOf( rStr[index] ) == -1 )
     296             :     {
     297           0 :         ++index;
     298           0 :         ++toklen;
     299             :     }
     300             : 
     301             :     //counts to position of next token
     302           0 :     while(index < rStr.getLength() &&
     303           0 :             aWhitespaceChars.indexOf( rStr[index] ) != -1 )
     304           0 :         ++index;
     305           0 :     if(index == rStr.getLength())
     306           0 :         index = -1;
     307             : 
     308           0 :     return rStr.copy(substart, toklen);
     309             : }
     310             : 
     311             : // PaletteSOC ------------------------------------------------------------------
     312             : 
     313       31032 : PaletteSOC::PaletteSOC( const OUString &rFPath, const OUString &rFName ) :
     314             :     mbLoadedPalette( false ),
     315             :     maFPath( rFPath ),
     316       31032 :     maName( rFName )
     317             : {
     318       31032 : }
     319             : 
     320       62064 : PaletteSOC::~PaletteSOC()
     321             : {
     322       62064 : }
     323             : 
     324           0 : const OUString& PaletteSOC::GetName()
     325             : {
     326           0 :     return maName;
     327             : }
     328             : 
     329           0 : void PaletteSOC::LoadColorSet( SvxColorValueSet& rColorSet )
     330             : {
     331           0 :     if( !mbLoadedPalette )
     332             :     {
     333           0 :         mbLoadedPalette = true;
     334           0 :         mpColorList = XPropertyList::AsColorList(XPropertyList::CreatePropertyListFromURL(XCOLOR_LIST, maFPath));
     335           0 :         (void)mpColorList->Load();
     336             :     }
     337           0 :     rColorSet.Clear();
     338           0 :     if( mpColorList.is() )
     339           0 :         rColorSet.addEntriesForXColorList( *mpColorList );
     340           0 : }
     341             : 
     342       31032 : bool PaletteSOC::IsValid()
     343             : {
     344       31032 :     return true;
     345             : }
     346             : 
     347             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11