Procházet zdrojové kódy

Fixed signedness issue when blitting on a big endian platform, as reported by capehill
For example, if sR is 0 and dR is 255, we will get -255*sA casted to an unsigned value. Basically results are quite large numbers instead of the expected 0-255 range.

Sam Lantinga před 8 roky
rodič
revize
d024c724d1
1 změnil soubory, kde provedl 7 přidání a 7 odebrání
  1. 7 7
      src/video/SDL_blit.h

+ 7 - 7
src/video/SDL_blit.h

@@ -443,19 +443,19 @@ do {                                                                    \
 /* Blend the RGB values of two pixels with an alpha value */
 #define ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB)                      \
 do {                                                                    \
-    dR = ((((unsigned)(sR-dR)*(unsigned)A)/255)+dR);                    \
-    dG = ((((unsigned)(sG-dG)*(unsigned)A)/255)+dG);                    \
-    dB = ((((unsigned)(sB-dB)*(unsigned)A)/255)+dB);                    \
+    dR = (Uint8)((((int)(sR-dR)*A)/255)+dR);                            \
+    dG = (Uint8)((((int)(sG-dG)*A)/255)+dG);                            \
+    dB = (Uint8)((((int)(sB-dB)*A)/255)+dB);                            \
 } while(0)
 
 
 /* Blend the RGBA values of two pixels */
 #define ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA)                \
 do {                                                                    \
-    dR = ((((unsigned)(sR-dR)*(unsigned)sA)/255)+dR);                   \
-    dG = ((((unsigned)(sG-dG)*(unsigned)sA)/255)+dG);                   \
-    dB = ((((unsigned)(sB-dB)*(unsigned)sA)/255)+dB);                   \
-    dA = ((unsigned)sA+(unsigned)dA-((unsigned)sA*dA)/255);             \
+    dR = (Uint8)((((int)(sR-dR)*sA)/255)+dR);                           \
+    dG = (Uint8)((((int)(sG-dG)*sA)/255)+dG);                           \
+    dB = (Uint8)((((int)(sB-dB)*sA)/255)+dB);                           \
+    dA = (Uint8)((int)sA+dA-((int)sA*dA)/255);                          \
 } while(0)