| 162 | | private static function xorPath(bm:BitmapData, p:Object):void |
|---|
| 163 | | { |
|---|
| 164 | | if(p.priv.length <= 0) // a path of length 0 is silly, but legal |
|---|
| 165 | | { |
|---|
| 166 | | return; |
|---|
| 167 | | } |
|---|
| 168 | | |
|---|
| 169 | | var y1:int = p.priv[p.priv.length - 1].y; |
|---|
| 170 | | |
|---|
| 171 | | var xa:int = p.priv[0].x; |
|---|
| 172 | | for(var k:int = 0; k < p.priv.length; k++) |
|---|
| 173 | | { |
|---|
| 174 | | var x:int = p.priv[k].x; |
|---|
| 175 | | var y:int = p.priv[k].y; |
|---|
| | 172 | private static function xorPath(bm:BitmapData, p:Object, filter:ColorMatrixFilter):void |
|---|
| | 173 | { |
|---|
| | 174 | var priv:Array = p.priv as Array; |
|---|
| | 175 | var len:int = priv.length; |
|---|
| | 176 | |
|---|
| | 177 | // get minimum x |
|---|
| | 178 | var minX:int = 99999; |
|---|
| | 179 | for(var i:int = 0; i < len; i++) |
|---|
| | 180 | { |
|---|
| | 181 | minX = Math.min(minX, priv[i].x); |
|---|
| | 182 | } |
|---|
| | 183 | |
|---|
| | 184 | var y1:int = priv[len - 1].y; |
|---|
| | 185 | var pt:Point = new Point(); |
|---|
| | 186 | var rect:Rectangle = new Rectangle; |
|---|
| | 187 | for(i = 0; i < len; i++) |
|---|
| | 188 | { |
|---|
| | 189 | var x:int = priv[i].x; |
|---|
| | 190 | var y:int = priv[i].y; |
|---|
| 179 | | // efficiently invert the rectangle [x,xa] x [y,y1] |
|---|
| 180 | | xorToRef(bm, x, Math.max(y, y1), xa); |
|---|
| | 194 | // efficiently invert the rectangle [minX, x] x [y,y1] |
|---|
| | 195 | var y2:int = Math.max(y, y1); |
|---|
| | 196 | pt.x = minX; pt.y = y2; |
|---|
| | 197 | rect.x = minX; rect.y = y2; rect.width = x - minX; rect.height = 1; |
|---|
| | 198 | bm.applyFilter(bm, rect, pt, filter); |
|---|
| 184 | | } |
|---|
| 185 | | |
|---|
| 186 | | /** |
|---|
| 187 | | * decompose image into paths efficiently invert bits [x,infty) and [xa,infty) in line y. |
|---|
| 188 | | * |
|---|
| 189 | | * Here xa must be a multiple of BM_WORDBITS. |
|---|
| 190 | | */ |
|---|
| 191 | | private static function xorToRef(bm:BitmapData, x:int, y:int, xa:int):void |
|---|
| 192 | | { |
|---|
| 193 | | // XOR |
|---|
| 194 | | var filter:ColorMatrixFilter = new ColorMatrixFilter([ |
|---|
| 195 | | -1, 0, 0, 0, 255, |
|---|
| 196 | | -1, 0, 0, 0, 255, |
|---|
| 197 | | -1, 0, 0, 0, 255, |
|---|
| 198 | | 0, 0, 0, 1, 0 |
|---|
| 199 | | ]); |
|---|
| 200 | | |
|---|
| 201 | | bm.applyFilter(bm, new Rectangle(0, y, x, 1), new Point(0, y), filter); |
|---|