- defined D3DCOLOR_B macros to access byte values of D3DCOLOR
- use D3DCOLOR macros instead of using shift + masks
- fix a bug where diffuse.lpData checked instead of specular.lpData
- implement color fixup on ARB VShader compilation code:
 -> on input parameters using swizzle
 -> add is_color parameter on vshader_program_add_param

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 25ccb04..cc4c58d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4601,10 +4601,10 @@
     if (Flags & D3DCLEAR_TARGET) {
         TRACE("Clearing screen with glClear to color %lx\n", Color);
         glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
-        glClearColor(((Color >> 16) & 0xFF) / 255.0f,
-                     ((Color >>  8) & 0xFF) / 255.0f,
-                     ((Color >>  0) & 0xFF) / 255.0f,
-                     ((Color >> 24) & 0xFF) / 255.0f);
+        glClearColor(D3DCOLOR_R(Color),
+                     D3DCOLOR_G(Color),
+                     D3DCOLOR_B(Color),
+                     D3DCOLOR_A(Color));
         checkGLcall("glClearColor");
 
         /* Clear ALL colors! */
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 64ddd89..ca1e8d7 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1416,30 +1416,30 @@
 
         /* Diffuse -------------------------------- */
         if (sd->u.s.diffuse.lpData != NULL) {
-            glColor4ub((diffuseColor >> 16) & 0xFF,
-                       (diffuseColor >>  8) & 0xFF,
-                       (diffuseColor >>  0) & 0xFF,
-                       (diffuseColor >> 24) & 0xFF);
-            VTRACE(("glColor4f: r,g,b,a=%f,%f,%f,%f\n",
-                    ((diffuseColor >> 16) & 0xFF) / 255.0f,
-                    ((diffuseColor >>  8) & 0xFF) / 255.0f,
-                    ((diffuseColor >>  0) & 0xFF) / 255.0f,
-                    ((diffuseColor >> 24) & 0xFF) / 255.0f));
+	  glColor4ub(D3DCOLOR_B_R(diffuseColor),
+		     D3DCOLOR_B_G(diffuseColor),
+		     D3DCOLOR_B_B(diffuseColor),
+		     D3DCOLOR_B_A(diffuseColor));
+            VTRACE(("glColor4ub: r,g,b,a=%u,%u,%u,%u\n", 
+                    D3DCOLOR_B_R(diffuseColor),
+		    D3DCOLOR_B_G(diffuseColor),
+		    D3DCOLOR_B_B(diffuseColor),
+		    D3DCOLOR_B_A(diffuseColor)));
         } else {
             if (vx_index == 0) glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
         }
 
         /* Specular ------------------------------- */
-        if (sd->u.s.diffuse.lpData != NULL) {
-            VTRACE(("glSecondaryColor4ub: r,g,b=%f,%f,%f\n",
-                    ((specularColor >> 16) & 0xFF) / 255.0f,
-                    ((specularColor >>  8) & 0xFF) / 255.0f,
-                    ((specularColor >>  0) & 0xFF) / 255.0f));
+        if (sd->u.s.specular.lpData != NULL) {
+            VTRACE(("glSecondaryColor4ub: r,g,b=%u,%u,%u\n", 
+                    D3DCOLOR_B_R(specularColor), 
+                    D3DCOLOR_B_G(specularColor), 
+                    D3DCOLOR_B_B(specularColor)));
             if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
                 GL_EXTCALL(glSecondaryColor3ubEXT)(
-                           (specularColor >> 16) & 0xFF,
-                           (specularColor >>  8) & 0xFF,
-                           (specularColor >>  0) & 0xFF);
+                           D3DCOLOR_B_R(specularColor),
+                           D3DCOLOR_B_G(specularColor),
+                           D3DCOLOR_B_B(specularColor));
             } else {
                 /* Do not worry if specular colour missing and disable request */
                 VTRACE(("Specular color extensions not supplied\n"));
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index bdd8bf1..226c5bb 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -887,10 +887,70 @@
   return D3DSIO_COMMENT == (token & D3DSI_OPCODE_MASK);
 }
 
-inline static void vshader_program_add_param(const DWORD param, int input, char *hwLine, BOOL namedArrays, CHAR constantsUsedBitmap[]) {
+inline static void vshader_program_add_output_param_swizzle(const DWORD param, int is_color, char *hwLine) {
+    /** operand output */
+    if ((param & D3DSP_WRITEMASK_ALL) != D3DSP_WRITEMASK_ALL) {
+      strcat(hwLine, ".");
+      if (param & D3DSP_WRITEMASK_0) { strcat(hwLine, "x"); }
+      if (param & D3DSP_WRITEMASK_1) { strcat(hwLine, "y"); }
+      if (param & D3DSP_WRITEMASK_2) { strcat(hwLine, "z"); }
+      if (param & D3DSP_WRITEMASK_3) { strcat(hwLine, "w"); }
+    }  
+}
+
+inline static void vshader_program_add_input_param_swizzle(const DWORD param, int is_color, char *hwLine) {
+    static const char swizzle_reg_chars_color_fix[] = "zyxw";
+    static const char swizzle_reg_chars[] = "xyzw";
+    const char* swizzle_regs = NULL;
+    char  tmpReg[255];
+
+    /** operand input */
+    DWORD swizzle = (param & D3DVS_SWIZZLE_MASK) >> D3DVS_SWIZZLE_SHIFT;
+    DWORD swizzle_x = swizzle & 0x03;
+    DWORD swizzle_y = (swizzle >> 2) & 0x03;
+    DWORD swizzle_z = (swizzle >> 4) & 0x03;
+    DWORD swizzle_w = (swizzle >> 6) & 0x03;
+
+    if (is_color) {
+      swizzle_regs = swizzle_reg_chars_color_fix;
+    } else {
+      swizzle_regs = swizzle_reg_chars;
+    }
+
+    /**
+     * swizzle bits fields:
+     *  WWZZYYXX
+     */
+    if ((D3DVS_NOSWIZZLE >> D3DVS_SWIZZLE_SHIFT) == swizzle) { /* D3DVS_NOSWIZZLE == 0xE4 << D3DVS_SWIZZLE_SHIFT */
+      if (is_color) {
+	sprintf(tmpReg, ".%c%c%c%c",
+		swizzle_regs[swizzle_x],
+		swizzle_regs[swizzle_y],
+		swizzle_regs[swizzle_z],
+		swizzle_regs[swizzle_w]);
+	strcat(hwLine, tmpReg);
+      }
+      return ;
+    }
+    if (swizzle_x == swizzle_y &&
+	swizzle_x == swizzle_z &&
+	swizzle_x == swizzle_w)
+    {
+      sprintf(tmpReg, ".%c", swizzle_regs[swizzle_x]);
+      strcat(hwLine, tmpReg);
+    } else {
+      sprintf(tmpReg, ".%c%c%c%c",
+	      swizzle_regs[swizzle_x],
+	      swizzle_regs[swizzle_y],
+	      swizzle_regs[swizzle_z],
+	      swizzle_regs[swizzle_w]);
+      strcat(hwLine, tmpReg);
+    }
+}
+
+inline static void vshader_program_add_param(const DWORD param, int input, int is_color, char *hwLine, BOOL namedArrays, CHAR constantsUsedBitmap[]) {
   /*static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" }; */
   static const char* hwrastout_reg_names[] = { "result.position", "result.fogcoord", "result.pointsize" };
-  static const char swizzle_reg_chars[] = "xyzw";
 
   DWORD reg = param & 0x00001FFF;
   DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
@@ -954,49 +1014,9 @@
   }
 
   if (!input) {
-    /** operand output */
-    if ((param & D3DSP_WRITEMASK_ALL) != D3DSP_WRITEMASK_ALL) {
-      strcat(hwLine, ".");
-      if (param & D3DSP_WRITEMASK_0) {
-          strcat(hwLine, "x");
-      }
-      if (param & D3DSP_WRITEMASK_1) {
-          strcat(hwLine, "y");
-      }
-      if (param & D3DSP_WRITEMASK_2) {
-          strcat(hwLine, "z");
-      }
-      if (param & D3DSP_WRITEMASK_3) {
-          strcat(hwLine, "w");
-      }
-    }
+    vshader_program_add_output_param_swizzle(param, is_color, hwLine);
   } else {
-    /** operand input */
-    DWORD swizzle = (param & D3DVS_SWIZZLE_MASK) >> D3DVS_SWIZZLE_SHIFT;
-    DWORD swizzle_x = swizzle & 0x03;
-    DWORD swizzle_y = (swizzle >> 2) & 0x03;
-    DWORD swizzle_z = (swizzle >> 4) & 0x03;
-    DWORD swizzle_w = (swizzle >> 6) & 0x03;
-    /**
-     * swizzle bits fields:
-     *  WWZZYYXX
-     */
-    if ((D3DVS_NOSWIZZLE >> D3DVS_SWIZZLE_SHIFT) != swizzle) { /* ! D3DVS_NOSWIZZLE == 0xE4 << D3DVS_SWIZZLE_SHIFT */
-      if (swizzle_x == swizzle_y &&
-        swizzle_x == swizzle_z &&
-        swizzle_x == swizzle_w)
-      {
-        sprintf(tmpReg, ".%c", swizzle_reg_chars[swizzle_x]);
-        strcat(hwLine, tmpReg);
-      } else {
-        sprintf(tmpReg, ".%c%c%c%c",
-        swizzle_reg_chars[swizzle_x],
-        swizzle_reg_chars[swizzle_y],
-        swizzle_reg_chars[swizzle_z],
-        swizzle_reg_chars[swizzle_w]);
-        strcat(hwLine, tmpReg);
-      }
-    }
+    vshader_program_add_input_param_swizzle(param, is_color, hwLine);
   }
 }
 
@@ -1540,7 +1560,7 @@
                     char tmpChar[80];
                     ++pToken;
                     sprintf(tmpLine, "ATTRIB ");
-                    vshader_program_add_param(*pToken, 0, tmpLine, This->namedArrays, This->constantsUsedBitmap);
+                    vshader_program_add_param(*pToken, 0, 0, tmpLine, This->namedArrays, This->constantsUsedBitmap);
                     sprintf(tmpChar," = %s", attribName);
                     strcat(tmpLine, tmpChar);
                     strcat(tmpLine,";\n");
@@ -1592,12 +1612,12 @@
             }
         }
         if (curOpcode->num_params > 0) {
-            vshader_program_add_param(*pToken, 0, tmpLine, This->namedArrays, This->constantsUsedBitmap);
+            vshader_program_add_param(*pToken, 0, 0, tmpLine, This->namedArrays, This->constantsUsedBitmap);
 
             ++pToken;
             for (i = 1; i < curOpcode->num_params; ++i) {
                 strcat(tmpLine, ",");
-                vshader_program_add_param(*pToken, 1, tmpLine, This->namedArrays, This->constantsUsedBitmap);
+                vshader_program_add_param(*pToken, 1, 0, tmpLine, This->namedArrays, This->constantsUsedBitmap);
                 ++pToken;
             }
         }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 65c59f5..9967e6f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -161,6 +161,11 @@
 #define GL_EXTCALL(FuncName)          (GLINFO_LOCATION.FuncName)
 #define GL_VEND(_VendName)            (GLINFO_LOCATION.gl_vendor == VENDOR_##_VendName ? TRUE : FALSE)
 
+#define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xFF)
+#define D3DCOLOR_B_G(dw) (((dw) >>  8) & 0xFF)
+#define D3DCOLOR_B_B(dw) (((dw) >>  0) & 0xFF)
+#define D3DCOLOR_B_A(dw) (((dw) >> 24) & 0xFF)
+
 #define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f)
 #define D3DCOLOR_G(dw) (((float) (((dw) >>  8) & 0xFF)) / 255.0f)
 #define D3DCOLOR_B(dw) (((float) (((dw) >>  0) & 0xFF)) / 255.0f)