[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[464] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-27 15:26:29
|
Revision: 464 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=464&view=rev Author: nickols_k Date: 2012-11-27 15:26:22 +0000 (Tue, 27 Nov 2012) Log Message: ----------- size optimization: new class OSD_Render Modified Paths: -------------- mplayerxp/libvo/osd.cpp mplayerxp/libvo/osd.h mplayerxp/libvo/sub.cpp mplayerxp/libvo/video_out.cpp mplayerxp/postproc/libmenu/menu.cpp Modified: mplayerxp/libvo/osd.cpp =================================================================== --- mplayerxp/libvo/osd.cpp 2012-11-27 13:18:15 UTC (rev 463) +++ mplayerxp/libvo/osd.cpp 2012-11-27 15:26:22 UTC (rev 464) @@ -95,18 +95,68 @@ } static void __FASTCALL__ vo_draw_alpha_uyvy_c(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize){ - (*vo_draw_alpha_yuy2_ptr)(w,h,src,srca,srcstride,dstbase+1,dststride,finalize); + vo_draw_alpha_yuy2_c(w,h,src,srca,srcstride,dstbase+1,dststride,finalize); } -draw_alpha_f vo_draw_alpha_yv12_ptr=NULL; -draw_alpha_f vo_draw_alpha_yuy2_ptr=NULL; -draw_alpha_f vo_draw_alpha_rgb24_ptr=NULL; -draw_alpha_f vo_draw_alpha_rgb32_ptr=NULL; -draw_alpha_f vo_draw_alpha_uyvy_ptr=vo_draw_alpha_uyvy_c; -draw_alpha_f vo_draw_alpha_rgb15_ptr=vo_draw_alpha_rgb15_c; -draw_alpha_f vo_draw_alpha_rgb16_ptr=vo_draw_alpha_rgb16_c; +static void __FASTCALL__ vo_draw_alpha_null(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize){ + UNUSED(w); + UNUSED(h); + UNUSED(src); + UNUSED(srca); + UNUSED(srcstride); + UNUSED(dstbase); + UNUSED(dststride); + UNUSED(finalize); +} -void vo_draw_alpha_init( void ){ +void OSD_Render::render(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) +{ + (*draw_alpha_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); +} + +void OSD_Render::get_draw_alpha(unsigned fmt) { + MSG_DBG2("get_draw_alpha(%s)\n",vo_format_name(fmt)); + switch(fmt) { + case IMGFMT_BGR15: + case IMGFMT_RGB15: + draw_alpha_ptr=draw_alpha_rgb15_ptr; + break; + case IMGFMT_BGR16: + case IMGFMT_RGB16: + draw_alpha_ptr=draw_alpha_rgb16_ptr; + break; + case IMGFMT_BGR24: + case IMGFMT_RGB24: + draw_alpha_ptr=draw_alpha_rgb24_ptr; + break; + case IMGFMT_BGR32: + case IMGFMT_RGB32: + draw_alpha_ptr=draw_alpha_rgb32_ptr; + break; + case IMGFMT_YV12: + case IMGFMT_I420: + case IMGFMT_IYUV: + case IMGFMT_YVU9: + case IMGFMT_IF09: + case IMGFMT_Y800: + case IMGFMT_Y8: + draw_alpha_ptr=draw_alpha_yv12_ptr; + break; + case IMGFMT_YUY2: + draw_alpha_ptr=draw_alpha_yuy2_ptr; + break; + case IMGFMT_UYVY: + draw_alpha_ptr=draw_alpha_uyvy_ptr; + break; + default: + MSG_ERR("draw alpha for %s fourcc not implemented yet!",vo_format_name(fmt)); + draw_alpha_ptr=vo_draw_alpha_null; + break; + } +} + +OSD_Render::OSD_Render(unsigned fourcc) +{ #ifdef FAST_OSD_TABLE int i; for(i=0;i<256;i++){ @@ -120,10 +170,10 @@ if(gCpuCaps.hasSSE41) { MSG_V("Using SSE4 Optimized OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_AVX; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_AVX; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_AVX; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_AVX; + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_AVX; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_AVX; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_AVX; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_AVX; } else #endif @@ -131,10 +181,10 @@ if(gCpuCaps.hasSSE41) { MSG_V("Using SSE4 Optimized OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE4; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE4; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE4; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE4; + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE4; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE4; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE4; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE4; } else #endif @@ -142,10 +192,10 @@ if(gCpuCaps.hasSSSE3) { MSG_V("Using SSSE3 Optimized OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSSE3; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSSE3; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSSE3; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSSE3; + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSSE3; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSSE3; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSSE3; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSSE3; } else #endif @@ -153,10 +203,10 @@ if(gCpuCaps.hasSSE3) { MSG_V("Using SSE3 Optimized OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE3; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE3; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE3; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE3; + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE3; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE3; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE3; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE3; } else #endif @@ -164,10 +214,10 @@ if(gCpuCaps.hasSSE2) { MSG_V("Using SSE2 Optimized OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE2; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE2; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE2; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE2; + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE2; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE2; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE2; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE2; } else #endif @@ -176,10 +226,10 @@ if(gCpuCaps.hasMMX2) { MSG_V("Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE; + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_SSE; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_SSE; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_SSE; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_SSE; } else #endif @@ -187,19 +237,25 @@ //if(gCpuCaps.hasMMX) //{ // MSG_V("Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay\n"); -// vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_MMX; -// vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_MMX; -// vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_MMX; -// vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_MMX; +// draw_alpha_yv12_ptr=vo_draw_alpha_yv12_MMX; +// draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_MMX; +// draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_MMX; +// draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_MMX; //} //else //#endif #endif { - MSG_V("Using generic OnScreenDisplay\n"); - vo_draw_alpha_yv12_ptr=vo_draw_alpha_yv12_c; - vo_draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_c; - vo_draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_c; - vo_draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_c; + MSG_V("Using generic OnScreenDisplay\n"); + draw_alpha_yv12_ptr=vo_draw_alpha_yv12_c; + draw_alpha_yuy2_ptr=vo_draw_alpha_yuy2_c; + draw_alpha_rgb24_ptr=vo_draw_alpha_rgb24_c; + draw_alpha_rgb32_ptr=vo_draw_alpha_rgb32_c; } + draw_alpha_uyvy_ptr=vo_draw_alpha_uyvy_c; + draw_alpha_rgb15_ptr=vo_draw_alpha_rgb15_c; + draw_alpha_rgb16_ptr=vo_draw_alpha_rgb16_c; + get_draw_alpha(fourcc); } + +OSD_Render::~OSD_Render(){} Modified: mplayerxp/libvo/osd.h =================================================================== --- mplayerxp/libvo/osd.h 2012-11-27 13:18:15 UTC (rev 463) +++ mplayerxp/libvo/osd.h 2012-11-27 15:26:22 UTC (rev 464) @@ -3,23 +3,23 @@ /* Generic alpha renderers for all YUV modes and RGB depths. */ /* These are "reference implementations", should be optimized later (MMX, etc) */ +class OSD_Render : public Opaque { + public: + OSD_Render(unsigned fourcc); + virtual ~OSD_Render(); -extern void vo_draw_alpha_init( void ); /* build tables */ + void render(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize); + private: + void get_draw_alpha(unsigned fmt); + typedef void (* __FASTCALL__ draw_alpha_f)(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize); + draw_alpha_f draw_alpha_ptr; + draw_alpha_f draw_alpha_yv12_ptr; + draw_alpha_f draw_alpha_yuy2_ptr; + draw_alpha_f draw_alpha_uyvy_ptr; + draw_alpha_f draw_alpha_rgb24_ptr; + draw_alpha_f draw_alpha_rgb32_ptr; + draw_alpha_f draw_alpha_rgb15_ptr; + draw_alpha_f draw_alpha_rgb16_ptr; +}; -typedef void (* __FASTCALL__ draw_alpha_f)(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize); - -extern draw_alpha_f vo_draw_alpha_yv12_ptr; -extern draw_alpha_f vo_draw_alpha_yuy2_ptr; -extern draw_alpha_f vo_draw_alpha_uyvy_ptr; -extern draw_alpha_f vo_draw_alpha_rgb24_ptr; -extern draw_alpha_f vo_draw_alpha_rgb32_ptr; -extern draw_alpha_f vo_draw_alpha_rgb15_ptr; -extern draw_alpha_f vo_draw_alpha_rgb16_ptr; -static inline void vo_draw_alpha_yv12(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_yv12_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } -static inline void vo_draw_alpha_yuy2(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_yuy2_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } -static inline void vo_draw_alpha_uyvy(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_uyvy_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } -static inline void vo_draw_alpha_rgb24(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_rgb24_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } -static inline void vo_draw_alpha_rgb32(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_rgb32_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } -static inline void vo_draw_alpha_rgb15(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_rgb15_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } -static inline void vo_draw_alpha_rgb16(int w,int h, const unsigned char* src, const unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride,int finalize) { (*vo_draw_alpha_rgb16_ptr)(w,h,src,srca,srcstride,dstbase,dststride,finalize); } #endif Modified: mplayerxp/libvo/sub.cpp =================================================================== --- mplayerxp/libvo/sub.cpp 2012-11-27 13:18:15 UTC (rev 463) +++ mplayerxp/libvo/sub.cpp 2012-11-27 15:26:22 UTC (rev 464) @@ -34,7 +34,6 @@ static const char * __sub_osd_names_short[] ={ "", "|>", "||", "[]", "<<" , ">>", "", "", "", "", "", ""}; static int vo_osd_changed_status = 0; static rect_highlight_t nav_hl; -static int draw_alpha_init_flag=0; static mp_osd_obj_t* vo_osd_list=NULL; sub_data_t sub_data = { NULL, 0, 0, 100, 0, 0 }; @@ -501,10 +500,6 @@ } void vo_init_osd(void){ - if(!draw_alpha_init_flag){ - draw_alpha_init_flag=1; - vo_draw_alpha_init(); - } if(vo_osd_list) free_osd_list(); // temp hack, should be moved to mplayer/mencoder later new_osd_obj(OSDTYPE_OSD); Modified: mplayerxp/libvo/video_out.cpp =================================================================== --- mplayerxp/libvo/video_out.cpp 2012-11-27 13:18:15 UTC (rev 463) +++ mplayerxp/libvo/video_out.cpp 2012-11-27 15:26:22 UTC (rev 464) @@ -128,7 +128,7 @@ dri_priv_t dri; const vo_info_t* video_out; class VO_Interface* vo_iface; - draw_alpha_f draw_alpha; + OSD_Render* draw_alpha; }; vo_priv_t::vo_priv_t() { @@ -137,6 +137,7 @@ } vo_priv_t::~vo_priv_t() { + if(draw_alpha) delete draw_alpha; delete vo_iface; } @@ -809,50 +810,18 @@ } } -static draw_alpha_f __FASTCALL__ get_draw_alpha(uint32_t fmt) { - MSG_DBG2("get_draw_alpha(%s)\n",vo_format_name(fmt)); - switch(fmt) { - case IMGFMT_BGR15: - case IMGFMT_RGB15: - return vo_draw_alpha_rgb15_ptr; - case IMGFMT_BGR16: - case IMGFMT_RGB16: - return vo_draw_alpha_rgb16_ptr; - case IMGFMT_BGR24: - case IMGFMT_RGB24: - return vo_draw_alpha_rgb24_ptr; - case IMGFMT_BGR32: - case IMGFMT_RGB32: - return vo_draw_alpha_rgb32_ptr; - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_Y800: - case IMGFMT_Y8: - return vo_draw_alpha_yv12_ptr; - case IMGFMT_YUY2: - return vo_draw_alpha_yuy2_ptr; - case IMGFMT_UYVY: - return vo_draw_alpha_uyvy_ptr; - } - - return NULL; -} - static void __FASTCALL__ dri_draw_osd(any_t*vo,unsigned idx,int x0,int _y0, int w,int h,const unsigned char* src,const unsigned char *srca, int stride) { vo_priv_t& priv=*static_cast<vo_priv_t*>(reinterpret_cast<vo_data_t*>(vo)->vo_priv); int finalize=vo_is_final(reinterpret_cast<vo_data_t*>(vo)); if(x0+w<=priv.dri.cap.width&&_y0+h<=priv.dri.cap.height) { - if(!priv.draw_alpha) priv.draw_alpha=get_draw_alpha(priv.dri.cap.fourcc); + if(!priv.draw_alpha) priv.draw_alpha=new(zeromem) OSD_Render(priv.dri.cap.fourcc); if(priv.draw_alpha) { dri_surface_t surf; surf.idx=idx; priv.vo_iface->get_surface(&surf); - (*priv.draw_alpha)(w,h,src,srca,stride, + priv.draw_alpha->render(w,h,src,srca,stride, surf.planes[0]+priv.dri.cap.strides[0]*_y0+x0*((priv.dri.bpp+7)/8), priv.dri.cap.strides[0],finalize); } Modified: mplayerxp/postproc/libmenu/menu.cpp =================================================================== --- mplayerxp/postproc/libmenu/menu.cpp 2012-11-27 13:18:15 UTC (rev 463) +++ mplayerxp/postproc/libmenu/menu.cpp 2012-11-27 15:26:22 UTC (rev 464) @@ -266,37 +266,6 @@ ///////////////////////////// Helpers //////////////////////////////////// -inline static draw_alpha_f get_draw_alpha(uint32_t fmt) { - switch(fmt) { - case IMGFMT_BGR15: - case IMGFMT_RGB15: - return vo_draw_alpha_rgb15_ptr; - case IMGFMT_BGR16: - case IMGFMT_RGB16: - return vo_draw_alpha_rgb16_ptr; - case IMGFMT_BGR24: - case IMGFMT_RGB24: - return vo_draw_alpha_rgb24_ptr; - case IMGFMT_BGR32: - case IMGFMT_RGB32: - return vo_draw_alpha_rgb32_ptr; - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_Y800: - case IMGFMT_Y8: - return vo_draw_alpha_yv12_ptr; - case IMGFMT_UYVY: - return vo_draw_alpha_uyvy_ptr; - case IMGFMT_YUY2: - return vo_draw_alpha_yuy2_ptr; - } - - return NULL; -} - // return the real height of a char: static inline int get_height(int c,int h){ int font; @@ -364,15 +333,10 @@ #endif void menu_draw_text(mp_image_t* mpi,const char* txt, int x, int y) { - draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); + OSD_Render& draw_alpha = *new(zeromem) OSD_Render(mpi->imgfmt); int font; int finalize=vo_is_final(vo_data); - if(!draw_alpha) { - MSG_WARN("[libmenu] Unsupported output format\n"); - return; - } - #ifdef USE_FRIBIDI txt = menu_fribidi(txt); #endif @@ -381,7 +345,7 @@ while (*txt) { int c=utf8_get_char((const char**)&txt); if ((font=vo_data->font->font[c])>=0 && (x + vo_data->font->width[c] <= mpi->w) && (y + vo_data->font->pic_a[font]->h <= mpi->h)) - draw_alpha(vo_data->font->width[c], vo_data->font->pic_a[font]->h, + draw_alpha.render(vo_data->font->width[c], vo_data->font->pic_a[font]->h, vo_data->font->pic_b[font]->bmp+vo_data->font->start[c], vo_data->font->pic_a[font]->bmp+vo_data->font->start[c], vo_data->font->pic_a[font]->w, @@ -401,13 +365,8 @@ int ll = 0; int font; int finalize=vo_is_final(vo_data); - draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); + OSD_Render& draw_alpha = *new(zeromem) OSD_Render(mpi->imgfmt); - if(!draw_alpha) { - MSG_WARN("[libmenu] Unsupported output format\n"); - return; - } - #ifdef USE_FRIBIDI txt = menu_fribidi(txt); #endif @@ -552,7 +511,7 @@ if(font >= 0) { int cs = (vo_data->font->pic_a[font]->h - vo_data->font->height) / 2; if ((sx + vo_data->font->width[c] < xmax) && (sy + vo_data->font->height < ymax) ) - draw_alpha(vo_data->font->width[c], vo_data->font->height, + draw_alpha.render(vo_data->font->width[c], vo_data->font->height, vo_data->font->pic_b[font]->bmp+vo_data->font->start[c] + cs * vo_data->font->pic_a[font]->w, vo_data->font->pic_a[font]->bmp+vo_data->font->start[c] + @@ -637,14 +596,9 @@ void menu_draw_box(const mp_image_t* mpi,unsigned char grey,unsigned char alpha, int x, int y, int w, int h) { - draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt); + OSD_Render& draw_alpha = *new(zeromem) OSD_Render(mpi->imgfmt); int g; - if(!draw_alpha) { - MSG_WARN("[libmenu] Unsupported output format\n"); - return; - } - if(x > mpi->w || y > mpi->h) return; if(x < 0) w += x, x = 0; @@ -661,7 +615,7 @@ unsigned char pic[stride*h],pic_alpha[stride*h]; memset(pic,g,stride*h); memset(pic_alpha,alpha,stride*h); - draw_alpha(w,h,pic,pic_alpha,stride, + draw_alpha.render(w,h,pic,pic_alpha,stride, mpi->planes[0] + y * mpi->stride[0] + x * (mpi->bpp>>3), mpi->stride[0],finalize); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |