8dda5ad6281dc04d8a2f5b8a7618c4fee172f210
[charm.git] / src / libs / ck-libs / liveViz / liveViz.h
1 /*
2   Data types, function prototypes,  etc. exported by liveViz.
3   This layer does image assembly, and is the most commonly-used 
4   interface to liveViz.
5  */
6 #ifndef __UIUC_CHARM_LIVEVIZ_H
7 #define __UIUC_CHARM_LIVEVIZ_H
8
9 #include "liveViz0.h"
10 #include "ckimage.h"
11 #include "colorScale.h"
12 #include "pup_toNetwork.h"
13
14 /********************** LiveViz ***********************/
15 #include "liveViz.decl.h"
16
17 typedef enum {
18   sum_image_data,
19   max_image_data,
20   sum_float_image_data,
21   max_float_image_data
22 } liveVizCombine_t;
23
24 /*
25   Start liveViz.  This routine should be called once on processor 0
26   when you are ready to begin receiving image requests.
27
28   The arrayID is the array that will make deposits into liveViz.
29
30   The callback is signalled each time a client requests an image.
31   The image parameters are passed in as a "liveVizRequestMsg *" message.
32 */
33 void liveVizInit(const liveVizConfig &cfg, CkArrayID a, CkCallback c);
34
35 class liveVizRequestMsg : public CMessage_liveVizRequestMsg {
36 public:
37         liveVizRequest req;
38         
39         /// Additional client request data: raw network bytes from client.
40         /// Use liveVizRequestUnpack to extract the data from this message.
41         char *data;
42         int dataLen;
43         
44         liveVizRequestMsg() {}
45         static liveVizRequestMsg *buildNew(const liveVizRequest &req,const void *data,int dataLen);
46 };
47
48 /// Unpack the extra client request data as network-byte-order ints,
49 ///  by calling pup on this class.
50 template<class T>
51 inline void liveVizRequestUnpack(const liveVizRequestMsg *src,T &dest)
52 {
53         PUP_toNetwork_unpack p(src->data);
54         p|dest;
55         if (p.size()!=src->dataLen) {
56                 CkError("liveVizRequestUnpack: client sent %d bytes, but you wanted %d bytes!\n",
57                         src->dataLen, p.size());
58                 CkAbort("liveVizRequestUnpack size mismatch\n");
59         }
60 }
61
62 /*
63   Deposit a (sizex x sizey) pixel portion of the final image,
64   starting at pixel (startx,starty) in the final image.
65   The "client" pointer is used to perform reductions, it's
66   normally "this".  Each array element must call deposit, even
67   if it's just an empty deposit, like:
68         liveVizDeposit(0,0, 0,0, NULL, this);
69 */
70 void liveVizDeposit(const liveVizRequest &req,
71                     int startx, int starty,
72                     int sizex, int sizey, const byte * imageData,
73                     ArrayElement* client,
74                     liveVizCombine_t combine=sum_image_data);
75
76
77 //As above, but taking a message instead of a request:
78 inline void liveVizDeposit(liveVizRequestMsg *reqMsg,
79                     int startx, int starty,
80                     int sizex, int sizey, const byte * imageData,
81                     ArrayElement* client,
82                    liveVizCombine_t combine=sum_image_data)
83 {
84         liveVizDeposit(reqMsg->req,startx,starty,sizex,sizey,imageData,client,
85                        combine);
86         delete reqMsg;
87 }
88
89 /**
90   A user-written routine to convert floating-point pixels
91   (when initialized with liveVizConfig::pix_float) to 
92   RGB pixels, which are actually sent across the wire.
93   This routine will only be called on processor 0, at the
94   end of a liveViz image assembly, in pix_float mode.
95 */
96 extern "C"
97 void liveVizFloatToRGB(liveVizRequest &req, 
98         const float *floatSrc, unsigned char *destRgb,
99         int nPixels);
100
101 /********************** LiveVizPoll **********************
102 These declarations should probably live in a header named "liveVizPoll.h"
103 */
104 #include "liveVizPoll.decl.h"
105
106
107
108 /**
109 Initialize the poll mode of liveViz.  This routine should
110 be called from main::main.
111
112 */
113 void liveVizPollInit();
114
115
116 typedef liveVizRequestMsg liveVizPollRequestMsg;
117
118
119 /**
120 Th Poll Mode has been extensively rewritten, Please read the new description in the manual.
121
122 Note the big changes:
123    liveVizPoll() no longer exists
124    liveVizPollDeposit requires some additional parameters
125
126 */
127
128 void liveVizPollDeposit(ArrayElement *from,
129                                                 int startx, int starty, 
130                                                 int sizex, int sizey,             // The dimensions of the piece I'm depositing
131                                                 int imagewidth, int imageheight,  // The dimensions of the entire image
132                                                 const byte * imageData,
133                                                 liveVizCombine_t _image_combine_reducer=sum_image_data,
134                                                 int bytes_per_pixel=3
135                                                 );
136
137
138
139
140 #endif /* def(thisHeader) */