annotate src/bitmask.c @ 3172:d1b367fc08bc tests-returncode

Use a return code of 1 when the tests fail.
author Thomas Kluyver <takowl@gmail.com>
date Wed, 09 Jan 2013 10:13:57 +0000
parents 5320c3356ae9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
808
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
1 /*
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
2 Bitmask Collision Detection Library 1.5
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
3 Copyright (C) 2002-2005 Ulf Ekstrom except for the bitcount function which
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
4 is copyright (C) Donald W. Gillies, 1992, and the other bitcount function
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
5 which was taken from Jorg Arndt's excellent "Algorithms for Programmers"
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
6 text.
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
7
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
8 This library is free software; you can redistribute it and/or
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
9 modify it under the terms of the GNU Library General Public
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
10 License as published by the Free Software Foundation; either
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
11 version 2 of the License, or (at your option) any later version.
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
12
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
13 This library is distributed in the hope that it will be useful,
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
16 Library General Public License for more details.
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
17
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
18 You should have received a copy of the GNU Library General Public
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
19 License along with this library; if not, write to the Free
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
21 */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
22
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
23 #include <stdlib.h>
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
24 #include <stddef.h>
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
25 #include <string.h>
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
26 #include "bitmask.h"
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
27
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
28 #ifndef INLINE
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
29 #warning No INLINE definition in bitmask.h, performance may suffer.
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
30 #endif
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
31
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
32 #define MIN(a,b) ((a) <= (b) ? (a) : (b))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
33 #define MAX(a,b) ((a) >= (b) ? (a) : (b))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
34
1265
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
35 /* The code by Gillies is slightly (1-3%) faster than the more
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
36 readable code below */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
37 #define GILLIES
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
38
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
39 static INLINE unsigned int bitcount(BITMASK_W n)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
40 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
41 if (BITMASK_W_LEN == 32)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
42 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
43 #ifdef GILLIES
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
44 /* (C) Donald W. Gillies, 1992. All rights reserved. You may reuse
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
45 this bitcount() function anywhere you please as long as you retain
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
46 this Copyright Notice. */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
47 register unsigned long tmp;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
48 return (tmp = (n) - (((n) >> 1) & 033333333333) -
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
49 (((n) >> 2) & 011111111111),
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
50 tmp = ((tmp + (tmp >> 3)) & 030707070707),
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
51 tmp = (tmp + (tmp >> 6)),
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
52 tmp = (tmp + (tmp >> 12) + (tmp >> 24)) & 077);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
53 /* End of Donald W. Gillies bitcount code */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
54 #else
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
55 /* This piece taken from Jorg Arndt's "Algorithms for Programmers" */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
56 n = ((n>>1) & 0x55555555) + (n & 0x55555555); // 0-2 in 2 bits
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
57 n = ((n>>2) & 0x33333333) + (n & 0x33333333); // 0-4 in 4 bits
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
58 n = ((n>>4) + n) & 0x0f0f0f0f; // 0-8 in 4 bits
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
59 n += n>> 8; // 0-16 in 8 bits
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
60 n += n>>16; // 0-32 in 8 bits
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
61 return n & 0xff;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
62 #endif
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
63 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
64 else if (BITMASK_W_LEN == 64)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
65 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
66 n = ((n>>1) & 0x5555555555555555) + (n & 0x5555555555555555);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
67 n = ((n>>2) & 0x3333333333333333) + (n & 0x3333333333333333);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
68 n = ((n>>4) + n) & 0x0f0f0f0f0f0f0f0f;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
69 n += n>> 8;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
70 n += n>>16;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
71 n += n>>32;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
72 return n & 0xff;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
73 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
74 else
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
75 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
76 /* Handle non-32 or 64 bit case the slow way */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
77 unsigned int nbits = 0;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
78 while (n)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
79 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
80 if (n & 1)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
81 nbits++;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
82 n = n >> 1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
83 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
84 return nbits;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
85 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
86 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
87
808
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
88 bitmask_t *bitmask_create(int w, int h)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
89 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
90 bitmask_t *temp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
91 temp = malloc(offsetof(bitmask_t,bits) + h*((w - 1)/BITMASK_W_LEN + 1)*sizeof(BITMASK_W));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
92 if (!temp)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
93 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
94 temp->w = w;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
95 temp->h = h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
96 bitmask_clear(temp);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
97 return temp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
98 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
99
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
100 void bitmask_free(bitmask_t *m)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
101 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
102 free(m);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
103 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
104
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
105 void bitmask_clear(bitmask_t *m)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
106 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
107 memset(m->bits,0,m->h*((m->w - 1)/BITMASK_W_LEN + 1)*sizeof(BITMASK_W));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
108 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
109
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
110 void bitmask_fill(bitmask_t *m)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
111 {
1265
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
112 int len, shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
113 BITMASK_W *pixels, cmask, full;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
114
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
115 len = m->h*((m->w - 1)/BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
116 shift = BITMASK_W_LEN - (m->w % BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
117 full = ~(BITMASK_W)0;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
118 cmask = (~(BITMASK_W)0) >> shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
119 /* fill all the pixels that aren't in the rightmost BITMASK_Ws */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
120 for (pixels = m->bits; pixels < (m->bits + len); pixels++) {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
121 *pixels = full;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
122 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
123 /* for the rightmost BITMASK_Ws, use cmask to ensure we aren't setting
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
124 bits that are outside of the mask */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
125 for (pixels = m->bits + len; pixels < (m->bits + len + m->h); pixels++) {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
126 *pixels = cmask;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
127 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
128 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
129
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
130 void bitmask_invert(bitmask_t *m)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
131 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
132 int len, shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
133 BITMASK_W *pixels, cmask;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
134
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
135 len = m->h*((m->w - 1)/BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
136 shift = BITMASK_W_LEN - (m->w % BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
137 cmask = (~(BITMASK_W)0) >> shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
138 /* flip all the pixels that aren't in the rightmost BITMASK_Ws */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
139 for (pixels = m->bits; pixels < (m->bits + len); pixels++) {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
140 *pixels = ~(*pixels);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
141 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
142 /* for the rightmost BITMASK_Ws, & with cmask to ensure we aren't setting
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
143 bits that are outside of the mask */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
144 for (pixels = m->bits + len; pixels < (m->bits + len + m->h); pixels++) {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
145 *pixels = cmask & ~(*pixels);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
146 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
147 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
148
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
149 unsigned int bitmask_count(bitmask_t *m)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
150 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
151 BITMASK_W *pixels;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
152 unsigned int tot = 0;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
153
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
154 for (pixels=m->bits; pixels<(m->bits+m->h*((m->w-1)/BITMASK_W_LEN + 1)); pixels++) {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
155 tot += bitcount(*pixels);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
156 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
157
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
158 return tot;
808
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
159 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
160
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
161 int bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
162 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
163 const BITMASK_W *a_entry,*a_end;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
164 const BITMASK_W *b_entry;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
165 const BITMASK_W *ap,*app,*bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
166 unsigned int shift,rshift,i,astripes,bstripes;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
167
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
168 if ((xoffset >= a->w) || (yoffset >= a->h) || (b->h + yoffset <= 0) || (b->w + xoffset <= 0))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
169 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
170
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
171 if (xoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
172 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
173 swapentry:
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
174 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
175 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
176 a_entry = a->bits + a->h*((unsigned int)xoffset/BITMASK_W_LEN) + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
177 a_end = a_entry + MIN(b->h,a->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
178 b_entry = b->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
179 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
180 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
181 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
182 a_entry = a->bits + a->h*((unsigned int)xoffset/BITMASK_W_LEN);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
183 a_end = a_entry + MIN(b->h + yoffset,a->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
184 b_entry = b->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
185 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
186 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
187 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
188 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
189 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
190 astripes = ((unsigned int)(a->w - 1))/BITMASK_W_LEN - (unsigned int)xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
191 bstripes = ((unsigned int)(b->w - 1))/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
192 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
193 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
194 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
195 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
196 for (ap = a_entry, app = ap + a->h, bp = b_entry;ap < a_end;)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
197 if ((*ap++ >> shift) & *bp || (*app++ << rshift) & *bp++) return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
198 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
199 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
200 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
201 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
202 for (ap = a_entry,bp = b_entry;ap < a_end;)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
203 if ((*ap++ >> shift) & *bp++) return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
204 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
205 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
206 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
207 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
208 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
209 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
210 for (ap = a_entry, app = ap + a->h, bp = b_entry;ap < a_end;)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
211 if ((*ap++ >> shift) & *bp || (*app++ << rshift) & *bp++) return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
212 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
213 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
214 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
215 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
216 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
217 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
218 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
219 else /* xoffset is a multiple of the stripe width, and the above routines wont work */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
220 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
221 astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
222 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
223 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
224 for (ap = a_entry,bp = b_entry;ap < a_end;)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
225 if (*ap++ & *bp++) return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
226 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
227 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
228 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
229 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
230 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
231 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
232 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
233 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
234 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
235 const bitmask_t *c = a;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
236 a = b;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
237 b = c;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
238 xoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
239 yoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
240 goto swapentry;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
241 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
242 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
243
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
244 /* Will hang if there are no bits set in w! */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
245 static INLINE int firstsetbit(BITMASK_W w)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
246 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
247 int i = 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
248 while ((w & 1) == 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
249 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
250 i++;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
251 w/=2;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
252 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
253 return i;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
254 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
255
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
256 /* x and y are given in the coordinates of mask a, and are untouched if there is no overlap */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
257 int bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset, int *x, int *y)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
258 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
259 const BITMASK_W *a_entry,*a_end, *b_entry, *ap, *bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
260 unsigned int shift,rshift,i,astripes,bstripes,xbase;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
261
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
262 if ((xoffset >= a->w) || (yoffset >= a->h) || (yoffset <= - b->h))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
263 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
264
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
265 if (xoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
266 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
267 xbase = xoffset/BITMASK_W_LEN; /* first stripe from mask a */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
268 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
269 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
270 a_entry = a->bits + a->h*xbase + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
271 a_end = a_entry + MIN(b->h,a->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
272 b_entry = b->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
273 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
274 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
275 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
276 a_entry = a->bits + a->h*xbase;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
277 a_end = a_entry + MIN(b->h + yoffset,a->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
278 b_entry = b->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
279 yoffset = 0; /* relied on below */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
280 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
281 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
282 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
283 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
284 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
285 astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
286 bstripes = (b->w - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
287 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
288 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
289 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
290 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
291 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
292 if (*ap & (*bp << shift))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
293 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
294 *y = ap - a_entry + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
295 *x = (xbase + i)*BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
296 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
297 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
298 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
299 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
300 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
301 if (*ap & (*bp >> rshift))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
302 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
303 *y = ap - a_entry + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
304 *x = (xbase + i + 1)*BITMASK_W_LEN + firstsetbit(*ap & (*bp >> rshift));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
305 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
306 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
307 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
308 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
309 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
310 if (*ap & (*bp << shift))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
311 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
312 *y = ap - a_entry + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
313 *x = (xbase + astripes)*BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
314 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
315 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
316 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
317 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
318 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
319 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
320 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
321 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
322 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
323 if (*ap & (*bp << shift))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
324 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
325 *y = ap - a_entry + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
326 *x = (xbase + i)*BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
327 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
328 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
329 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
330 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
331 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
332 if (*ap & (*bp >> rshift))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
333 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
334 *y = ap - a_entry + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
335 *x = (xbase + i + 1)*BITMASK_W_LEN + firstsetbit(*ap & (*bp >> rshift));
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
336 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
337 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
338 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
339 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
340 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
341 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
342 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
343 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
344 /* xoffset is a multiple of the stripe width, and the above routines
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
345 won't work. This way is also slightly faster. */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
346 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
347 astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
348 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
349 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
350 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
351 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
352 if (*ap & *bp)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
353 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
354 *y = ap - a_entry + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
355 *x = (xbase + i)*BITMASK_W_LEN + firstsetbit(*ap & *bp);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
356 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
357 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
358 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
359 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
360 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
361 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
362 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
363 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
364 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
365 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
366 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
367 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
368 if (bitmask_overlap_pos(b,a,-xoffset,-yoffset,x,y))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
369 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
370 *x += xoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
371 *y += yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
372 return 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
373 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
374 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
375 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
376 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
377 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
378
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
379 int bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
380 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
381 const BITMASK_W *a_entry,*a_end, *b_entry, *ap,*bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
382 unsigned int shift,rshift,i,astripes,bstripes;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
383 unsigned int count = 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
384
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
385 if ((xoffset >= a->w) || (yoffset >= a->h) || (b->h + yoffset <= 0) || (b->w + xoffset <= 0))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
386 return 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
387
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
388 if (xoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
389 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
390 swapentry:
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
391 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
392 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
393 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
394 a_end = a_entry + MIN(b->h,a->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
395 b_entry = b->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
396 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
397 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
398 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
399 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
400 a_end = a_entry + MIN(b->h + yoffset,a->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
401 b_entry = b->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
402 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
403 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
404 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
405 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
406 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
407 astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
408 bstripes = (b->w - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
409 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
410 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
411 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
412 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
413 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
414 count += bitcount(((*ap >> shift) | (*(ap + a->h) << rshift)) & *bp);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
415 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
416 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
417 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
418 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
419 for (ap = a_entry,bp = b_entry;ap < a_end;)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
420 count += bitcount((*ap++ >> shift) & *bp++);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
421 return count;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
422 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
423 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
424 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
425 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
426 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
427 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
428 count += bitcount(((*ap >> shift) | (*(ap + a->h) << rshift)) & *bp);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
429 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
430 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
431 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
432 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
433 return count;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
434 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
435 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
436 else /* xoffset is a multiple of the stripe width, and the above routines wont work */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
437 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
438 astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
439 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
440 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
441 for (ap = a_entry,bp = b_entry;ap < a_end;)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
442 count += bitcount(*ap++ & *bp++);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
443
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
444 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
445 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
446 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
447 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
448 return count;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
449 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
450 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
451 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
452 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
453 const bitmask_t *c = a;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
454 a = b;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
455 b = c;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
456 xoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
457 yoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
458 goto swapentry;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
459 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
460 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
461
1265
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
462 /* Makes a mask of the overlap of two other masks */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
463 void bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, int xoffset, int yoffset)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
464 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
465 const BITMASK_W *a_entry,*a_end, *ap;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
466 const BITMASK_W *b_entry, *b_end, *bp;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
467 BITMASK_W *c_entry, *c_end, *cp;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
468 int shift,rshift,i,astripes,bstripes;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
469
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
470 if ((xoffset >= a->w) || (yoffset >= a->h) || (yoffset <= - b->h))
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
471 return;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
472
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
473 if (xoffset >= 0)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
474 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
475 if (yoffset >= 0)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
476 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
477 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
478 c_entry = c->bits + c->h*(xoffset/BITMASK_W_LEN) + yoffset;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
479 a_end = a_entry + MIN(b->h,a->h - yoffset);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
480 b_entry = b->bits;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
481 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
482 else
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
483 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
484 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
485 c_entry = c->bits + c->h*(xoffset/BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
486 a_end = a_entry + MIN(b->h + yoffset,a->h);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
487 b_entry = b->bits - yoffset;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
488 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
489 shift = xoffset & BITMASK_W_MASK;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
490 if (shift)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
491 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
492 rshift = BITMASK_W_LEN - shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
493 astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
494 bstripes = (b->w - 1)/BITMASK_W_LEN + 1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
495 if (bstripes > astripes) /* zig-zag .. zig*/
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
496 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
497 for (i=0;i<astripes;i++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
498 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
499 for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
500 *cp = *ap & (*bp << shift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
501 a_entry += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
502 c_entry += c->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
503 a_end += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
504 for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
505 *cp = *ap & (*bp >> rshift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
506 b_entry += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
507 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
508 for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
509 *cp = *ap & (*bp << shift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
510 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
511 else /* zig-zag */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
512 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
513 for (i=0;i<bstripes;i++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
514 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
515 for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
516 *cp = *ap & (*bp << shift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
517 a_entry += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
518 c_entry += c->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
519 a_end += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
520 for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
521 *cp = *ap & (*bp >> rshift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
522 b_entry += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
523 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
524 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
525 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
526 else /* xoffset is a multiple of the stripe width,
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
527 and the above routines won't work. */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
528 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
529 astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
530 for (i=0;i<astripes;i++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
531 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
532 for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
533 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
534 *cp = *ap & *bp;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
535 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
536 a_entry += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
537 c_entry += c->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
538 a_end += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
539 b_entry += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
540 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
541 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
542 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
543 else
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
544 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
545 xoffset *= -1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
546 yoffset *= -1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
547
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
548 if (yoffset >= 0)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
549 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
550 b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN) + yoffset;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
551 b_end = b_entry + MIN(a->h,b->h - yoffset);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
552 a_entry = a->bits;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
553 c_entry = c->bits;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
554 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
555 else
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
556 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
557 b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
558 b_end = b_entry + MIN(a->h + yoffset,b->h);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
559 a_entry = a->bits - yoffset;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
560 c_entry = c->bits - yoffset;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
561 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
562 shift = xoffset & BITMASK_W_MASK;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
563 if (shift)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
564 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
565 rshift = BITMASK_W_LEN - shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
566 astripes = (b->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
567 bstripes = (a->w - 1)/BITMASK_W_LEN + 1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
568 if (bstripes > astripes) /* zig-zag .. zig*/
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
569 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
570 for (i=0;i<astripes;i++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
571 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
572 for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
573 *cp = *ap & (*bp >> shift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
574 b_entry += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
575 b_end += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
576 for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
577 *cp = *ap & (*bp <<rshift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
578 a_entry += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
579 c_entry += c->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
580 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
581 for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
582 *cp = *ap & (*bp >> shift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
583 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
584 else /* zig-zag */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
585 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
586 for (i=0;i<bstripes;i++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
587 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
588 for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
589 *cp = *ap & (*bp >> shift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
590 b_entry += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
591 b_end += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
592 for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
593 *cp = *ap & (*bp << rshift);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
594 a_entry += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
595 c_entry += c->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
596 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
597 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
598 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
599 else /* xoffset is a multiple of the stripe width, and the above routines won't work. */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
600 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
601 astripes = (MIN(a->w,b->w - xoffset) - 1)/BITMASK_W_LEN + 1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
602 for (i=0;i<astripes;i++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
603 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
604 for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
605 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
606 *cp = *ap & *bp;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
607 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
608 b_entry += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
609 b_end += b->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
610 a_entry += a->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
611 c_entry += c->h;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
612 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
613 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
614 xoffset *= -1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
615 yoffset *= -1;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
616 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
617 /* Zero out bits outside the mask rectangle (to the right), if there
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
618 is a chance we were drawing there. */
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
619 if (xoffset + b->w > c->w)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
620 {
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
621 BITMASK_W edgemask;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
622 int n = c->w/BITMASK_W_LEN;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
623 shift = (n + 1)*BITMASK_W_LEN - c->w;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
624 edgemask = (~(BITMASK_W)0) >> shift;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
625 c_end = c->bits + n*c->h + MIN(c->h,b->h + yoffset);
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
626 for (cp = c->bits + n*c->h + MAX(yoffset,0);cp<c_end;cp++)
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
627 *cp &= edgemask;
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
628 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
629 }
e417071fc04d new functions and improvements in mask
Nirav Patel <nrp@eclecti.cc>
parents: 808
diff changeset
630
808
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
631 /* Draws mask b onto mask a (bitwise OR) */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
632 void bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
633 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
634 BITMASK_W *a_entry,*a_end, *ap;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
635 const BITMASK_W *b_entry, *b_end, *bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
636 int shift,rshift,i,astripes,bstripes;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
637
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
638 if ((xoffset >= a->w) || (yoffset >= a->h) || (yoffset <= - b->h))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
639 return;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
640
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
641 if (xoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
642 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
643 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
644 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
645 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
646 a_end = a_entry + MIN(b->h,a->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
647 b_entry = b->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
648 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
649 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
650 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
651 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
652 a_end = a_entry + MIN(b->h + yoffset,a->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
653 b_entry = b->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
654 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
655 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
656 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
657 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
658 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
659 astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
660 bstripes = (b->w - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
661 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
662 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
663 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
664 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
665 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
666 *ap |= (*bp << shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
667 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
668 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
669 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
670 *ap |= (*bp >> rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
671 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
672 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
673 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
674 *ap |= (*bp << shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
675 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
676 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
677 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
678 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
679 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
680 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
681 *ap |= (*bp << shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
682 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
683 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
684 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
685 *ap |= (*bp >> rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
686 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
687 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
688 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
689 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
690 else /* xoffset is a multiple of the stripe width,
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
691 and the above routines won't work. */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
692 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
693 astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
694 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
695 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
696 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
697 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
698 *ap |= *bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
699 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
700 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
701 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
702 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
703 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
704 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
705 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
706 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
707 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
708 xoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
709 yoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
710
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
711 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
712 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
713 b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN) + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
714 b_end = b_entry + MIN(a->h,b->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
715 a_entry = a->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
716 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
717 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
718 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
719 b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
720 b_end = b_entry + MIN(a->h + yoffset,b->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
721 a_entry = a->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
722 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
723 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
724 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
725 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
726 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
727 astripes = (b->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
728 bstripes = (a->w - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
729 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
730 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
731 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
732 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
733 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
734 *ap |= (*bp >> shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
735 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
736 b_end += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
737 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
738 *ap |= (*bp <<rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
739 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
740 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
741 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
742 *ap |= (*bp >> shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
743 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
744 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
745 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
746 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
747 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
748 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
749 *ap |= (*bp >> shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
750 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
751 b_end += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
752 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
753 *ap |= (*bp << rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
754 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
755 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
756 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
757 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
758 else /* xoffset is a multiple of the stripe width, and the above routines won't work. */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
759 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
760 astripes = (MIN(a->w,b->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
761 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
762 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
763 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
764 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
765 *ap |= *bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
766 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
767 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
768 b_end += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
769 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
770 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
771 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
772 xoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
773 yoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
774 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
775 /* Zero out bits outside the mask rectangle (to the right), if there
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
776 is a chance we were drawing there. */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
777 if (xoffset + b->w > a->w)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
778 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
779 BITMASK_W edgemask;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
780 int n = a->w/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
781 shift = (n + 1)*BITMASK_W_LEN - a->w;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
782 edgemask = (~(BITMASK_W)0) >> shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
783 a_end = a->bits + n*a->h + MIN(a->h,b->h + yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
784 for (ap = a->bits + n*a->h + MAX(yoffset,0);ap<a_end;ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
785 *ap &= edgemask;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
786 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
787 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
788
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
789 /* Erases mask b from mask a (a &= ~b) */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
790 void bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
791 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
792 BITMASK_W *a_entry,*a_end, *ap;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
793 const BITMASK_W *b_entry, *b_end, *bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
794 int shift,rshift,i,astripes,bstripes;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
795
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
796 if ((xoffset >= a->w) || (yoffset >= a->h) || (yoffset <= - b->h))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
797 return;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
798
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
799 if (xoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
800 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
801 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
802 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
803 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
804 a_end = a_entry + MIN(b->h,a->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
805 b_entry = b->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
806 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
807 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
808 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
809 a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
810 a_end = a_entry + MIN(b->h + yoffset,a->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
811 b_entry = b->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
812 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
813 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
814 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
815 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
816 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
817 astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
818 bstripes = (b->w - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
819 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
820 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
821 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
822 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
823 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
824 *ap &= ~(*bp << shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
825 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
826 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
827 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
828 *ap &= ~(*bp >> rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
829 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
830 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
831 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
832 *ap &= ~(*bp << shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
833 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
834 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
835 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
836 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
837 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
838 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
839 *ap &= ~(*bp << shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
840 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
841 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
842 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
843 *ap &= ~(*bp >> rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
844 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
845 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
846 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
847 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
848 else /* xoffset is a multiple of the stripe width,
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
849 and the above routines won't work. */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
850 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
851 astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
852 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
853 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
854 for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
855 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
856 *ap &= ~*bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
857 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
858 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
859 a_end += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
860 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
861 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
862 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
863 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
864 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
865 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
866 xoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
867 yoffset *= -1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
868
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
869 if (yoffset >= 0)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
870 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
871 b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN) + yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
872 b_end = b_entry + MIN(a->h,b->h - yoffset);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
873 a_entry = a->bits;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
874 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
875 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
876 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
877 b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
878 b_end = b_entry + MIN(a->h + yoffset,b->h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
879 a_entry = a->bits - yoffset;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
880 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
881 shift = xoffset & BITMASK_W_MASK;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
882 if (shift)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
883 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
884 rshift = BITMASK_W_LEN - shift;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
885 astripes = (b->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
886 bstripes = (a->w - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
887 if (bstripes > astripes) /* zig-zag .. zig*/
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
888 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
889 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
890 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
891 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
892 *ap &= ~(*bp >> shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
893 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
894 b_end += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
895 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
896 *ap &= ~(*bp <<rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
897 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
898 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
899 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
900 *ap |= (*bp >> shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
901 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
902 else /* zig-zag */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
903 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
904 for (i=0;i<bstripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
905 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
906 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
907 *ap &= ~(*bp >> shift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
908 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
909 b_end += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
910 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
911 *ap &= ~(*bp << rshift);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
912 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
913 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
914 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
915 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
916 else /* xoffset is a multiple of the stripe width, and the above routines won't work. */
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
917 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
918 astripes = (MIN(a->w,b->w - xoffset) - 1)/BITMASK_W_LEN + 1;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
919 for (i=0;i<astripes;i++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
920 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
921 for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
922 *ap &= ~*bp;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
923 b_entry += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
924 b_end += b->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
925 a_entry += a->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
926 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
927 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
928 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
929 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
930
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
931
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
932
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
933 bitmask_t *bitmask_scale(const bitmask_t *m, int w, int h)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
934 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
935 bitmask_t *nm;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
936 int x,y,nx,ny,dx,dy,dnx,dny;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
937
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
938 if (w < 1 || h < 1)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
939 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
940 nm = bitmask_create(1,1);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
941 return nm;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
942 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
943
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
944 nm = bitmask_create(w,h);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
945 if (!nm)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
946 return NULL;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
947 ny = dny = 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
948 for (y=0,dy=h; y<m->h; y++,dy+=h)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
949 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
950 while (dny < dy)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
951 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
952 nx = dnx = 0;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
953 for (x=0,dx=w; x < m->w; x++, dx+=w)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
954 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
955 if (bitmask_getbit(m,x,y))
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
956 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
957 while (dnx < dx)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
958 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
959 bitmask_setbit(nm,nx,ny);
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
960 nx++;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
961 dnx += m->w;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
962 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
963 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
964 else
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
965 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
966 while (dnx < dx)
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
967 {
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
968 nx++;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
969 dnx += m->w;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
970 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
971 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
972 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
973 ny++;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
974 dny+=m->h;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
975 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
976 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
977 return nm;
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
978 }
953eedb0041e Adding the bitmask code from Ulf Ekstrom.
Rene Dudfield <renesd@gmail.com>
parents:
diff changeset
979
1406
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
980 void bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *o, int xoffset, int yoffset)
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
981 {
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
982 int x, y;
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
983
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
984 xoffset += b->w - 1;
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
985 yoffset += b->h - 1;
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
986 for (y = 0; y < b->h; y++)
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
987 for (x = 0; x < b->w; x++)
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
988 if (bitmask_getbit(b, x, y))
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
989 bitmask_draw(o, a, xoffset - x, yoffset - y);
5320c3356ae9 Mask convolve function and tests from Michael George
Nirav Patel <nrp@eclecti.cc>
parents: 1265
diff changeset
990 }