-
Notifications
You must be signed in to change notification settings - Fork 171
/
bitmap-private.h
176 lines (153 loc) · 7.98 KB
/
bitmap-private.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Alexandre Pigolkine (pigolkine@gmx.de)
* Duncan Mak (duncan@ximian.com)
* Miguel de Icaza (miguel@ximian.com)
* Ravindra (rkumar@novell.com)
* Sanjay Gupta (gsanjay@novell.com)
* Vladimir Vukicevic (vladimir@pobox.com)
* Geoff Norton (gnorton@customerdna.com)
* Jonathan Gilbert (logic@deltaq.org)
* Sebastien Pouliot <sebastien@ximian.com>
*
* Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com)
*/
/*
* NOTE: This is a private header files and everything is subject to changes.
*/
#ifndef __BITMAP_PRIVATE_H__
#define __BITMAP_PRIVATE_H__
#include "gdiplus-private.h"
#include "image-private.h"
#define COLOR_PALETTE_FLAGS_DEFAULT 0
#define COLOR_PALETTE_FLAGS_HAS_ALPHA 1
#define COLOR_PALETTE_FLAGS_GREYSCALE 2
#define COLOR_PALETTE_FLAGS_HALFTONE 4
/* LockMode (reserved) flags */
#define GBD_OWN_SCAN0 (1<<8)
#define GBD_WRITE_OK (1<<9)
#define GBD_LOCKED (1<<10)
#define GBD_TRUE24BPP (1<<11)
#ifdef WORDS_BIGENDIAN
#define set_pixel_bgra(pixel,index,b,g,r,a) do { \
((unsigned char *)(pixel))[index] = a; \
((unsigned char *)(pixel))[index+1] = r; \
((unsigned char *)(pixel))[index+2] = g; \
((unsigned char *)(pixel))[index+3] = b; \
} while (0)
#else
#define set_pixel_bgra(pixel,index,b,g,r,a) do { \
((unsigned char *)(pixel))[index] = b; \
((unsigned char *)(pixel))[index+1] = g; \
((unsigned char *)(pixel))[index+2] = r; \
((unsigned char *)(pixel))[index+3] = a; \
} while (0)
#endif
#define get_pixel_bgra(color, b, g, r, a) do { \
a = ((color & 0xff000000) >> 24); \
r = ((color & 0x00ff0000) >> 16); \
g = ((color & 0x0000ff00) >> 8); \
b = (color & 0x000000ff); \
} while(0)
/* This structure is mirrored in System.Drawing.Imaging.BitmapData.
Any changes here must also be made to BitmapData.cs */
typedef struct {
unsigned int width;
unsigned int height;
int stride;
int pixel_format;
BYTE *scan0;
unsigned int reserved;
/* the rest of the structure isn't part of MS GDI+ definition */
ColorPalette *palette;
int property_count; /* Number of properties */
PropertyItem *property; /* Properties associated with image */
float dpi_horz; /* */
float dpi_vert; /* */
ImageFlags image_flags; /* Alpha, ColorSpace, etc. */
unsigned int left; /* left display coordinate of frame */
unsigned int top; /* top display coordinate of frame */
unsigned int x; /* LockBits: left coordinate of locked rectangle */
unsigned int y; /* LockBits: top coordinate of locked rectangle */
int transparent; /* Index of transparent color (<24bit only) */
} BitmapData;
typedef struct {
int count; /* Number of bitmaps contained in this frame */
BitmapData *bitmap; /* Bitmaps for this frame */
GUID frame_dimension; /* GUID describing the frame type */
} FrameData;
typedef struct _Image {
/* Image Description */
ImageType type; /* Undefined, Bitmap, MetaFile */
ImageFormat image_format; /* BMP, TIF, GIF, PNG, etc. */
/* Image Data */
int num_of_frames; /* Number of frames */
FrameData *frames; /* Array of frames (Page, Time, Resolution) for the image */
/* Tracking of active image */
int active_frame; /* Index of frame currently used */
int active_bitmap_no; /* Index of active bitmap in current frame */
BitmapData *active_bitmap; /* Pointer to active frame/bitmap; DO NOT free() */
/* Internal fields */
int cairo_format;
cairo_surface_t *surface;
} GpBitmap;
void gdip_bitmap_init (GpBitmap *bitmap) GDIP_INTERNAL;
GpBitmap *gdip_bitmap_new (void) GDIP_INTERNAL;
GpBitmap *gdip_bitmap_new_with_frame (const GUID *dimension, BOOL add_bitmapdata) GDIP_INTERNAL;
FrameData *gdip_frame_add(GpBitmap *bitmap, const GUID *dimension) GDIP_INTERNAL;
BitmapData *gdip_frame_add_bitmapdata(FrameData *frame) GDIP_INTERNAL;
GpStatus gdip_bitmap_dispose (GpBitmap *bitmap) GDIP_INTERNAL;
GpStatus gdip_bitmap_clone (GpBitmap *bitmap, GpBitmap **clonedbitmap) GDIP_INTERNAL;
GpStatus gdip_bitmap_setactive (GpBitmap *bitmap, const GUID *dimension, int index) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_clone (BitmapData *src, BitmapData **dest, int count) GDIP_INTERNAL;
ColorPalette *gdip_palette_clone(ColorPalette *original) GDIP_INTERNAL;
GpStatus gdip_property_get_short (int offset, void *value, unsigned short *result) GDIP_INTERNAL;
GpStatus gdip_property_get_long (int offset, void *value, guint32 *result) GDIP_INTERNAL;
GpStatus gdip_property_get_srational (int offset, void *value, unsigned short *numerator, unsigned short *denominator) GDIP_INTERNAL;
GpStatus gdip_property_get_rational (int offset, void *value, guint32 *numerator, guint32 *denominator) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add (BitmapData *bitmap_data, PROPID id, ULONG length, WORD type, VOID *value) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add_byte (BitmapData *bitmap_data, PROPID id, BYTE value) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add_short (BitmapData *bitmap_data, PROPID id, unsigned short value) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add_long (BitmapData *bitmap_data, PROPID id, guint32 value) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add_ASCII (BitmapData *bitmap_data, PROPID id, unsigned char *value) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add_rational (BitmapData *bitmap_data, PROPID id, guint32 numerator, guint32 denominator) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_add_srational (BitmapData *bitmap_data, PROPID id, unsigned short numerator, unsigned short denominator) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_remove_id (BitmapData *bitmap_data, PROPID id) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_remove_index (BitmapData *bitmap_data, int index) GDIP_INTERNAL;
GpStatus gdip_bitmapdata_property_find_id (BitmapData *bitmap_data, PROPID id, int *index) GDIP_INTERNAL;
cairo_surface_t* gdip_bitmap_ensure_surface (GpBitmap *bitmap) GDIP_INTERNAL;
GpBitmap* gdip_convert_indexed_to_rgb (GpBitmap *bitmap) GDIP_INTERNAL;
BOOL gdip_bitmap_format_needs_premultiplication (GpBitmap *bitmap) GDIP_INTERNAL;
BYTE* gdip_bitmap_get_premultiplied_scan0 (GpBitmap *bitmap) GDIP_INTERNAL;
void gdip_process_bitmap_attributes (GpBitmap *bitmap, void **dest, GpImageAttributes* attr, BOOL *allocated) GDIP_INTERNAL;
ColorPalette* gdip_create_greyscale_palette (int num_colors) GDIP_INTERNAL;
typedef struct {
Rect region;
int x, y; /* the offset of the next byte that will be loaded, once the buffer is depleted */
unsigned short buffer;
int p; /* index of pixel within 'buffer' that was returned by the last call to gdip_pixel_stream_get_next () */
int one_pixel_mask;
int one_pixel_shift;
int pixels_per_byte; /* a negative value is used to indicate a count of bytes per pixel for depths of more than 8 bits */
BitmapData *data;
BYTE *scan;
} StreamingState;
GpStatus gdip_init_pixel_stream (StreamingState *state, BitmapData *data, int x, int y, int w, int h) GDIP_INTERNAL;
unsigned int gdip_pixel_stream_get_next (StreamingState *state) GDIP_INTERNAL;
#include "bitmap.h"
#endif