18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
268513a70bcd92384395513322f1b801e7bf9c729Steve Block * 2010 Igalia S.L
368513a70bcd92384395513322f1b801e7bf9c729Steve Block *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DragImage.h"
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedImage.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h"
2428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "RefPtrCairo.h"
2568513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <cairo.h>
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntSize dragImageSize(DragImageRef image)
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (image)
3268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return IntSize(cairo_image_surface_get_width(image), cairo_image_surface_get_height(image));
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntSize(0, 0);
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid deleteDragImage(DragImageRef image)
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (image)
4068513a70bcd92384395513322f1b801e7bf9c729Steve Block        cairo_surface_destroy(image);
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochDragImageRef scaleDragImage(DragImageRef image, FloatSize scale)
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!image)
4668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return 0;
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4868513a70bcd92384395513322f1b801e7bf9c729Steve Block    int newWidth = scale.width() * cairo_image_surface_get_width(image);
4968513a70bcd92384395513322f1b801e7bf9c729Steve Block    int newHeight = scale.height() * cairo_image_surface_get_height(image);
5068513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_surface_t* scaledSurface = cairo_surface_create_similar(image, CAIRO_CONTENT_COLOR_ALPHA, newWidth, newHeight);
5168513a70bcd92384395513322f1b801e7bf9c729Steve Block
5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    RefPtr<cairo_t> context = adoptRef(cairo_create(scaledSurface));
5368513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_scale(context.get(), scale.width(), scale.height());
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_pattern_set_extend(cairo_get_source(context.get()), CAIRO_EXTEND_PAD);
5568513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_pattern_set_filter(cairo_get_source(context.get()), CAIRO_FILTER_BEST);
5668513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_set_operator(context.get(), CAIRO_OPERATOR_SOURCE);
5768513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_set_source_surface(context.get(), image, 0, 0);
5868513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_paint(context.get());
5968513a70bcd92384395513322f1b801e7bf9c729Steve Block
6068513a70bcd92384395513322f1b801e7bf9c729Steve Block    deleteDragImage(image);
6168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return scaledSurface;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6468513a70bcd92384395513322f1b801e7bf9c729Steve BlockDragImageRef dissolveDragImageToFraction(DragImageRef image, float fraction)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6668513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!image)
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block        return 0;
6868513a70bcd92384395513322f1b801e7bf9c729Steve Block
6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    RefPtr<cairo_t> context = adoptRef(cairo_create(image));
7068513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_set_operator(context.get(), CAIRO_OPERATOR_DEST_IN);
7168513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_set_source_rgba(context.get(), 0, 0, 0, fraction);
7268513a70bcd92384395513322f1b801e7bf9c729Steve Block    cairo_paint(context.get());
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return image;
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochDragImageRef createDragImageFromImage(Image* image)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7868513a70bcd92384395513322f1b801e7bf9c729Steve Block    return cairo_surface_reference(image->nativeImageForCurrentFrame());
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDragImageRef createDragImageIconForCachedImage(CachedImage*)
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
87