INT_PTR DrawAvatarPicture(WPARAM wParam, LPARAM lParam) { AVATARDRAWREQUEST *r = (AVATARDRAWREQUEST *)lParam; AVATARCACHEENTRY *ace = NULL; if (fei == NULL || r == NULL || IsBadReadPtr((void *)r, sizeof(AVATARDRAWREQUEST))) return 0; if (r->cbSize != sizeof(AVATARDRAWREQUEST)) return 0; if (r->dwFlags & AVDRQ_PROTOPICT) { if (r->szProto == NULL) return 0; for (int i = 0; i < g_ProtoPictures.getCount(); i++) { protoPicCacheEntry& p = g_ProtoPictures[i]; if ( !lstrcmpA(p.szProtoname, r->szProto) && lstrlenA(r->szProto) == lstrlenA(p.szProtoname) && p.hbmPic != 0) { ace = (AVATARCACHEENTRY *)&g_ProtoPictures[i]; break; } } } else if (r->dwFlags & AVDRQ_OWNPIC) { if (r->szProto == NULL) return 0; if (r->szProto[0] == '\0' && db_get_b(NULL, AVS_MODULE, "GlobalUserAvatarNotConsistent", 1)) return -1; ace = (AVATARCACHEENTRY *)GetMyAvatar(0, (LPARAM)r->szProto); } else ace = (AVATARCACHEENTRY *)GetAvatarBitmap((WPARAM)r->hContact, 0); if (ace && (!(r->dwFlags & AVDRQ_RESPECTHIDDEN) || !(ace->dwFlags & AVS_HIDEONCLIST))) { ace->t_lastAccess = time(NULL); if (ace->bmHeight == 0 || ace->bmWidth == 0 || ace->hbmPic == 0) return 0; InternalDrawAvatar(r, ace->hbmPic, ace->bmWidth, ace->bmHeight, ace->dwFlags); return 1; } return 0; }
void StartAnimatedGif(HWND hwnd, ACCData* data) { if (fei == NULL) return; int x, y; AVATARCACHEENTRY *ace = NULL; if (data->hContact != NULL) ace = (AVATARCACHEENTRY *) GetAvatarBitmap((WPARAM) data->hContact, 0); else ace = (AVATARCACHEENTRY *) GetMyAvatar(0, (LPARAM) data->proto); if (ace == NULL) return; int format = ProtoGetAvatarFormat(ace->szFilename); if (format != PA_FORMAT_GIF) return; FREE_IMAGE_FORMAT fif = fei->FI_GetFileTypeT(ace->szFilename, 0); if (fif == FIF_UNKNOWN) fif = fei->FI_GetFIFFromFilenameT(ace->szFilename); data->ag.multi = fei->FI_OpenMultiBitmapT(fif, ace->szFilename, FALSE, TRUE, FALSE, GIF_LOAD256); if (data->ag.multi == NULL) return; data->ag.frameCount = fei->FI_GetPageCount(data->ag.multi); if (data->ag.frameCount <= 1) goto ERR; if (!AnimatedGifGetData(data)) goto ERR; //allocate entire logical area data->ag.dib = fei->FI_Allocate(data->ag.logicalWidth, data->ag.logicalHeight, 32, 0, 0, 0); if (data->ag.dib == NULL) goto ERR; //fill with background color to start for (y = 0; y < data->ag.logicalHeight; y++) { RGBQUAD *scanline = (RGBQUAD *) fei->FI_GetScanLine(data->ag.dib, y); for (x = 0; x < data->ag.logicalWidth; x++) *scanline++ = data->ag.background; } data->ag.hbms = (HBITMAP *) malloc(sizeof(HBITMAP) * data->ag.frameCount); memset(data->ag.hbms, 0, sizeof(HBITMAP) * data->ag.frameCount); data->ag.times = (int *) malloc(sizeof(int) * data->ag.frameCount); memset(data->ag.times, 0, sizeof(int) * data->ag.frameCount); AnimatedGifMountFrame(data, 0); data->showingAnimatedGif = TRUE; return; ERR: fei->FI_CloseMultiBitmap(data->ag.multi, 0); data->ag.multi = NULL; }