DragImageRef scaleDragImage(DragImageRef image, FloatSize scale) { // FIXME: due to the way drag images are done on windows we need // to preprocess the alpha channel <rdar://problem/5015946> if (!image) return 0; CGContextRef targetContext; CGContextRef srcContext; CGImageRef srcImage; IntSize srcSize = dragImageSize(image); IntSize dstSize(static_cast<int>(srcSize.width() * scale.width()), static_cast<int>(srcSize.height() * scale.height())); HBITMAP hbmp = 0; HDC dc = GetDC(0); HDC dstDC = CreateCompatibleDC(dc); if (!dstDC) goto exit; hbmp = allocImage(dstDC, dstSize, &targetContext); if (!hbmp) goto exit; srcContext = createCgContextFromBitmap(image); srcImage = CGBitmapContextCreateImage(srcContext); CGRect rect; rect.origin.x = 0; rect.origin.y = 0; rect.size = dstSize; CGContextDrawImage(targetContext, rect, srcImage); CGImageRelease(srcImage); CGContextRelease(srcContext); CGContextRelease(targetContext); ::DeleteObject(image); image = 0; exit: if (!hbmp) hbmp = image; if (dstDC) DeleteDC(dstDC); ReleaseDC(0, dc); return hbmp; }
DragImageRef scaleDragImage(DragImageRef imageRef, FloatSize scale) { // FIXME: due to the way drag images are done on windows we need // to preprocess the alpha channel <rdar://problem/5015946> if (!imageRef) return 0; GDIObject<HBITMAP> hbmp; auto image = adoptGDIObject(imageRef); IntSize srcSize = dragImageSize(image.get()); IntSize dstSize(static_cast<int>(srcSize.width() * scale.width()), static_cast<int>(srcSize.height() * scale.height())); HWndDC dc(0); auto dstDC = adoptGDIObject(::CreateCompatibleDC(dc)); if (!dstDC) goto exit; CGContextRef targetContext; hbmp = allocImage(dstDC.get(), dstSize, &targetContext); if (!hbmp) goto exit; CGContextRef srcContext = createCgContextFromBitmap(image.get()); CGImageRef srcImage = CGBitmapContextCreateImage(srcContext); CGRect rect; rect.origin.x = 0; rect.origin.y = 0; rect.size = dstSize; CGContextDrawImage(targetContext, rect, srcImage); CGImageRelease(srcImage); CGContextRelease(srcContext); CGContextRelease(targetContext); exit: if (!hbmp) hbmp.swap(image); return hbmp.leak(); }