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