From f013e3d3c9d26a37e0e4948f2d6069c07eb895d7 Mon Sep 17 00:00:00 2001
From: Regina Henschel <rb.henschel@t-online.de>
Date: Fri, 9 Sep 2011 15:02:34 +0200
Subject: [PATCH] Add missing chart data point ODF1.2 standard symbols

---
 .../chartapiwrapper/WrappedSymbolProperties.cxx    |    2 +-
 chart2/source/view/main/ShapeFactory.cxx           |  323 ++++++++++++++++++++
 cui/source/tabpages/tpline.cxx                     |   37 ++-
 oox/source/drawingml/chart/typegroupconverter.cxx  |   12 +-
 sc/source/filter/excel/xlchart.cxx                 |   22 +-
 xmloff/inc/xmloff/xmltoken.hxx                     |    6 +
 xmloff/source/chart/XMLSymbolTypePropertyHdl.cxx   |    7 +
 xmloff/source/core/xmltoken.cxx                    |    6 +
 xmloff/source/transform/StyleOASISTContext.cxx     |   14 +
 xmloff/source/transform/StyleOOoTContext.cxx       |   21 ++
 10 files changed, 429 insertions(+), 21 deletions(-)

diff --git a/chart2/source/controller/chartapiwrapper/WrappedSymbolProperties.cxx b/chart2/source/controller/chartapiwrapper/WrappedSymbolProperties.cxx
index 5707a0a..97d3156 100644
--- a/chart2/source/controller/chartapiwrapper/WrappedSymbolProperties.cxx
+++ b/chart2/source/controller/chartapiwrapper/WrappedSymbolProperties.cxx
@@ -151,7 +151,7 @@ sal_Int32 lcl_getSymbolType( const ::com::sun::star::chart2::Symbol& rSymbol )
             nSymbol = ::com::sun::star::chart::ChartSymbolType::AUTO;
             break;
         case chart2::SymbolStyle_STANDARD:
-            nSymbol = rSymbol.StandardSymbol%8;
+            nSymbol = rSymbol.StandardSymbol%15;
             break;
         case chart2::SymbolStyle_POLYGON://new feature
             nSymbol = ::com::sun::star::chart::ChartSymbolType::AUTO;
diff --git a/chart2/source/view/main/ShapeFactory.cxx b/chart2/source/view/main/ShapeFactory.cxx
index e152c47..dc06eba 100644
--- a/chart2/source/view/main/ShapeFactory.cxx
+++ b/chart2/source/view/main/ShapeFactory.cxx
@@ -1263,6 +1263,13 @@ enum SymbolType { SYMBOL_SQUARE=0
                  , SYMBOL_ARROW_LEFT
                  , SYMBOL_BOWTIE
                  , SYMBOL_SANDGLASS
+                 , SYMBOL_CIRCLE
+                 , SYMBOL_STAR
+                 , SYMBOL_X
+                 , SYMBOL_PLUS
+                 , SYMBOL_ASTERISK
+                 , SYMBOL_HORIZONTAL_BAR
+                 , SYMBOL_VERTICAL_BAR
                  , SYMBOL_COUNT
                   };
 
@@ -1286,6 +1293,9 @@ drawing::PolyPolygonShape3D createPolyPolygon_Symbol( const drawing::Position3D&
     const double fWidthH  = rSize.DirectionX/2.0; //fWidthH stands for Half Width
     const double fHeightH = rSize.DirectionY/2.0; //fHeightH stands for Half Height
 
+    double fMaxSize = fHeightH > fWidthH ? fHeightH : fWidthH; //assumes non negative
+    const sal_Int32 nQuarterCount = 35; // points inside a quadrant, used in case circle
+
     sal_Int32 nPointCount = 4; //all arrow symbols only need 4 points
     switch( eSymbolType )
     {
@@ -1293,8 +1303,25 @@ drawing::PolyPolygonShape3D createPolyPolygon_Symbol( const drawing::Position3D&
         case SYMBOL_DIAMOND:
         case SYMBOL_BOWTIE:
         case SYMBOL_SANDGLASS:
+        case SYMBOL_HORIZONTAL_BAR:
+        case SYMBOL_VERTICAL_BAR:
             nPointCount = 5;
             break;
+        case SYMBOL_X:
+            nPointCount = 13;
+            break;
+        case SYMBOL_PLUS:
+            nPointCount = 13;
+            break;
+        case SYMBOL_STAR:
+            nPointCount = 9;
+            break;
+        case SYMBOL_ASTERISK:
+            nPointCount = 19;
+            break;
+        case SYMBOL_CIRCLE:
+            nPointCount = 5 + 4 * nQuarterCount;
+            break;
         default:
             break;
     }
@@ -1323,6 +1350,24 @@ drawing::PolyPolygonShape3D createPolyPolygon_Symbol( const drawing::Position3D&
 
     switch(eSymbolType)
     {
+        case SYMBOL_SQUARE:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
         case SYMBOL_ARROW_UP:
         {
             *pInnerSequenceX++ = fX-fWidthH;
@@ -1438,6 +1483,284 @@ drawing::PolyPolygonShape3D createPolyPolygon_Symbol( const drawing::Position3D&
             *pInnerSequenceY++ = fY;
             break;
         }
+        case SYMBOL_HORIZONTAL_BAR:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+            break;
+        }
+        case SYMBOL_VERTICAL_BAR:
+        {
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            break;
+        }
+        case SYMBOL_CIRCLE:
+        {
+            double fOmega = 1.5707963267948966192 / (nQuarterCount + 1.0);
+            // one point in the middle of each edge to get full size bounding rectangle
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY;
+            // 0 to PI/2
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX + fWidthH * cos( i * fOmega );
+                *pInnerSequenceY++ = fY - fHeightH * sin( i * fOmega );
+            }
+            // PI/2 to PI
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY - fHeightH;
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX - fWidthH * sin( i * fOmega);
+                *pInnerSequenceY++ = fY - fHeightH * cos( i * fOmega);
+            }
+            // PI to 3/2*PI
+            *pInnerSequenceX++ = fX - fWidthH;
+            *pInnerSequenceY++ = fY;
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX - fWidthH * cos( i * fOmega);
+                *pInnerSequenceY++ = fY + fHeightH * sin( i * fOmega);
+            }
+            // 3/2*PI to 2*PI
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY + fHeightH;
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX + fWidthH * sin(i * fOmega);
+                *pInnerSequenceY++ = fY + fHeightH * cos(i * fOmega);
+            }
+            // close polygon
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY;
+            break;
+        }
+        case SYMBOL_STAR:
+        {
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        case SYMBOL_X:
+        {
+            const double fScaleX = fWidthH / 128.0;
+            const double fScaleY = fHeightH / 128.0;
+            const double fSmall = sqrt(200.0);
+            const double fLarge = 128.0 - fSmall;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY - fScaleY * fSmall;
+
+            *pInnerSequenceX++ = fX - fScaleX * fLarge;
+            *pInnerSequenceY++ = fY - fHeightH;
+
+            *pInnerSequenceX++ = fX - fWidthH;
+            *pInnerSequenceY++ = fY - fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX - fScaleX * fSmall;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX - fWidthH;
+            *pInnerSequenceY++ = fY + fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX - fScaleX * fLarge;
+            *pInnerSequenceY++ = fY + fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY + fScaleY * fSmall;
+
+            *pInnerSequenceX++ = fX + fScaleX * fLarge;
+            *pInnerSequenceY++ = fY + fHeightH;
+
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY + fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX + fScaleX * fSmall;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY - fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX + fScaleX * fLarge;
+            *pInnerSequenceY++ = fY - fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY - fScaleY * fSmall;
+            break;
+
+        }
+        case SYMBOL_PLUS:
+        {
+            const double fScaleX = fWidthH / 128.0;
+            const double fScaleY = fHeightH / 128.0;
+            const double fHalf = 10.0; //half line width on 256 size square
+            const double fdX = fScaleX * fHalf;
+            const double fdY = fScaleY * fHalf;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fdX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fdX;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX+fdX;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX+fdY;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+
+        }
+        case SYMBOL_ASTERISK:
+        {
+            const double fHalf = 10.0; // half line width on 256 size square
+            const double fTwoY = fHalf * sqrt(3.0);
+            const double fFourY = (128.0 - 2.0 * fHalf ) / sqrt(3.0);
+            const double fThreeX = 128.0 - fHalf;
+            const double fThreeY = fHalf * sqrt(3.0) + fFourY;
+            const double fFiveX = 2.0 * fHalf;
+
+            const double fScaleX = fWidthH / 128.0;
+            const double fScaleY = fHeightH / 128.0;
+
+            //1
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fHeightH;
+            //2
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
+            //3
+            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
+            //4
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fScaleY * fFourY;
+            //5
+            *pInnerSequenceX++ = fX-fScaleX * fFiveX;
+            *pInnerSequenceY++ = fY;
+            //6 as 4
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fScaleY * fFourY;
+            //7 as 3
+            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
+            //8 as 2
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
+            //9 as 1
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fHeightH;
+            //10 as 1
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fHeightH;
+            //11 as 2
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
+            //12 as 3
+            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
+            //13 as 4
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fScaleY * fFourY;
+            //14 as 5
+            *pInnerSequenceX++ = fX+fScaleX * fFiveX;
+            *pInnerSequenceY++ = fY;
+            //15 as 4
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fScaleY * fFourY;
+            //16 as 3
+            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
+            //17 as 2
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
+            // 18 as 1
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fHeightH;
+            // 19 = 1, closing
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
         default: //case SYMBOL_SQUARE:
         {
             *pInnerSequenceX++ = fX-fWidthH;
diff --git a/cui/source/tabpages/tpline.cxx b/cui/source/tabpages/tpline.cxx
index 2b44a9e..b6825b9 100644
--- a/cui/source/tabpages/tpline.cxx
+++ b/cui/source/tabpages/tpline.cxx
@@ -910,8 +910,6 @@ void SvxLineTabPage::Reset( const SfxItemSet& rAttrs )
                 if(pObj)
                 {
                     pObj=pObj->Clone();
-                    pPage->NbcInsertObject(pObj);
-                    pView->MarkObj(pObj,pPageView);
                     if(pSymbolAttr)
                     {
                         pObj->SetMergedItemSet(*pSymbolAttr);
@@ -920,17 +918,31 @@ void SvxLineTabPage::Reset( const SfxItemSet& rAttrs )
                     {
                         pObj->SetMergedItemSet(rOutAttrs);
                     }
+
+                    pPage->NbcInsertObject(pObj);
+
+                    // Generate invisible square to give all symbol types a
+                    // bitmap size, which is indepedent from specific glyph
+                    SdrObject *pInvisibleSquare=pSymbolList->GetObj(0);
+                    pInvisibleSquare=pInvisibleSquare->Clone();
+                    pPage->NbcInsertObject(pInvisibleSquare);
+                    pInvisibleSquare->SetMergedItem(XFillTransparenceItem(100));
+                    pInvisibleSquare->SetMergedItem(XLineTransparenceItem(100));
+
+                    pView->MarkAll();
                     GDIMetaFile aMeta(pView->GetAllMarkedMetaFile());
 
                     aSymbolGraphic=Graphic(aMeta);
                     aSymbolSize=pObj->GetSnapRect().GetSize();
-                    aSymbolGraphic.SetPrefSize(aSymbolSize);
+                    aSymbolGraphic.SetPrefSize(pInvisibleSquare->GetSnapRect().GetSize());
                     aSymbolGraphic.SetPrefMapMode(MAP_100TH_MM);
                     bPrevSym=sal_True;
                     bEnable=sal_True;
                     bIgnoreGraphic=sal_True;
 
                     pView->UnmarkAll();
+                    pInvisibleSquare=pPage->RemoveObject(1);
+                    SdrObject::Free( pInvisibleSquare);
                     pObj=pPage->RemoveObject(0);
                     SdrObject::Free( pObj );
                 }
@@ -957,12 +969,12 @@ void SvxLineTabPage::Reset( const SfxItemSet& rAttrs )
             bPrevSym=sal_True;
         }
     }
+
     if(rAttrs.GetItemState(rAttrs.GetPool()->GetWhich(SID_ATTR_SYMBOLSIZE),sal_True,&pPoolItem) == SFX_ITEM_SET)
     {
         aSymbolSize = ((const SvxSizeItem *)pPoolItem)->GetSize();
     }
 
-
     aSymbolRatioCB.Enable(bEnable);
     aSymbolHeightFT.Enable(bEnable);
     aSymbolWidthFT.Enable(bEnable);
@@ -1537,6 +1549,15 @@ IMPL_LINK( SvxLineTabPage, MenuCreateHdl_Impl, MenuButton *, pButton )
 
         PopupMenu* pPopup = new PopupMenu;
         String aEmptyStr;
+
+        // Generate invisible square to give all symbols a
+        // bitmap size, which is indepedent from specific glyph
+        SdrObject *pInvisibleSquare=pSymbolList->GetObj(0);
+        pInvisibleSquare=pInvisibleSquare->Clone();
+        pPage->NbcInsertObject(pInvisibleSquare);
+        pInvisibleSquare->SetMergedItem(XFillTransparenceItem(100));
+        pInvisibleSquare->SetMergedItem(XLineTransparenceItem(100));
+
         for(long i=0;; ++i)
         {
             SdrObject *pObj=pSymbolList->GetObj(i);
@@ -1545,7 +1566,6 @@ IMPL_LINK( SvxLineTabPage, MenuCreateHdl_Impl, MenuButton *, pButton )
             pObj=pObj->Clone();
             aGrfNames.push_back(aEmptyStr);
             pPage->NbcInsertObject(pObj);
-            pView->MarkObj(pObj,pPageView);
             if(pSymbolAttr)
             {
                 pObj->SetMergedItemSet(*pSymbolAttr);
@@ -1554,11 +1574,11 @@ IMPL_LINK( SvxLineTabPage, MenuCreateHdl_Impl, MenuButton *, pButton )
             {
                 pObj->SetMergedItemSet(rOutAttrs);
             }
-
+            pView->MarkAll();
             Bitmap aBitmap(pView->GetAllMarkedBitmap());
             GDIMetaFile aMeta(pView->GetAllMarkedMetaFile());
             pView->UnmarkAll();
-            pObj=pPage->RemoveObject(0);
+            pObj=pPage->RemoveObject(1);
             SdrObject::Free(pObj);
 
             SvxBrushItem* pBrushItem = new SvxBrushItem(Graphic(aMeta), GPOS_AREA, SID_ATTR_BRUSH);
@@ -1585,6 +1605,9 @@ IMPL_LINK( SvxLineTabPage, MenuCreateHdl_Impl, MenuButton *, pButton )
             Image aImage(aBitmap);
             pPopup->InsertItem(pInfo->nItemId,aEmptyStr,aImage);
         }
+        pInvisibleSquare=pPage->RemoveObject(0);
+        SdrObject::Free(pInvisibleSquare);
+
         aSymbolMB.GetPopupMenu()->SetPopupMenu( MN_SYMBOLS, pPopup );
 
         if(aGrfNames.empty())
diff --git a/oox/source/drawingml/chart/typegroupconverter.cxx b/oox/source/drawingml/chart/typegroupconverter.cxx
index 5dba350..3924694 100644
--- a/oox/source/drawingml/chart/typegroupconverter.cxx
+++ b/oox/source/drawingml/chart/typegroupconverter.cxx
@@ -451,19 +451,19 @@ void TypeGroupConverter::convertMarker( PropertySet& rPropSet, sal_Int32 nOoxSym
         // symbol style
         cssc::Symbol aSymbol;
         aSymbol.Style = cssc::SymbolStyle_STANDARD;
-        switch( nOoxSymbol )
+        switch( nOoxSymbol ) // compare with XclChPropSetHelper::WriteMarkerProperties in xlchart.cxx
         {
             case XML_auto:      aSymbol.Style = cssc::SymbolStyle_AUTO; break;
             case XML_none:      aSymbol.Style = cssc::SymbolStyle_NONE; break;
             case XML_square:    aSymbol.StandardSymbol = 0;             break;  // square
             case XML_diamond:   aSymbol.StandardSymbol = 1;             break;  // diamond
             case XML_triangle:  aSymbol.StandardSymbol = 3;             break;  // arrow up
-            case XML_x:         aSymbol.StandardSymbol = 6;             break;  // bow tie
-            case XML_star:      aSymbol.StandardSymbol = 7;             break;  // sand glass
+            case XML_x:         aSymbol.StandardSymbol = 10;            break;  // X, legacy bow tie
+            case XML_star:      aSymbol.StandardSymbol = 12;            break;  // asterisk, legacy sand glass
             case XML_dot:       aSymbol.StandardSymbol = 4;             break;  // arrow right
-            case XML_dash:      aSymbol.StandardSymbol = 2;             break;  // arrow down
-            case XML_circle:    aSymbol.StandardSymbol = 4;             break;  // arrow right
-            case XML_plus:      aSymbol.StandardSymbol = 5;             break;  // arrow left
+            case XML_dash:      aSymbol.StandardSymbol = 13;            break;  // horizontal bar, legacy arrow down
+            case XML_circle:    aSymbol.StandardSymbol = 8;             break;  // circle, legacy arrow right
+            case XML_plus:      aSymbol.StandardSymbol = 11;            break;  // plus, legacy arrow left
         }
 
         // symbol size (points in OOXML, 1/100 mm in Chart2)
diff --git a/sc/source/filter/excel/xlchart.cxx b/sc/source/filter/excel/xlchart.cxx
index 6a71736..bffe9ae 100644
--- a/sc/source/filter/excel/xlchart.cxx
+++ b/sc/source/filter/excel/xlchart.cxx
@@ -944,10 +944,17 @@ void XclChPropSetHelper::ReadMarkerProperties(
                     case 1:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND;   break;  // diamond
                     case 2:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV;    break;  // arrow down
                     case 3:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_TRIANGLE;  break;  // arrow up
-                    case 4:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CIRCLE;    break;  // arrow right
+                    case 4:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DOWJ;      break;  // arrow right, same as import
                     case 5:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS;      break;  // arrow left
                     case 6:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS;     break;  // bow tie
                     case 7:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR;      break;  // sand glass
+                    case 8:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CIRCLE;    break;  // circle new in LibO3.5
+                    case 9:     rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND;   break;  // star new in LibO3.5
+                    case 10:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS;     break;  // X new in LibO3.5
+                    case 11:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS;      break;  // plus new in LibO3.5
+                    case 12:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR;      break;  // asterisk new in LibO3.5
+                    case 13:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV;    break;  // horizontal bar new in LibO3.5
+                    case 14:    rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR;      break;  // vertical bar new in LibO3.5
                     default:    rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx );
                 }
             break;
@@ -1153,12 +1160,13 @@ void XclChPropSetHelper::WriteMarkerProperties(
         case EXC_CHMARKERFORMAT_SQUARE:     aApiSymbol.StandardSymbol = 0;              break;  // square
         case EXC_CHMARKERFORMAT_DIAMOND:    aApiSymbol.StandardSymbol = 1;              break;  // diamond
         case EXC_CHMARKERFORMAT_TRIANGLE:   aApiSymbol.StandardSymbol = 3;              break;  // arrow up
-        case EXC_CHMARKERFORMAT_CROSS:      aApiSymbol.StandardSymbol = 6;              break;  // bow tie
-        case EXC_CHMARKERFORMAT_STAR:       aApiSymbol.StandardSymbol = 7;              break;  // sand glass
-        case EXC_CHMARKERFORMAT_DOWJ:       aApiSymbol.StandardSymbol = 4;              break;  // arrow right
-        case EXC_CHMARKERFORMAT_STDDEV:     aApiSymbol.StandardSymbol = 2;              break;  // arrow down
-        case EXC_CHMARKERFORMAT_CIRCLE:     aApiSymbol.StandardSymbol = 4;              break;  // arrow right
-        case EXC_CHMARKERFORMAT_PLUS:       aApiSymbol.StandardSymbol = 5;              break;  // arrow left
+        case EXC_CHMARKERFORMAT_CROSS:      aApiSymbol.StandardSymbol = 10;             break;  // X, legacy bow tie
+        case EXC_CHMARKERFORMAT_STAR:       aApiSymbol.StandardSymbol = 12;             break;  // asterisk, legacy sand glass
+        case EXC_CHMARKERFORMAT_DOWJ:       aApiSymbol.StandardSymbol = 4;              break;  // arrow right, same as export
+        case EXC_CHMARKERFORMAT_STDDEV:     aApiSymbol.StandardSymbol = 13;             break;  // horizontal bar, legacy arrow down
+        case EXC_CHMARKERFORMAT_CIRCLE:     aApiSymbol.StandardSymbol = 8;              break;  // circle, legacy arrow right
+        case EXC_CHMARKERFORMAT_PLUS:       aApiSymbol.StandardSymbol = 11;             break;  // plus, legacy arrow left
+        default: break;
     }
 
     // symbol size
diff --git a/xmloff/inc/xmloff/xmltoken.hxx b/xmloff/inc/xmloff/xmltoken.hxx
index a923f46..746e75d 100644
--- a/xmloff/inc/xmloff/xmltoken.hxx
+++ b/xmloff/inc/xmloff/xmltoken.hxx
@@ -3139,6 +3139,12 @@ namespace xmloff { namespace token {
 
         XML_MARGIN, // #i117001#
 
+        // regina, ODF1.2 additional symbols in charts
+        XML_STAR,
+        XML_ASTERISK,
+        XML_HORIZONTAL_BAR,
+        XML_VERTICAL_BAR,
+
         XML_TOKEN_END
     };
 
diff --git a/xmloff/source/chart/XMLSymbolTypePropertyHdl.cxx b/xmloff/source/chart/XMLSymbolTypePropertyHdl.cxx
index 4eba27e..c284c57 100644
--- a/xmloff/source/chart/XMLSymbolTypePropertyHdl.cxx
+++ b/xmloff/source/chart/XMLSymbolTypePropertyHdl.cxx
@@ -63,6 +63,13 @@ SvXMLSignedEnumMapEntry aXMLChartSymbolNameMap[] =
     { XML_ARROW_LEFT,           5 },
     { XML_BOW_TIE,              6 },
     { XML_HOURGLASS,            7 },
+    { XML_CIRCLE,               8 },
+    { XML_STAR,                 9 },
+    { XML_X,                   10 },
+    { XML_PLUS,                11 },
+    { XML_ASTERISK,            12 },
+    { XML_HORIZONTAL_BAR,      13 },
+    { XML_VERTICAL_BAR,        14 },
     { XML_TOKEN_INVALID,        0 }
 };
 
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index b07e77a..45bcc35 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -3137,6 +3137,12 @@ namespace xmloff { namespace token {
 
         TOKEN( "margin", XML_MARGIN),
 
+        // regina, ODF1.2 additional symbols in charts
+        TOKEN( "star",                         XML_STAR ),
+        TOKEN( "asterisk",                     XML_ASTERISK ),
+        TOKEN( "horizontal-bar",               XML_HORIZONTAL_BAR ),
+        TOKEN( "vertical-bar",                 XML_VERTICAL_BAR ),
+
 #if OSL_DEBUG_LEVEL > 0
         { 0, NULL, NULL,                       XML_TOKEN_END }
 #else
diff --git a/xmloff/source/transform/StyleOASISTContext.cxx b/xmloff/source/transform/StyleOASISTContext.cxx
index 2ef42bf..b6e361f 100644
--- a/xmloff/source/transform/StyleOASISTContext.cxx
+++ b/xmloff/source/transform/StyleOASISTContext.cxx
@@ -389,6 +389,20 @@ void XMLPropertiesTContext_Impl::StartElement(
                             nSymbolType = 6;
                         else if( IsXMLToken( rAttrValue, XML_HOURGLASS ))
                             nSymbolType = 7;
+                        else if( IsXMLToken( rAttrValue, XML_CIRCLE ))
+                            nSymbolType = 8;
+                        else if( IsXMLToken( rAttrValue, XML_STAR ))
+                            nSymbolType = 9;
+                        else if( IsXMLToken( rAttrValue, XML_X ))
+                            nSymbolType = 10;
+                        else if( IsXMLToken( rAttrValue, XML_PLUS ))
+                            nSymbolType = 11;
+                        else if( IsXMLToken( rAttrValue, XML_ASTERISK ))
+                            nSymbolType = 12;
+                        else if( IsXMLToken( rAttrValue, XML_HORIZONTAL_BAR ))
+                            nSymbolType = 13;
+                        else if( IsXMLToken( rAttrValue, XML_VERTICAL_BAR ))
+                            nSymbolType = 14;
 
                         if( nSymbolType >= 0 )
                             pAttrList->AddAttribute(
diff --git a/xmloff/source/transform/StyleOOoTContext.cxx b/xmloff/source/transform/StyleOOoTContext.cxx
index f74ebde..88cff6b 100644
--- a/xmloff/source/transform/StyleOOoTContext.cxx
+++ b/xmloff/source/transform/StyleOOoTContext.cxx
@@ -772,6 +772,27 @@ void XMLPropertiesOOoTContext_Impl::StartElement(
                         case 7:
                             eToken = XML_HOURGLASS;
                             break;
+                        case 8:
+                            eToken = XML_CIRCLE;
+                            break;
+                        case 9:
+                            eToken = XML_STAR;
+                            break;
+                        case 10:
+                            eToken = XML_X;
+                            break;
+                        case 11:
+                            eToken = XML_PLUS;
+                            break;
+                        case 12:
+                            eToken = XML_ASTERISK;
+                            break;
+                        case 13:
+                            eToken = XML_HORIZONTAL_BAR;
+                            break;
+                        case 14:
+                            eToken = XML_VERTICAL_BAR;
+                            break;
                         default:
                             OSL_FAIL( "invalid named symbol" );
                             break;
-- 
1.7.5.1
