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_blit_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) {
00041     
00042     static bool firsttime = true;
00043     if (firsttime) {
00044         printf("DISKO: Using accelerated 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     src+= sx + sy * src_pitch_pix;
00056     dst+= dx + dy * dst_pitch_pix;
00057 
00058     
00059     if (dst_pitch_pix - dx < sw - sx)
00060         sw = dst_pitch_pix - dx - sx;
00061     if (dst_height - dy < sh - sy)
00062         sh = dst_height - dy - sy;
00063     if ((sw <= 0)||(sh <= 0))
00064         return;
00065 
00066     unsigned int OLDDST = (*dst) + 1;
00067     unsigned int OLDSRC  = (*src) + 1;
00068     unsigned int *src_end = src + src_pitch_pix * sh;
00069     int src_pitch_diff = src_pitch_pix - sw;
00070     int dst_pitch_diff = dst_pitch_pix - sw;
00071     register unsigned int d;
00072 
00073     
00074     while (src < src_end) {
00075         
00076         unsigned int *line_end = src + sw;
00077         while (src < line_end) {
00078             
00079             register unsigned int SRC = *src;
00080 
00081             
00082             register unsigned int A = SRC >> 24;
00083             if (A == 0xff) {
00084                 
00085                 *dst = SRC;
00086             }
00087             else
00088             if (A) {
00089                 
00090                 register unsigned int DST = *dst;
00091 
00092                 if ((DST==OLDDST)&&(SRC==OLDSRC)) {
00093                     
00094                     *dst = d;
00095                     dst++;
00096                     src++;
00097                     continue;
00098                 }
00099                 OLDDST = DST;
00100                 OLDSRC = SRC;
00101 
00102                 
00103                 register int SA= 0x100 - A;
00104                 unsigned int a = DST >> 24;
00105                 int y = (DST << 8) >> 24;
00106                 int u = (DST << 16) >> 24;
00107                 int v = DST & 0xff;
00108 
00109                 
00110                 
00111                 MMSFB_CONV_PREPARE_YUVBLEND(y,u,v);
00112 
00113                 
00114                 a = (SA * a) >> 8;
00115                 y = (SA * y) >> 8;
00116                 u = (SA * u) >> 8;
00117                 v = (SA * v) >> 8;
00118 
00119                 
00120                 a += A;
00121                 y += (SRC << 8) >> 24;
00122                 u += (SRC << 16) >> 24;
00123                 v += SRC & 0xff;
00124 
00125                 
00126                 
00127                 d = ((a >> 8) ? 0xff000000 : (a << 24));
00128                 if (y > 0)
00129                     d |= ((y >> 8) ? 0xff0000 : (y << 16));
00130                 if (u > 0)
00131                     d |= ((u >> 8) ? 0xff00 : (u << 8));
00132                 if (v > 0)
00133                     d |= ((v >> 8) ? 0xff : v);
00134 
00135                 *dst = d;
00136             }
00137 
00138             dst++;
00139             src++;
00140         }
00141 
00142         
00143         src+= src_pitch_diff;
00144         dst+= dst_pitch_diff;
00145     }
00146 }
00147 
00148 #endif