18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DragImage.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedImage.h" 302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Font.h" 312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FontDescription.h" 322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FontSelector.h" 332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Frame.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RetainPtr.h" 372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Settings.h" 382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "StringTruncator.h" 392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "TextRun.h" 402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WebCoreTextRenderer.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <windows.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 462fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHBITMAP allocImage(HDC, IntSize, PlatformGraphicsContext** targetRef); 472fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid deallocContext(PlatformGraphicsContext* target); 482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntSize dragImageSize(DragImageRef image) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!image) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntSize(); 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BITMAP b; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetObject(image, sizeof(BITMAP), &b); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntSize(b.bmWidth, b.bmHeight); 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid deleteDragImage(DragImageRef image) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (image) 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::DeleteObject(image); 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDragImageRef dissolveDragImageToFraction(DragImageRef image, float) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //We don't do this on windows as the dragimage is blended by the OS 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return image; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochDragImageRef createDragImageIconForCachedImage(CachedImage* image) 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!image) 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String filename = image->response().suggestedFilename(); 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch SHFILEINFO shfi = {0}; 780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (FAILED(SHGetFileInfo(static_cast<LPCWSTR>(filename.charactersWithNullTermination()), FILE_ATTRIBUTE_NORMAL, 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))) 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ICONINFO iconInfo; 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!GetIconInfo(shfi.hIcon, &iconInfo)) { 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch DestroyIcon(shfi.hIcon); 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch DestroyIcon(shfi.hIcon); 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch DeleteObject(iconInfo.hbmMask); 900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return iconInfo.hbmColor; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 942fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float DragLabelBorderX = 4; 952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// Keep border_y in synch with DragController::LinkDragBorderInset. 962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float DragLabelBorderY = 2; 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float DragLabelRadius = 5; 982fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float LabelBorderYOffset = 2; 992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float MinDragLabelWidthBeforeClip = 120; 1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float MaxDragLabelWidth = 200; 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float MaxDragLabelStringWidth = (MaxDragLabelWidth - 2 * DragLabelBorderX); 1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float DragLinkLabelFontsize = 11; 1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst float DragLinkUrlFontSize = 10; 1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic Font dragLabelFont(int size, bool bold, FontRenderingMode renderingMode) 1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NONCLIENTMETRICS metrics; 1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block metrics.cbSize = sizeof(metrics); 1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); 1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block FontDescription description; 1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block description.setWeight(bold ? FontWeightBold : FontWeightNormal); 1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block FontFamily family; 1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block family.setFamily(metrics.lfSmCaptionFont.lfFaceName); 1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block description.setFamily(family); 1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block description.setSpecifiedSize((float)size); 1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block description.setComputedSize((float)size); 1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block description.setRenderingMode(renderingMode); 1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Font result = Font(description, 0, 0); 1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block result.update(0); 1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return result; 1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1272fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockDragImageRef createDragImageForLink(KURL& url, const String& inLabel, Frame* frame) 1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // This is more or less an exact match for the Mac OS X code. 1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const Font* labelFont; 1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const Font* urlFont; 1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (frame->settings() && frame->settings()->fontRenderingMode() == AlternateRenderingMode) { 1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Font alternateRenderingModeLabelFont = dragLabelFont(DragLinkLabelFontsize, true, AlternateRenderingMode); 1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Font alternateRenderingModeURLFont = dragLabelFont(DragLinkUrlFontSize, false, AlternateRenderingMode); 1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block labelFont = &alternateRenderingModeLabelFont; 1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block urlFont = &alternateRenderingModeURLFont; 1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } else { 1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Font normalRenderingModeLabelFont = dragLabelFont(DragLinkLabelFontsize, true, NormalRenderingMode); 1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Font normalRenderingModeURLFont = dragLabelFont(DragLinkUrlFontSize, false, NormalRenderingMode); 1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block labelFont = &normalRenderingModeLabelFont; 1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block urlFont = &normalRenderingModeURLFont; 1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool drawURLString = true; 1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool clipURLString = false; 1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool clipLabelString = false; 1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String urlString = url.string(); 1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String label = inLabel; 1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (label.isEmpty()) { 1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block drawURLString = false; 1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block label = urlString; 1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // First step in drawing the link drag image width. 1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block TextRun labelRun(label.impl()); 1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block TextRun urlRun(urlString.impl()); 1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntSize labelSize(labelFont->width(labelRun), labelFont->fontMetrics().ascent() + labelFont->fontMetrics().descent()); 1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (labelSize.width() > MaxDragLabelStringWidth) { 1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block labelSize.setWidth(MaxDragLabelStringWidth); 1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block clipLabelString = true; 1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntSize urlStringSize; 1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntSize imageSize(labelSize.width() + DragLabelBorderX * 2, labelSize.height() + DragLabelBorderY * 2); 1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (drawURLString) { 1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block urlStringSize.setWidth(urlFont->width(urlRun)); 1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block urlStringSize.setHeight(urlFont->fontMetrics().ascent() + urlFont->fontMetrics().descent()); 1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block imageSize.setHeight(imageSize.height() + urlStringSize.height()); 1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (urlStringSize.width() > MaxDragLabelStringWidth) { 1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block imageSize.setWidth(MaxDragLabelWidth); 1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block clipURLString = true; 1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } else 1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block imageSize.setWidth(std::max(labelSize.width(), urlStringSize.width()) + DragLabelBorderX * 2); 1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // We now know how big the image needs to be, so we create and 1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // fill the background 1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HBITMAP image = 0; 1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HDC dc = GetDC(0); 1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HDC workingDC = CreateCompatibleDC(dc); 1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!workingDC) { 1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ReleaseDC(0, dc); 1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block PlatformGraphicsContext* contextRef; 1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block image = allocImage(workingDC, imageSize, &contextRef); 1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!image) { 1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DeleteDC(workingDC); 1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ReleaseDC(0, dc); 1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block SelectObject(workingDC, image); 2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block GraphicsContext context(contextRef); 2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // On Mac alpha is {0.7, 0.7, 0.7, 0.8}, however we can't control alpha 2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // for drag images on win, so we use 1 2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Color backgroundColor(140, 140, 140); 2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const IntSize radii(DragLabelRadius, DragLabelRadius); 2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntRect rect(0, 0, imageSize.width(), imageSize.height()); 2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block context.fillRoundedRect(rect, radii, radii, radii, radii, backgroundColor, ColorSpaceDeviceRGB); 2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Draw the text 2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Color topColor(0, 0, 0, 255); // original alpha = 0.75 2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const Color bottomColor(255, 255, 255, 127); // original alpha = 0.5 2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (drawURLString) { 2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (clipURLString) 21381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch urlString = StringTruncator::rightTruncate(urlString, imageSize.width() - (DragLabelBorderX * 2.0f), *urlFont); 2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntPoint textPos(DragLabelBorderX, imageSize.height() - (LabelBorderYOffset + urlFont->fontMetrics().descent())); 2152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebCoreDrawDoubledTextAtPoint(context, urlString, textPos, *urlFont, topColor, bottomColor); 2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (clipLabelString) 21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch label = StringTruncator::rightTruncate(label, imageSize.width() - (DragLabelBorderX * 2.0f), *labelFont); 2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block IntPoint textPos(DragLabelBorderX, DragLabelBorderY + labelFont->pixelSize()); 2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebCoreDrawDoubledTextAtPoint(context, label, textPos, *labelFont, topColor, bottomColor); 2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block deallocContext(contextRef); 2252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DeleteDC(workingDC); 2262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ReleaseDC(0, dc); 2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return image; 2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 231