gambas-source-code/main/lib/image/gb.image.h
Benoît Minisini 7af5ee2344 [GB.DRAW]
* NEW: Paint.BrushOrigin is a new property that allows to define the origin 
  of the brush.
* NEW: Paint.FillRect is a new property equivalent to Draw.FillRect.

[GB.GTK]
* NEW: Support for the new Paint methods.

[GB.GUI.BASE]
* NEW: Start to implement a Draw static class based on the Paint class.
  That class aims at replacing the current Draw class. As it will be based 
  on the Paint class, it will be able to act on Image and Printer, making
  the old Gambas 2 printing code works with Gambas 3 directly.

[GB.QT4]
* NEW: Support for the new Paint methods.


git-svn-id: svn://localhost/gambas/trunk@5365 867c0c6c-44f3-4631-809d-bfa615b0a4ec
2012-11-25 01:39:49 +00:00

167 lines
5.8 KiB
C

/***************************************************************************
gb.image.h
(c) 2000-2012 Benoît Minisini <gambas@users.sourceforge.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
***************************************************************************/
#ifndef __GB_IMAGE_H
#define __GB_IMAGE_H
#include "gambas.h"
// Constants used by image data format
#define GB_IMAGE_BGRX 0 // 00000
#define GB_IMAGE_XRGB 1 // 00001
#define GB_IMAGE_RGBX 2 // 00010
#define GB_IMAGE_XBGR 3 // 00011
#define GB_IMAGE_BGR 4 // 00100
#define GB_IMAGE_RGB 5 // 00101
#define GB_IMAGE_BGRA 8 // 01000
#define GB_IMAGE_ARGB 9 // 01001
#define GB_IMAGE_RGBA 10 // 01010
#define GB_IMAGE_ABGR 11 // 01011
#define GB_IMAGE_BGRP 24 // 11000
#define GB_IMAGE_PRGB 25 // 11001
#define GB_IMAGE_RGBP 26 // 11010
#define GB_IMAGE_PBGR 27 // 11011
// Format test functions
#define GB_IMAGE_FMT_IS_24_BITS(_format) ((_format) & 4)
#define GB_IMAGE_FMT_IS_32_BITS(_format) (((_format) & 4) == 0)
#define GB_IMAGE_FMT_IS_RGBA(_format) ((_format) & 2)
#define GB_IMAGE_FMT_IS_SWAPPED(_format) ((_format) & 1)
#define GB_IMAGE_FMT_IS_TRANSPARENT(_format) ((_format) & 8)
#define GB_IMAGE_FMT_IS_PREMULTIPLIED(_format) ((_format) & 16)
#define GB_IMAGE_FMT_SET_PREMULTIPLIED(_format) ((_format) | 16)
#define GB_IMAGE_FMT_CLEAR_PREMULTIPLIED(_format) ((_format) & ~16)
// Image owner information
struct GB_IMG;
typedef
struct {
const char *name; // owner name (this is the name of the component)
int format; // preferred format
void (*free)(struct GB_IMG *img, void *handle); // free owner handle
void (*release)(struct GB_IMG *img, void *handle); // free temporary handle
void *(*temp)(struct GB_IMG *img); // create a temporary handle for an image and returns it
void (*sync)(struct GB_IMG *img); // synchronize the data. Called only if the GB_IMG.sync flag is set
}
GB_IMG_OWNER;
// Gambas image
typedef
struct GB_IMG {
GB_BASE ob;
unsigned char *data; // points at the image data
int width; // image width in pixels
int height; // image height in pixels
int format; // image format (RGB, BGR, RGBA...)
GB_IMG_OWNER *owner; // owner of the data, NULL means gb.image
void *owner_handle; // handle for the owner
GB_IMG_OWNER *temp_owner; // owner of the temporary handle that does not own the data
void *temp_handle; // temporary handle
unsigned modified : 1; // data has been modified by gb.image
unsigned sync : 1; // data must be synchronized by calling GB_IMG_OWNER.sync()
unsigned is_void : 1; // void image (no data)
}
GB_IMG;
#ifndef __GB_IMAGE_DEFINED
#define __GB_IMAGE_DEFINED
typedef
void *GB_IMAGE;
#endif
// Pixel color: the color is not premultiplied, and the alpha component is inverted (0 = solid / 255 = transparent)
#ifndef __GB_COLOR_DEFINED
#define __GB_COLOR_DEFINED
typedef
unsigned int GB_COLOR;
#endif
// Split a color into its component. Uninvert the alpha component
#define GB_COLOR_SPLIT(_color, _r, _g, _b, _a) \
{ \
_b = (_color) & 0xFF; \
_g = ((_color) >> 8) & 0xFF; \
_r = ((_color) >> 16) & 0xFF; \
_a = ((_color) >> 24) ^ 0xFF; \
}
// Create a GB_COLOR from rgba components
#define GB_COLOR_MAKE(_r, _g, _b, _a) (((_b) & 0xFF) | (((_g) & 0xFF) << 8) | (((_r) & 0xFF) << 16) | ((((_a) & 0xFF) ^ 0xFF) << 24))
// Gambas image component interface
#define IMAGE_INTERFACE_VERSION 1
typedef
struct {
intptr_t version;
// Create an image
GB_IMG *(*Create)(int width, int height, int format, unsigned char *data);
// Take image ownership by giving the image handle and information
void (*Take)(GB_IMG *img, GB_IMG_OWNER *owner, void *owner_handle, int width, int height, unsigned char *data);
// Create a temporary handle on the image without becoming the owner.
void *(*Check)(GB_IMG *img, GB_IMG_OWNER *temp_owner);
// Synchronize the image data if needed
void (*Synchronize)(GB_IMG *img);
// Return the size of the image data in bytes
int (*Size)(GB_IMG *img);
// Set the default format used when creating images
void (*SetDefaultFormat)(int format);
// Get the default format used when creating images
int (*GetDefaultFormat)(void);
// Get the color of a pixel
GB_COLOR (*GetPixel)(GB_IMG *img, int x, int y);
// Converts an image to one of the following formats: BGRA, RGBA, BGRP, RGBP
void (*Convert)(GB_IMG *img, int format);
// Merge two colors
GB_COLOR (*MergeColor)(GB_COLOR col1, GB_COLOR col2, double weight);
// Make a color lighter
GB_COLOR (*LighterColor)(GB_COLOR col);
// Make a color darker
GB_COLOR (*DarkerColor)(GB_COLOR col);
}
IMAGE_INTERFACE;
#define GB_IMG_HANDLE(_image) ((_image)->temp_handle)
#define SYNCHRONIZE_IMAGE(_image) (IMAGE.Synchronize(_image))
#define MODIFY_IMAGE(_image) ((_image)->modified = 1)
#define COLOR_DEFAULT (-1)
#endif