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 #include "mmsgui/fb/mmsfbbase.h"
00034 #include "mmstools/tools.h"
00035 #include <string.h>
00036 
00037 
00038 string MMSFB_LastErrorString;
00039 
00040 
00041 bool MMSFBBase_rotate180 = false;
00042 
00043 
00044 string MMSFB_ErrorString(const int rc, const string msg) {
00045     if (rc)
00046     {
00047 #ifdef  __HAVE_DIRECTFB__
00048         string s1 = msg;
00049         string s2 = DirectFBErrorString((DFBResult)rc);
00050         return s1 + " [" + s2 + "]";
00051 #else
00052         return msg;
00053 #endif
00054     }
00055     else
00056         return msg;
00057 }
00058 
00059 void MMSFB_SetError(const int rc, const string msg) {
00060     MMSFB_LastErrorString = MMSFB_ErrorString(rc, msg);
00061     DEBUGMSG("MMSGUI", MMSFB_LastErrorString);
00062 }
00063 
00064 bool isAlphaPixelFormat(MMSFBSurfacePixelFormat pf) {
00065     if   ((pf == MMSFB_PF_RGB16)
00066         ||(pf == MMSFB_PF_RGB24)
00067         ||(pf == MMSFB_PF_RGB32)
00068         ||(pf == MMSFB_PF_YV12)
00069         ||(pf == MMSFB_PF_YUY2)
00070         ||(pf == MMSFB_PF_UYVY)
00071         ||(pf == MMSFB_PF_LUT8)
00072         ||(pf == MMSFB_PF_NV12)
00073         ||(pf == MMSFB_PF_NV16)
00074         ||(pf == MMSFB_PF_NV21)
00075         ||(pf == MMSFB_PF_I420)
00076         ||(pf == MMSFB_PF_RGB18)
00077         ||(pf == MMSFB_PF_LUT2)
00078         ||(pf == MMSFB_PF_RGB444)
00079         ||(pf == MMSFB_PF_RGB555)
00080         ||(pf == MMSFB_PF_BGR24)
00081         ||(pf == MMSFB_PF_BGR555))
00082         return false;
00083     return true;
00084 }
00085 
00086 bool isIndexedPixelFormat(MMSFBSurfacePixelFormat pf) {
00087     if   ((pf == MMSFB_PF_ALUT44)
00088         ||(pf == MMSFB_PF_LUT8))
00089         return true;
00090     return false;
00091 }
00092 
00093 bool isRGBPixelFormat(MMSFBSurfacePixelFormat pf) {
00094     if   ((pf == MMSFB_PF_YV12)
00095         ||(pf == MMSFB_PF_AYUV)
00096         ||(pf == MMSFB_PF_YUY2)
00097         ||(pf == MMSFB_PF_UYVY)
00098         ||(pf == MMSFB_PF_I420)
00099         ||(pf == MMSFB_PF_NV12)
00100         ||(pf == MMSFB_PF_NV16)
00101         ||(pf == MMSFB_PF_NV21)
00102         ||(pf == MMSFB_PF_LUT2))
00103         return false;
00104     return true;
00105 }
00106 
00107 void getBitsPerPixel(MMSFBSurfacePixelFormat pf, MMSFBPixelDef *pixeldef) {
00108 
00109     if (!pixeldef)
00110         return;
00111 
00112     pixeldef->bits = 0;
00113     pixeldef->red_length = 0;
00114     pixeldef->red_offset = 0;
00115     pixeldef->green_length = 0;
00116     pixeldef->green_offset = 0;
00117     pixeldef->blue_length = 0;
00118     pixeldef->blue_offset = 0;
00119     pixeldef->transp_length = 0;
00120     pixeldef->transp_offset = 0;
00121 
00122     if(pf == MMSFB_PF_RGB16) {
00123         pixeldef->bits          = 2*8;
00124         pixeldef->red_length    = 5;
00125         pixeldef->green_length  = 6;
00126         pixeldef->blue_length   = 5;
00127         pixeldef->red_offset    = 11;
00128         pixeldef->green_offset  = 5;
00129         pixeldef->blue_offset   = 0;
00130         return;
00131     }
00132     else
00133     if(pf == MMSFB_PF_RGB24) {
00134         pixeldef->bits          = 3*8;
00135         pixeldef->red_length    = 8;
00136         pixeldef->green_length  = 8;
00137         pixeldef->blue_length   = 8;
00138         pixeldef->red_offset    = 16;
00139         pixeldef->green_offset  = 8;
00140         pixeldef->blue_offset   = 0;
00141         return;
00142     }
00143     else
00144     if(pf == MMSFB_PF_RGB32) {
00145         pixeldef->bits          = 4*8;
00146         pixeldef->red_length    = 8;
00147         pixeldef->green_length  = 8;
00148         pixeldef->blue_length   = 8;
00149         pixeldef->red_offset    = 16;
00150         pixeldef->green_offset  = 8;
00151         pixeldef->blue_offset   = 0;
00152         return;
00153     }
00154     else
00155     if(pf == MMSFB_PF_ARGB) {
00156         pixeldef->bits          = 4*8;
00157         pixeldef->transp_length = 8;
00158         pixeldef->red_length    = 8;
00159         pixeldef->green_length  = 8;
00160         pixeldef->blue_length   = 8;
00161         pixeldef->transp_offset = 24;
00162         pixeldef->red_offset    = 16;
00163         pixeldef->green_offset  = 8;
00164         pixeldef->blue_offset   = 0;
00165         return;
00166     }
00167     else
00168     if(pf == MMSFB_PF_A8) {
00169         pixeldef->bits = 1*8;
00170         return;
00171     }
00172     else
00173     if(pf == MMSFB_PF_YUY2) {
00174         pixeldef->bits = 2*8;
00175         return;
00176     }
00177     else
00178     if(pf == MMSFB_PF_UYVY) {
00179         pixeldef->bits = 2*8;
00180         return;
00181     }
00182     else
00183     if(pf == MMSFB_PF_I420) {
00184         pixeldef->bits = 12;
00185         return;
00186     }
00187     else
00188     if(pf == MMSFB_PF_YV12) {
00189         pixeldef->bits = 12;
00190         return;
00191     }
00192     else
00193     if(pf == MMSFB_PF_AiRGB) {
00194         pixeldef->bits          = 4*8;
00195         pixeldef->transp_length = 8;
00196         pixeldef->red_length    = 8;
00197         pixeldef->green_length  = 8;
00198         pixeldef->blue_length   = 8;
00199         pixeldef->transp_offset = 24;
00200         pixeldef->red_offset    = 16;
00201         pixeldef->green_offset  = 8;
00202         pixeldef->blue_offset   = 0;
00203         return;
00204     }
00205     else
00206     if(pf == MMSFB_PF_A1) {
00207         pixeldef->bits = 1;
00208         return;
00209     }
00210     else
00211     if(pf == MMSFB_PF_NV12) {
00212         pixeldef->bits = 1*8;
00213         return;
00214     }
00215     else
00216     if(pf == MMSFB_PF_NV16) {
00217         pixeldef->bits = 1*8;
00218         return;
00219     }
00220     else
00221     if (pf == MMSFB_PF_NV21) {
00222         pixeldef->bits = 1*8;
00223         return;
00224     }
00225     else
00226     if (pf == MMSFB_PF_AYUV) {
00227         pixeldef->bits = 4*8;
00228         return;
00229     }
00230     else
00231     if (pf == MMSFB_PF_A4) {
00232         pixeldef->bits = 4;
00233         return;
00234     }
00235     else
00236     if (pf == MMSFB_PF_ARGB1666) {
00237         pixeldef->bits = 3*8;
00238         return;
00239     }
00240     else
00241     if (pf == MMSFB_PF_ARGB6666) {
00242         pixeldef->bits = 3*8;
00243         return;
00244     }
00245     else
00246     if (pf == MMSFB_PF_RGB18) {
00247         pixeldef->bits = 3*8;
00248         return;
00249     }
00250     else
00251     if (pf == MMSFB_PF_LUT2) {
00252         pixeldef->bits = 2;
00253         return;
00254     }
00255     else
00256     if (pf == MMSFB_PF_RGB444) {
00257         pixeldef->bits = 2*8;
00258         return;
00259     }
00260     else
00261     if (pf == MMSFB_PF_RGB555) {
00262         pixeldef->bits = 2*8;
00263         return;
00264     }
00265     else
00266     if(pf == MMSFB_PF_ARGB1555) {
00267         pixeldef->bits = 2*8;
00268         return;
00269     }
00270     else
00271     if(pf == MMSFB_PF_RGB332) {
00272         pixeldef->bits = 1*8;
00273         return;
00274     }
00275     else
00276     if(pf == MMSFB_PF_ALUT44) {
00277         pixeldef->bits = 1*8;
00278         return;
00279     }
00280     else
00281     if(pf == MMSFB_PF_LUT8) {
00282         pixeldef->bits = 1*8;
00283         return;
00284     }
00285     else
00286     if(pf == MMSFB_PF_ARGB2554) {
00287         pixeldef->bits = 2*8;
00288         return;
00289     }
00290     else
00291     if(pf == MMSFB_PF_ARGB4444) {
00292         pixeldef->bits = 2*8;
00293         return;
00294     }
00295     else
00296     if(pf == MMSFB_PF_ARGB3565) {
00297         pixeldef->bits          = 20;
00298         pixeldef->transp_length = 3;
00299         pixeldef->red_length    = 5;
00300         pixeldef->green_length  = 6;
00301         pixeldef->blue_length   = 5;
00302         pixeldef->transp_offset = 16;
00303         pixeldef->red_offset    = 11;
00304         pixeldef->green_offset  = 5;
00305         pixeldef->blue_offset   = 0;
00306         return;
00307     }
00308     else
00309     if(pf == MMSFB_PF_BGR24) {
00310         pixeldef->bits          = 3*8;
00311         pixeldef->red_length    = 8;
00312         pixeldef->green_length  = 8;
00313         pixeldef->blue_length   = 8;
00314         pixeldef->red_offset    = 0;
00315         pixeldef->green_offset  = 8;
00316         pixeldef->blue_offset   = 16;
00317         return;
00318     }
00319     else
00320     if(pf == MMSFB_PF_BGR555) {
00321         pixeldef->bits          = 2*8;
00322         pixeldef->red_length    = 5;
00323         pixeldef->green_length  = 5;
00324         pixeldef->blue_length   = 5;
00325         pixeldef->red_offset    = 0;
00326         pixeldef->green_offset  = 5;
00327         pixeldef->blue_offset   = 10;
00328         return;
00329     }
00330     else
00331     if(pf == MMSFB_PF_ABGR) {
00332         pixeldef->bits          = 4*8;
00333         pixeldef->transp_length = 8;
00334         pixeldef->red_length    = 8;
00335         pixeldef->green_length  = 8;
00336         pixeldef->blue_length   = 8;
00337         pixeldef->transp_offset = 24;
00338         pixeldef->red_offset    = 0;
00339         pixeldef->green_offset  = 8;
00340         pixeldef->blue_offset   = 16;
00341         return;
00342     }
00343 }
00344 
00345 #ifdef  __HAVE_DIRECTFB__
00346 MMSFBSurfacePixelFormat getMMSFBPixelFormatFromDFBPixelFormat(DFBSurfacePixelFormat pf) {
00347     switch (pf) {
00348     case DSPF_RGB16:    return MMSFB_PF_RGB16;
00349     case DSPF_RGB24:    return MMSFB_PF_RGB24;
00350     case DSPF_RGB32:    return MMSFB_PF_RGB32;
00351     case DSPF_ARGB:     return MMSFB_PF_ARGB;
00352     case DSPF_A8:       return MMSFB_PF_A8;
00353     case DSPF_YUY2:     return MMSFB_PF_YUY2;
00354     case DSPF_UYVY:     return MMSFB_PF_UYVY;
00355     case DSPF_I420:     return MMSFB_PF_I420;
00356     case DSPF_YV12:     return MMSFB_PF_YV12;
00357     case DSPF_AiRGB:    return MMSFB_PF_AiRGB;
00358     case DSPF_A1:       return MMSFB_PF_A1;
00359     case DSPF_NV12:     return MMSFB_PF_NV12;
00360     case DSPF_NV16:     return MMSFB_PF_NV16;
00361     case DSPF_NV21:     return MMSFB_PF_NV21;
00362     case DSPF_AYUV:     return MMSFB_PF_AYUV;
00363     case DSPF_A4:       return MMSFB_PF_A4;
00364     case DSPF_ARGB1666: return MMSFB_PF_ARGB1666;
00365     case DSPF_ARGB6666: return MMSFB_PF_ARGB6666;
00366     case DSPF_RGB18:    return MMSFB_PF_RGB18;
00367     case DSPF_LUT2:     return MMSFB_PF_LUT2;
00368     case DSPF_RGB444:   return MMSFB_PF_RGB444;
00369     case DSPF_RGB555:   return MMSFB_PF_RGB555;
00370     case DSPF_ARGB1555: return MMSFB_PF_ARGB1555;
00371     case DSPF_RGB332:   return MMSFB_PF_RGB332;
00372     case DSPF_ALUT44:   return MMSFB_PF_ALUT44;
00373     case DSPF_LUT8:     return MMSFB_PF_LUT8;
00374     case DSPF_ARGB2554: return MMSFB_PF_ARGB2554;
00375     case DSPF_ARGB4444: return MMSFB_PF_ARGB4444;
00376     default:            return MMSFB_PF_NONE;
00377     }
00378 }
00379 
00380 DFBSurfacePixelFormat getDFBPixelFormatFromMMSFBPixelFormat(MMSFBSurfacePixelFormat pf) {
00381     switch (pf) {
00382     case MMSFB_PF_RGB16:    return DSPF_RGB16;
00383     case MMSFB_PF_RGB24:    return DSPF_RGB24;
00384     case MMSFB_PF_RGB32:    return DSPF_RGB32;
00385     case MMSFB_PF_ARGB:     return DSPF_ARGB;
00386     case MMSFB_PF_A8:       return DSPF_A8;
00387     case MMSFB_PF_YUY2:     return DSPF_YUY2;
00388     case MMSFB_PF_UYVY:     return DSPF_UYVY;
00389     case MMSFB_PF_I420:     return DSPF_I420;
00390     case MMSFB_PF_YV12:     return DSPF_YV12;
00391     case MMSFB_PF_AiRGB:    return DSPF_AiRGB;
00392     case MMSFB_PF_A1:       return DSPF_A1;
00393     case MMSFB_PF_NV12:     return DSPF_NV12;
00394     case MMSFB_PF_NV16:     return DSPF_NV16;
00395     case MMSFB_PF_NV21:     return DSPF_NV21;
00396     case MMSFB_PF_AYUV:     return DSPF_AYUV;
00397     case MMSFB_PF_A4:       return DSPF_A4;
00398     case MMSFB_PF_ARGB1666: return DSPF_ARGB1666;
00399     case MMSFB_PF_ARGB6666: return DSPF_ARGB6666;
00400     case MMSFB_PF_RGB18:    return DSPF_RGB18;
00401     case MMSFB_PF_LUT2:     return DSPF_LUT2;
00402     case MMSFB_PF_RGB444:   return DSPF_RGB444;
00403     case MMSFB_PF_RGB555:   return DSPF_RGB555;
00404     case MMSFB_PF_ARGB1555: return DSPF_ARGB1555;
00405     case MMSFB_PF_RGB332:   return DSPF_RGB332;
00406     case MMSFB_PF_ALUT44:   return DSPF_ALUT44;
00407     case MMSFB_PF_LUT8:     return DSPF_LUT8;
00408     case MMSFB_PF_ARGB2554: return DSPF_ARGB2554;
00409     case MMSFB_PF_ARGB4444: return DSPF_ARGB4444;
00410     default:                return DSPF_UNKNOWN;
00411     }
00412 }
00413 
00414 
00415 
00416 string getDFBLayerBufferModeString(DFBDisplayLayerBufferMode bm) {
00417     string ret = MMSFB_BM_NONE;
00418 
00419     if(bm & DLBM_FRONTONLY)
00420         ret = ret + "|" + MMSFB_BM_FRONTONLY;
00421 
00422     if(bm & DLBM_BACKVIDEO)
00423         ret = ret + "|" + MMSFB_BM_BACKVIDEO;
00424     if(bm & DLBM_BACKSYSTEM)
00425         ret = ret + "|" + MMSFB_BM_BACKSYSTEM;
00426     if(bm & DLBM_TRIPLE)
00427         ret = ret + "|" + MMSFB_BM_TRIPLE;
00428     if(bm & DLBM_WINDOWS)
00429         ret = ret + "|" + MMSFB_BM_WINDOWS;
00430 
00431     if (ret!=MMSFB_BM_NONE)
00432         return ret.substr(1);
00433     else
00434         return MMSFB_BM_NONE;
00435 }
00436 
00437 DFBDisplayLayerBufferMode getDFBLayerBufferModeFromString(string bm) {
00438     DFBDisplayLayerBufferMode b = DLBM_UNKNOWN;
00439 
00440     if (bm == MMSFB_BM_NONE)
00441         return b;
00442     if(strstr(bm.c_str(),MMSFB_BM_FRONTONLY))
00443         b = (DFBDisplayLayerBufferMode)(b | DLBM_FRONTONLY);
00444 
00445     if(strstr(bm.c_str(),MMSFB_BM_BACKVIDEO))
00446         b = (DFBDisplayLayerBufferMode)(b | DLBM_BACKVIDEO);
00447     if(strstr(bm.c_str(),MMSFB_BM_BACKSYSTEM))
00448         b = (DFBDisplayLayerBufferMode)(b | DLBM_BACKSYSTEM);
00449     if(strstr(bm.c_str(),MMSFB_BM_TRIPLE))
00450         b = (DFBDisplayLayerBufferMode)(b | DLBM_TRIPLE);
00451     if(strstr(bm.c_str(),MMSFB_BM_WINDOWS))
00452         b = (DFBDisplayLayerBufferMode)(b | DLBM_WINDOWS);
00453     return b;
00454 }
00455 
00456 string getDFBLayerOptionsString(DFBDisplayLayerOptions opts) {
00457     string ret = MMSFB_LO_NONE;
00458 
00459     if(opts & DLOP_ALPHACHANNEL)
00460         ret = ret + "|" + MMSFB_LO_ALPHACHANNEL;
00461     if(opts & DLOP_FLICKER_FILTERING)
00462         ret = ret + "|" + MMSFB_LO_FLICKER_FILTERING;
00463     if(opts & DLOP_DEINTERLACING)
00464         ret = ret + "|" + MMSFB_LO_DEINTERLACING;
00465     if(opts & DLOP_SRC_COLORKEY)
00466         ret = ret + "|" + MMSFB_LO_SRC_COLORKEY;
00467     if(opts & DLOP_DST_COLORKEY)
00468         ret = ret + "|" + MMSFB_LO_DST_COLORKEY;
00469     if(opts & DLOP_OPACITY)
00470         ret = ret + "|" + MMSFB_LO_OPACITY;
00471     if(opts & DLOP_FIELD_PARITY)
00472         ret = ret + "|" + MMSFB_LO_FIELD_PARITY;
00473 
00474     if (ret!=MMSFB_LO_NONE)
00475         return ret.substr(1);
00476     else
00477         return MMSFB_LO_NONE;
00478 }
00479 
00480 DFBDisplayLayerOptions getDFBLayerOptionsFromString(string opts) {
00481     DFBDisplayLayerOptions  o = DLOP_NONE;
00482 
00483     if (opts == MMSFB_LO_NONE)
00484         return o;
00485     if(strstr(opts.c_str(),MMSFB_LO_ALPHACHANNEL))
00486         o = (DFBDisplayLayerOptions)(o | DLOP_ALPHACHANNEL);
00487     if(strstr(opts.c_str(),MMSFB_LO_FLICKER_FILTERING))
00488         o = (DFBDisplayLayerOptions)(o | DLOP_FLICKER_FILTERING);
00489     if(strstr(opts.c_str(),MMSFB_LO_DEINTERLACING))
00490         o = (DFBDisplayLayerOptions)(o | DLOP_DEINTERLACING);
00491     if(strstr(opts.c_str(),MMSFB_LO_SRC_COLORKEY))
00492         o = (DFBDisplayLayerOptions)(o | DLOP_SRC_COLORKEY);
00493     if(strstr(opts.c_str(),MMSFB_LO_DST_COLORKEY))
00494         o = (DFBDisplayLayerOptions)(o | DLOP_DST_COLORKEY);
00495     if(strstr(opts.c_str(),MMSFB_LO_OPACITY))
00496         o = (DFBDisplayLayerOptions)(o | DLOP_OPACITY);
00497     if(strstr(opts.c_str(),MMSFB_LO_FIELD_PARITY))
00498         o = (DFBDisplayLayerOptions)(o | DLOP_FIELD_PARITY);
00499     return o;
00500 }
00501 
00502 
00503 DFBSurfaceBlittingFlags getDFBSurfaceBlittingFlagsFromMMSFBBlittingFlags(MMSFBBlittingFlags flags) {
00504     DFBSurfaceBlittingFlags retflags = DSBLIT_NOFX;
00505     if (flags & MMSFB_BLIT_BLEND_ALPHACHANNEL)
00506         retflags = (DFBSurfaceBlittingFlags)(retflags | DSBLIT_BLEND_ALPHACHANNEL);
00507     if (flags & MMSFB_BLIT_BLEND_COLORALPHA)
00508         retflags = (DFBSurfaceBlittingFlags)(retflags | DSBLIT_BLEND_COLORALPHA);
00509     if (flags & MMSFB_BLIT_COLORIZE)
00510         retflags = (DFBSurfaceBlittingFlags)(retflags | DSBLIT_COLORIZE);
00511     if (flags & MMSFB_BLIT_SRC_PREMULTIPLY)
00512         retflags = (DFBSurfaceBlittingFlags)(retflags | DSBLIT_SRC_PREMULTIPLY);
00513     if (flags & MMSFB_BLIT_SRC_PREMULTCOLOR)
00514         retflags = (DFBSurfaceBlittingFlags)(retflags | DSBLIT_SRC_PREMULTCOLOR);
00515     return retflags;
00516 }
00517 
00518 DFBSurfaceDrawingFlags getDFBSurfaceDrawingFlagsFromMMSFBDrawingFlags(MMSFBDrawingFlags flags) {
00519     DFBSurfaceDrawingFlags retflags = DSDRAW_NOFX;
00520     if (flags & MMSFB_DRAW_BLEND)
00521         retflags = (DFBSurfaceDrawingFlags)(retflags | DSDRAW_BLEND);
00522     if (flags & MMSFB_DRAW_SRC_PREMULTIPLY)
00523         retflags = (DFBSurfaceDrawingFlags)(retflags | DSDRAW_SRC_PREMULTIPLY);
00524     return retflags;
00525 }
00526 
00527 DFBSurfaceFlipFlags getDFBSurfaceFlipFlagsFromMMSFBFlipFlags(MMSFBFlipFlags flags) {
00528     DFBSurfaceFlipFlags retflags = DSFLIP_NONE;
00529     if (flags & MMSFB_FLIP_WAIT)
00530         retflags = (DFBSurfaceFlipFlags)(retflags | DSFLIP_WAIT);
00531     if (flags & MMSFB_FLIP_ONSYNC)
00532         retflags = (DFBSurfaceFlipFlags)(retflags | DSFLIP_ONSYNC);
00533     if (flags & MMSFB_FLIP_WAITFORSYNC)
00534         retflags = (DFBSurfaceFlipFlags)(retflags | DSFLIP_WAITFORSYNC);
00535     return retflags;
00536 }
00537 
00538 DFBSurfaceLockFlags getDFBSurfaceLockFlagsFromMMSFBLockFlags(MMSFBLockFlags flags) {
00539     DFBSurfaceLockFlags retflags = DSLF_READ;
00540     if (flags & MMSFB_LOCK_WRITE)
00541         retflags = (DFBSurfaceLockFlags)(retflags | DSLF_WRITE);
00542     return retflags;
00543 }
00544 
00545 
00546 #endif
00547 
00548 
00549 void calcAspectRatio(int sw, int sh, int dw, int dh, MMSFBRectangle &dest, bool aspect_ratio, bool even_aligned) {
00550     if (aspect_ratio) {
00551         
00552         dest.h = dw * sh / sw;
00553         if (dest.h <= dh) {
00554             dest.w = dw;
00555         }
00556         else {
00557             dest.w = dh * sw / sh;
00558             dest.h = dh;
00559         }
00560     }
00561     else {
00562         
00563         dest.w = dw;
00564         dest.h = dh;
00565     }
00566 
00567     
00568     dest.x = (dw - dest.w) / 2;
00569     dest.y = (dh - dest.h) / 2;
00570 
00571     if (even_aligned) {
00572         
00573         dest.x &= ~0x01;
00574         dest.y &= ~0x01;
00575         dest.w &= ~0x01;
00576         dest.h &= ~0x01;
00577     }
00578 }
00579