add editeng::ConvertBorderWidthFromWord:
Replace the 2 duplicate implementations of this in ww8 and writerfilter with a common one. Differences were: 2) ww8 doubles the with, writerfilter does not 13) unsupported, mapped to THINTHICK_SMALLGAP vs. THICKTHIN_SMALLGAP 22) unsupported, mapped to DASHED vs. SOLID 26) INSET not supported in writerfilter 27) OUTSET not supported in writerfilter Change-Id: I533b77394388e736f38d70284a6a11061d81e813
This commit is contained in:
@@ -52,9 +52,12 @@ namespace editeng {
|
||||
// values from ::com::sun::star::table::BorderLineStyle
|
||||
typedef sal_Int16 SvxBorderStyle;
|
||||
|
||||
// convert border style between Word formats and LO
|
||||
SvxBorderStyle EDITENG_DLLPUBLIC ConvertBorderStyleFromWord(int);
|
||||
/// convert border width in twips between Word formats and LO
|
||||
double EDITENG_DLLPUBLIC ConvertBorderWidthToWord(SvxBorderStyle, double);
|
||||
double EDITENG_DLLPUBLIC ConvertBorderWidthFromWord(SvxBorderStyle, double);
|
||||
double EDITENG_DLLPUBLIC ConvertBorderWidthFromWord(SvxBorderStyle,
|
||||
double, int);
|
||||
|
||||
class EDITENG_DLLPUBLIC SvxBorderLine
|
||||
{
|
||||
|
||||
@@ -117,6 +117,78 @@ SvxBorderLine::SvxBorderLine( const Color *pCol, long nWidth,
|
||||
aColor = *pCol;
|
||||
}
|
||||
|
||||
|
||||
SvxBorderStyle
|
||||
ConvertBorderStyleFromWord(int const nWordLineStyle)
|
||||
{
|
||||
switch (nWordLineStyle)
|
||||
{
|
||||
// First the single lines
|
||||
case 1:
|
||||
case 2: // thick line
|
||||
case 5:
|
||||
// and the unsupported special cases which we map to a single line
|
||||
case 8:
|
||||
case 9:
|
||||
case 20:
|
||||
return SOLID;
|
||||
break;
|
||||
case 6:
|
||||
return DOTTED;
|
||||
break;
|
||||
case 7:
|
||||
case 22:
|
||||
return DASHED;
|
||||
break;
|
||||
// then the shading beams which we represent by a double line
|
||||
case 23:
|
||||
return DOUBLE;
|
||||
break;
|
||||
// then the double lines, for which we have good matches
|
||||
case 3:
|
||||
case 10: // Don't have triple so use double
|
||||
case 21: // Don't have double wave: use double instead
|
||||
return DOUBLE;
|
||||
break;
|
||||
case 11:
|
||||
return THINTHICK_SMALLGAP;
|
||||
break;
|
||||
case 12:
|
||||
case 13: // Don't have thin thick thin, so use thick thin
|
||||
return THICKTHIN_SMALLGAP;
|
||||
break;
|
||||
case 14:
|
||||
return THINTHICK_MEDIUMGAP;
|
||||
break;
|
||||
case 15:
|
||||
case 16: // Don't have thin thick thin, so use thick thin
|
||||
return THICKTHIN_MEDIUMGAP;
|
||||
break;
|
||||
case 17:
|
||||
return THINTHICK_LARGEGAP;
|
||||
break;
|
||||
case 18:
|
||||
case 19: // Don't have thin thick thin, so use thick thin
|
||||
return THICKTHIN_LARGEGAP;
|
||||
break;
|
||||
case 24:
|
||||
return EMBOSSED;
|
||||
break;
|
||||
case 25:
|
||||
return ENGRAVED;
|
||||
break;
|
||||
case 26:
|
||||
return OUTSET;
|
||||
break;
|
||||
case 27:
|
||||
return INSET;
|
||||
break;
|
||||
default:
|
||||
return NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const double THINTHICK_SMALLGAP_line2 = 15.0;
|
||||
static const double THINTHICK_SMALLGAP_gap = 15.0;
|
||||
static const double THINTHICK_LARGEGAP_line1 = 30.0;
|
||||
@@ -129,7 +201,8 @@ static const double OUTSET_line1 = 15.0;
|
||||
static const double INSET_line2 = 15.0;
|
||||
|
||||
double
|
||||
ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth)
|
||||
ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth,
|
||||
int const nWordLineStyle)
|
||||
{
|
||||
switch (eStyle)
|
||||
{
|
||||
@@ -137,7 +210,7 @@ ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth)
|
||||
case SOLID:
|
||||
case DOTTED:
|
||||
case DASHED:
|
||||
return fWidth;
|
||||
return (2 == nWordLineStyle) ? (fWidth * 2.0) : fWidth;
|
||||
break;
|
||||
|
||||
// Double lines
|
||||
|
||||
@@ -1280,83 +1280,13 @@ sal_uInt8 lcl_ReadBorders(bool bVer67, WW8_BRC* brc, WW8PLCFx_Cp_FKP* pPap,
|
||||
void GetLineIndex(SvxBoxItem &rBox, short nLineThickness, short nSpace, sal_uInt8 nCol, short nIdx,
|
||||
sal_uInt16 nOOIndex, sal_uInt16 nWWIndex, short *pSize=0)
|
||||
{
|
||||
::editeng::SvxBorderStyle eStyle = table::BorderLineStyle::SOLID;
|
||||
switch (nIdx)
|
||||
{
|
||||
// First the single lines
|
||||
case 1:
|
||||
case 5:
|
||||
// and the unsupported special cases which we map to a single line
|
||||
case 8:
|
||||
case 9:
|
||||
case 20:
|
||||
case 22:
|
||||
eStyle = table::BorderLineStyle::SOLID;
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
eStyle = table::BorderLineStyle::SOLID;
|
||||
nLineThickness *= 2;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
eStyle = table::BorderLineStyle::DOTTED;
|
||||
break;
|
||||
case 7:
|
||||
eStyle = table::BorderLineStyle::DASHED;
|
||||
break;
|
||||
// then the shading beams which we represent by a double line
|
||||
case 23:
|
||||
eStyle = table::BorderLineStyle::DOUBLE;
|
||||
break;
|
||||
// then the double lines, for which we have good matches
|
||||
case 3:
|
||||
case 10: //Don't have tripple so use double
|
||||
case 21: //Don't have double wave: use double instead
|
||||
eStyle = table::BorderLineStyle::DOUBLE;
|
||||
break;
|
||||
case 11:
|
||||
eStyle = table::BorderLineStyle::THINTHICK_SMALLGAP;
|
||||
break;
|
||||
case 12:
|
||||
case 13: //Don't have thin thick thin, so use thick thin
|
||||
eStyle = table::BorderLineStyle::THICKTHIN_SMALLGAP;
|
||||
break;
|
||||
case 14:
|
||||
eStyle = table::BorderLineStyle::THINTHICK_MEDIUMGAP;
|
||||
break;
|
||||
case 15:
|
||||
case 16: //Don't have thin thick thin, so use thick thin
|
||||
eStyle = table::BorderLineStyle::THICKTHIN_MEDIUMGAP;
|
||||
break;
|
||||
case 17:
|
||||
eStyle = table::BorderLineStyle::THINTHICK_LARGEGAP;
|
||||
break;
|
||||
case 18:
|
||||
case 19: //Don't have thin thick thin, so use thick thin
|
||||
eStyle = table::BorderLineStyle::THICKTHIN_LARGEGAP;
|
||||
break;
|
||||
case 24:
|
||||
eStyle = table::BorderLineStyle::EMBOSSED;
|
||||
break;
|
||||
case 25:
|
||||
eStyle = table::BorderLineStyle::ENGRAVED;
|
||||
break;
|
||||
case 26:
|
||||
eStyle = table::BorderLineStyle::OUTSET;
|
||||
break;
|
||||
case 27:
|
||||
eStyle = table::BorderLineStyle::INSET;
|
||||
break;
|
||||
default:
|
||||
eStyle = table::BorderLineStyle::NONE;
|
||||
break;
|
||||
}
|
||||
::editeng::SvxBorderStyle const eStyle(
|
||||
::editeng::ConvertBorderStyleFromWord(nIdx));
|
||||
|
||||
::editeng::SvxBorderLine aLine;
|
||||
aLine.SetBorderLineStyle( eStyle );
|
||||
double const fConverted( (table::BorderLineStyle::NONE == eStyle) ? 0.0 :
|
||||
::editeng::ConvertBorderWidthFromWord(eStyle, nLineThickness));
|
||||
::editeng::ConvertBorderWidthFromWord(eStyle, nLineThickness, nIdx));
|
||||
aLine.SetWidth(fConverted);
|
||||
|
||||
//No AUTO for borders as yet, so if AUTO, use BLACK
|
||||
|
||||
@@ -133,77 +133,16 @@ void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineType,
|
||||
if(!bIsOOXML && sal::static_int_cast<sal_uInt32>(nLineColor) < SAL_N_ELEMENTS(aBorderDefColor))
|
||||
nLineColor = aBorderDefColor[nLineColor];
|
||||
|
||||
sal_Int16 nLineStyle = NONE;
|
||||
// Map to our border types, we should use of one equal line
|
||||
// thickness, or one of smaller thickness. If too small we
|
||||
// can make the defecit up in additional white space or
|
||||
// object size
|
||||
switch(nLineType)
|
||||
{
|
||||
// First the single lines
|
||||
case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
nLineStyle = SOLID;
|
||||
break;
|
||||
// Dotted and dashed lines
|
||||
case 6:
|
||||
nLineStyle = DOTTED;
|
||||
break;
|
||||
case 7:
|
||||
case 22:
|
||||
nLineStyle = DASHED;
|
||||
break;
|
||||
// and the unsupported special cases which we map to a single line
|
||||
case 8:
|
||||
case 9:
|
||||
case 20:
|
||||
nLineStyle = SOLID;
|
||||
break;
|
||||
// Double line
|
||||
case 3:
|
||||
case 10: //Don't have tripple so use double
|
||||
case 21:
|
||||
case 23:
|
||||
nLineStyle = DOUBLE;
|
||||
break;
|
||||
case 11:
|
||||
case 13: //Don't have thin thick thin, so use thick thin
|
||||
nLineStyle = THINTHICK_SMALLGAP;
|
||||
break;
|
||||
case 12:
|
||||
nLineStyle = THICKTHIN_SMALLGAP;
|
||||
break;
|
||||
case 14:
|
||||
nLineStyle = THINTHICK_MEDIUMGAP;
|
||||
break;
|
||||
case 15:
|
||||
case 16: //Don't have thin thick thin, so use thick thin
|
||||
nLineStyle = THICKTHIN_MEDIUMGAP;
|
||||
break;
|
||||
case 17:
|
||||
nLineStyle = THINTHICK_LARGEGAP;
|
||||
break;
|
||||
case 18:
|
||||
case 19: //Don't have thin thick thin, so use thick thin
|
||||
nLineStyle = THICKTHIN_LARGEGAP;
|
||||
break;
|
||||
// Embossed and engraved lines
|
||||
case 24:
|
||||
nLineStyle = EMBOSSED;
|
||||
break;
|
||||
case 25:
|
||||
nLineStyle = ENGRAVED;
|
||||
break;
|
||||
case 0:
|
||||
case 255:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
::editeng::SvxBorderStyle const nLineStyle(
|
||||
::editeng::ConvertBorderStyleFromWord(nLineType));
|
||||
rToFill.LineStyle = nLineStyle;
|
||||
double const fConverted( (NONE == nLineStyle) ? 0.0 :
|
||||
::editeng::ConvertBorderWidthFromWord(nLineStyle, nLineThickness));
|
||||
::editeng::ConvertBorderWidthFromWord(nLineStyle, nLineThickness,
|
||||
nLineType));
|
||||
rToFill.LineWidth = convertTwipToMM100(fConverted);
|
||||
rToFill.Color = nLineColor;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user