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/mmsfbconv.h"
00034 
00035 #ifdef __HAVE_PF_AYUV__
00036 
00037 #include "mmstools/mmstools.h"
00038 
00039 void mmsfb_stretchblit_blend_ayuv_to_ayuv(MMSFBExternalSurfaceBuffer *extbuf, int src_height, int sx, int sy, int sw, int sh,
00040                                           unsigned int *dst, int dst_pitch, int dst_height, int dx, int dy, int dw, int dh) {
00041     
00042     static bool firsttime = true;
00043     if (firsttime) {
00044         printf("DISKO: Using accelerated stretch & blend AYUV to AYUV.\n");
00045         firsttime = false;
00046     }
00047 
00048     
00049     unsigned int *src = (unsigned int *)extbuf->ptr;
00050     int src_pitch = extbuf->pitch;
00051 
00052     
00053     int  src_pitch_pix = src_pitch >> 2;
00054     int  dst_pitch_pix = dst_pitch >> 2;
00055     unsigned int *src_end = src + sx + src_pitch_pix * (sy + sh);
00056     if (src_end > src + src_pitch_pix * src_height)
00057         src_end = src + src_pitch_pix * src_height;
00058     unsigned int *dst_end = dst + dst_pitch_pix * dst_height;
00059     src+=sx + sy * src_pitch_pix;
00060     dst+=dx + dy * dst_pitch_pix;
00061 
00062 
00063 
00064 
00065     int horifact = (dw<<16)/sw;
00066     int vertfact = (dh<<16)/sh;
00067 
00068 
00069 
00070     
00071     int vertcnt = 0x8000;
00072     while ((src < src_end)&&(dst < dst_end)) {
00073         
00074         vertcnt+=vertfact;
00075         if (vertcnt & 0xffff0000) {
00076             unsigned int *line_end = src + sw;
00077             unsigned int *old_dst = dst;
00078 
00079             do {
00080                 int horicnt = 0x8000;
00081                 while (src < line_end) {
00082                     
00083 
00084                     horicnt+=horifact;
00085 
00086                     if (horicnt & 0xffff0000) {
00087                         register unsigned int SRC  = *src;
00088                         register unsigned int A = SRC >> 24;
00089 
00090                         if (A == 0xff) {
00091                             
00092                             do {
00093                                 *dst = SRC;
00094                                 dst++;
00095                                 horicnt-=0x10000;
00096                             } while (horicnt & 0xffff0000);
00097                         }
00098                         else
00099                         if (!A) {
00100                             
00101                             do {
00102                                 dst++;
00103                                 horicnt-=0x10000;
00104                             } while (horicnt & 0xffff0000);
00105                         }
00106                         else
00107                         {
00108                             
00109                             register int SA= 0x100 - A;
00110                             register unsigned int DST = *dst;
00111                             unsigned int OLDDST = DST + 1;
00112                             register unsigned int d;
00113 
00114                             do {
00115                                 if (DST==OLDDST) {
00116                                     
00117                                     if (A) {
00118                                         
00119                                         *dst = d;
00120                                     }
00121                                     dst++;
00122                                     DST = *dst;
00123                                     horicnt-=0x10000;
00124                                     continue;
00125                                 }
00126                                 OLDDST = DST;
00127 
00128 
00129                                 
00130                                 unsigned int a = DST >> 24;
00131                                 int y = (DST << 8) >> 24;
00132                                 int u = (DST << 16) >> 24;
00133                                 int v = DST & 0xff;
00134 
00135                                 
00136                                 
00137                                 MMSFB_CONV_PREPARE_YUVBLEND(y,u,v);
00138 
00139                                 
00140                                 a = (SA * a) >> 8;
00141                                 y = (SA * y) >> 8;
00142                                 u = (SA * u) >> 8;
00143                                 v = (SA * v) >> 8;
00144 
00145                                 
00146                                 a += A;
00147                                 y += (SRC << 8) >> 24;
00148                                 u += (SRC << 16) >> 24;
00149                                 v += SRC & 0xff;
00150 
00151                                 
00152                                 
00153                                 d = ((a >> 8) ? 0xff000000 : (a << 24));
00154                                 if (y > 0)
00155                                     d |= ((y >> 8) ? 0xff0000 : (y << 16));
00156                                 if (u > 0)
00157                                     d |= ((u >> 8) ? 0xff00 : (u << 8));
00158                                 if (v > 0)
00159                                     d |= ((v >> 8) ? 0xff : v);
00160 
00161                                 *dst = d;
00162                                 dst++;
00163                                 DST = *dst;
00164                                 horicnt-=0x10000;
00165                             } while (horicnt & 0xffff0000);
00166                         }
00167                     }
00168 
00169                     src++;
00170                 }
00171                 src-=sw;
00172                 vertcnt-=0x10000;
00173                 dst = old_dst +  dst_pitch/4;
00174                 old_dst = dst;
00175             } while (vertcnt & 0xffff0000);
00176         }
00177 
00178         
00179         src+=src_pitch/4;
00180     }
00181 
00182 }
00183 
00184 #endif