[Libreoffice-commits] core.git: Branch 'feature/chart-opengl2' - 2 commits - chart2/source
Markus Mohrhard
markus.mohrhard at googlemail.com
Fri Jan 3 21:18:50 PST 2014
chart2/source/controller/dialogs/tp_DataSource.cxx | 23 +++-
chart2/source/controller/dialogs/tp_DataSource.hrc | 2
chart2/source/controller/dialogs/tp_DataSource.hxx | 7 +
chart2/source/controller/dialogs/tp_DataSource.src | 16 ++-
chart2/source/view/charttypes/BubbleChart.cxx | 9 +
chart2/source/view/inc/VDataSeries.hxx | 7 +
chart2/source/view/main/OpenGLRender.cxx | 99 +++++++++++++++++++++
chart2/source/view/main/OpenGLRender.hxx | 14 ++
chart2/source/view/main/VDataSeries.cxx | 27 +++++
9 files changed, 190 insertions(+), 14 deletions(-)
New commits:
commit b9970db1ca75a5f06a4d32fdb92f17927b63ea25
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Sat Jan 4 08:16:08 2014 +0100
first step for mapped properties
Only FillColor in bubble charts is supported right now.
Change-Id: If6ad0220c15e06a9a57c554f6243fd9908b2651b
diff --git a/chart2/source/controller/dialogs/tp_DataSource.cxx b/chart2/source/controller/dialogs/tp_DataSource.cxx
index c0232ae..87cd872 100644
--- a/chart2/source/controller/dialogs/tp_DataSource.cxx
+++ b/chart2/source/controller/dialogs/tp_DataSource.cxx
@@ -212,13 +212,10 @@ void lcl_increaseHeightOfControl( Control & rControl, long nYOffset )
namespace chart
{
-DataSourceTabPage::DataSourceTabPage(
- Window * pParent,
- DialogModel & rDialogModel,
- ChartTypeTemplateProvider* pTemplateProvider,
- Dialog * pParentDialog,
- bool bHideDescription /* = false */ ) :
- ::svt::OWizardPage( pParent, SchResId( TP_DATA_SOURCE )),
+DataSourceTabPage::DataSourceTabPage( Window * pParent,
+ DialogModel & rDialogModel, ChartTypeTemplateProvider* pTemplateProvider,
+ Dialog * pParentDialog, bool bHideDescription /* = false */ ) :
+ ::svt::OWizardPage( pParent, SchResId( TP_DATA_SOURCE )),
m_aFT_CAPTION ( this, SchResId( FT_CAPTION_FOR_WIZARD )),
m_aFT_SERIES ( this, SchResId( FT_SERIES )),
@@ -236,6 +233,7 @@ DataSourceTabPage::DataSourceTabPage(
m_aFT_DATALABELS ( this, SchResId( FT_DATALABELS )),
m_aEDT_CATEGORIES ( this, SchResId( EDT_CATEGORIES )),
m_aIMB_RANGE_CAT ( this, SchResId( IMB_RANGE_CAT )),
+ m_aBtn_AddMapping ( this, SchResId( BTN_ADDMAPPING )),
m_pTemplateProvider( pTemplateProvider ),
m_rDialogModel( rDialogModel ),
@@ -319,6 +317,9 @@ DataSourceTabPage::DataSourceTabPage(
m_aEDT_RANGE.SetStyle( m_aEDT_RANGE.GetStyle() | WB_FORCECTRLBACKGROUND );
m_aEDT_CATEGORIES.SetStyle( m_aEDT_CATEGORIES.GetStyle() | WB_FORCECTRLBACKGROUND );
+ // mapped properties
+ m_aBtn_AddMapping.SetClickHdl( LINK( this, DataSourceTabPage, AddMappingHdl ));
+
// set symbol font for arrows
// note: StarSymbol is substituted to OpenSymbol for OOo
Font aSymbolFont( m_aBTN_UP.GetFont());
@@ -824,6 +825,14 @@ IMPL_LINK( DataSourceTabPage, RangeUpdateDataHdl, Edit*, pEdit )
return 0;
}
+IMPL_LINK_NOARG( DataSourceTabPage, AddMappingHdl )
+{
+ OUString aNewMappingName = "FillColor";
+ m_aLB_ROLE.InsertEntry( lcl_GetRoleLBEntry( aNewMappingName, OUString()));
+
+ return 0;
+}
+
void DataSourceTabPage::listeningFinished(
const OUString & rNewRange )
{
diff --git a/chart2/source/controller/dialogs/tp_DataSource.hrc b/chart2/source/controller/dialogs/tp_DataSource.hrc
index 2ac81ce..83f70af 100644
--- a/chart2/source/controller/dialogs/tp_DataSource.hrc
+++ b/chart2/source/controller/dialogs/tp_DataSource.hrc
@@ -41,4 +41,6 @@
#define BTN_UP 140
#define BTN_DOWN 150
+#define BTN_ADDMAPPING 160
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/dialogs/tp_DataSource.hxx b/chart2/source/controller/dialogs/tp_DataSource.hxx
index bb74276..6324b49 100644
--- a/chart2/source/controller/dialogs/tp_DataSource.hxx
+++ b/chart2/source/controller/dialogs/tp_DataSource.hxx
@@ -90,6 +90,7 @@ protected:
DECL_LINK( RangeUpdateDataHdl, Edit* );
DECL_LINK( UpButtonClickedHdl, void* );
DECL_LINK( DownButtonClickedHdl, void* );
+ DECL_LINK( AddMappingHdl, void* );
// ____ RangeSelectionListenerParent ____
virtual void listeningFinished( const OUString & rNewRange );
@@ -110,8 +111,8 @@ protected:
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelectionListener >
getSelectionRangeListener();
- /** @return </sal_True>, if the edit field contains a valid range entry. if no
- XCellRangesAccess can be obtained, </sal_True> is returned.
+ /** @return </sal_True>, if the edit field contains a valid range entry. If no
+ XCellRangesAccess can be obtained, </sal_False> is returned.
*/
bool isRangeFieldContentValid( Edit & rEdit );
@@ -145,6 +146,8 @@ private:
RangeEdit m_aEDT_CATEGORIES;
RangeSelectionButton m_aIMB_RANGE_CAT;
+ PushButton m_aBtn_AddMapping;
+
OUString m_aFixedTextRange;
ChartTypeTemplateProvider * m_pTemplateProvider;
diff --git a/chart2/source/controller/dialogs/tp_DataSource.src b/chart2/source/controller/dialogs/tp_DataSource.src
index da12954..008b4ab5 100644
--- a/chart2/source/controller/dialogs/tp_DataSource.src
+++ b/chart2/source/controller/dialogs/tp_DataSource.src
@@ -97,7 +97,7 @@ TabPage TP_DATA_SOURCE
FixedText FT_CATEGORIES
{
- Pos = MAP_APPFONT ( 82 , 107 );
+ Pos = MAP_APPFONT ( 82 , 104 );
Size = MAP_APPFONT ( 160 , 8 );
Text [ en-US ] = "~Categories";
@@ -105,7 +105,7 @@ TabPage TP_DATA_SOURCE
FixedText FT_DATALABELS
{
- Pos = MAP_APPFONT ( 82 , 107 );
+ Pos = MAP_APPFONT ( 82 , 104 );
Size = MAP_APPFONT ( 160 , 8 );
Text [ en-US ] = "Data ~labels" ;
@@ -116,14 +116,14 @@ TabPage TP_DATA_SOURCE
HelpID = "chart2:Edit:TP_DATA_SOURCE:EDT_CATEGORIES";
Border = TRUE;
TabStop = TRUE;
- Pos = MAP_APPFONT ( 82 , 117 );
+ Pos = MAP_APPFONT ( 82 , 114 );
Size = MAP_APPFONT ( 144 , 12 );
};
ImageButton IMB_RANGE_CAT
{
HelpID = "chart2:ImageButton:TP_DATA_SOURCE:IMB_RANGE_CAT";
TabStop = TRUE;
- Pos = MAP_APPFONT ( 228 , 116 );
+ Pos = MAP_APPFONT ( 228 , 113 );
Size = MAP_APPFONT ( 14 , 14 );
};
@@ -169,6 +169,14 @@ TabPage TP_DATA_SOURCE
Pos = MAP_APPFONT ( 64 , 121 );
Size = MAP_APPFONT ( 14 , 14 );
};
+ PushButton BTN_ADDMAPPING
+ {
+ TabStop = TRUE;
+ Pos = MAP_APPFONT( 82, 130 );
+ Size = MAP_APPFONT( 54, 14 );
+
+ Text [ en-US ] = "Add property mapping";
+ };
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/charttypes/BubbleChart.cxx b/chart2/source/view/charttypes/BubbleChart.cxx
index 1db4d83..a2e5dca 100644
--- a/chart2/source/view/charttypes/BubbleChart.cxx
+++ b/chart2/source/view/charttypes/BubbleChart.cxx
@@ -248,6 +248,8 @@ void BubbleChart::createShapes()
if(!pSeries)
continue;
+ bool bHasFillColorMapping = pSeries->hasPropertyMapping("FillColor");
+
uno::Reference< drawing::XShapes > xSeriesGroupShape_Shapes = getSeriesGroupShape(*aSeriesIter, xSeriesTarget);
sal_Int32 nAttachedAxisIndex = pSeries->getAttachedAxisIndex();
@@ -319,6 +321,13 @@ void BubbleChart::createShapes()
, pSeries->getPropertiesOfPoint( nIndex )
, PropertyMapper::getPropertyNameMapForFilledSeriesProperties() );
+ if(bHasFillColorMapping)
+ {
+ uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY_THROW );
+ xProps->setPropertyValue("FillColor", uno::makeAny(static_cast<sal_Int32>(
+ pSeries->getValueByProperty(nIndex, "FillColor"))));
+ }
+
m_pShapeFactory->setShapeName( xShape, "MarkHandles" );
//create data point label
diff --git a/chart2/source/view/inc/VDataSeries.hxx b/chart2/source/view/inc/VDataSeries.hxx
index 7989b3e..ab48afe 100644
--- a/chart2/source/view/inc/VDataSeries.hxx
+++ b/chart2/source/view/inc/VDataSeries.hxx
@@ -36,6 +36,7 @@
#include <vector>
#include <boost/noncopyable.hpp>
#include <boost/scoped_ptr.hpp>
+#include <boost/ptr_container/ptr_map.hpp>
namespace chart
{
@@ -93,6 +94,10 @@ public:
double getMinimumofAllDifferentYValues( sal_Int32 index ) const;
double getMaximumofAllDifferentYValues( sal_Int32 index ) const;
+ double getValueByProperty( sal_Int32 index, const OUString& rPropName ) const;
+
+ bool hasPropertyMapping( const OUString& rPropName ) const;
+
::com::sun::star::uno::Sequence< double > getAllX() const;
::com::sun::star::uno::Sequence< double > getAllY() const;
@@ -214,6 +219,8 @@ private: //member
VDataSequence* m_pValueSequenceForDataLabelNumberFormatDetection;
+ boost::ptr_map<OUString, VDataSequence> maPropertyMap;
+
mutable double m_fXMeanValue;
mutable double m_fYMeanValue;
diff --git a/chart2/source/view/main/VDataSeries.cxx b/chart2/source/view/main/VDataSeries.cxx
index 52b510f..dad92a8 100644
--- a/chart2/source/view/main/VDataSeries.cxx
+++ b/chart2/source/view/main/VDataSeries.cxx
@@ -226,6 +226,12 @@ VDataSeries::VDataSeries( const uno::Reference< XDataSeries >& xDataSeries )
m_aValues_Y_Last.init( xDataSequence );
else if (aRole == "values-size")
m_aValues_Bubble_Size.init( xDataSequence );
+ else
+ {
+ VDataSequence* pSequence = new VDataSequence();
+ pSequence->init( xDataSequence );
+ maPropertyMap.insert(aRole, pSequence);
+ }
}
catch( const uno::Exception& e )
{
@@ -1082,6 +1088,27 @@ VDataSeries* VDataSeries::createCopyForTimeBased() const
return pNew;
}
+double VDataSeries::getValueByProperty( sal_Int32 nIndex, const OUString& rPropName ) const
+{
+ boost::ptr_map<OUString, VDataSequence>::const_iterator itr =
+ maPropertyMap.find(rPropName);
+ if(itr == maPropertyMap.end())
+ {
+ double fNan;
+ ::rtl::math::setNan( & fNan );
+ return fNan;
+ }
+
+ // TODO:moggi handle time based charting
+ const VDataSequence* pData = itr->second;
+ return pData->getValue(nIndex);
+}
+
+bool VDataSeries::hasPropertyMapping(const OUString& rPropName ) const
+{
+ return maPropertyMap.find(rPropName) != maPropertyMap.end();
+}
+
} //namespace chart
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit ea624e22884d07717bd6cf147b2c5e4bf183058e
Author: Peilin <peilin at multicorewareinc.com>
Date: Fri Jan 3 17:30:42 2014 +0800
add GL area rendering
Change-Id: Ide31ee7d32b417138de9d66f8f566d1027060222
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 2d5f209..5d5b2cc 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1520,5 +1520,104 @@ int OpenGLRender::CreateBMPHeaderRGBA(sal_uInt8 *bmpHeader, int xsize, int ysize
return 0;
}
+int OpenGLRender::ProcessArea2D(uno::Reference< drawing::XShape > &xShape)
+{
+ //get point from shape
+ uno::Reference< beans::XPropertySet > xProp( xShape, uno::UNO_QUERY );
+ com::sun::star::uno::Sequence<drawing::PointSequence> pointss;
+ com::sun::star::uno::Any value = xProp->getPropertyValue(UNO_NAME_POLYPOLYGON);
+ value >>= pointss;
+ int pointsscount = pointss.getLength();
+
+ uno::Any co = xProp->getPropertyValue(UNO_NAME_FILLCOLOR);
+ long *colorvalue = (long*)co.getValue();
+ SetColor(*colorvalue);
+ for(int i = 0; i < pointsscount; i++)
+ {
+ com::sun::star::uno::Sequence<com::sun::star::awt::Point> points = pointss[i];
+ int pointscount = points.getLength();
+ for(int j = 0; j < pointscount; j++)
+ {
+ com::sun::star::awt::Point p = points[j];
+ SetArea2DShapePoint((float)p.X, (float)p.Y, pointscount);
+ }
+ }
+ //render the shape
+ RenderArea2DShape();
+ m_fZStep += 0.01f;
+ return 0;
+}
+int OpenGLRender::SetArea2DShapePoint(float x, float y, int listLength)
+{
+ if (!m_Area2DPointList.pointBuf)
+ {
+ //a new point buffer should be alloc, we should push the old buffer first
+ m_Area2DPointList.bufLen = listLength * sizeof(float) * 3;
+ m_Area2DPointList.pointBuf = (float *)malloc(m_Area2DPointList.bufLen);
+ }
+ float actualX = (x / OPENGL_SCALE_VALUE) - ((float)m_iWidth / 2);
+ float actualY = (y / OPENGL_SCALE_VALUE) - ((float)m_iHeight / 2);
+ m_Area2DPointList.pointBuf[m_iPointNum++] = actualX;
+ m_Area2DPointList.pointBuf[m_iPointNum++] = actualY;
+ m_Area2DPointList.pointBuf[m_iPointNum++] = m_fZStep;
+ m_fPicLeft = actualX < m_fPicLeft ? actualX : m_fPicLeft;
+
+ m_fPicRight = actualX > m_fPicRight ? actualX : m_fPicRight;
+
+ m_fPicBottom = actualY < m_fPicBottom ? actualY : m_fPicBottom;
+
+ m_fPicTop = actualY > m_fPicTop ? actualY : m_fPicTop;
+
+ if (m_iPointNum == (listLength * 3))
+ {
+ m_Area2DShapePointList.push_back(m_Area2DPointList);
+ m_Area2DPointList.pointBuf = NULL;
+ m_iPointNum = 0;
+ }
+ return 0;
+}
+int OpenGLRender::RenderArea2DShape()
+{
+ glDisable(GL_MULTISAMPLE);
+ int listNum = m_Area2DShapePointList.size();
+ cout << "listNum = " << listNum << endl;
+ PosVecf3 trans = {0.0f, 0.0f, 0.0f};
+ PosVecf3 angle = {0.0f, 0.0f, 0.0f};
+ PosVecf3 scale = {1.0f, 1.0f, 1.0f};
+ MoveModelf(trans, angle, scale);
+ m_MVP = m_Projection * m_View * m_Model;
+ for (int i = 0; i < listNum; i++)
+ {
+ Area2DPointList &pointList = m_Area2DShapePointList.front();
+ //fill vertex buffer
+ glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+ glBufferData(GL_ARRAY_BUFFER, pointList.bufLen, pointList.pointBuf, GL_STATIC_DRAW);
+ // Use our shader
+ glUseProgram(m_CommonProID);
+
+ glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
+
+ glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+
+ // 1rst attribute buffer : vertices
+ glEnableVertexAttribArray(m_2DVertexID);
+ glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+ glVertexAttribPointer(
+ m_2DVertexID, // attribute. No particular reason for 0, but must match the layout in the shader.
+ 3, // size
+ GL_FLOAT, // type
+ GL_FALSE, // normalized?
+ 0, // stride
+ (void*)0 // array buffer offset
+ );
+ glDrawArrays(GL_POLYGON, 0, pointList.bufLen / sizeof(float) / 3); // 12*3 indices starting at 0 -> 12 triangles
+ glDisableVertexAttribArray(m_2DVertexID);
+ glUseProgram(0);
+ m_Area2DShapePointList.pop_front();
+ free(pointList.pointBuf);
+ }
+ glEnable(GL_MULTISAMPLE);
+ return 0;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index ce353b7..88adfe9 100644
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -109,7 +109,11 @@ typedef struct TextInfo
double rotation;
float vertex[8];
}TextInfo;
-
+typedef struct Area2DPointList
+{
+ float *pointBuf;
+ int bufLen;
+}Area2DPointList;
/// Holds the information of our new child window
struct GLWindow
{
@@ -179,6 +183,11 @@ public:
int CreateTextTexture(::rtl::OUString textValue, sal_uInt32 color, const Font& rFont, awt::Point aPos, awt::Size aSize, long rotation);
int RenderTextShape();
+
+ int SetArea2DShapePoint(float x, float y, int listLength);
+ int ProcessArea2D(com::sun::star::uno::Reference<
+ com::sun::star::drawing::XShape > &xShape);
+ int RenderArea2DShape();
private:
GLint LoadShaders(const char *vertexShader,const char *fragmentShader);
int CreateTextureObj(int width, int height);
@@ -317,6 +326,9 @@ private:
GLuint m_TextTexCoordBuf;
GLint m_TextTexID;
+ Area2DPointList m_Area2DPointList;
+ list <Area2DPointList> m_Area2DShapePointList;
+
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list