1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef OOX_VML_VMLFORMATTING_HXX 25 #define OOX_VML_VMLFORMATTING_HXX 26 27 #include "oox/helper/helper.hxx" 28 29 namespace oox { 30 class GraphicHelper; 31 namespace drawingml { class Color; } 32 namespace drawingml { class ShapePropertyMap; } 33 } 34 35 namespace oox { 36 namespace vml { 37 38 // ============================================================================ 39 40 typedef ::std::pair< sal_Int32, sal_Int32 > Int32Pair; 41 typedef ::std::pair< double, double > DoublePair; 42 43 // ============================================================================ 44 45 class ConversionHelper 46 { 47 public: 48 /** Returns two values contained in rValue separated by cSep. 49 */ 50 static bool separatePair( 51 ::rtl::OUString& orValue1, ::rtl::OUString& orValue2, 52 const ::rtl::OUString& rValue, sal_Unicode cSep ); 53 54 /** Returns the boolean value from the passed string of a VML attribute. 55 Supported values: 'f', 't', 'false', 'true'. False for anything else. 56 */ 57 static bool decodeBool( const ::rtl::OUString& rValue ); 58 59 /** Converts the passed VML percentage measure string to a normalized 60 floating-point value. 61 62 @param rValue The VML percentage value. This is a floating-point value 63 with optional following '%' sign. If the '%' sign is missing, the 64 floating point value will be returned unmodified. If the '%' sign 65 is present, the value will be divided by 100. 66 */ 67 static double decodePercent( 68 const ::rtl::OUString& rValue, 69 double fDefValue ); 70 71 /** Converts the passed VML measure string to EMU (English Metric Units). 72 73 @param rGraphicHelper The graphic helper needed to perform pixel 74 conversion according to the current output device. 75 76 @param rValue The VML measure value. This is a floating-point value 77 with optional measure string following the value. 78 79 @param nRefValue Reference value needed for percentage measure. 80 81 @param bPixelX Set to true if the value is oriented horizontally (e.g. 82 X coordinates, widths). Set to false if the value is oriented 83 vertically (e.g. Y coordinates, heights). This is needed because 84 output devices may specify different width and height for a pixel. 85 86 @param bDefaultAsPixel Set to true if omitted measure unit means 87 pixel. Set to false if omitted measure unit means EMU. 88 */ 89 static sal_Int64 decodeMeasureToEmu( 90 const GraphicHelper& rGraphicHelper, 91 const ::rtl::OUString& rValue, 92 sal_Int32 nRefValue, 93 bool bPixelX, 94 bool bDefaultAsPixel ); 95 96 /** Converts the passed VML measure string to 1/100 mm. 97 98 @param rGraphicHelper See above. 99 @param rValue See above. 100 @param nRefValue See above. 101 @param bPixelX See above. 102 @param bDefaultAsPixel See above. 103 */ 104 static sal_Int32 decodeMeasureToHmm( 105 const GraphicHelper& rGraphicHelper, 106 const ::rtl::OUString& rValue, 107 sal_Int32 nRefValue, 108 bool bPixelX, 109 bool bDefaultAsPixel ); 110 111 /** Converts VML color attributes to a DrawingML color. 112 113 @param roVmlColor The VML string representation of the color. If 114 existing, this can be a 3-digit or 6-digit hexadecimal RGB value 115 with leading '#' character, a predefined color name (e.g. 'black', 116 'red', etc.), the index into an application defined color palette 117 in brackets with leading color name (e.g. 'red [9]' or 118 'windowColor [64]'), or a color modifier used in one-color 119 gradients (e.g. 'fill darken(128)' or 'fill lighten(0)'). 120 121 @param roVmlOpacity The opacity of the color. If existing, this should 122 be a floating-point value in the range [0.0;1.0]. 123 124 @param nDefaultRgb Deafult RGB color used if the parameter roVmlColor 125 is empty. 126 127 @param nPrimaryRgb If set to something else than API_RGB_TRANSPARENT, 128 specifies the color to be used to resolve the color modifiers used 129 in one-color gradients. 130 131 @return The resulting DrawingML color. 132 */ 133 static ::oox::drawingml::Color decodeColor( 134 const GraphicHelper& rGraphicHelper, 135 const OptValue< ::rtl::OUString >& roVmlColor, 136 const OptValue< double >& roVmlOpacity, 137 sal_Int32 nDefaultRgb, 138 sal_Int32 nPrimaryRgb = API_RGB_TRANSPARENT ); 139 140 private: 141 ConversionHelper(); 142 ~ConversionHelper(); 143 }; 144 145 // ============================================================================ 146 147 /** The stroke arrow model structure contains all properties for an line end arrow. */ 148 struct StrokeArrowModel 149 { 150 OptValue< sal_Int32 > moArrowType; 151 OptValue< sal_Int32 > moArrowWidth; 152 OptValue< sal_Int32 > moArrowLength; 153 154 void assignUsed( const StrokeArrowModel& rSource ); 155 }; 156 157 // ============================================================================ 158 159 /** The stroke model structure contains all shape border properties. */ 160 struct StrokeModel 161 { 162 OptValue< bool > moStroked; /// Shape border line on/off. 163 StrokeArrowModel maStartArrow; /// Start line arrow style. 164 StrokeArrowModel maEndArrow; /// End line arrow style. 165 OptValue< ::rtl::OUString > moColor; /// Solid line color. 166 OptValue< double > moOpacity; /// Solid line color opacity. 167 OptValue< ::rtl::OUString > moWeight; /// Line width. 168 OptValue< ::rtl::OUString > moDashStyle; /// Line dash (predefined or manually). 169 OptValue< sal_Int32 > moLineStyle; /// Line style (single, double, ...). 170 OptValue< sal_Int32 > moEndCap; /// Type of line end cap. 171 OptValue< sal_Int32 > moJoinStyle; /// Type of line join. 172 173 void assignUsed( const StrokeModel& rSource ); 174 175 /** Writes the properties to the passed property map. */ 176 void pushToPropMap( 177 ::oox::drawingml::ShapePropertyMap& rPropMap, 178 const GraphicHelper& rGraphicHelper ) const; 179 }; 180 181 // ============================================================================ 182 183 /** The fill model structure contains all shape fill properties. */ 184 struct FillModel 185 { 186 OptValue< bool > moFilled; /// Shape fill on/off. 187 OptValue< ::rtl::OUString > moColor; /// Solid fill color. 188 OptValue< double > moOpacity; /// Solid fill color opacity. 189 OptValue< ::rtl::OUString > moColor2; /// End color of gradient. 190 OptValue< double > moOpacity2; /// End color opycity of gradient. 191 OptValue< sal_Int32 > moType; /// Fill type. 192 OptValue< sal_Int32 > moAngle; /// Gradient rotation angle. 193 OptValue< double > moFocus; /// Linear gradient focus of second color. 194 OptValue< DoublePair > moFocusPos; /// Rectanguar gradient focus position of second color. 195 OptValue< DoublePair > moFocusSize; /// Rectanguar gradient focus size of second color. 196 OptValue< ::rtl::OUString > moBitmapPath; /// Path to fill bitmap fragment. 197 OptValue< bool > moRotate; /// True = rotate gradient/bitmap with shape. 198 199 void assignUsed( const FillModel& rSource ); 200 201 /** Writes the properties to the passed property map. */ 202 void pushToPropMap( 203 ::oox::drawingml::ShapePropertyMap& rPropMap, 204 const GraphicHelper& rGraphicHelper ) const; 205 }; 206 207 // ============================================================================ 208 209 } // namespace vml 210 } // namespace oox 211 212 #endif 213