annotate Plugins/Visualization/paranormal/pn/pnimage.c @ 1591:02841f72b897 trunk

[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
author chainsaw
date Thu, 24 Aug 2006 11:40:00 -0700
parents a898e415ad8f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
1 /* Paranormal - A highly customizable audio visualization library
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
2 * Copyright (C) 2001 Jamie Gennis <jgennis@mindspring.com>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
3 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
4 * This library is free software; you can redistribute it and/or
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
5 * modify it under the terms of the GNU Library General Public
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
6 * License as published by the Free Software Foundation; either
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
7 * version 2 of the License, or (at your option) any later version.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
8 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
9 * This library is distributed in the hope that it will be useful,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
12 * Library General Public License for more details.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
13 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
14 * You should have received a copy of the GNU Library General Public
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
15 * License along with this library; if not, write to the Free
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
17 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
18
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
19 #include <config.h>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
20
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
21 #include <glib.h>
1585
a898e415ad8f [svn] An include a day keeps the implicit declaration at bay.
chainsaw
parents: 1507
diff changeset
22 #include <string.h>
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
23 #include "pnimage.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
24 #include "pnerror.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
25 #include "pncpu.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
26
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
27 static void pn_image_class_init (PnImageClass *class);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
28 static void pn_image_init (PnImage *image,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
29 PnImageClass *class);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
30
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
31 /* GObject signals */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
32 static void pn_image_finalize (GObject *gobject);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
33
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
34 static PnObjectClass *parent_class = NULL;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
35
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
36 const gchar *pn_image_blend_mode_strings[] =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
37 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
38 "Ignore",
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
39 "Replace",
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
40 "50/50"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
41 };
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
42 const guint pn_image_blend_mode_count = 3;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
43
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
44 GType
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
45 pn_image_get_type (void)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
46 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
47 static GType image_type = 0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
48
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
49 if (! image_type)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
50 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
51 static const GTypeInfo image_info =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
52 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
53 sizeof (PnImageClass),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
54 NULL, /* base_init */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
55 NULL, /* base_finalize */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
56 (GClassInitFunc) pn_image_class_init,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
57 NULL, /* class_finalize */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
58 NULL, /* class_data */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
59 sizeof (PnImage),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
60 0, /* n_preallocs */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
61 (GInstanceInitFunc) pn_image_init
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
62 };
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
63
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
64 /* FIXME: should this be dynamic? */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
65 image_type = g_type_register_static (PN_TYPE_OBJECT,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
66 "PnImage",
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
67 &image_info,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
68 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
69 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
70 return image_type;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
71 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
72
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
73 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
74 pn_image_class_init (PnImageClass *class)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
75 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
76 GObjectClass *gobject_class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
77 PnObjectClass *object_class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
78
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
79 parent_class = g_type_class_peek_parent (class);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
80
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
81 gobject_class = (GObjectClass *) class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
82 object_class = (PnObjectClass *) class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
83
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
84 /* GObject signals */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
85 gobject_class->finalize = pn_image_finalize;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
86 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
87
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
88 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
89 pn_image_init (PnImage *image, PnImageClass *class)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
90 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
91 image->render_mode = PN_BLEND_MODE_REPLACE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
92 image->transform_mode = PN_BLEND_MODE_REPLACE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
93 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
94
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
95 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
96 pn_image_finalize (GObject *gobject)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
97 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
98 PnImage *image;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
99
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
100 image = (PnImage *) gobject;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
101
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
102 if (image->image_buffer)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
103 g_free (image->image_buffer);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
104
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
105 if (image->transform_buffer)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
106 g_free (image->transform_buffer);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
107 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
108
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
109 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
110 * pn_image_new
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
111 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
112 * Creates a new #PnImage object
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
113 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
114 * Returns: The new #PnImage object
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
115 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
116 PnImage*
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
117 pn_image_new (void)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
118 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
119 return (PnImage *) g_object_new (PN_TYPE_IMAGE, NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
120 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
121
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
122 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
123 * pn_image_new_width_size
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
124 * @width: the width of the new image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
125 * @height: the hight of the new image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
126 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
127 * Creates a new #PnImage object with the given dimensions
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
128 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
129 * Returns: The new #PnImage object
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
130 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
131 PnImage*
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
132 pn_image_new_with_size (guint width, guint height)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
133 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
134 PnImage *image;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
135
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
136 image = (PnImage *) g_object_new (PN_TYPE_IMAGE, NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
137
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
138 pn_image_set_size (image, width, height);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
139
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
140 return image;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
141 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
142
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
143 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
144 * pn_image_set_size
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
145 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
146 * @width: the new width of the image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
147 * @height: the new height of the image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
148 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
149 * Sets the size of the image contained in a #PnImage object
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
150 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
151 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
152 pn_image_set_size (PnImage *image, guint width, guint height)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
153 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
154 guint pitch;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
155
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
156 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
157 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
158 g_return_if_fail (width > 0 && height > 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
159
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
160 pitch = width * sizeof (PnColor);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
161
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
162 /* Align each row to 8 bytes */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
163 if (pitch & 0x00000007)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
164 pitch = (pitch & 0xfffffff8) + 8;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
165
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
166 if (image->image_buffer)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
167 g_free (image->image_buffer);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
168
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
169 if (image->transform_buffer)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
170 g_free (image->transform_buffer);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
171
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
172 image->pitch = pitch;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
173 image->width = width;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
174 image->height = height;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
175 image->image_buffer = g_malloc0 (pitch * height);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
176 image->transform_buffer = g_malloc0 (pitch * height);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
177 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
178
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
179 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
180 * pn_image_get_width
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
181 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
182 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
183 * Gets the width of a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
184 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
185 * Returns: The width of the image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
186 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
187 guint
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
188 pn_image_get_width (PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
189 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
190 g_return_val_if_fail (image != NULL, 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
191 g_return_val_if_fail (PN_IS_IMAGE (image), 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
192
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
193 return image->width;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
194 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
195
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
196 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
197 * pn_image_get_height
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
198 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
199 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
200 * Gets the height of a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
201 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
202 * Returns: The height of the image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
203 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
204 guint
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
205 pn_image_get_height (PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
206 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
207 g_return_val_if_fail (image != NULL, 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
208 g_return_val_if_fail (PN_IS_IMAGE (image), 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
209
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
210 return image->height;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
211 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
212
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
213 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
214 * pn_image_get_pitch
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
215 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
216 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
217 * Gets the pitch (width in bytes) of a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
218 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
219 * Returns: The pitch of the image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
220 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
221 guint
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
222 pn_image_get_pitch (PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
223 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
224 g_return_val_if_fail (image != NULL, 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
225 g_return_val_if_fail (PN_IS_IMAGE (image), 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
226
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
227 return image->pitch;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
228 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
229
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
230 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
231 * pn_image_set_render_mode
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
232 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
233 * @render_mode: the blend mode to use
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
234 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
235 * Sets the blend mode to be used by render functions. The
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
236 * render functions are pn_image_render_pixel(),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
237 * pn_image_render_pixel_by_offset(), and pn_image_render_line().
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
238 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
239 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
240 pn_image_set_render_mode (PnImage *image, PnBlendMode render_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
241 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
242 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
243 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
244 g_return_if_fail (render_mode < PN_BLEND_MODE_LAST);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
245
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
246 image->render_mode = render_mode;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
247 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
248
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
249 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
250 * pn_image_set_transform_mode
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
251 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
252 * @transform_mode: the blend mode to use
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
253 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
254 * Sets the blend mode to be used by pn_image_apply_transform().
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
255 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
256 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
257 pn_image_set_transform_mode (PnImage *image, PnBlendMode transform_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
258 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
259 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
260 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
261 g_return_if_fail (transform_mode < PN_BLEND_MODE_LAST);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
262
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
263 image->transform_mode = transform_mode;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
264 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
265
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
266 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
267 * pn_image_get_image_buffer
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
268 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
269 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
270 * Retrieves the image buffer (the 'front buffer') of a #PnImage.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
271 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
272 * Returns: A pointer to the image buffer
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
273 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
274 PnColor*
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
275 pn_image_get_image_buffer (PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
276 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
277 g_return_val_if_fail (image != NULL, NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
278 g_return_val_if_fail (PN_IS_IMAGE (image), NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
279
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
280 return image->image_buffer;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
281 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
282
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
283 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
284 * pn_image_get_transform_buffer
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
285 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
286 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
287 * Retrieves the transform buffer (the 'back buffer') of a #PnImage.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
288 * The transform buffer should only be used internally by transform
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
289 * actuators. *EVERY* pixel in the transform buffer *MUST* be set.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
290 * The transform buffer can be 'copied' to the image buffer using
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
291 * pn_image_apply_transform().
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
292 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
293 * Returns: A pointer to the transform buffer
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
294 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
295 PnColor*
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
296 pn_image_get_transform_buffer (PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
297 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
298 g_return_val_if_fail (image != NULL, NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
299 g_return_val_if_fail (PN_IS_IMAGE (image), NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
300
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
301 return image->transform_buffer;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
302 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
303
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
304 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
305 * pn_image_render_pixel
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
306 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
307 * @x: the x coordinate (left being 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
308 * @y: the y coordinate (top being 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
309 * @color: the color
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
310 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
311 * Renders a pixel to the image buffer of a #PnImage. pn_image_set_render_mode()
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
312 * can be used to set the blend mode that is used by this function.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
313 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
314 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
315 pn_image_render_pixel (PnImage *image, guint x, guint y, PnColor color)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
316 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
317 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
318 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
319 g_return_if_fail (image->image_buffer != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
320
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
321 if (x > image->width || y > image->height)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
322 return;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
323
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
324 switch (image->render_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
325 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
326 case PN_BLEND_MODE_LAST: break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
327 case PN_BLEND_MODE_IGNORE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
328 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
329
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
330 case PN_BLEND_MODE_REPLACE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
331 image->image_buffer[(y * (image->pitch>>2)) + x] = color;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
332 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
333
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
334 case PN_BLEND_MODE_5050:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
335 image->image_buffer[(y * (image->pitch>>2)) + x].red =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
336 (image->image_buffer[(y * (image->pitch>>2)) + x].red + color.red) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
337 image->image_buffer[(y * (image->pitch>>2)) + x].green =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
338 (image->image_buffer[(y * (image->pitch>>2)) + x].green + color.green) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
339 image->image_buffer[(y * (image->pitch>>2)) + x].blue =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
340 (image->image_buffer[(y * (image->pitch>>2)) + x].blue + color.blue) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
341 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
342 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
343 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
344
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
345 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
346 * pn_image_render_pixel_by_offset
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
347 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
348 * @offset: the pixel offset (0 being the top left) NOTE: Use (pitch>>2) rather
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
349 * than width
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
350 * @color: the color
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
351 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
352 * Renders a pixel to the image buffer of a #PnImage based on a pixel offset rather than
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
353 * rectangular coordinates. This function should be used if there is a more optimum way
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
354 * to calculate the offset than multiplying at every pixel. pn_image_set_render_mode()
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
355 * can be used to set the blend mode that is used by this function.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
356 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
357 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
358 pn_image_render_pixel_by_offset (PnImage *image, guint offset, PnColor color)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
359 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
360 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
361 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
362 g_return_if_fail (image->image_buffer != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
363
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
364 if (offset > (image->pitch>>2) * image->height)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
365 return;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
366
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
367 switch (image->render_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
368 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
369 case PN_BLEND_MODE_LAST: break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
370 case PN_BLEND_MODE_IGNORE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
371 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
372
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
373 case PN_BLEND_MODE_REPLACE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
374 image->image_buffer[offset] = color;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
375 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
376
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
377 case PN_BLEND_MODE_5050:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
378 image->image_buffer[offset].red =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
379 (image->image_buffer[offset].red + color.red) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
380 image->image_buffer[offset].green =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
381 (image->image_buffer[offset].green + color.green) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
382 image->image_buffer[offset].blue =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
383 (image->image_buffer[offset].blue + color.blue) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
384 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
385 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
386 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
387
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
388 /* FIXME: Add clipping to this */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
389 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
390 * pn_image_render_line
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
391 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
392 * @x0: the x coordinate of the first point
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
393 * @y0: the y coordinate of the first point
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
394 * @x1: the x coordinate of the second point
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
395 * @y1: the y coordinate of the second point
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
396 * @color: the color
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
397 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
398 * Renders a line from (x0,y0) to (x1,y1) to the image buffer of a #PnImage.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
399 * Currently ***NO CLIPPING IS CURRENTLY DONE!!!***
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
400 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
401 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
402 pn_image_render_line (PnImage *image, guint _x0, guint _y0, guint _x1, guint _y1, PnColor color)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
403 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
404 gint x0 = _x0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
405 gint y0 = _y0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
406 gint x1 = _x1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
407 gint y1 = _y1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
408
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
409 gint dy = y1 - y0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
410 gint dx = x1 - x0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
411 gint stepx, stepy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
412 gint fraction;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
413
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
414 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
415 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
416 g_return_if_fail (image->image_buffer != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
417
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
418 if (dy < 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
419 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
420 dy = -dy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
421 stepy = -(image->pitch>>2);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
422 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
423 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
424 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
425 stepy = image->pitch>>2;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
426 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
427 if (dx < 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
428 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
429 dx = -dx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
430 stepx = -1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
431 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
432 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
433 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
434 stepx = 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
435 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
436 dy <<= 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
437 dx <<= 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
438
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
439 y0 *= image->pitch>>2;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
440 y1 *= image->pitch>>2;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
441 pn_image_render_pixel_by_offset(image, x0+y0, color);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
442 if (dx > dy)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
443 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
444 fraction = dy - (dx >> 1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
445 while (x0 != x1)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
446 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
447 if (fraction >= 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
448 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
449 y0 += stepy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
450 fraction -= dx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
451 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
452 x0 += stepx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
453 fraction += dy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
454 pn_image_render_pixel_by_offset (image, x0+y0, color);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
455 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
456 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
457 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
458 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
459 fraction = dx - (dy >> 1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
460 while (y0 != y1)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
461 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
462 if (fraction >= 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
463 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
464 x0 += stepx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
465 fraction -= dy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
466 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
467 y0 += stepy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
468 fraction += dx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
469 pn_image_render_pixel_by_offset (image, x0+y0, color);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
470 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
471 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
472 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
473
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
474 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
475 pn_image_bufcopy_5050 (PnColor *dest, PnColor *src, guint bufsize)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
476 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
477 register guint i;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
478 register PnColor *d, *s;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
479
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
480 d = dest;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
481 s = src;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
482
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
483 for (i=0; i<bufsize; i++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
484 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
485 d->red = (s->red + d->red) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
486 d->green = (s->green + d->green) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
487 d->blue = (s->blue + d->blue) >> 1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
488 d++;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
489 s++;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
490 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
491 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
492
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
493 #ifdef PN_USE_MMX
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
494 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
495 pn_image_bufcopy_5050_mmx (PnColor *dest, PnColor *src, guint bufsize)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
496 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
497 __asm__ __volatile__ (
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
498 "pxor %%mm7,%%mm7\n\t" /* zero mm7 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
499
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
500 "10:\n\t" /* The start of the loop */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
501
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
502 "movq (%0),%%mm0\n\t" /* Read the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
503 "movq (%1),%%mm2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
504 "movq %%mm0,%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
505 "movq %%mm2,%%mm3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
506
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
507 "punpcklbw %%mm7,%%mm0\n\t" /* Unpack the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
508 "punpckhbw %%mm7,%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
509 "punpcklbw %%mm7,%%mm2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
510 "punpckhbw %%mm7,%%mm3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
511
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
512 "paddw %%mm2,%%mm0\n\t" /* Add the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
513 "paddw %%mm3,%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
514
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
515 "psrlw $1,%%mm0\n\t" /* Divide the pixels by 2 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
516 "psrlw $1,%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
517
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
518 "packuswb %%mm1,%%mm0\n\t" /* Pack it up & write it */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
519 "movq %%mm0,(%0)\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
520
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
521 "addl $8,%0\n\t" /* Advance the pointers */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
522 "addl $8,%1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
523
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
524 "decl %2\n\t" /* See if we're done */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
525 "jnz 10b\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
526
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
527 "emms"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
528 : /* no outputs */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
529 : "r" (dest), "r" (src), "r" (bufsize >> 1)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
530 );
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
531 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
532
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
533 /* FIXME: Should this be in a separate #define PN_USE_MMXEXT ? */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
534 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
535 pn_image_bufcopy_5050_mmxext (PnColor *dest, PnColor *src, guint bufsize)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
536 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
537
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
538
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
539 __asm__ __volatile__ (
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
540 "10:\n\t" /* The non-unrolled loop */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
541
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
542 "decl %2\n\t" /* See if we're done */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
543 "js 20f\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
544
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
545 "movq (%0),%%mm0\n\t" /* Read the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
546 "movq (%1),%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
547 "pavgb %%mm1,%%mm0\n\t" /* Average the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
548
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
549 "movq %%mm0,(%0)\n\t" /* Write the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
550
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
551 "addl $8,%0\n\t" /* Advance the pointers */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
552 "addl $8,%1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
553
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
554 "20:\n\t" /* The unrolled loop */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
555
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
556 "decl %3\n\t" /* See if we're done */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
557 "js 30f\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
558
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
559 /* First 2 pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
560 "movq (%0),%%mm0\n\t" /* Read the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
561 "movq (%1),%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
562 "pavgb %%mm1,%%mm0\n\t" /* Average the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
563
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
564 /* Second 2 pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
565 "movq 8(%0),%%mm2\n\t" /* Read the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
566 "movq 8(%1),%%mm3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
567 "pavgb %%mm3,%%mm2\n\t" /* Average the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
568
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
569 /* Third 2 pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
570 "movq 16(%0),%%mm4\n\t" /* Read the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
571 "movq 16(%1),%%mm5\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
572 "pavgb %%mm5,%%mm4\n\t" /* Average the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
573
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
574 /* Fourth 2 pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
575 "movq 24(%0),%%mm6\n\t" /* Read the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
576 "movq 24(%1),%%mm7\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
577 "pavgb %%mm7,%%mm6\n\t" /* Average the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
578
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
579 /* Write them all */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
580 "movq %%mm0,(%0)\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
581 "movq %%mm2,8(%0)\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
582 "movq %%mm4,16(%0)\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
583 "movq %%mm6,24(%0)\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
584
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
585 "addl $32,%0\n\t" /* Advance the pointers */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
586 "addl $32,%1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
587
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
588 "jmp 20b\n\t" /* And again */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
589
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
590 "30:\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
591
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
592 "emms"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
593 : /* no outputs */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
594 : "r" (dest), "r" (src), "r" ((bufsize >> 1) & 0x3), "r" (bufsize >> 3)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
595 );
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
596 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
597
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
598 #endif /* PN_USE_MMX */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
599
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
600 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
601 * pn_image_apply_transform
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
602 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
603 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
604 * Renders the transform buffer onto the image buffer.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
605 * pn_image_set_transform_mode() may be used to set the blend mode that is
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
606 * used by this function.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
607 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
608 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
609 pn_image_apply_transform (PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
610 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
611 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
612 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
613
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
614 switch (image->transform_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
615 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
616 case PN_BLEND_MODE_LAST:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
617 case PN_BLEND_MODE_IGNORE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
618 return;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
619
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
620 case PN_BLEND_MODE_REPLACE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
621 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
622 PnColor *tmp = image->image_buffer;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
623 image->image_buffer = image->transform_buffer;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
624 image->transform_buffer = tmp;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
625 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
626 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
627
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
628 case PN_BLEND_MODE_5050:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
629 #ifdef PN_USE_MMX
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
630 if (pn_cpu_get_caps () & PN_CPU_CAP_MMXEXT)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
631 pn_image_bufcopy_5050_mmxext (image->image_buffer, image->transform_buffer,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
632 image->height * (image->pitch >> 2));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
633 else if (pn_cpu_get_caps () & PN_CPU_CAP_MMX)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
634 pn_image_bufcopy_5050_mmx (image->image_buffer, image->transform_buffer,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
635 image->height * (image->pitch >> 2));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
636 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
637 #endif /* PN_USE_MMX */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
638 pn_image_bufcopy_5050 (image->image_buffer, image->transform_buffer,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
639 image->height * (image->pitch >> 2));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
640 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
641 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
642 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
643
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
644 /**
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
645 * pn_image_render_image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
646 * @image: a #PnImage
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
647 * @src: the source image
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
648 * @blend_mode: the blend mode to use
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
649 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
650 * Renders the image buffer of @src onto the image buffer of an image.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
651 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
652 void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
653 pn_image_render_image (PnImage *image, PnImage *src, PnBlendMode blend_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
654 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
655 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
656 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
657 g_return_if_fail (src != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
658 g_return_if_fail (PN_IS_IMAGE (src));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
659 g_return_if_fail (blend_mode < PN_BLEND_MODE_LAST);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
660 g_return_if_fail (image->width == src->width);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
661 g_return_if_fail (image->height == src->height);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
662
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
663 switch (blend_mode)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
664 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
665 case PN_BLEND_MODE_LAST:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
666 case PN_BLEND_MODE_IGNORE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
667 return;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
668
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
669 case PN_BLEND_MODE_REPLACE:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
670 memcpy (image->image_buffer, src->image_buffer, image->height * (image->pitch >> 2) * sizeof (PnColor));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
671 break;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
672
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
673 case PN_BLEND_MODE_5050:
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
674 #ifdef PN_USE_MMX
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
675 if (pn_cpu_get_caps () & PN_CPU_CAP_MMXEXT)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
676 pn_image_bufcopy_5050_mmxext (image->image_buffer, src->image_buffer,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
677 image->height * (image->pitch >> 2));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
678 else if (pn_cpu_get_caps () & PN_CPU_CAP_MMX)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
679 pn_image_bufcopy_5050_mmx (image->image_buffer, src->image_buffer, image->height * (image->pitch >> 2));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
680 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
681 #endif /* PN_USE_MMX */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
682 pn_image_bufcopy_5050 (image->image_buffer, src->image_buffer, image->height * (image->pitch >> 2));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
683 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
684 }