1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef __CHART_COMMON_CONVERTERS_HXX 24*b1cdbd2cSJim Jagielski #define __CHART_COMMON_CONVERTERS_HXX 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include <tools/poly.hxx> 27*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Point.hpp> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Rectangle.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Size.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/Direction3D.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/HomogenMatrix.hpp> 32*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/HomogenMatrix3.hpp> 33*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PointSequenceSequence.hpp> 35*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/Position3D.hpp> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PolyPolygonShape3D.hpp> 37*b1cdbd2cSJim Jagielski #include <com/sun/star/text/WritingMode.hpp> 38*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSequence.hpp> 39*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx> 40*b1cdbd2cSJim Jagielski #include <basegfx/point/b3dpoint.hxx> 41*b1cdbd2cSJim Jagielski #include <basegfx/vector/b3dvector.hxx> 42*b1cdbd2cSJim Jagielski #include "charttoolsdllapi.hxx" 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski #include <vector> 45*b1cdbd2cSJim Jagielski #include <algorithm> 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski //............................................................................. 48*b1cdbd2cSJim Jagielski namespace chart 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski //............................................................................. 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 53*b1cdbd2cSJim Jagielski /** 54*b1cdbd2cSJim Jagielski diverse methods for class conversions; e.g. ::basegfx::B3DHomMatrix to HomogenMatrix 55*b1cdbd2cSJim Jagielski and operations e.g drawing::Position3D + drawing::Direction3D 56*b1cdbd2cSJim Jagielski */ 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 59*b1cdbd2cSJim Jagielski /** ::basegfx::B3DHomMatrix -> HomogenMatrix 60*b1cdbd2cSJim Jagielski */ 61*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::HomogenMatrix 62*b1cdbd2cSJim Jagielski B3DHomMatrixToHomogenMatrix( const ::basegfx::B3DHomMatrix& rM ); 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 65*b1cdbd2cSJim Jagielski /** HomogenMatrix -> ::basegfx::B3DHomMatrix 66*b1cdbd2cSJim Jagielski */ 67*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::basegfx::B3DHomMatrix HomogenMatrixToB3DHomMatrix( const com::sun::star::drawing::HomogenMatrix& rHM ); 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 70*b1cdbd2cSJim Jagielski /** ::basegfx::B3DHomMatrix -> B2DHomMatrix 71*b1cdbd2cSJim Jagielski */ 72*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 73*b1cdbd2cSJim Jagielski ::basegfx::B2DHomMatrix IgnoreZ( const ::basegfx::B3DHomMatrix& rM ); 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 76*b1cdbd2cSJim Jagielski /** B2DHomMatrix <-> HomogenMatrix3 77*b1cdbd2cSJim Jagielski */ 78*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::HomogenMatrix3 79*b1cdbd2cSJim Jagielski B2DHomMatrixToHomogenMatrix3( const ::basegfx::B2DHomMatrix& rM ); 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 82*b1cdbd2cSJim Jagielski /** Position3D -> B3DPoint 83*b1cdbd2cSJim Jagielski */ 84*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::basegfx::B3DPoint Position3DToB3DPoint( const com::sun::star::drawing::Position3D& rPosition ); 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 87*b1cdbd2cSJim Jagielski /** B3DVector -> Direction3D 88*b1cdbd2cSJim Jagielski */ 89*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::Direction3D B3DVectorToDirection3D( const ::basegfx::B3DVector& rVector); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 92*b1cdbd2cSJim Jagielski /** B3DPoint -> Position3D 93*b1cdbd2cSJim Jagielski */ 94*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::Position3D B3DPointToPosition3D( const ::basegfx::B3DPoint& rPoint); 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 97*b1cdbd2cSJim Jagielski /** Direction3D -> B3DVector 98*b1cdbd2cSJim Jagielski */ 99*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::basegfx::B3DVector Direction3DToB3DVector( const com::sun::star::drawing::Direction3D& rDirection); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 102*b1cdbd2cSJim Jagielski /** PolyPolygonShape3D + drawing::Position3D -> PolyPolygonShape3D 103*b1cdbd2cSJim Jagielski */ 104*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 105*b1cdbd2cSJim Jagielski void AddPointToPoly( ::com::sun::star::drawing::PolyPolygonShape3D& rPoly 106*b1cdbd2cSJim Jagielski , const com::sun::star::drawing::Position3D& rPos 107*b1cdbd2cSJim Jagielski , sal_Int32 nSequenceIndex=0 ); 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 110*b1cdbd2cSJim Jagielski /** get a single Point from a Polygon 111*b1cdbd2cSJim Jagielski */ 112*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::com::sun::star::drawing::Position3D getPointFromPoly( 113*b1cdbd2cSJim Jagielski const ::com::sun::star::drawing::PolyPolygonShape3D& rPolygon 114*b1cdbd2cSJim Jagielski , sal_Int32 nPointIndex, sal_Int32 nPolyIndex=0 ); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 117*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 118*b1cdbd2cSJim Jagielski void addPolygon( com::sun::star::drawing::PolyPolygonShape3D& rRet 119*b1cdbd2cSJim Jagielski , const com::sun::star::drawing::PolyPolygonShape3D& rAdd ); 120*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 121*b1cdbd2cSJim Jagielski /** PolyPolygonShape3D + PolyPolygonShape3D -> PolyPolygonShape3D 122*b1cdbd2cSJim Jagielski */ 123*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 124*b1cdbd2cSJim Jagielski void appendPoly( com::sun::star::drawing::PolyPolygonShape3D& rRet 125*b1cdbd2cSJim Jagielski , const com::sun::star::drawing::PolyPolygonShape3D& rAdd ); 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 128*b1cdbd2cSJim Jagielski /** PolyPolygonBezierCoords -> PolyPolygonShape3D 129*b1cdbd2cSJim Jagielski */ 130*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 131*b1cdbd2cSJim Jagielski com::sun::star::drawing::PolyPolygonShape3D BezierToPoly( 132*b1cdbd2cSJim Jagielski const com::sun::star::drawing::PolyPolygonBezierCoords& rBezier ); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 135*b1cdbd2cSJim Jagielski /** PolyPolygonShape3D -> drawing::PointSequenceSequence (2D) 136*b1cdbd2cSJim Jagielski */ 137*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 138*b1cdbd2cSJim Jagielski com::sun::star::drawing::PointSequenceSequence PolyToPointSequence( 139*b1cdbd2cSJim Jagielski const com::sun::star::drawing::PolyPolygonShape3D& rPolyPolygon ); 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 142*b1cdbd2cSJim Jagielski /** drawing::PointSequenceSequence + drawing::PointSequenceSequence 143*b1cdbd2cSJim Jagielski */ 144*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 145*b1cdbd2cSJim Jagielski void appendPointSequence( com::sun::star::drawing::PointSequenceSequence& rTarget 146*b1cdbd2cSJim Jagielski , com::sun::star::drawing::PointSequenceSequence& rAdd ); 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 149*b1cdbd2cSJim Jagielski /** Position3D + Direction3D == Position3D 150*b1cdbd2cSJim Jagielski */ 151*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::Position3D 152*b1cdbd2cSJim Jagielski operator+( const com::sun::star::drawing::Position3D& rPos 153*b1cdbd2cSJim Jagielski , const com::sun::star::drawing::Direction3D& rDirection); 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 156*b1cdbd2cSJim Jagielski /** Position3D - Position3D == Direction3D 157*b1cdbd2cSJim Jagielski */ 158*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::Direction3D 159*b1cdbd2cSJim Jagielski operator-( const com::sun::star::drawing::Position3D& rPos1 160*b1cdbd2cSJim Jagielski , const com::sun::star::drawing::Position3D& rPos2); 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 163*b1cdbd2cSJim Jagielski /** Position3D == Position3D ? 164*b1cdbd2cSJim Jagielski */ 165*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 166*b1cdbd2cSJim Jagielski bool operator==( const com::sun::star::drawing::Position3D& rPos1 167*b1cdbd2cSJim Jagielski , const com::sun::star::drawing::Position3D& rPos2); 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 170*b1cdbd2cSJim Jagielski /** awt::Rect --> awt::Point (2D) 171*b1cdbd2cSJim Jagielski */ 172*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::com::sun::star::awt::Point ToPoint( const com::sun::star::awt::Rectangle& rRectangle ); 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 175*b1cdbd2cSJim Jagielski /** awt::Rect --> awt::Size (2D) 176*b1cdbd2cSJim Jagielski */ 177*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::com::sun::star::awt::Size ToSize( const com::sun::star::awt::Rectangle& rRectangle ); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 180*b1cdbd2cSJim Jagielski /** Position3D --> awt::Point (2D) 181*b1cdbd2cSJim Jagielski */ 182*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::com::sun::star::awt::Point Position3DToAWTPoint( const com::sun::star::drawing::Position3D& rPos ); 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 185*b1cdbd2cSJim Jagielski /** Direction3D --> awt::Size (2D) 186*b1cdbd2cSJim Jagielski */ 187*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS ::com::sun::star::awt::Size Direction3DToAWTSize( const com::sun::star::drawing::Direction3D& rDirection ); 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 190*b1cdbd2cSJim Jagielski /** B3DPoint -> Sequence<double> 191*b1cdbd2cSJim Jagielski */ 192*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::uno::Sequence< double > B3DPointToSequence( const ::basegfx::B3DPoint& rPoint ); 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 195*b1cdbd2cSJim Jagielski /** Sequence<double> -> drawing::Position3D 196*b1cdbd2cSJim Jagielski */ 197*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::drawing::Position3D 198*b1cdbd2cSJim Jagielski SequenceToPosition3D( const com::sun::star::uno::Sequence< double >& rSeq ); 199*b1cdbd2cSJim Jagielski 200*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 201*b1cdbd2cSJim Jagielski /** drawing::Position3D -> Sequence<double> 202*b1cdbd2cSJim Jagielski */ 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS com::sun::star::uno::Sequence< double > 205*b1cdbd2cSJim Jagielski Position3DToSequence( const com::sun::star::drawing::Position3D& rPosition ); 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 208*b1cdbd2cSJim Jagielski /** chart2::XDataSequence -> uno::Sequence< double > 209*b1cdbd2cSJim Jagielski */ 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 212*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< double > DataSequenceToDoubleSequence( 213*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 214*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::data::XDataSequence > & xDataSequence ); 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 217*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< rtl::OUString > DataSequenceToStringSequence( 218*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 219*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::data::XDataSequence > & xDataSequence ); 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 222*b1cdbd2cSJim Jagielski /** uno::Sequence< uno::Sequence< T > > -> uno::Sequence< T > 223*b1cdbd2cSJim Jagielski */ 224*b1cdbd2cSJim Jagielski template< typename T > 225*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< T > FlattenSequence(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Sequence<T>> & aSeqSeq)226*b1cdbd2cSJim Jagielski FlattenSequence( const ::com::sun::star::uno::Sequence< 227*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< T > > & aSeqSeq ) 228*b1cdbd2cSJim Jagielski { 229*b1cdbd2cSJim Jagielski sal_Int32 nOuter, nInner, nCount = 0, 230*b1cdbd2cSJim Jagielski nResultSize = 0; 231*b1cdbd2cSJim Jagielski const sal_Int32 nOuterSize = aSeqSeq.getLength(); 232*b1cdbd2cSJim Jagielski for( nOuter=0; nOuter<nOuterSize; ++nOuter ) 233*b1cdbd2cSJim Jagielski nResultSize += aSeqSeq[nOuter].getLength(); 234*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< T > aResult( nResultSize ); 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski for( nOuter=0; nOuter<nOuterSize; ++nOuter ) 237*b1cdbd2cSJim Jagielski { 238*b1cdbd2cSJim Jagielski const sal_Int32 nInnerSize = aSeqSeq[nOuter].getLength(); 239*b1cdbd2cSJim Jagielski for( nInner=0; nInner<nInnerSize; ++nInner, ++nCount ) 240*b1cdbd2cSJim Jagielski aResult[nCount] = aSeqSeq[nOuter][nInner]; 241*b1cdbd2cSJim Jagielski } 242*b1cdbd2cSJim Jagielski return aResult; 243*b1cdbd2cSJim Jagielski } 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielski template< typename T > 246*b1cdbd2cSJim Jagielski ::std::vector< T > FlattenVector(const::std::vector<::std::vector<T>> & rVecVec)247*b1cdbd2cSJim Jagielski FlattenVector( const ::std::vector< ::std::vector< T > > & rVecVec ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski typedef ::std::vector< T > tFlatVec; 250*b1cdbd2cSJim Jagielski typedef ::std::vector< tFlatVec > tVecVec; 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski tFlatVec aResult; 253*b1cdbd2cSJim Jagielski typename tVecVec::const_iterator aOuterEnd( rVecVec.end()); 254*b1cdbd2cSJim Jagielski for( typename tVecVec::const_iterator aOuterIt( rVecVec.begin()); aOuterIt != aOuterEnd; ++aOuterIt ) 255*b1cdbd2cSJim Jagielski ::std::copy( aOuterIt->begin(), aOuterIt->end(), back_inserter( aResult )); 256*b1cdbd2cSJim Jagielski return aResult; 257*b1cdbd2cSJim Jagielski } 258*b1cdbd2cSJim Jagielski 259*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 260*b1cdbd2cSJim Jagielski sal_Bool hasDoubleValue( const ::com::sun::star::uno::Any& rAny ); 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 263*b1cdbd2cSJim Jagielski sal_Bool hasLongOrShortValue( const ::com::sun::star::uno::Any& rAny ); 264*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 265*b1cdbd2cSJim Jagielski sal_Int16 getShortForLongAlso( const ::com::sun::star::uno::Any& rAny ); 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski OOO_DLLPUBLIC_CHARTTOOLS 268*b1cdbd2cSJim Jagielski bool replaceParamterInString( rtl::OUString & rInOutResourceString, 269*b1cdbd2cSJim Jagielski const rtl::OUString & rParamToReplace, 270*b1cdbd2cSJim Jagielski const rtl::OUString & rReplaceWith ); 271*b1cdbd2cSJim Jagielski 272*b1cdbd2cSJim Jagielski //............................................................................. 273*b1cdbd2cSJim Jagielski } //namespace chart 274*b1cdbd2cSJim Jagielski //............................................................................. 275*b1cdbd2cSJim Jagielski #endif 276