00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "CudaFramework.H"
00039 #include <stdio.h>
00040 #include <stdlib.h>
00041 #include <string.h>
00042 #include <pthread.h>
00043 #include <errno.h>
00044 #include <GL/glew.h>
00045 #include <cuda_gl_interop.h>
00046 #include "CUDA/CudaImage.H"
00047 #include "CUDA/CudaImageSet.H"
00048 #include "Image/Pixels.H"
00049 #include "Image/MathOps.H"
00050 #if defined(__APPLE__) || defined(MACOSX)
00051 #include <GLUT/glut.h>
00052 #else
00053 #include <GL/glut.h>
00054 #endif
00055 #include "CudaImageDisplay.h"
00056 #include <unistd.h>
00057 #include "Raster/Raster.H"
00058 #include "Raster/PngWriter.H"
00059 #include "CUDA/CudaCutPaste.H"
00060 #include "Component/ModelManager.H"
00061 #include "CUDA/CudaSaliency.H"
00062 #include "Image/SimpleFont.H"
00063 #include "Image/DrawOps.H"
00064 #include "Raster/Raster.H"
00065 #include "Raster/GenericFrame.H"
00066 #include "Media/FrameSeries.H"
00067 #include "CUDA/CudaDrawOps.H"
00068 #include "CUDA/CudaShapeOps.H"
00069
00070
00071
00072 CudaFramework::CudaFramework()
00073 {
00074 canvasModified = true;
00075 }
00076
00077
00078
00079 CudaFramework::~CudaFramework()
00080 {
00081 }
00082
00083
00084
00085 int CudaFramework::getW()
00086 {
00087 return w;
00088 }
00089
00090
00091
00092 int CudaFramework::getH()
00093 {
00094 return h;
00095 }
00096
00097
00098
00099 int CudaFramework::getCanvasW()
00100 {
00101 return canvas_image.getWidth();
00102 }
00103
00104
00105
00106 int CudaFramework::getCanvasH()
00107 {
00108 return canvas_image.getHeight();
00109 }
00110
00111
00112
00113 CudaImage<PixRGB<float> >& CudaFramework::getCanvas()
00114 {
00115 return canvas_image;
00116 }
00117
00118
00119
00120 Point2D<int> CudaFramework::getPoint(int index)
00121 {
00122 return point_list[index];
00123 }
00124
00125
00126 int CudaFramework::getDev()
00127 {
00128 return dev1;
00129 }
00130
00131
00132
00133 MemoryPolicy CudaFramework::getMP()
00134 {
00135 return mp1;
00136 }
00137
00138
00139
00140 int CudaFramework::getLockAtt()
00141 {
00142 return pthread_mutex_trylock(&canvas_lock);
00143 }
00144
00145
00146
00147 bool CudaFramework::getCanvasModified()
00148 {
00149 return canvasModified;
00150 }
00151
00152
00153
00154 void CudaFramework::setMutexDestroy()
00155 {
00156 pthread_mutex_destroy(&canvas_lock);
00157 }
00158
00159
00160
00161 void CudaFramework::setMutexUnlock()
00162 {
00163 pthread_mutex_unlock(&canvas_lock);
00164 }
00165
00166
00167
00168 void CudaFramework::setCanvasModified(bool new_state)
00169 {
00170 canvasModified = new_state;
00171 }
00172
00173
00174
00175 void CudaFramework::setPoint(int index,Point2D<int> pt)
00176 {
00177 point_list[index] = pt;
00178 }
00179
00180
00181
00182 void CudaFramework::setDev(int dev)
00183 {
00184 dev1 = dev;
00185 }
00186
00187
00188
00189 void CudaFramework::setMP(MemoryPolicy mp)
00190 {
00191 mp1 = mp;
00192 }
00193
00194
00195
00196 void CudaFramework::setW(int W)
00197 {
00198 w = W;
00199 }
00200
00201
00202
00203 void CudaFramework::setH(int H)
00204 {
00205 h = H;
00206 }
00207
00208
00209
00210 void CudaFramework::updateCanvas(int index, CudaImage<PixRGB<float> > &src)
00211 {
00212 pthread_mutex_lock(&canvas_lock);
00213 cudaInplacePaste(canvas_image,src,point_list[index]);
00214 canvasModified=true;
00215 pthread_mutex_unlock(&canvas_lock);
00216 }
00217
00218
00219
00220 void CudaFramework::startFramework(int W,int H,int dev,MemoryPolicy mp)
00221 {
00222
00223 w = W;
00224 h = H;
00225 dev1 = dev;
00226 mp1 = mp;
00227 canvas_image = CudaImage<PixRGB<float> >(w,h,ZEROS, mp1, dev1);
00228 pthread_mutex_init(&canvas_lock, 0);
00229 }
00230
00231
00232 void CudaFramework::drawRectangle_centrepoint(Point2D<int> max_point, const PixRGB<float> color,const int w,const int h, const int rad)
00233 {
00234 pthread_mutex_lock(&canvas_lock);
00235 Point2D<int> centre_point;
00236
00237 centre_point.i = max_point.i - w/2;
00238 centre_point.j = max_point.j - h/2;
00239 if(centre_point.i <0 )
00240 centre_point.i = 0;
00241 if(centre_point.j <0 )
00242 centre_point.j = 0;
00243
00244 cudaDrawRect(canvas_image,Rectangle::Rectangle(centre_point,(Dims::Dims(w,h))),color,rad);
00245 canvasModified=true;
00246 pthread_mutex_unlock(&canvas_lock);
00247
00248 }
00249
00250 void CudaFramework::drawRectangle_topleftpoint(Point2D<int> max_point, const PixRGB<float> color,const int w,const int h, const int rad)
00251 {
00252 pthread_mutex_lock(&canvas_lock);
00253 cudaDrawRect(canvas_image,Rectangle::Rectangle(max_point,(Dims::Dims(w,h))),color,rad);
00254 canvasModified=true;
00255 pthread_mutex_unlock(&canvas_lock);
00256
00257 }
00258
00259
00260 void CudaFramework::setText(const char* text,Point2D<int> text_coord,const PixRGB<float> color,const PixRGB<float> bgcolor,const SimpleFont& f,bool transparent_background)
00261 {
00262 pthread_mutex_lock(&canvas_lock);
00263 writeText(text_patch,Point2D<int>(0,0),text,color,bgcolor,f,transparent_background);
00264 text_patch_cuda = CudaImage<PixRGB<float> >(text_patch,mp1,dev1);
00265 cudaInplacePaste(canvas_image,text_patch_cuda,text_coord);
00266 canvasModified=true;
00267 pthread_mutex_unlock(&canvas_lock);
00268 }
00269
00270
00271 void CudaFramework::initTextLayer(int w,int h)
00272 {
00273 text_patch = Image<PixRGB<float> >(w,h,NO_INIT);
00274 }
00275