|
From: <le...@us...> - 2006-11-29 23:39:27
|
Revision: 26
http://svn.sourceforge.net/qcell/?rev=26&view=rev
Author: lessm
Date: 2006-11-29 15:39:25 -0800 (Wed, 29 Nov 2006)
Log Message:
-----------
- CalculationData class can import/export setings from xml string
Modified Paths:
--------------
trunk/qcell/baseheaders/CalculationData.h
trunk/qcell/baseheaders/Neighbourhood.h
trunk/qcell/basesources/CalculationData.cpp
trunk/qcell/basesources/Neighbourhood.cpp
Modified: trunk/qcell/baseheaders/CalculationData.h
===================================================================
--- trunk/qcell/baseheaders/CalculationData.h 2006-11-29 20:12:56 UTC (rev 25)
+++ trunk/qcell/baseheaders/CalculationData.h 2006-11-29 23:39:25 UTC (rev 26)
@@ -3,7 +3,8 @@
#include <string.h>
#include <QString>
-#include <QByteArray>
+#include <QDomDocument>
+#include <QDomElement>
class CalculationData
{
@@ -22,12 +23,20 @@
private:
DATA_TYPES dataType;
int sizeX, sizeY, sizeZ, sizeT;
+ int backBufferSizeX, backBufferSizeY, backBufferSizeZ, backBufferSizeT;
int dimension, size;
- char *data;
+ char *data, *dataBorderFree;
+ int minX, minY, minZ, minT;
+ int maxX, maxY, maxZ, maxT;
+
+ bool borderExist;
+
protected:
bool resize(const char *dataPointer=NULL);
void * getAddressAt(int x, int y, int z, int t);
+ void * getAddressAtBackBuffer(int x, int y, int z, int t);
+ void calculateBackBufferSize(void);
public:
@@ -54,7 +63,9 @@
void setValueAt_d(double val, int x, int y, int z);
void setValueAt_d(double val, int x, int y, int z, int t);
- void setDataType(DATA_TYPES type = DATA_TYPES::CHAR);
+ void setDataType(CalculationData::DATA_TYPES type = CalculationData::DATA_TYPES::CHAR);
+ CalculationData::DATA_TYPES getDataType(void);
+ int getDataSize(void);
bool resize(int x, const char *dataPointer=NULL);
bool resize(int x, int y, const char *dataPointer=NULL);
@@ -68,7 +79,32 @@
int getSizeInByte(void);
const char *getDataPointer(void);
+ const char *getBackBufferDataPointer(void);
void fill(const char *dataPointer);
+
+
+ void setCalculationSpace(void);
+ void setCalculationSpace(int startX, int endX);
+ void setCalculationSpace(int startX, int startY, int endX, int endY);
+ void setCalculationSpace(int startX, int startY, int startZ, int endX, int endY, int endZ);
+ void setCalculationSpace(int startX, int startY, int startZ, int startT, int endX, int endY, int endZ, int endT);
+
+ void removeBorder(void);
+ bool haveBorder(void);
+
+ QString createXmlHeader(void);
+ void setFromXmlString(QString *xmlString);
+ void parseXmlElement(QDomElement *root);
+
+ void setValueAt_i_Back(int val, int x);
+ void setValueAt_i_Back(int val, int x, int y);
+ void setValueAt_i_Back(int val, int x, int y, int z);
+ void setValueAt_i_Back(int val, int x, int y, int z, int t);
+
+ void setValueAt_d_Back(double val, int x);
+ void setValueAt_d_Back(double val, int x, int y);
+ void setValueAt_d_Back(double val, int x, int y, int z);
+ void setValueAt_d_Back(double val, int x, int y, int z, int t);
};
-#endif
\ No newline at end of file
+#endif
Modified: trunk/qcell/baseheaders/Neighbourhood.h
===================================================================
--- trunk/qcell/baseheaders/Neighbourhood.h 2006-11-29 20:12:56 UTC (rev 25)
+++ trunk/qcell/baseheaders/Neighbourhood.h 2006-11-29 23:39:25 UTC (rev 26)
@@ -48,10 +48,10 @@
int getInValueOf(int index);
double getDoubleValueOf(int index);
- void calculateOffsets(int sizeX, int sizeY, int sizeZ, int sizeT);
+ void calculateOffsets(int sizeX, int sizeY, int sizeZ, int sizeT, int dataSize);
};
-#endif
\ No newline at end of file
+#endif
Modified: trunk/qcell/basesources/CalculationData.cpp
===================================================================
--- trunk/qcell/basesources/CalculationData.cpp 2006-11-29 20:12:56 UTC (rev 25)
+++ trunk/qcell/basesources/CalculationData.cpp 2006-11-29 23:39:25 UTC (rev 26)
@@ -2,13 +2,20 @@
bool CalculationData::resize(const char *dataPointer)
{
+ borderExist = 0;
if(data)
- delete data;
+ delete[] data;
data = new char[getSizeInByte()];
if(!data)
return 0;
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ dataBorderFree = NULL;
+ }
+
if(dataPointer)
fill(dataPointer);
return 1;
@@ -48,6 +55,69 @@
return data + dSize * (x + y * sizeX + z * sizeX * sizeY + t * sizeX * sizeY * sizeZ);
}
+void * CalculationData::getAddressAtBackBuffer(int x, int y, int z, int t)
+{
+ int dSize;
+ if(dataType==CalculationData::DATA_TYPES::NONE)
+ return NULL;
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::BOOL:
+ size = 0;
+ break;
+
+ case CalculationData::DATA_TYPES::CHAR:
+ dSize = 1;
+ break;
+
+ case CalculationData::DATA_TYPES::INT:
+ dSize = sizeof(int);
+ break;
+
+ case CalculationData::DATA_TYPES::SHORT:
+ dSize = sizeof(short);
+ break;
+
+ case CalculationData::DATA_TYPES::DOUBLE:
+ dSize = sizeof(double);
+ break;
+ case CalculationData::DATA_TYPES::FLOAT:
+ dSize = sizeof(float);
+ break;
+ }
+
+ x -= minX;
+ y -= minY;
+ z -= minZ;
+ t -= minT;
+
+ if(t<0)
+ t=0;
+ if(z<0)
+ z=0;
+ if(y<0)
+ y=0;
+ if(x<0)
+ x=0;
+
+ return dataBorderFree + dSize * (x + y * backBufferSizeX + z * backBufferSizeX * backBufferSizeY + t * backBufferSizeX * backBufferSizeY * backBufferSizeZ);
+}
+
+void CalculationData::calculateBackBufferSize(void)
+{
+ switch(dimension)
+ {
+ case 4:
+ backBufferSizeT = maxT - minT;
+ case 3:
+ backBufferSizeZ = maxZ - minZ;
+ case 2:
+ backBufferSizeY = maxY - minY;
+ case 1:
+ backBufferSizeX = maxX - minX;
+ }
+}
+
CalculationData::CalculationData()
{
dataType = CalculationData::DATA_TYPES::NONE;
@@ -55,6 +125,8 @@
dimension = -1;
size = -1;
data = NULL;
+ dataBorderFree = NULL;
+ borderExist = 0;
}
CalculationData::~CalculationData()
@@ -65,9 +137,14 @@
size = -1;
if(data)
{
- delete data;
+ delete[] data;
data = NULL;
}
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ dataBorderFree = NULL;
+ }
}
int CalculationData::getValueAt_i(int x)
@@ -378,6 +455,15 @@
}
}
+CalculationData::DATA_TYPES CalculationData::getDataType(void)
+{
+ return dataType;
+}
+int CalculationData::getDataSize(void)
+{
+ return size;
+}
+
bool CalculationData::resize(int x, const char *dataPointer)
{
sizeX = x;
@@ -443,17 +529,7 @@
switch(dataType)
{
case CalculationData::DATA_TYPES::BOOL:
- switch(dimension)
- {
- case 1:
- return sizeX / 8 + ((sizeX % 8)>0);
- case 2:
- return (sizeX * sizeY) / 8 + (((sizeX * sizeY) % 8)>0);
- case 3:
- return (sizeX * sizeY * sizeZ) / 8 + (((sizeX * sizeY * sizeZ) % 8)>0);
- case 4:
- return (sizeX * sizeY * sizeZ * sizeT) / 8 + (((sizeX * sizeY * sizeZ * sizeT) % 8)>0);
- }
+ return (sizeX * sizeY * sizeZ * sizeT)/8;
case CalculationData::DATA_TYPES::CHAR:
switch(dimension)
@@ -528,10 +604,478 @@
return data;
}
+const char *CalculationData::getBackBufferDataPointer(void)
+{
+ return dataBorderFree;
+}
+
void CalculationData::fill(const char *dataPointer)
{
if(data!=NULL)
{
memcpy(data, dataPointer, getSizeInByte());
}
-}
\ No newline at end of file
+}
+
+void CalculationData::setCalculationSpace(void)
+{
+ minX = 0;
+ minY = 0;
+ minZ = 0;
+ minT = 0;
+
+ maxX = sizeX;
+ maxY = sizeY;
+ maxZ = sizeZ;
+ maxT = sizeT;
+
+ borderExist = 0;
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ }
+ dataBorderFree = new char[getSizeInByte()];
+ calculateBackBufferSize();
+}
+
+void CalculationData::setCalculationSpace(int startX, int endX)
+{
+ minX = startX;
+ maxX = endX;
+ borderExist = 1;
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ }
+ dataBorderFree = new char[(maxX - minX) * size];
+ calculateBackBufferSize();
+}
+
+void CalculationData::setCalculationSpace(int startX, int startY, int endX, int endY)
+{
+ minX = startX;
+ maxX = endX;
+ minY = startY;
+ maxY = endY;
+ borderExist = 1;
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ }
+ dataBorderFree = new char[((maxX - minX) * (maxY - minY)) * size];
+ calculateBackBufferSize();
+}
+
+void CalculationData::setCalculationSpace(int startX, int startY, int startZ, int endX, int endY, int endZ)
+{
+ minX = startX;
+ maxX = endX;
+ minY = startY;
+ maxY = endY;
+ minZ = startZ;
+ maxZ = endZ;
+ borderExist = 1;
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ }
+ dataBorderFree = new char[((maxX - minX) * (maxY - minY) * (maxZ - minZ)) * size];
+ calculateBackBufferSize();
+}
+
+void CalculationData::setCalculationSpace(int startX, int startY, int startZ, int startT, int endX, int endY, int endZ, int endT)
+{
+ minX = startX;
+ maxX = endX;
+ minY = startY;
+ maxY = endY;
+ minZ = startZ;
+ maxZ = endZ;
+ minT = startT;
+ maxT = endT;
+ borderExist = 1;
+ if(dataBorderFree)
+ {
+ delete[] dataBorderFree;
+ }
+ dataBorderFree = new char[((maxX - minX) * (maxY - minY) * (maxZ - minZ) * (maxT - minT)) * size];
+ calculateBackBufferSize();
+}
+
+void CalculationData::removeBorder(void)
+{
+ char *temp;
+ int newSize = 1, counter = 0;
+ if(borderExist)
+ {
+ switch(dimension)
+ {
+
+ case 4:
+ newSize *= maxT - minT;
+
+ case 3:
+ newSize *= maxZ - minZ;
+
+ case 2:
+ newSize *= maxY - minY;
+
+ case 1:
+ newSize *= maxX - minX;
+ break;
+
+ default:
+ newSize = 0;
+ }
+
+ temp = new char[newSize * size];
+
+ for(int t=minT;t<maxT;++t)
+ {
+ for(int z=minZ;z<maxZ;++z)
+ {
+ for(int y=minY;y<maxY;++y)
+ {
+ for(int x=minX;x<maxX;++x)
+ {
+ memcpy(temp + counter, getAddressAt(x, y, z, t), size);
+ counter += size;
+ }
+ }
+ }
+ }
+
+ switch(dimension)
+ {
+
+ case 4:
+ sizeT = maxT - minT;
+
+ case 3:
+ sizeZ = maxZ - minZ;
+
+ case 2:
+ sizeY = maxY - minY;
+
+ case 1:
+ sizeX = maxX - minX;
+ }
+
+ delete[] data;
+ data = temp;
+ temp = NULL;
+
+ }
+ borderExist = 0;
+}
+
+bool CalculationData::haveBorder(void)
+{
+ return borderExist;
+}
+
+QString CalculationData::createXmlHeader(void)
+{
+ QDomDocument doc;
+ QDomElement root, element, subElementMin, subElementMax;
+ root = doc.createElement("CalculationData");
+ doc.appendChild(root);
+ element = doc.createElement("Data");
+ switch(dimension)
+ {
+ case 4:
+ element.setAttribute("t", sizeT);
+ case 3:
+ element.setAttribute("z", sizeZ);
+ case 2:
+ element.setAttribute("y", sizeY);
+ case 1:
+ element.setAttribute("x", sizeX);
+ }
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::BOOL:
+ element.setAttribute("ContentType", "bool");
+ break;
+
+ case CalculationData::DATA_TYPES::CHAR:
+ element.setAttribute("ContentType", "char");
+ break;
+
+ case CalculationData::DATA_TYPES::DOUBLE:
+ element.setAttribute("ContentType", "double");
+ break;
+
+ case CalculationData::DATA_TYPES::FLOAT:
+ element.setAttribute("ContentType", "float");
+ break;
+
+ case CalculationData::DATA_TYPES::INT:
+ element.setAttribute("ContentType", "bool");
+ break;
+
+ case CalculationData::DATA_TYPES::SHORT:
+ element.setAttribute("ContentType", "short");
+ break;
+ }
+ root.appendChild(element);
+
+ if(haveBorder())
+ {
+ element = doc.createElement("Border");
+ subElementMin = doc.createElement("Min");
+ subElementMax = doc.createElement("Max");
+ switch(dimension)
+ {
+ case 4:
+ subElementMin.setAttribute("t", minT);
+ subElementMax.setAttribute("t", maxT);
+ case 3:
+ subElementMin.setAttribute("z", minZ);
+ subElementMax.setAttribute("z", maxZ);
+ case 2:
+ subElementMin.setAttribute("y", minY);
+ subElementMax.setAttribute("y", maxY);
+ case 1:
+ subElementMin.setAttribute("x", minX);
+ subElementMax.setAttribute("x", maxX);
+ }
+ element.appendChild(subElementMin);
+ element.appendChild(subElementMax);
+ root.appendChild(element);
+ }
+ return doc.toString();
+}
+
+void CalculationData::setFromXmlString(QString *xmlString)
+{
+ QDomDocument doc;
+ QDomElement element;
+ doc.setContent(*xmlString);
+ element = doc.documentElement();
+ parseXmlElement(&element);
+}
+
+void CalculationData::parseXmlElement(QDomElement *root)
+{
+ QDomElement element, minElement, maxElement;
+ QDomNode node, subNode;
+
+ if(root->tagName()=="CalculationData")
+ {
+ node = root->firstChild();
+ while(!node.isNull())
+ {
+ element = node.toElement();
+ if(element.tagName()=="Data")
+ {
+ if(element.attribute("ContentType")=="bool")
+ setDataType(CalculationData::DATA_TYPES::BOOL);
+ else
+ if(element.attribute("ContentType")=="char")
+ setDataType(CalculationData::DATA_TYPES::CHAR);
+ else
+ if(element.attribute("ContentType")=="double")
+ setDataType(CalculationData::DATA_TYPES::DOUBLE);
+ else
+ if(element.attribute("ContentType")=="float")
+ setDataType(CalculationData::DATA_TYPES::FLOAT);
+ else
+ if(element.attribute("ContentType")=="int")
+ setDataType(CalculationData::DATA_TYPES::INT);
+ else
+ if(element.attribute("ContentType")=="short")
+ setDataType(CalculationData::DATA_TYPES::SHORT);
+
+ if(element.hasAttribute("t"))
+ resize(element.attribute("t").toInt(), element.attribute("z").toInt(), element.attribute("y").toInt(), element.attribute("x").toInt());
+ else
+ if(element.hasAttribute("z"))
+ resize(element.attribute("z").toInt(), element.attribute("y").toInt(), element.attribute("x").toInt());
+ else
+ if(element.hasAttribute("y"))
+ resize(element.attribute("y").toInt(), element.attribute("x").toInt());
+ else
+ resize(element.attribute("x").toInt());
+
+ }
+ if(element.tagName()=="Border")
+ {
+ subNode = element.firstChild();
+ while(!subNode.isNull())
+ {
+ element = subNode.toElement();
+ if(element.tagName()=="Min")
+ minElement = subNode.toElement();
+ else
+ if(element.tagName()=="Max")
+ maxElement = subNode.toElement();
+ subNode = subNode.nextSibling();
+ }
+ switch(dimension)
+ {
+ case 1:
+ setCalculationSpace(minElement.attribute("x").toInt(), maxElement.attribute("x").toInt());
+ break;
+ case 2:
+ setCalculationSpace(minElement.attribute("x").toInt(), minElement.attribute("y").toInt(), maxElement.attribute("x").toInt(), maxElement.attribute("y").toInt());
+ break;
+ case 3:
+ setCalculationSpace(minElement.attribute("x").toInt(), minElement.attribute("y").toInt(), minElement.attribute("z").toInt(), maxElement.attribute("x").toInt(), maxElement.attribute("y").toInt(), maxElement.attribute("z").toInt());
+ break;
+ case 4:
+ setCalculationSpace(minElement.attribute("x").toInt(), minElement.attribute("y").toInt(), minElement.attribute("z").toInt(), minElement.attribute("t").toInt(), maxElement.attribute("x").toInt(), maxElement.attribute("y").toInt(), maxElement.attribute("z").toInt(), maxElement.attribute("t").toInt());
+ break;
+ }
+ }
+ node = node.nextSibling();
+ }
+ if(!haveBorder())
+ setCalculationSpace();
+ }
+}
+
+void CalculationData::setValueAt_i_Back(int val, int x)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::BOOL:
+ size = 0;
+ break;
+
+ case CalculationData::DATA_TYPES::CHAR:
+ *((char *)getAddressAtBackBuffer(x, 0, 0, 0)) = (char)val;
+ break;
+
+ case CalculationData::DATA_TYPES::INT:
+ *((int *)(getAddressAtBackBuffer(x, 0, 0, 0))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::SHORT:
+ *((short *)(getAddressAtBackBuffer(x, 0, 0, 0))) = (short)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_i_Back(int val, int x, int y)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::BOOL:
+ size = 0;
+ break;
+
+ case CalculationData::DATA_TYPES::CHAR:
+ *((char *)getAddressAtBackBuffer(x, y, 0, 0)) = (char)val;
+ break;
+
+ case CalculationData::DATA_TYPES::INT:
+ *((int *)(getAddressAtBackBuffer(x, y, 0, 0))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::SHORT:
+ *((short *)(getAddressAtBackBuffer(x, y, 0, 0))) = (short)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_i_Back(int val, int x, int y, int z)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::BOOL:
+ size = 0;
+ break;
+
+ case CalculationData::DATA_TYPES::CHAR:
+ *((char *)getAddressAtBackBuffer(x, y, z, 0)) = (char)val;
+ break;
+
+ case CalculationData::DATA_TYPES::INT:
+ *((int *)(getAddressAtBackBuffer(x, y, z, 0))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::SHORT:
+ *((short *)(getAddressAtBackBuffer(x, y, z, 0))) = (short)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_i_Back(int val, int x, int y, int z, int t)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::BOOL:
+ size = 0;
+ break;
+
+ case CalculationData::DATA_TYPES::CHAR:
+ *((char *)getAddressAtBackBuffer(x, y, z, t)) = (char)val;
+ break;
+
+ case CalculationData::DATA_TYPES::INT:
+ *((int *)(getAddressAtBackBuffer(x, y, z, t))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::SHORT:
+ *((short *)(getAddressAtBackBuffer(x, y, z, t))) = (short)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_d_Back(double val, int x)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::DOUBLE:
+ *((double *)(getAddressAtBackBuffer(x, 0, 0, 0))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::FLOAT:
+ *((float *)(getAddressAtBackBuffer(x, 0, 0, 0))) = (float)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_d_Back(double val, int x, int y)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::DOUBLE:
+ *((double *)(getAddressAtBackBuffer(x, y, 0, 0))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::FLOAT:
+ *((float *)(getAddressAtBackBuffer(x, y, 0, 0))) = (float)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_d_Back(double val, int x, int y, int z)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::DOUBLE:
+ *((double *)(getAddressAtBackBuffer(x, y, z, 0))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::FLOAT:
+ *((float *)(getAddressAtBackBuffer(x, y, z, 0))) = (float)val;
+ break;
+ }
+}
+
+void CalculationData::setValueAt_d_Back(double val, int x, int y, int z, int t)
+{
+ switch(dataType)
+ {
+ case CalculationData::DATA_TYPES::DOUBLE:
+ *((double *)(getAddressAtBackBuffer(x, y, z, t))) = val;
+ break;
+
+ case CalculationData::DATA_TYPES::FLOAT:
+ *((float *)(getAddressAtBackBuffer(x, y, z, t))) = (float)val;
+ break;
+ }
+}
+
Modified: trunk/qcell/basesources/Neighbourhood.cpp
===================================================================
--- trunk/qcell/basesources/Neighbourhood.cpp 2006-11-29 20:12:56 UTC (rev 25)
+++ trunk/qcell/basesources/Neighbourhood.cpp 2006-11-29 23:39:25 UTC (rev 26)
@@ -233,4 +233,4 @@
{
neighbourVector[i].offset = dataSize * (neighbourVector[i].x + neighbourVector[i].y * sizeX + neighbourVector[i].z * sizeX * sizeY + neighbourVector[i].t * sizeX * sizeY * sizeZ);
}
-}
\ No newline at end of file
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|