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_ARGB__
00036 #ifdef __HAVE_PF_BGR24__
00037 
00038 #include "mmstools/mmstools.h"
00039 
00040 void mmsfb_blit_blend_argb_to_bgr24(MMSFBSurfacePlanes *src_planes, int src_height, int sx, int sy, int sw, int sh,
00041                                     MMSFBSurfacePlanes *dst_planes, int dst_height, int dx, int dy) {
00042     
00043     static bool firsttime = true;
00044     if (firsttime) {
00045         printf("DISKO: Using accelerated blend ARGB to BGR24.\n");
00046         firsttime = false;
00047     }
00048 
00049     
00050     unsigned int *src = (unsigned int *)src_planes->ptr;
00051     int src_pitch = src_planes->pitch;
00052 
00053     
00054     unsigned char *dst = (unsigned char *)dst_planes->ptr;
00055     int dst_pitch = dst_planes->pitch;
00056 
00057     
00058     int src_pitch_pix = src_pitch >> 2;
00059     int dst_pitch_pix = dst_pitch / 3;
00060     src+= sx + sy * src_pitch_pix;
00061     dst+= dx*3 + dy * dst_pitch;
00062 
00063     
00064     if (dst_pitch_pix - dx < sw - sx)
00065         sw = dst_pitch_pix - dx - sx;
00066     if (dst_height - dy < sh - sy)
00067         sh = dst_height - dy - sy;
00068     if ((sw <= 0)||(sh <= 0))
00069         return;
00070 
00071     unsigned int *src_end = src + src_pitch_pix * sh;
00072     int src_pitch_diff = src_pitch_pix - sw;
00073     int dst_pitch_diff = dst_pitch - sw * 3;
00074 
00075     
00076     while (src < src_end) {
00077         
00078         unsigned int *line_end = src + sw;
00079         while (src < line_end) {
00080             
00081             register unsigned int SRC  = *src;
00082 
00083             
00084             register unsigned int A = SRC >> 24;
00085             if (A == 0xff) {
00086                 
00087                 *dst     = (unsigned char)(SRC >> 16);
00088                 *(dst+1) = (unsigned char)(SRC >> 8);
00089                 *(dst+2) = (unsigned char)SRC;
00090             }
00091             else
00092             if (A) {
00093                 
00094                 register unsigned int SA= 0x100 - A;
00095                 unsigned int r = *dst;
00096                 unsigned int g = *(dst+1);
00097                 unsigned int b = *(dst+2);
00098 
00099                 
00100                 r = (SA * r) >> 8;
00101                 g = (SA * g) >> 8;
00102                 b = (SA * b) >> 8;
00103 
00104                 
00105                 r += (A*(SRC & 0xff0000)) >> 24;
00106                 g += (A*(SRC & 0xff00)) >> 16;
00107                 b += (A*(SRC & 0xff)) >> 8;
00108                 *dst     = (r >> 8) ? 0xff : r;
00109                 *(dst+1) = (g >> 8) ? 0xff : g;
00110                 *(dst+2) = (b >> 8) ? 0xff : b;
00111             }
00112 
00113             dst+=3;
00114             src++;
00115         }
00116 
00117         
00118         src+= src_pitch_diff;
00119         dst+= dst_pitch_diff;
00120     }
00121 }
00122 
00123 #endif
00124 #endif