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