/* Copyright (C) 2009-2010 ProFUSION embedded systems Copyright (C) 2009-2010 Samsung Electronics This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "ewk_util.h" #include "ewk_private.h" #include <eina_safety_checks.h> /** * Converts an image from cairo_surface to the Evas_Object. * * @param canvas display canvas * @param surface cairo representation of an image * @return converted cairo_surface object to the Evas_Object */ Evas_Object* ewk_util_image_from_cairo_surface_add(Evas* canvas, cairo_surface_t* surface) { cairo_status_t status; cairo_surface_type_t type; cairo_format_t format; int w, h, stride; Evas_Object* image; const void* src; void* dst; EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, 0); status = cairo_surface_status(surface); if (status != CAIRO_STATUS_SUCCESS) { ERR("cairo surface is invalid: %s", cairo_status_to_string(status)); return 0; } type = cairo_surface_get_type(surface); if (type != CAIRO_SURFACE_TYPE_IMAGE) { ERR("unknown surface type %d, required %d (CAIRO_SURFACE_TYPE_IMAGE).", type, CAIRO_SURFACE_TYPE_IMAGE); return 0; } format = cairo_image_surface_get_format(surface); if (format != CAIRO_FORMAT_ARGB32 && format != CAIRO_FORMAT_RGB24) { ERR("unknown surface format %d, expected %d or %d.", format, CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_RGB24); return 0; } w = cairo_image_surface_get_width(surface); h = cairo_image_surface_get_height(surface); stride = cairo_image_surface_get_stride(surface); if (w <= 0 || h <= 0 || stride <= 0) { ERR("invalid image size %dx%d, stride=%d", w, h, stride); return 0; } src = cairo_image_surface_get_data(surface); if (!src) { ERR("could not get source data."); return 0; } image = evas_object_image_filled_add(canvas); if (!image) { ERR("could not add image to canvas."); return 0; } evas_object_image_colorspace_set(image, EVAS_COLORSPACE_ARGB8888); evas_object_image_size_set(image, w, h); evas_object_image_alpha_set(image, format == CAIRO_FORMAT_ARGB32); if (evas_object_image_stride_get(image) != stride) { ERR("evas' stride %d diverges from cairo's %d.", evas_object_image_stride_get(image), stride); evas_object_del(image); return 0; } dst = evas_object_image_data_get(image, EINA_TRUE); memcpy(dst, src, h * stride); evas_object_image_data_set(image, dst); evas_object_resize(image, w, h); // helpful but not really required return image; }