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