1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "DragImage.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Image.h"
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "NativeImageSkia.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "NotImplemented.h"
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RefPtr.h"
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SkBitmap.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "skia/ext/image_operations.h"
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntSize dragImageSize(DragImageRef image)
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!image)
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return IntSize();
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return IntSize(image->width(), image->height());
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid deleteDragImage(DragImageRef image)
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete image;
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectDragImageRef scaleDragImage(DragImageRef image, FloatSize scale)
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!image)
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int imageWidth = scale.width() * image->width();
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int imageHeight = scale.height() * image->height();
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DragImageRef scaledImage = new SkBitmap(
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        skia::ImageOperations::Resize(*image, skia::ImageOperations::RESIZE_LANCZOS3,
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                      imageWidth, imageHeight));
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete image;
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return scaledImage;
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7121939df44de1705786c545cd1bf519d47250322dBen MurdochDragImageRef dissolveDragImageToFraction(DragImageRef image, float fraction)
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
7321939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!image)
7421939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 0;
7521939df44de1705786c545cd1bf519d47250322dBen Murdoch
7621939df44de1705786c545cd1bf519d47250322dBen Murdoch    image->setIsOpaque(false);
7721939df44de1705786c545cd1bf519d47250322dBen Murdoch    image->lockPixels();
7821939df44de1705786c545cd1bf519d47250322dBen Murdoch
7921939df44de1705786c545cd1bf519d47250322dBen Murdoch    for (int row = 0; row < image->height(); ++row) {
8021939df44de1705786c545cd1bf519d47250322dBen Murdoch        for (int column = 0; column < image->width(); ++column) {
8121939df44de1705786c545cd1bf519d47250322dBen Murdoch            uint32_t* pixel = image->getAddr32(column, row);
8221939df44de1705786c545cd1bf519d47250322dBen Murdoch            *pixel = SkPreMultiplyARGB(SkColorGetA(*pixel) * fraction,
8321939df44de1705786c545cd1bf519d47250322dBen Murdoch                                       SkColorGetR(*pixel),
8421939df44de1705786c545cd1bf519d47250322dBen Murdoch                                       SkColorGetG(*pixel),
8521939df44de1705786c545cd1bf519d47250322dBen Murdoch                                       SkColorGetB(*pixel));
8621939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
8721939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
8821939df44de1705786c545cd1bf519d47250322dBen Murdoch
8921939df44de1705786c545cd1bf519d47250322dBen Murdoch    image->unlockPixels();
9021939df44de1705786c545cd1bf519d47250322dBen Murdoch
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return image;
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockDragImageRef createDragImageFromImage(Image* image)
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!image)
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    NativeImageSkia* bitmap = image->nativeImageForCurrentFrame();
10021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!bitmap)
10121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 0;
10221939df44de1705786c545cd1bf519d47250322dBen Murdoch
10321939df44de1705786c545cd1bf519d47250322dBen Murdoch    SkBitmap* dragImage = new SkBitmap();
10421939df44de1705786c545cd1bf519d47250322dBen Murdoch    bitmap->copyTo(dragImage, SkBitmap::kARGB_8888_Config);
10521939df44de1705786c545cd1bf519d47250322dBen Murdoch    return dragImage;
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectDragImageRef createDragImageIconForCachedImage(CachedImage*)
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore
115