void Cache_GetAvatar(struct ClcData *dat, struct ClcContact *contact) { if (dat->use_avatar_service) { if (dat->avatars_show && !DBGetContactSettingByte(contact->hContact, "CList", "HideContactAvatar", 0)) { contact->avatar_data = (struct avatarCacheEntry *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)contact->hContact, 0); if (contact->avatar_data == NULL || contact->avatar_data->cbSize != sizeof(struct avatarCacheEntry) || contact->avatar_data->dwFlags == AVS_BITMAP_EXPIRED) { contact->avatar_data = NULL; } if (contact->avatar_data != NULL) contact->avatar_data->t_lastAccess = time(NULL); } else { contact->avatar_data = NULL; } } else { int old_pos = contact->avatar_pos; contact->avatar_pos = AVATAR_POS_DONT_HAVE; if (dat->avatars_show && !DBGetContactSettingByte(contact->hContact, "CList", "HideContactAvatar", 0)) { DBVARIANT dbv; if (!DBGetContactSetting(contact->hContact, "ContactPhoto", "File", &dbv) && (dbv.type == DBVT_ASCIIZ || dbv.type == DBVT_UTF8)) { HBITMAP hBmp = (HBITMAP) CallService(MS_UTILS_LOADBITMAP, 0, (LPARAM)dbv.pszVal); if (hBmp != NULL) { // Make bounds BITMAP bm; if (GetObject(hBmp,sizeof(BITMAP),&bm)) { // Create data... HDC hdc; HBITMAP hDrawBmp,oldBmp; // Make bounds -> keep aspect radio LONG width_clip; LONG height_clip; RECT rc = {0}; // Clipping width and height width_clip = dat->avatars_size; height_clip = dat->avatars_size; if (height_clip * bm.bmWidth / bm.bmHeight <= width_clip) { width_clip = height_clip * bm.bmWidth / bm.bmHeight; } else { height_clip = width_clip * bm.bmHeight / bm.bmWidth; } // Create objs hdc = CreateCompatibleDC(dat->avatar_cache.hdc); hDrawBmp = CreateBitmap32(width_clip, height_clip); oldBmp=SelectObject(hdc, hDrawBmp); SetBkMode(hdc,TRANSPARENT); { POINT org; GetBrushOrgEx(hdc, &org); SetStretchBltMode(hdc, HALFTONE); SetBrushOrgEx(hdc, org.x, org.y, NULL); } rc.right = width_clip - 1; rc.bottom = height_clip - 1; // Draw bitmap 8//8 { HDC dcMem = CreateCompatibleDC(hdc); HBITMAP obmp=SelectObject(dcMem, hBmp); StretchBlt(hdc, 0, 0, width_clip, height_clip,dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); SelectObject(dcMem,obmp); DeleteDC(dcMem); } { RECT rtr={0}; rtr.right=width_clip+1; rtr.bottom=height_clip+1; FillRect255Alpha(hdc,&rtr); } hDrawBmp = GetCurrentObject(hdc, OBJ_BITMAP); SelectObject(hdc,oldBmp); DeleteDC(hdc); // Add to list if (old_pos >= 0) { ImageArray_ChangeImage(&dat->avatar_cache, hDrawBmp, old_pos); contact->avatar_pos = old_pos; } else { contact->avatar_pos = ImageArray_AddImage(&dat->avatar_cache, hDrawBmp, -1); } DeleteObject(hDrawBmp); } // if (GetObject(hBmp,sizeof(BITMAP),&bm)) DeleteObject(hBmp); } //if (hBmp != NULL) } DBFreeVariant(&dbv); } // Remove avatar if needed if (old_pos >= 0 && contact->avatar_pos == AVATAR_POS_DONT_HAVE) { ImageArray_RemoveImage(&dat->avatar_cache, old_pos); // Update all itens ExecuteOnAllContacts(dat, ReduceAvatarPosition, (void *)&old_pos); } } }
void Cache_GetAvatar(struct ClcData *dat, struct ClcContact *contact) { int old_pos=contact->avatar_pos; if (g_CluiData.bSTATE!=STATE_NORMAL || (dat->use_avatar_service && !ServiceExists(MS_AV_GETAVATARBITMAP)) ) // workaround for avatar service and other wich destroys service on OK_TOEXIT { contact->avatar_pos = AVATAR_POS_DONT_HAVE; contact->avatar_data = NULL; return; } if (dat->use_avatar_service && ServiceExists(MS_AV_GETAVATARBITMAP)) { if (dat->avatars_show && !ModernGetSettingByte(contact->hContact, "CList", "HideContactAvatar", 0)) { contact->avatar_data = (struct avatarCacheEntry *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)contact->hContact, 0); if (contact->avatar_data == NULL || contact->avatar_data->cbSize != sizeof(struct avatarCacheEntry) || contact->avatar_data->dwFlags == AVS_BITMAP_EXPIRED) { contact->avatar_data = NULL; } if (contact->avatar_data != NULL) { contact->avatar_data->t_lastAccess = (DWORD)time(NULL); } } else { contact->avatar_data = NULL; } Cache_ProceedAvatarInList(dat, contact); } else { contact->avatar_pos = AVATAR_POS_DONT_HAVE; if (dat->avatars_show && !ModernGetSettingByte(contact->hContact, "CList", "HideContactAvatar", 0)) { DBVARIANT dbv; if (!ModernGetSettingTString(contact->hContact, "ContactPhoto", "File", &dbv)) { HBITMAP hBmp = (HBITMAP) CallService(MS_UTILS_LOADBITMAPT, 0, (LPARAM)dbv.ptszVal); if (hBmp != NULL) { // Make bounds BITMAP bm; if (GetObject(hBmp,sizeof(BITMAP),&bm)) { // Create data... HDC hdc; HBITMAP hDrawBmp,oldBmp; // Make bounds -> keep aspect radio LONG width_clip; LONG height_clip; RECT rc = {0}; // Clipping width and height width_clip = dat->avatars_maxheight_size; height_clip = dat->avatars_maxheight_size; if (height_clip * bm.bmWidth / bm.bmHeight <= width_clip) { width_clip = height_clip * bm.bmWidth / bm.bmHeight; } else { height_clip = width_clip * bm.bmHeight / bm.bmWidth; } // Create objs hdc = CreateCompatibleDC(dat->avatar_cache.hdc); hDrawBmp = ske_CreateDIB32(width_clip, height_clip); oldBmp=(HBITMAP)SelectObject(hdc, hDrawBmp); SetBkMode(hdc,TRANSPARENT); { POINT org; GetBrushOrgEx(hdc, &org); SetStretchBltMode(hdc, HALFTONE); SetBrushOrgEx(hdc, org.x, org.y, NULL); } rc.right = width_clip - 1; rc.bottom = height_clip - 1; // Draw bitmap 8//8 { HDC dcMem = CreateCompatibleDC(hdc); HBITMAP obmp=(HBITMAP)SelectObject(dcMem, hBmp); StretchBlt(hdc, 0, 0, width_clip, height_clip,dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); SelectObject(dcMem,obmp); mod_DeleteDC(dcMem); } { RECT rtr={0}; rtr.right=width_clip+1; rtr.bottom=height_clip+1; ske_SetRectOpaque(hdc,&rtr); } hDrawBmp = (HBITMAP)GetCurrentObject(hdc, OBJ_BITMAP); SelectObject(hdc,oldBmp); mod_DeleteDC(hdc); // Add to list if (old_pos >= 0) { ImageArray_ChangeImage(&dat->avatar_cache, hDrawBmp, old_pos); contact->avatar_pos = old_pos; } else { contact->avatar_pos = ImageArray_AddImage(&dat->avatar_cache, hDrawBmp, -1); } DeleteObject(hDrawBmp); } // if (GetObject(hBmp,sizeof(BITMAP),&bm)) DeleteObject(hBmp); } //if (hBmp != NULL) } ModernDBFreeVariant(&dbv); } // Remove avatar if needed if (old_pos >= 0 && contact->avatar_pos == AVATAR_POS_DONT_HAVE) { ImageArray_RemoveImage(&dat->avatar_cache, old_pos); // Update all items ExecuteOnAllContacts(dat, ReduceAvatarPosition, (void *)&old_pos); } if (old_pos==AVATAR_POS_ANIMATED && contact->avatar_pos != AVATAR_POS_ANIMATED) { AniAva_RemoveAvatar( contact->hContact ); } } }
void Cache_ProceedAvatarInList(ClcData *dat, ClcContact *contact) { avatarCacheEntry * ace = contact->avatar_data; int old_pos = contact->avatar_pos; if (ace == NULL || ace->dwFlags == AVS_BITMAP_EXPIRED || ace->hbmPic == NULL) { // Avatar was not ready or removed - need to remove it from cache if (old_pos >= 0) { ImageArray_RemoveImage(&dat->avatar_cache, old_pos); // Update all items ExecuteOnAllContacts(dat, ReduceAvatarPosition, (void *)&old_pos); contact->avatar_pos = AVATAR_POS_DONT_HAVE; return; } } else if (contact->avatar_data->hbmPic != NULL) //Lets Add it { // Clipping width and height LONG width_clip = dat->avatars_maxwidth_size ? dat->avatars_maxwidth_size : dat->avatars_maxheight_size; LONG height_clip = dat->avatars_maxheight_size; if (height_clip * ace->bmWidth / ace->bmHeight <= width_clip) width_clip = height_clip * ace->bmWidth / ace->bmHeight; else height_clip = width_clip * ace->bmHeight / ace->bmWidth; if (wildcmpit(contact->avatar_data->szFilename, _T("*.gif"))) { if (old_pos == AVATAR_POS_ANIMATED) AniAva_RemoveAvatar(contact->hContact); int res = AniAva_AddAvatar(contact->hContact, contact->avatar_data->szFilename, width_clip, height_clip); if (res) { contact->avatar_pos = AVATAR_POS_ANIMATED; contact->avatar_size.cy = HIWORD(res); contact->avatar_size.cx = LOWORD(res); return; } } // Create objs void * pt; HDC hdc = CreateCompatibleDC(dat->avatar_cache.hdc); HBITMAP hDrawBmp = ske_CreateDIB32Point(width_clip, height_clip, &pt); HBITMAP oldBmp = (HBITMAP)SelectObject(hdc, hDrawBmp); // need to draw avatar bitmap here DrawAvatarImageWithGDIp(hdc, 0, 0, width_clip, height_clip, ace->hbmPic, 0, 0, ace->bmWidth, ace->bmHeight, ace->dwFlags, 255); SelectObject(hdc, oldBmp); DeleteDC(hdc); // Add to list if (old_pos >= 0) { ImageArray_ChangeImage(&dat->avatar_cache, hDrawBmp, old_pos); contact->avatar_pos = old_pos; } else contact->avatar_pos = ImageArray_AddImage(&dat->avatar_cache, hDrawBmp, -1); if (old_pos == AVATAR_POS_ANIMATED && contact->avatar_pos != AVATAR_POS_ANIMATED) AniAva_RemoveAvatar(contact->hContact); DeleteObject(hDrawBmp); } }
void Cache_ProceedAvatarInList(struct ClcData *dat, struct ClcContact *contact) { struct avatarCacheEntry * ace=contact->avatar_data; int old_pos=contact->avatar_pos; if ( ace==NULL || ace->dwFlags == AVS_BITMAP_EXPIRED || ace->hbmPic == NULL) { //Avatar was not ready or removed - need to remove it from cache if (old_pos>=0) { ImageArray_RemoveImage(&dat->avatar_cache, old_pos); // Update all items ExecuteOnAllContacts(dat, ReduceAvatarPosition, (void *)&old_pos); contact->avatar_pos=AVATAR_POS_DONT_HAVE; return; } } else if (contact->avatar_data->hbmPic != NULL) //Lets Add it { HDC hdc; HBITMAP hDrawBmp,oldBmp; void * pt; // Make bounds -> keep aspect radio LONG width_clip; LONG height_clip; RECT rc = {0}; // Clipping width and height width_clip = dat->avatars_maxwidth_size?dat->avatars_maxwidth_size:dat->avatars_maxheight_size; height_clip = dat->avatars_maxheight_size; if (height_clip * ace->bmWidth / ace->bmHeight <= width_clip) { width_clip = height_clip * ace->bmWidth / ace->bmHeight; } else { height_clip = width_clip * ace->bmHeight / ace->bmWidth; } if (wildcmpi(contact->avatar_data->szFilename,_T("*.gif"))) { int res; if (old_pos==AVATAR_POS_ANIMATED) AniAva_RemoveAvatar(contact->hContact); res=AniAva_AddAvatar(contact->hContact, contact->avatar_data->szFilename, width_clip, height_clip); if (res) { contact->avatar_pos=AVATAR_POS_ANIMATED; contact->avatar_size.cy=HIWORD(res); contact->avatar_size.cx=LOWORD(res); return; } } // Create objs hdc = CreateCompatibleDC(dat->avatar_cache.hdc); hDrawBmp = ske_CreateDIB32Point(width_clip, height_clip,&pt); oldBmp=(HBITMAP)SelectObject(hdc, hDrawBmp); //need to draw avatar bitmap here { RECT real_rc={0,0,width_clip, height_clip}; /* if (ServiceExists(MS_AV_BLENDDRAWAVATAR)) { AVATARDRAWREQUEST adr; adr.cbSize = sizeof(AVATARDRAWREQUEST); adr.hContact = contact->hContact; adr.hTargetDC = hdc; adr.rcDraw = real_rc; adr.dwFlags = 0; adr.alpha = 255; CallService(MS_AV_BLENDDRAWAVATAR, 0, (LPARAM) &adr); } else */ { int w=width_clip; int h=height_clip; if (!g_CluiData.fGDIPlusFail) //Use gdi+ engine { DrawAvatarImageWithGDIp(hdc, 0, 0, w, h,ace->hbmPic,0,0,ace->bmWidth,ace->bmHeight,ace->dwFlags,255); } else { if (!(ace->dwFlags&AVS_PREMULTIPLIED)) { HDC hdcTmp = CreateCompatibleDC(hdc); RECT r={0,0,w,h}; HDC hdcTmp2 = CreateCompatibleDC(hdc); HBITMAP bmo=(HBITMAP)SelectObject(hdcTmp,ace->hbmPic); HBITMAP b2=ske_CreateDIB32(w,h); HBITMAP bmo2=(HBITMAP)SelectObject(hdcTmp2,b2); SetStretchBltMode(hdcTmp, HALFTONE); SetStretchBltMode(hdcTmp2, HALFTONE); StretchBlt(hdcTmp2, 0, 0, w, h, hdcTmp, 0, 0, ace->bmWidth, ace->bmHeight, SRCCOPY); ske_SetRectOpaque(hdcTmp2,&r); BitBlt(hdc, rc.left, rc.top, w, h,hdcTmp2,0,0,SRCCOPY); SelectObject(hdcTmp2,bmo2); SelectObject(hdcTmp,bmo); mod_DeleteDC(hdcTmp); mod_DeleteDC(hdcTmp2); DeleteObject(b2); } else { BLENDFUNCTION bf={AC_SRC_OVER, 0,255, AC_SRC_ALPHA }; HDC hdcTempAv = CreateCompatibleDC(hdc); HBITMAP hbmTempAvOld; hbmTempAvOld = (HBITMAP)SelectObject(hdcTempAv,ace->hbmPic); ske_AlphaBlend(hdc, rc.left, rc.top, w, h, hdcTempAv, 0, 0,ace->bmWidth,ace->bmHeight, bf); SelectObject(hdcTempAv, hbmTempAvOld); mod_DeleteDC(hdcTempAv); } } } } SelectObject(hdc,oldBmp); DeleteDC(hdc); // Add to list if (old_pos >= 0) { ImageArray_ChangeImage(&dat->avatar_cache, hDrawBmp, old_pos); contact->avatar_pos = old_pos; } else { contact->avatar_pos = ImageArray_AddImage(&dat->avatar_cache, hDrawBmp, -1); } if (old_pos==AVATAR_POS_ANIMATED && contact->avatar_pos!=AVATAR_POS_ANIMATED) { AniAva_RemoveAvatar(contact->hContact); } DeleteObject(hDrawBmp); } }