| /* |
| 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; |
| } |