/* -*- 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 #include #include #include #include #include #include #include #include "dmapperLoggers.hxx" namespace writerfilter { namespace dmapper { using namespace ::com::sun::star; CellColorHandler::CellColorHandler() : LoggedProperties(dmapper_logger, "CellColorHandler"), m_nShadingPattern( drawing::ShadingPattern::CLEAR ), m_nColor( 0xffffffff ), m_nFillColor( 0xffffffff ), m_OutputFormat( Form ) { } CellColorHandler::~CellColorHandler() { } // ST_Shd strings are converted to integers by the tokenizer, store strings in // the InteropGrabBag uno::Any lcl_ConvertShd(sal_Int32 nIntValue) { OUString aRet; // This should be in sync with the ST_Shd list in ooxml's model.xml. switch (nIntValue) { case 0: aRet = "clear"; break; case 1: aRet = "solid"; break; case 2: aRet = "pct5"; break; case 3: aRet = "pct10"; break; case 4: aRet = "pct20"; break; case 5: aRet = "pct25"; break; case 6: aRet = "pct30"; break; case 7: aRet = "pct40"; break; case 8: aRet = "pct50"; break; case 9: aRet = "pct60"; break; case 10: aRet = "pct70"; break; case 11: aRet = "pct75"; break; case 12: aRet = "pct80"; break; case 13: aRet = "pct90"; break; case 14: aRet = "horzStripe"; break; case 15: aRet = "vertStripe"; break; case 17: aRet = "reverseDiagStripe"; break; case 16: aRet = "diagStripe"; break; case 18: aRet = "horzCross"; break; case 19: aRet = "diagCross"; break; case 20: aRet = "thinHorzStripe"; break; case 21: aRet = "thinVertStripe"; break; case 23: aRet = "thinReverseDiagStripe"; break; case 22: aRet = "thinDiagStripe"; break; case 24: aRet = "thinHorzCross"; break; case 25: aRet = "thinDiagCross"; break; case 37: aRet = "pct12"; break; case 38: aRet = "pct15"; break; case 43: aRet = "pct35"; break; case 44: aRet = "pct37"; break; case 46: aRet = "pct45"; break; case 49: aRet = "pct55"; break; case 51: aRet = "pct62"; break; case 52: aRet = "pct65"; break; case 57: aRet = "pct85"; break; case 58: aRet = "pct87"; break; case 60: aRet = "pct95"; break; case 65535: aRet = "nil"; break; } return uno::makeAny(aRet); } void CellColorHandler::lcl_attribute(Id rName, Value & rVal) { sal_Int32 nIntValue = rVal.getInt(); switch( rName ) { case NS_ooxml::LN_CT_Shd_val: { createGrabBag("val", lcl_ConvertShd(nIntValue)); //might be clear, pct5...90, some hatch types //TODO: The values need symbolic names! m_nShadingPattern = nIntValue; //clear == 0, solid: 1, pct5: 2, pct50:8, pct95: x3c, horzStripe:0x0e, thinVertStripe: 0x15 } break; case NS_ooxml::LN_CT_Shd_fill: createGrabBag("fill", uno::makeAny(OStringToOUString(msfilter::util::ConvertColor(nIntValue, /*bAutoColor=*/true), RTL_TEXTENCODING_UTF8))); if( nIntValue == OOXML_COLOR_AUTO ) nIntValue = 0xffffff; //fill color auto means white m_nFillColor = nIntValue; break; case NS_ooxml::LN_CT_Shd_color: createGrabBag("color", uno::makeAny(OStringToOUString(msfilter::util::ConvertColor(nIntValue, /*bAutoColor=*/true), RTL_TEXTENCODING_UTF8))); if( nIntValue == OOXML_COLOR_AUTO ) nIntValue = 0; //shading color auto means black //color of the shading m_nColor = nIntValue; break; case NS_ooxml::LN_CT_Shd_themeFill: createGrabBag("themeFill", uno::makeAny(TDefTableHandler::getThemeColorTypeString(nIntValue))); break; case NS_ooxml::LN_CT_Shd_themeFillShade: createGrabBag("themeFillShade", uno::makeAny(OUString::number(nIntValue, 16))); break; case NS_ooxml::LN_CT_Shd_themeFillTint: createGrabBag("themeFillTint", uno::makeAny(OUString::number(nIntValue, 16))); break; case NS_ooxml::LN_CT_Shd_themeColor: createGrabBag("themeColor", uno::makeAny(TDefTableHandler::getThemeColorTypeString(nIntValue))); break; case NS_ooxml::LN_CT_Shd_themeShade: createGrabBag("themeShade", uno::makeAny(OUString::number(nIntValue, 16))); break; case NS_ooxml::LN_CT_Shd_themeTint: createGrabBag("themeTint", uno::makeAny(OUString::number(nIntValue, 16))); break; default: OSL_FAIL( "unknown attribute"); } } void CellColorHandler::lcl_sprm(Sprm & rSprm) { (void)rSprm; } TablePropertyMapPtr CellColorHandler::getProperties() { TablePropertyMapPtr pPropertyMap(new TablePropertyMap); // Code from binary word filter (the values are out of 1000) static const sal_Int32 eMSGrayScale[] = { // Clear-Brush 0, // 0 clear // Solid-Brush 1000, // 1 solid // Percent values 50, // 2 pct5 100, // 3 pct10 200, // 4 pct20 250, // 5 pct25 300, // 6 pct30 400, // 7 pct40 500, // 8 pct50 600, // 9 pct60 700, // 10 pct70 750, // 11 pct75 800, // 12 pct80 900, // 13 pct90 // Special cases 333, // 14 Dark Horizontal 333, // 15 Dark Vertical 333, // 16 Dark Forward Diagonal 333, // 17 Dark Backward Diagonal 333, // 18 Dark Cross 333, // 19 Dark Diagonal Cross 333, // 20 Horizontal 333, // 21 Vertical 333, // 22 Forward Diagonal 333, // 23 Backward Diagonal 333, // 24 Cross 333, // 25 Diagonal Cross // Undefined values in DOC spec-sheet 500, // 26 500, // 27 500, // 28 500, // 29 500, // 30 500, // 31 500, // 32 500, // 33 500, // 34 // Different shading types 25, // 35 [available in DOC, not available in DOCX] 75, // 36 [available in DOC, not available in DOCX] 125, // 37 pct12 150, // 38 pct15 175, // 39 [available in DOC, not available in DOCX] 225, // 40 [available in DOC, not available in DOCX] 275, // 41 [available in DOC, not available in DOCX] 325, // 42 [available in DOC, not available in DOCX] 350, // 43 pct35 375, // 44 pct37 425, // 45 [available in DOC, not available in DOCX] 450, // 46 pct45 475, // 47 [available in DOC, not available in DOCX] 525, // 48 [available in DOC, not available in DOCX] 550, // 49 pct55 575, // 50 [available in DOC, not available in DOCX] 625, // 51 pct62 650, // 52 pct65 675, // 53 [available in DOC, not available in DOCX] 725, // 54 [available in DOC, not available in DOCX] 775, // 55 [available in DOC, not available in DOCX] 825, // 56 [available in DOC, not available in DOCX] 850, // 57 pct85 875, // 58 pct87 925, // 59 [available in DOC, not available in DOCX] 950, // 60 pct95 975 // 61 [available in DOC, not available in DOCX] };// 62 if( m_nShadingPattern >= (sal_Int32)SAL_N_ELEMENTS( eMSGrayScale ) ) m_nShadingPattern = 0; sal_Int32 nWW8BrushStyle = eMSGrayScale[m_nShadingPattern]; sal_Int32 nApplyColor = 0; if( !nWW8BrushStyle ) { // Clear-Brush nApplyColor = m_nFillColor; } else { sal_Int32 nFore = m_nColor; sal_Int32 nBack = m_nFillColor; sal_uInt32 nRed = ((nFore & 0xff0000)>>0x10) * nWW8BrushStyle; sal_uInt32 nGreen = ((nFore & 0xff00)>>0x8) * nWW8BrushStyle; sal_uInt32 nBlue = (nFore & 0xff) * nWW8BrushStyle; nRed += ((nBack & 0xff0000)>>0x10) * (1000L - nWW8BrushStyle); nGreen += ((nBack & 0xff00)>>0x8)* (1000L - nWW8BrushStyle); nBlue += (nBack & 0xff) * (1000L - nWW8BrushStyle); nApplyColor = ( (nRed/1000) << 0x10 ) + ((nGreen/1000) << 8) + nBlue/1000; } // Check if it is a 'Character' if (m_OutputFormat == Character) { static sal_Int32 aWWShadingPatterns[ ] = { drawing::ShadingPattern::CLEAR, drawing::ShadingPattern::SOLID, drawing::ShadingPattern::PCT5, drawing::ShadingPattern::PCT10, drawing::ShadingPattern::PCT20, drawing::ShadingPattern::PCT25, drawing::ShadingPattern::PCT30, drawing::ShadingPattern::PCT40, drawing::ShadingPattern::PCT50, drawing::ShadingPattern::PCT60, drawing::ShadingPattern::PCT70, drawing::ShadingPattern::PCT75, drawing::ShadingPattern::PCT80, drawing::ShadingPattern::PCT90, drawing::ShadingPattern::HORZ_STRIPE, drawing::ShadingPattern::VERT_STRIPE, drawing::ShadingPattern::REVERSE_DIAG_STRIPE, drawing::ShadingPattern::DIAG_STRIPE, drawing::ShadingPattern::HORZ_CROSS, drawing::ShadingPattern::DIAG_CROSS, drawing::ShadingPattern::THIN_HORZ_STRIPE, drawing::ShadingPattern::THIN_VERT_STRIPE, drawing::ShadingPattern::THIN_REVERSE_DIAG_STRIPE, drawing::ShadingPattern::THIN_DIAG_STRIPE, drawing::ShadingPattern::THIN_HORZ_CROSS, drawing::ShadingPattern::THIN_DIAG_CROSS, drawing::ShadingPattern::UNUSED_1, drawing::ShadingPattern::UNUSED_2, drawing::ShadingPattern::UNUSED_3, drawing::ShadingPattern::UNUSED_4, drawing::ShadingPattern::UNUSED_5, drawing::ShadingPattern::UNUSED_6, drawing::ShadingPattern::UNUSED_7, drawing::ShadingPattern::UNUSED_8, drawing::ShadingPattern::UNUSED_9, drawing::ShadingPattern::PCT2, drawing::ShadingPattern::PCT7, drawing::ShadingPattern::PCT12, drawing::ShadingPattern::PCT15, drawing::ShadingPattern::PCT17, drawing::ShadingPattern::PCT22, drawing::ShadingPattern::PCT27, drawing::ShadingPattern::PCT32, drawing::ShadingPattern::PCT35, drawing::ShadingPattern::PCT37, drawing::ShadingPattern::PCT42, drawing::ShadingPattern::PCT45, drawing::ShadingPattern::PCT47, drawing::ShadingPattern::PCT52, drawing::ShadingPattern::PCT55, drawing::ShadingPattern::PCT57, drawing::ShadingPattern::PCT62, drawing::ShadingPattern::PCT65, drawing::ShadingPattern::PCT67, drawing::ShadingPattern::PCT72, drawing::ShadingPattern::PCT77, drawing::ShadingPattern::PCT82, drawing::ShadingPattern::PCT85, drawing::ShadingPattern::PCT87, drawing::ShadingPattern::PCT92, drawing::ShadingPattern::PCT95, drawing::ShadingPattern::PCT97 }; // Write the shading pattern property pPropertyMap->Insert(PROP_CHAR_SHADING_VALUE, uno::makeAny( aWWShadingPatterns[m_nShadingPattern] )); } pPropertyMap->Insert( m_OutputFormat == Form ? PROP_BACK_COLOR : m_OutputFormat == Paragraph ? PROP_PARA_BACK_COLOR : PROP_CHAR_BACK_COLOR, uno::makeAny( nApplyColor )); createGrabBag("originalColor", uno::makeAny( OStringToOUString( msfilter::util::ConvertColor( nApplyColor, true ), RTL_TEXTENCODING_UTF8 ))); return pPropertyMap; } void CellColorHandler::createGrabBag(const OUString& aName, uno::Any aAny) { if (m_aInteropGrabBagName.isEmpty()) return; beans::PropertyValue aValue; aValue.Name = aName; aValue.Value = aAny; m_aInteropGrabBag.push_back(aValue); } void CellColorHandler::enableInteropGrabBag(const OUString& aName) { m_aInteropGrabBagName = aName; } beans::PropertyValue CellColorHandler::getInteropGrabBag() { beans::PropertyValue aRet; aRet.Name = m_aInteropGrabBagName; uno::Sequence aSeq(m_aInteropGrabBag.size()); beans::PropertyValue* pSeq = aSeq.getArray(); for (std::vector::iterator i = m_aInteropGrabBag.begin(); i != m_aInteropGrabBag.end(); ++i) *pSeq++ = *i; aRet.Value = uno::makeAny(aSeq); return aRet; } void CellColorHandler::disableInteropGrabBag() { m_aInteropGrabBagName = ""; m_aInteropGrabBag.clear(); } bool CellColorHandler::isInteropGrabBagEnabled() { return !(m_aInteropGrabBagName.isEmpty()); } } //namespace dmapper } //namespace writerfilter /* vim:set shiftwidth=4 softtabstop=4 expandtab: */