Ver Fonte

Merge pull request #18 from yangfasheng/master

update blit.c Blit565to565PixelAlpha addr align;
Bernard Xiong há 7 anos atrás
pai
commit
2dc45b55fb
1 ficheiros alterados com 21 adições e 4 exclusões
  1. 21 4
      src/blit.c

+ 21 - 4
src/blit.c

@@ -795,17 +795,32 @@ Blit565to565PixelAlpha(struct rtgui_blit_info * info)
         alpha >>= 3;
     }
 
-    if (alpha == 0)
-        return;
-
+    if (alpha > 0)
     {
         int width = info->dst_w / 2;
         int height = info->dst_h;
         rt_uint32_t *srcp = (rt_uint32_t *) info->src;
         rt_uint32_t *dstp = (rt_uint32_t *) info->dst;
+        rt_bool_t addr_align = ((rt_uint32_t)info->dst % 4) / 2;
 
         while (height--)
         {
+            if (addr_align)
+            {
+                rt_uint32_t s = *(rt_uint16_t*)srcp;
+                rt_uint32_t d = *(rt_uint16_t*)dstp;
+
+                s = (s | s << 16) & 0x07e0f81f;
+                d = (d | d << 16) & 0x07e0f81f;
+                d += (s - d) * alpha / 32;
+                d &= 0x07e0f81f;
+                *(rt_uint16_t*)dstp = (rt_uint16_t)(d | d >> 16);
+                srcp = (rt_uint32_t*)((unsigned int)srcp + 2);
+                dstp = (rt_uint32_t*)((unsigned int)dstp + 2);
+                
+                width = (info->dst_w - 1) / 2;
+            }
+            
             DUFFS_LOOP8(
             {
                 rt_uint32_t s = *srcp++;
@@ -822,8 +837,9 @@ Blit565to565PixelAlpha(struct rtgui_blit_info * info)
                 d = ((s - d) * alpha / 32 + d) & 0x07e0f81f;
                 *dstp++ = (du << 16) | (du >> 16) | d;
             }, width);
+            
             /* Deal with the last pixel. */
-            if (info->dst_w % 2)
+            if ((addr_align && (info->dst_w - 1) % 2) || (!addr_align && info->dst_w % 2))
             {
                 rt_uint32_t s = *(rt_uint16_t*)srcp;
                 rt_uint32_t d = *(rt_uint16_t*)dstp;
@@ -836,6 +852,7 @@ Blit565to565PixelAlpha(struct rtgui_blit_info * info)
                 srcp = (rt_uint32_t*)((unsigned int)srcp + 2);
                 dstp = (rt_uint32_t*)((unsigned int)dstp + 2);
             }
+            
             srcp = (rt_uint32_t*)((unsigned int)srcp + info->src_skip);
             dstp = (rt_uint32_t*)((unsigned int)dstp + info->dst_skip);
         }