00001
00002
00003
00004
00005
00006 #ifndef __IMAGEDATA_H
00007 #define __IMAGEDATA_H
00008
00009 #include "liveViz.h"
00010
00011 typedef liveVizCombine_t ImageDataCombine_t;
00012
00013 class ImageData
00014 {
00015 public:
00016 ImageData (int bytesPerPixel);
00017
00018 ~ImageData ();
00019
00020
00021
00022
00023
00024 int GetBuffSize (const int& startx,
00025 const int& starty,
00026 const int& sizex,
00027 const int& sizey,
00028 const int req_wid,
00029 const int req_ht,
00030 const byte* src);
00031
00032
00033
00034
00035
00036
00037 inline int GetImageDataSize (void)
00038 {
00039 return m_size;
00040 }
00041
00045 class ImageHeader {
00046 public:
00048 int m_lines;
00049
00051 ImageDataCombine_t m_combine;
00052
00054 liveVizRequest m_req;
00055
00056
00057
00058 };
00059
00063 class LineHeader {
00064 public:
00067 int m_pos;
00069 int m_size;
00070 };
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 int AddImage (const int req_wid,
00088 byte* dest = NULL);
00089
00090 void WriteHeader(ImageDataCombine_t combine,
00091 const liveVizRequest* req,
00092 byte* dest);
00093 void ReadHeader(ImageDataCombine_t &combine,
00094 liveVizRequest* req,
00095 const byte* src);
00096
00097
00098
00099
00100
00101
00102 int CombineImageDataSize (int nMsg, CkReductionMsg **msgs);
00103
00104
00105
00106
00107 void CombineImageData (int nMsg, CkReductionMsg **msgs, byte* dest);
00108
00109
00110
00111
00112
00113
00114
00115
00116 byte* ConstructImage (byte* src,
00117 liveVizRequest& req);
00118
00119 private:
00120
00121
00122
00123
00124
00125
00126
00127
00128 int CopyImageData (byte* dest, int n, const CkReductionMsg* msg,
00129 ImageDataCombine_t reducer);
00130
00131
00132
00133
00134
00135
00136 byte* GetClippedImage (const byte* img,
00137 const int& startx,
00138 const int& starty,
00139 const int& sizex,
00140 const int& sizey,
00141 const int req_wid,
00142 const int req_ht
00143 );
00144
00145
00146
00147
00148
00149
00150 inline bool IsPixelOn (const byte* pixel)
00151 {
00152 bool isOn = false;
00153
00154 for (int i=0; i<m_bytesPerPixel; i++)
00155 {
00156 if (0 != pixel [i])
00157 {
00158 isOn = true;
00159 }
00160 }
00161
00162 return isOn;
00163 }
00164
00165
00166
00167
00168 inline void CopyPixel (byte* dest, const byte* src)
00169 {
00170 int i = 0;
00171 while (i < m_bytesPerPixel)
00172 {
00173 *dest++ = *src++;
00174 i++;
00175 }
00176 }
00177
00178 inline int NumNonNullLists (int* pos,
00179 const int* size,
00180 const int& n)
00181 {
00182 int returnVal = 0;
00183
00184 for (int i=0; i<n; i++)
00185 {
00186 if ((-1 != pos [i]) &&
00187 (pos [i] != size [i]))
00188 {
00189 returnVal ++;
00190 }
00191 else
00192 {
00193 pos [i] = -1;
00194 }
00195 }
00196
00197 return returnVal;
00198 }
00199
00200 inline int GetNonNullListIndex (const int* pos,
00201 const int& n)
00202 {
00203 for (int i=0; i<n; i++)
00204 {
00205 if (-1 != pos [i])
00206 {
00207 return i;
00208 }
00209 }
00210 return -1;
00211 }
00212
00213
00214
00215
00216
00217
00218 int m_bytesPerPixel;
00219
00220
00221
00222
00223
00224 int m_size;
00225
00226
00227
00228
00229 int m_headerSize;
00230
00231
00232
00233
00234 int m_numDataLines;
00235
00236
00238 void SetSize(int nLines,int nPixels) {
00239 m_numDataLines = nLines;
00240 m_headerSize=sizeof (ImageHeader) +
00241 (sizeof (LineHeader) * nLines);
00242 m_size=m_headerSize +
00243 (m_bytesPerPixel * nPixels);
00244 }
00245
00247 LineHeader *getHeader(void *src,int lineNo) {
00248 return (LineHeader *)(((byte *)src)
00249 +sizeof(ImageHeader)
00250 +lineNo*sizeof(LineHeader)
00251 );
00252 }
00253
00254
00255
00256
00257
00258
00259
00260 byte* m_header;
00261
00262
00263
00264
00265
00266
00267
00268 byte* m_clippedImage;
00269
00270
00271
00272
00273 bool m_clippedImageAllocated;
00274
00275
00276
00277
00278 int m_startx;
00279
00280
00281
00282
00283 int m_starty;
00284
00285
00286
00287
00288 int m_sizex;
00289
00290
00291
00292
00293 int m_sizey;
00294
00295
00296
00297
00298 ImageData () {};
00299 };
00300
00301 #endif
00302