Index: source/blender/blenkernel/intern/cdderivedmesh.c =================================================================== --- source/blender/blenkernel/intern/cdderivedmesh.c (revision 15559) +++ source/blender/blenkernel/intern/cdderivedmesh.c (working copy) @@ -336,6 +336,11 @@ glEnable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); + + /* for vertex color alpha channel */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBegin(glmode = GL_QUADS); for(a = 0; a < dm->numFaceData; a++, mface++, cp1 += 16) { int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES; @@ -345,26 +350,26 @@ glBegin(glmode = new_glmode); } - glColor3ub(cp1[0], cp1[1], cp1[2]); + glColor4ub(cp1[0], cp1[1], cp1[2], cp1[3]); glVertex3fv(mvert[mface->v1].co); - glColor3ub(cp1[4], cp1[5], cp1[6]); + glColor4ub(cp1[4], cp1[5], cp1[6], cp1[7]); glVertex3fv(mvert[mface->v2].co); - glColor3ub(cp1[8], cp1[9], cp1[10]); + glColor4ub(cp1[8], cp1[9], cp1[10], cp1[11]); glVertex3fv(mvert[mface->v3].co); if(mface->v4) { - glColor3ub(cp1[12], cp1[13], cp1[14]); + glColor4ub(cp1[12], cp1[13], cp1[14], cp1[15]); glVertex3fv(mvert[mface->v4].co); } if(useTwoSided) { - glColor3ub(cp2[8], cp2[9], cp2[10]); + glColor4ub(cp2[8], cp2[9], cp2[10], cp2[11]); glVertex3fv(mvert[mface->v3].co ); - glColor3ub(cp2[4], cp2[5], cp2[6]); + glColor4ub(cp2[4], cp2[5], cp2[6], cp2[7]); glVertex3fv(mvert[mface->v2].co ); - glColor3ub(cp2[0], cp2[1], cp2[2]); + glColor4ub(cp2[0], cp2[1], cp2[2], cp2[3]); glVertex3fv(mvert[mface->v1].co ); if(mface->v4) { - glColor3ub(cp2[12], cp2[13], cp2[14]); + glColor4ub(cp2[12], cp2[13], cp2[14], cp2[15]); glVertex3fv(mvert[mface->v4].co ); } } @@ -372,6 +377,7 @@ } glEnd(); + glDisable(GL_BLEND); glShadeModel(GL_FLAT); glDisable(GL_CULL_FACE); } @@ -389,6 +395,10 @@ MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE); int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX); + /* for vertex color alpha channel */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + for(i = 0; i < dm->numFaceData; i++, mf++) { MVert *mvert; int flag; @@ -434,26 +444,26 @@ glBegin(mf->v4?GL_QUADS:GL_TRIANGLES); if(tf) glTexCoord2fv(tf[i].uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); mvert = &mv[mf->v1]; if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no); glVertex3fv(mvert->co); if(tf) glTexCoord2fv(tf[i].uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); mvert = &mv[mf->v2]; if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no); glVertex3fv(mvert->co); if(tf) glTexCoord2fv(tf[i].uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); mvert = &mv[mf->v3]; if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no); glVertex3fv(mvert->co); if(mf->v4) { if(tf) glTexCoord2fv(tf[i].uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); mvert = &mv[mf->v4]; if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no); glVertex3fv(mvert->co); @@ -463,6 +473,7 @@ if(nors) nors += 3; } + glDisable(GL_BLEND); } static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) @@ -479,6 +490,10 @@ float *nors= dm->getFaceDataArray(dm, CD_NORMAL); int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX); + /* for vertex color alpha channel */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + for(i = 0; i < dm->numFaceData; i++, mf++) { int drawSmooth = (mf->flag & ME_SMOOTH); @@ -517,28 +532,28 @@ glNormal3fv(nor); } - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glVertex3fv(mv[mf->v1].co); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glVertex3fv(mv[mf->v2].co); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9],cp[8]); glVertex3fv(mv[mf->v3].co); if(mf->v4) { - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glVertex3fv(mv[mf->v4].co); } } else { - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glNormal3sv(mv[mf->v1].no); glVertex3fv(mv[mf->v1].co); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glNormal3sv(mv[mf->v2].no); glVertex3fv(mv[mf->v2].co); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glNormal3sv(mv[mf->v3].no); glVertex3fv(mv[mf->v3].co); if(mf->v4) { - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glNormal3sv(mv[mf->v4].no); glVertex3fv(mv[mf->v4].co); } @@ -549,6 +564,7 @@ if (nors) nors += 3; } + glDisable(GL_BLEND); } static void cdDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData) Index: source/blender/blenkernel/intern/subsurf_ccg.c =================================================================== --- source/blender/blenkernel/intern/subsurf_ccg.c (revision 15559) +++ source/blender/blenkernel/intern/subsurf_ccg.c (working copy) @@ -1683,6 +1683,11 @@ } glShadeModel(GL_SMOOTH); + + /* for vertex color alpha channel */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + if(col1 && col2) glEnable(GL_CULL_FACE); @@ -1700,23 +1705,23 @@ float *c = faceGridData[(y+1)*gridSize + x + 1].co; float *d = faceGridData[(y+1)*gridSize + x].co; - glColor3ub(cp1[3], cp1[2], cp1[1]); + glColor4ub(cp1[3], cp1[2], cp1[1], cp1[0]); glVertex3fv(d); - glColor3ub(cp1[7], cp1[6], cp1[5]); + glColor4ub(cp1[7], cp1[6], cp1[5], cp1[4]); glVertex3fv(c); - glColor3ub(cp1[11], cp1[10], cp1[9]); + glColor4ub(cp1[11], cp1[10], cp1[9], cp1[8]); glVertex3fv(b); - glColor3ub(cp1[15], cp1[14], cp1[13]); + glColor4ub(cp1[15], cp1[14], cp1[13], cp1[12]); glVertex3fv(a); if (useTwoSide) { - glColor3ub(cp2[15], cp2[14], cp2[13]); + glColor4ub(cp2[15], cp2[14], cp2[13], cp2[12]); glVertex3fv(a); - glColor3ub(cp2[11], cp2[10], cp2[9]); + glColor4ub(cp2[11], cp2[10], cp2[9], cp2[8]); glVertex3fv(b); - glColor3ub(cp2[7], cp2[6], cp2[5]); + glColor4ub(cp2[7], cp2[6], cp2[5], cp2[4]); glVertex3fv(c); - glColor3ub(cp2[3], cp2[2], cp2[1]); + glColor4ub(cp2[3], cp2[2], cp2[1], cp2[0]); glVertex3fv(d); } @@ -1728,6 +1733,8 @@ } glEnd(); + glDisable(GL_BLEND); + ccgFaceIterator_free(fi); } @@ -1745,6 +1752,11 @@ int gridFaces = gridSize - 1; totface = ccgSubSurf_getNumFaces(ss); + + /* for vertex color alpha channel */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + for(i = 0; i < totface; i++) { CCGFace *f = ccgdm->faceMap[i].face; int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f); @@ -1792,12 +1804,12 @@ b = &faceGridData[(y+1)*gridSize + x]; if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glNormal3fv(a->no); glVertex3fv(a->co); if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glNormal3fv(b->no); glVertex3fv(b->co); @@ -1811,12 +1823,12 @@ b = &faceGridData[(y+1)*gridSize + x]; if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glNormal3fv(a->no); glVertex3fv(a->co); if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glNormal3fv(b->no); glVertex3fv(b->co); @@ -1838,19 +1850,19 @@ ccgDM_glNormalFast(a, b, c, d); if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glVertex3fv(d); if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glVertex3fv(c); if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glVertex3fv(b); if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glVertex3fv(a); if(tf) tf++; @@ -1861,6 +1873,7 @@ } } } + glDisable(GL_BLEND); } static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) Index: source/blender/blenkernel/intern/DerivedMesh.c =================================================================== --- source/blender/blenkernel/intern/DerivedMesh.c (revision 15559) +++ source/blender/blenkernel/intern/DerivedMesh.c (working copy) @@ -727,6 +727,10 @@ /* always use smooth shading even for flat faces, else vertex colors wont interpolate */ glShadeModel(GL_SMOOTH); + + /* for vertex color alpha channel */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (vertexCos) { EditVert *eve; @@ -764,41 +768,41 @@ glNormal3fv(emdm->faceNos[i]); if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glVertex3fv(vertexCos[(int) efa->v1->tmp.l]); if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glVertex3fv(vertexCos[(int) efa->v2->tmp.l]); if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glVertex3fv(vertexCos[(int) efa->v3->tmp.l]); if(efa->v4) { if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glVertex3fv(vertexCos[(int) efa->v4->tmp.l]); } } else { if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glNormal3fv(vertexNos[(int) efa->v1->tmp.l]); glVertex3fv(vertexCos[(int) efa->v1->tmp.l]); if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glNormal3fv(vertexNos[(int) efa->v2->tmp.l]); glVertex3fv(vertexCos[(int) efa->v2->tmp.l]); if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glNormal3fv(vertexNos[(int) efa->v3->tmp.l]); glVertex3fv(vertexCos[(int) efa->v3->tmp.l]); if(efa->v4) { if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glNormal3fv(vertexNos[(int) efa->v4->tmp.l]); glVertex3fv(vertexCos[(int) efa->v4->tmp.l]); } @@ -836,41 +840,41 @@ glNormal3fv(efa->n); if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glVertex3fv(efa->v1->co); if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glVertex3fv(efa->v2->co); if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glVertex3fv(efa->v3->co); if(efa->v4) { if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glVertex3fv(efa->v4->co); } } else { if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); + if(cp) glColor4ub(cp[3], cp[2], cp[1], cp[0]); glNormal3fv(efa->v1->no); glVertex3fv(efa->v1->co); if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); + if(cp) glColor4ub(cp[7], cp[6], cp[5], cp[4]); glNormal3fv(efa->v2->no); glVertex3fv(efa->v2->co); if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); + if(cp) glColor4ub(cp[11], cp[10], cp[9], cp[8]); glNormal3fv(efa->v3->no); glVertex3fv(efa->v3->co); if(efa->v4) { if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); + if(cp) glColor4ub(cp[15], cp[14], cp[13], cp[12]); glNormal3fv(efa->v4->no); glVertex3fv(efa->v4->co); } @@ -879,6 +883,7 @@ } } } + glDisable(GL_BLEND); } static void emDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) Index: source/blender/include/BSE_trans_types.h =================================================================== --- source/blender/include/BSE_trans_types.h (revision 15559) +++ source/blender/include/BSE_trans_types.h (working copy) @@ -74,7 +74,8 @@ } TransVert; typedef struct VPaint { - float r, g, b, a; + float r, g, b, alpha; + float a; /* amount of pressure */ float size; /* of brush */ float gamma, mul; short mode, flag; Index: source/blender/src/buttons_editing.c =================================================================== --- source/blender/src/buttons_editing.c (revision 15559) +++ source/blender/src/buttons_editing.c (working copy) @@ -6060,10 +6060,13 @@ uiDefButF(block, NUMSLI, B_NOP, "R ", 979,170,150,19, &Gvp.r, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of red used for painting"); uiDefButF(block, NUMSLI, B_NOP, "G ", 979,150,150,19, &Gvp.g, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of green used for painting"); uiDefButF(block, NUMSLI, B_NOP, "B ", 979,130,150,19, &Gvp.b, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of blue used for painting"); + uiBlockEndAlign(block); + + uiDefButF(block, NUMSLI, B_NOP, "A ", 979,105,150,19, &Gvp.alpha, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of alpha used for painting"); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 979,105,222,19, &Gvp.a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush"); - uiDefButF(block, NUMSLI, B_NOP, "Size ", 979,85,222,19, &Gvp.size, 2.0, 64.0, 0, 0, "The size of the brush"); + uiDefButF(block, NUMSLI, B_NOP, "Pressure ", 979,75,222,19, &Gvp.a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush"); + uiDefButF(block, NUMSLI, B_NOP, "Size ", 979,55,222,19, &Gvp.size, 2.0, 64.0, 0, 0, "The size of the brush"); uiBlockEndAlign(block); uiDefButF(block, COL, B_REDR, "", 1140,150,60,40, &(Gvp.r), 0, 0, 0, B_VPCOLSLI, ""); Index: source/blender/src/vpaint.c =================================================================== --- source/blender/src/vpaint.c (revision 15559) +++ source/blender/src/vpaint.c (working copy) @@ -110,8 +110,8 @@ #define MAXINDEX 512000 -VPaint Gvp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT+VP_SPRAY, 0}; -VPaint Gwp= {1.0, 1.0, 1.0, 1.0, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT, 0}; +VPaint Gvp= {1.0, 1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT+VP_SPRAY, 0}; +VPaint Gwp= {1.0, 1.0, 1.0, 1.0, 1.0, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT, 0}; static int *get_indexarray(void) { @@ -157,7 +157,7 @@ static unsigned int vpaint_get_current_col(VPaint *vp) { - return rgba_to_mcol(vp->r, vp->g, vp->b, 1.0f); + return rgba_to_mcol(vp->r, vp->g, vp->b, vp->alpha); } void do_shared_vertexcol(Mesh *me) @@ -532,6 +532,7 @@ Gvp.r= cp[0]/255.0f; Gvp.g= cp[1]/255.0f; Gvp.b= cp[2]/255.0f; + /* do not sample alpha channel? */ } else { Brush *brush= G.scene->toolsettings->imapaint.brush; @@ -540,6 +541,7 @@ brush->rgb[0]= cp[0]/255.0f; brush->rgb[1]= cp[1]/255.0f; brush->rgb[2]= cp[2]/255.0f; + /* do not sample alpha channel? */ allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWIMAGE, 0); @@ -565,7 +567,7 @@ cp2= (char *)&col2; cp= (char *)&col; - cp[0]= 255; + cp[0]= (mfac*cp1[0]+fac*cp2[0])>>8; /* mix alpha channels */ cp[1]= (mfac*cp1[1]+fac*cp2[1])/255; cp[2]= (mfac*cp1[2]+fac*cp2[2])/255; cp[3]= (mfac*cp1[3]+fac*cp2[3])/255; @@ -585,7 +587,7 @@ cp2= (char *)&col2; cp= (char *)&col; - cp[0]= 255; + cp[0]= cp1[0]; /* keep original alpha */ temp= cp1[1] + ((fac*cp2[1])/255); if(temp>254) cp[1]= 255; else cp[1]= temp; temp= cp1[2] + ((fac*cp2[2])/255); @@ -608,7 +610,7 @@ cp2= (char *)&col2; cp= (char *)&col; - cp[0]= 255; + cp[0]= cp1[0]; /* keep original alpha */ temp= cp1[1] - ((fac*cp2[1])/255); if(temp<0) cp[1]= 0; else cp[1]= temp; temp= cp1[2] - ((fac*cp2[2])/255); @@ -634,7 +636,7 @@ cp= (char *)&col; /* first mul, then blend the fac */ - cp[0]= 255; + cp[0]= cp1[0]; /* keep original alpha */ cp[1]= (mfac*cp1[1] + fac*((cp2[1]*cp1[1])/255) )/255; cp[2]= (mfac*cp1[2] + fac*((cp2[2]*cp1[2])/255) )/255; cp[3]= (mfac*cp1[3] + fac*((cp2[3]*cp1[3])/255) )/255; @@ -663,7 +665,7 @@ if (cp1[1]+cp1[2]+cp1[3] > cp2[1]+cp2[2]+cp2[3]) return col1; - cp[0]= 255; + cp[0]= cp1[0]; /* keep original alpha */ cp[1]= (mfac*cp1[1]+fac*cp2[1])/255; cp[2]= (mfac*cp1[2]+fac*cp2[2])/255; cp[3]= (mfac*cp1[3]+fac*cp2[3])/255; @@ -691,7 +693,7 @@ if (cp1[1]+cp1[2]+cp1[3] < cp2[1]+cp2[2]+cp2[3]) return col1; - cp[0]= 255; + cp[0]= cp1[0]; /* keep original alpha */ cp[1]= (mfac*cp1[1]+fac*cp2[1])/255; cp[2]= (mfac*cp1[2]+fac*cp2[2])/255; cp[3]= (mfac*cp1[3]+fac*cp2[3])/255;