void TaskbarPreview::DrawBitmap(PRUint32 width, PRUint32 height, PRBool isPreview) { nsresult rv; nsRefPtr<gfxWindowsSurface> surface = new gfxWindowsSurface(gfxIntSize(width, height), gfxASurface::ImageFormatARGB32); nsCOMPtr<nsIDocShell> shell = do_QueryReferent(mDocShell); if (!shell) return; rv = GetRenderingContext(shell, surface, width, height); if (NS_FAILED(rv)) return; PRBool drawFrame = PR_FALSE; if (isPreview) rv = mController->DrawPreview(gCtx, &drawFrame); else rv = mController->DrawThumbnail(gCtx, width, height, &drawFrame); if (NS_FAILED(rv)) return; HDC hDC = surface->GetDC(); HBITMAP hBitmap = (HBITMAP)GetCurrentObject(hDC, OBJ_BITMAP); DWORD flags = drawFrame ? DWM_SIT_DISPLAYFRAME : 0; POINT pptClient = { 0, 0 }; if (isPreview) nsUXThemeData::dwmSetIconicLivePreviewBitmapPtr(PreviewWindow(), hBitmap, &pptClient, flags); else nsUXThemeData::dwmSetIconicThumbnailPtr(PreviewWindow(), hBitmap, flags); ResetRenderingContext(); }
nsresult TaskbarPreview::UpdateTooltip() { NS_ASSERTION(CanMakeTaskbarCalls() && mVisible, "UpdateTooltip called on invisible tab preview"); if (FAILED(mTaskbar->SetThumbnailTooltip(PreviewWindow(), mTooltip.get()))) return NS_ERROR_FAILURE; return NS_OK; }
NS_IMETHODIMP TaskbarPreview::Invalidate() { if (!mVisible) return NS_ERROR_FAILURE; // DWM Composition is required for previews if (!nsUXThemeData::CheckForCompositor()) return NS_OK; HWND previewWindow = PreviewWindow(); return FAILED(nsUXThemeData::dwmInvalidateIconicBitmapsPtr(previewWindow)) ? NS_ERROR_FAILURE : NS_OK; }
LRESULT TaskbarPreview::WndProc(UINT nMsg, WPARAM wParam, LPARAM lParam) { switch (nMsg) { case WM_DWMSENDICONICTHUMBNAIL: { uint32_t width = HIWORD(lParam); uint32_t height = LOWORD(lParam); float aspectRatio = width/float(height); nsresult rv; float preferredAspectRatio; rv = mController->GetThumbnailAspectRatio(&preferredAspectRatio); if (NS_FAILED(rv)) break; uint32_t thumbnailWidth = width; uint32_t thumbnailHeight = height; if (aspectRatio > preferredAspectRatio) { thumbnailWidth = uint32_t(thumbnailHeight * preferredAspectRatio); } else { thumbnailHeight = uint32_t(thumbnailWidth / preferredAspectRatio); } DrawBitmap(thumbnailWidth, thumbnailHeight, false); } break; case WM_DWMSENDICONICLIVEPREVIEWBITMAP: { uint32_t width, height; nsresult rv; rv = mController->GetWidth(&width); if (NS_FAILED(rv)) break; rv = mController->GetHeight(&height); if (NS_FAILED(rv)) break; double scale = nsIWidget::DefaultScaleOverride(); if (scale <= 0.0) scale = gfxWindowsPlatform::GetPlatform()->GetDPIScale(); DrawBitmap(NSToIntRound(scale * width), NSToIntRound(scale * height), true); } break; } return ::DefWindowProcW(PreviewWindow(), nMsg, wParam, lParam); }
LRESULT TaskbarPreview::WndProc(UINT nMsg, WPARAM wParam, LPARAM lParam) { switch (nMsg) { case WM_DWMSENDICONICTHUMBNAIL: { PRUint32 width = HIWORD(lParam); PRUint32 height = LOWORD(lParam); float aspectRatio = width/float(height); nsresult rv; float preferredAspectRatio; rv = mController->GetThumbnailAspectRatio(&preferredAspectRatio); if (NS_FAILED(rv)) break; PRUint32 thumbnailWidth = width; PRUint32 thumbnailHeight = height; if (aspectRatio > preferredAspectRatio) { thumbnailWidth = PRUint32(thumbnailHeight * preferredAspectRatio); } else { thumbnailHeight = PRUint32(thumbnailWidth / preferredAspectRatio); } DrawBitmap(thumbnailWidth, thumbnailHeight, PR_FALSE); } break; case WM_DWMSENDICONICLIVEPREVIEWBITMAP: { PRUint32 width, height; nsresult rv; rv = mController->GetWidth(&width); if (NS_FAILED(rv)) break; rv = mController->GetHeight(&height); if (NS_FAILED(rv)) break; DrawBitmap(width, height, PR_TRUE); } break; } return ::DefWindowProcW(PreviewWindow(), nMsg, wParam, lParam); }