⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cairo-image-surface.c

📁 按照官方的说法:Cairo is a vector graphics library with cross-device output support. 翻译过来
💻 C
📖 第 1 页 / 共 2 页
字号:
/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): *	Carl D. Worth <cworth@cworth.org> */#include "cairoint.h"static int_cairo_format_bpp (cairo_format_t format){    switch (format) {    case CAIRO_FORMAT_A1:	return 1;    case CAIRO_FORMAT_A8:	return 8;    case CAIRO_FORMAT_RGB16_565:	return 16;    case CAIRO_FORMAT_RGB24:    case CAIRO_FORMAT_ARGB32:	return 32;    }    ASSERT_NOT_REACHED;    return 32;}cairo_surface_t *_cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image,					      cairo_format_t  format){    cairo_image_surface_t *surface;    surface = malloc (sizeof (cairo_image_surface_t));    if (surface == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    _cairo_surface_init (&surface->base, &cairo_image_surface_backend,			 _cairo_content_from_format (format));    surface->pixman_image = pixman_image;    surface->format = format;    surface->data = (unsigned char *) pixman_image_get_data (pixman_image);    surface->owns_data = FALSE;    surface->has_clip = FALSE;    surface->width = pixman_image_get_width (pixman_image);    surface->height = pixman_image_get_height (pixman_image);    surface->stride = pixman_image_get_stride (pixman_image);    surface->depth = pixman_image_get_depth (pixman_image);    return &surface->base;}/* Try to recover a cairo_format_t from a pixman_format * by looking at the bpp and masks values. */static cairo_format_t_cairo_format_from_pixman_format (pixman_format_t *pixman_format){    int bpp, am, rm, gm, bm;    pixman_format_get_masks (pixman_format, &bpp, &am, &rm, &gm, &bm);    switch (bpp) {    case 32:	if (am == 0xff000000 &&	    rm == 0x00ff0000 &&	    gm == 0x0000ff00 &&	    bm == 0x000000ff)	    return CAIRO_FORMAT_ARGB32;	if (am == 0x0 &&	    rm == 0x00ff0000 &&	    gm == 0x0000ff00 &&	    bm == 0x000000ff)	    return CAIRO_FORMAT_RGB24;	break;    case 16:	if (am == 0x0 &&	    rm == 0xf800 &&	    gm == 0x07e0 &&	    bm == 0x001f)	    return CAIRO_FORMAT_RGB16_565;	break;    case 8:	if (am == 0xff &&	    rm == 0x0 &&	    gm == 0x0 &&	    bm == 0x0)	    return CAIRO_FORMAT_A8;	break;    case 1:	if (am == 0x1 &&	    rm == 0x0 &&	    gm == 0x0 &&	    bm == 0x0)	    return CAIRO_FORMAT_A1;	break;    }    fprintf (stderr,	     "Error: Cairo does not yet support the requested image format:\n"	     "\tDepth: %d\n"	     "\tAlpha mask: 0x%08x\n"	     "\tRed   mask: 0x%08x\n"	     "\tBlue  mask: 0x%08x\n"	     "\tGreen mask: 0x%08x\n"	     "Please file an enhacement request (quoting the above) at:\n"	     PACKAGE_BUGREPORT "\n",	     bpp, am, rm, gm, bm);    ASSERT_NOT_REACHED;    return (cairo_format_t) -1;}cairo_surface_t *_cairo_image_surface_create_with_masks (unsigned char	       *data,					cairo_format_masks_t   *format,					int			width,					int			height,					int			stride){    cairo_surface_t *surface;    pixman_format_t *pixman_format;    pixman_image_t *pixman_image;    cairo_format_t cairo_format;    pixman_format = pixman_format_create_masks (format->bpp,						format->alpha_mask,						format->red_mask,						format->green_mask,						format->blue_mask);    if (pixman_format == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    cairo_format = _cairo_format_from_pixman_format (pixman_format);    pixman_image = pixman_image_create_for_data ((pixman_bits_t *) data, pixman_format,						 width, height, format->bpp, stride);    pixman_format_destroy (pixman_format);    if (pixman_image == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    surface = _cairo_image_surface_create_for_pixman_image (pixman_image,							    cairo_format);    return surface;}static pixman_format_t *_create_pixman_format (cairo_format_t format){    switch (format) {    case CAIRO_FORMAT_A1:	return pixman_format_create (PIXMAN_FORMAT_NAME_A1);	break;    case CAIRO_FORMAT_A8:	return pixman_format_create (PIXMAN_FORMAT_NAME_A8);	break;    case CAIRO_FORMAT_RGB16_565:	return pixman_format_create (PIXMAN_FORMAT_NAME_RGB16_565);	break;    case CAIRO_FORMAT_RGB24:	return pixman_format_create (PIXMAN_FORMAT_NAME_RGB24);	break;    case CAIRO_FORMAT_ARGB32:    default:	return pixman_format_create (PIXMAN_FORMAT_NAME_ARGB32);	break;    }}/** * cairo_image_surface_create: * @format: format of pixels in the surface to create * @width: width of the surface, in pixels * @height: height of the surface, in pixels * * Creates an image surface of the specified format and * dimensions. Initially the surface contents are all * 0. (Specifically, within each pixel, each color or alpha channel * belonging to format will be 0. The contents of bits within a pixel, * but not belonging to the given format are undefined). * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. **/cairo_surface_t *cairo_image_surface_create (cairo_format_t	format,			    int			width,			    int			height){    cairo_surface_t *surface;    pixman_format_t *pixman_format;    pixman_image_t *pixman_image;    if (! CAIRO_FORMAT_VALID (format))	return (cairo_surface_t*) &_cairo_surface_nil;    pixman_format = _create_pixman_format (format);    if (pixman_format == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    pixman_image = pixman_image_create (pixman_format, width, height);    pixman_format_destroy (pixman_format);    if (pixman_image == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    surface = _cairo_image_surface_create_for_pixman_image (pixman_image, format);    return surface;}cairo_surface_t *_cairo_image_surface_create_with_content (cairo_content_t	content,					  int			width,					  int			height){    if (! CAIRO_CONTENT_VALID (content))	return (cairo_surface_t*) &_cairo_surface_nil;    return cairo_image_surface_create (_cairo_format_from_content (content),				       width, height);}/** * cairo_image_surface_create_for_data: * @data: a pointer to a buffer supplied by the application *    in which to write contents. * @format: the format of pixels in the buffer * @width: the width of the image to be stored in the buffer * @height: the height of the image to be stored in the buffer * @stride: the number of bytes between the start of rows *   in the buffer. Having this be specified separate from @width *   allows for padding at the end of rows, or for writing *   to a subportion of a larger image. * * Creates an image surface for the provided pixel data. The output * buffer must be kept around until the #cairo_surface_t is destroyed * or cairo_surface_finish() is called on the surface.  The initial * contents of @buffer will be used as the inital image contents; you * must explicitely clear the buffer, using, for example, * cairo_rectangle() and cairo_fill() if you want it cleared. * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * See cairo_surface_set_user_data() for a means of attaching a * destroy-notification fallback to the surface if necessary. **/cairo_surface_t *cairo_image_surface_create_for_data (unsigned char     *data,				     cairo_format_t	format,				     int		width,				     int		height,				     int		stride){    cairo_surface_t *surface;    pixman_format_t *pixman_format;    pixman_image_t *pixman_image;    if (! CAIRO_FORMAT_VALID (format))	return (cairo_surface_t*) &_cairo_surface_nil;    pixman_format = _create_pixman_format (format);    if (pixman_format == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    pixman_image = pixman_image_create_for_data ((pixman_bits_t *) data, pixman_format,						 width, height,						 _cairo_format_bpp (format),						 stride);    pixman_format_destroy (pixman_format);    if (pixman_image == NULL) {	_cairo_error (CAIRO_STATUS_NO_MEMORY);	return (cairo_surface_t*) &_cairo_surface_nil;    }    surface = _cairo_image_surface_create_for_pixman_image (pixman_image, format);    return surface;}cairo_surface_t *_cairo_image_surface_create_for_data_with_content (unsigned char	*data,						   cairo_content_t	 content,						   int			 width,						   int			 height,						   int			 stride){    if (! CAIRO_CONTENT_VALID (content))	return (cairo_surface_t*) &_cairo_surface_nil;    return cairo_image_surface_create_for_data (data,						_cairo_format_from_content (content),						width, height, stride);}/** * cairo_image_surface_get_data: * @surface: a #cairo_image_surface_t * * Get a pointer to the data of the image surface, for direct * inspection or modification. * * Return value: a pointer to the image data of this surface or NULL * if @surface is not an image surface. * * Since: 1.2 **/unsigned char *cairo_image_surface_get_data (cairo_surface_t *surface){    cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;    if (!_cairo_surface_is_image (surface)) {	_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);	return NULL;    }    return image_surface->data;}/** * cairo_image_surface_get_format: * @surface: a #cairo_image_surface_t * * Get the format of the surface. * * Return value: the format of the surface * * Since: 1.2 **/cairo_format_tcairo_image_surface_get_format (cairo_surface_t *surface){    cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;    if (!_cairo_surface_is_image (surface)) {	_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);	return 0;    }    return image_surface->format;}/** * cairo_image_surface_get_width: * @surface: a #cairo_image_surface_t * * Get the width of the image surface in pixels. * * Return value: the width of the surface in pixels. **/intcairo_image_surface_get_width (cairo_surface_t *surface){    cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;    if (!_cairo_surface_is_image (surface)) {	_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);	return 0;    }    return image_surface->width;}/** * cairo_image_surface_get_height: * @surface: a #cairo_image_surface_t * * Get the height of the image surface in pixels. * * Return value: the height of the surface in pixels. **/intcairo_image_surface_get_height (cairo_surface_t *surface){    cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;    if (!_cairo_surface_is_image (surface)) {	_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);	return 0;    }    return image_surface->height;}/** * cairo_image_surface_get_stride: * @surface: a #cairo_image_surface_t * * Get the stride of the image surface in bytes * * Return value: the stride of the image surface in bytes (or 0 if * @surface is not an image surface). The stride is the distance in * bytes from the beginning of one row of the image data to the * beginning of the next row. * * Since: 1.2 **/intcairo_image_surface_get_stride (cairo_surface_t *surface){    cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;    if (!_cairo_surface_is_image (surface)) {	_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);	return 0;    }    return image_surface->stride;}cairo_format_t_cairo_format_from_content (cairo_content_t content){    switch (content) {    case CAIRO_CONTENT_COLOR:	return CAIRO_FORMAT_RGB24;    case CAIRO_CONTENT_ALPHA:	return CAIRO_FORMAT_A8;    case CAIRO_CONTENT_COLOR_ALPHA:	return CAIRO_FORMAT_ARGB32;    }    ASSERT_NOT_REACHED;    return CAIRO_FORMAT_ARGB32;}cairo_content_t_cairo_content_from_format (cairo_format_t format){    switch (format) {    case CAIRO_FORMAT_ARGB32:	return CAIRO_CONTENT_COLOR_ALPHA;    case CAIRO_FORMAT_RGB24:    case CAIRO_FORMAT_RGB16_565:	return CAIRO_CONTENT_COLOR;    case CAIRO_FORMAT_A8:    case CAIRO_FORMAT_A1:	return CAIRO_CONTENT_ALPHA;    }    ASSERT_NOT_REACHED;    return CAIRO_CONTENT_COLOR_ALPHA;}static cairo_surface_t *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -