summaryrefslogtreecommitdiffstats
path: root/awt/org/apache/harmony/awt/gl/render/JavaShapeRasterizer.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/org/apache/harmony/awt/gl/render/JavaShapeRasterizer.java')
-rw-r--r--awt/org/apache/harmony/awt/gl/render/JavaShapeRasterizer.java475
1 files changed, 0 insertions, 475 deletions
diff --git a/awt/org/apache/harmony/awt/gl/render/JavaShapeRasterizer.java b/awt/org/apache/harmony/awt/gl/render/JavaShapeRasterizer.java
deleted file mode 100644
index dbaaf53..0000000
--- a/awt/org/apache/harmony/awt/gl/render/JavaShapeRasterizer.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * @author Denis M. Kishenko
- * @version $Revision$
- */
-package org.apache.harmony.awt.gl.render;
-
-import java.awt.Shape;
-import java.awt.geom.PathIterator;
-
-import org.apache.harmony.awt.gl.MultiRectArea;
-import org.apache.harmony.awt.internal.nls.Messages;
-
-public class JavaShapeRasterizer {
-
- static final int POINT_CAPACITY = 16;
-
- int edgesCount;
- int edgeCur;
- int[] edgesX;
- int[] edgesY;
- int[] edgesYS; // Y coordinate of edge START point
- int[] edgesN;
- int[] edgesDY;
- int[] bounds;
- int boundCount;
- boolean[] edgesExt; // Extremal points
-
- int activeCount;
- float[] activeX;
- int[] activeYEnd;
- float[] activeXStep;
- int[] activeDY;
- boolean[] activeExt;
-
- int[] crossX;
- int[] crossDY;
-
- Filler filler;
-
- /**
- * Rasterization filler for different path rules
- */
- static abstract class Filler {
-
- static class NonZero extends Filler {
- @Override
- void add(MultiRectArea.LineCash rect, int[] points, int[] orient, int length, int y) {
-
- int[] dst = new int[length];
- int dstLength = 1;
- dst[0] = points[0];
- int count = 0;
- boolean inside = true;
- for(int i = 0; i < length; i++) {
- count += orient[i] > 0 ? 1 : -1;
- if (count == 0) {
- dst[dstLength++] = points[i];
- inside = false;
- } else {
- if (!inside) {
- dst[dstLength++] = points[i];
- inside = true;
- }
- }
-
- }
-
- for(int i = 1; i < dstLength; i += 2) {
- dst[i]--;
- }
-
- dstLength = excludeEmpty(dst, dstLength);
-// System.out.println("test");
-
- dstLength = union(dst, dstLength);
-
- rect.addLine(dst, dstLength);
- }
- }
-
- static class EvenOdd extends Filler {
- @Override
- void add(MultiRectArea.LineCash rect, int[] points, int[] orient, int length, int y) {
- /*
- int[] buf = new int[length];
- int j = 0;
- for(int i = 0; i < length - 1; i++) {
- if (points[i] != points[i + 1]) {
- buf[j++] = points[i];
- }
- }
- */
- for(int i = 1; i < length; i += 2) {
- points[i]--;
- }
-
- length = excludeEmpty(points, length);
-// System.out.println("test");
-
- length = union(points, length);
- rect.addLine(points, length);
- /*
- for(int i = 0; i < length;) {
- rect.add(points[i++], y, points[i++], y);
- }
- */
- }
- }
-
- abstract void add(MultiRectArea.LineCash rect, int[] points, int[] orient, int length, int y);
-
- static int excludeEmpty(int[] points, int length) {
- int i = 0;
- while(i < length) {
- if (points[i] <= points[i + 1]) {
- i += 2;
- } else {
- length -= 2;
- System.arraycopy(points, i + 2, points, i, length - i);
- }
- }
- return length;
- }
-
- static int union(int[] points, int length) {
- int i = 1;
- while(i < length - 1) {
- if (points[i] < points[i - 1]) {
- System.arraycopy(points, i + 1, points, i - 1, length - i - 1);
- length -= 2;
- } else
- if (points[i] >= points[i + 1] - 1) {
- System.arraycopy(points, i + 2, points, i, length - i - 2);
- length -= 2;
- } else {
- i += 2;
- }
- }
- return length;
- }
-
- }
-
- public JavaShapeRasterizer() {
- }
-
- /**
- * Checks buffer size and realloc if necessary
- */
- int[] checkBufSize(int[] buf, int size) {
- if (size == buf.length) {
- int[] tmp;
- tmp = new int[size + POINT_CAPACITY];
- System.arraycopy(buf, 0, tmp, 0, buf.length);
- buf = tmp;
- }
- return buf;
- }
-
- /**
- * Adds to the buffers new edge
- */
- void addEdge(int x, int y, int num) {
- edgesX = checkBufSize(edgesX, edgesCount);
- edgesY = checkBufSize(edgesY, edgesCount);
- edgesN = checkBufSize(edgesN, edgesCount);
- edgesX[edgesCount] = x;
- edgesY[edgesCount] = y;
- edgesN[edgesCount] = (num << 16) | edgesCount;
- edgesCount++;
- }
-
- /**
- * Prepare all buffers and variable to rasterize shape
- */
- void makeBuffer(PathIterator path, double flatness) {
- edgesX = new int[POINT_CAPACITY];
- edgesY = new int[POINT_CAPACITY];
- edgesN = new int[POINT_CAPACITY];
- bounds = new int[POINT_CAPACITY];
- boundCount = 0;
- edgesCount = 0;
-
- if (path.getWindingRule() == PathIterator.WIND_EVEN_ODD) {
- filler = new Filler.EvenOdd();
- } else {
- filler = new Filler.NonZero();
- }
- float[] coords = new float[2];
- boolean closed = true;
- while (!path.isDone()) {
- switch(path.currentSegment(coords)) {
- case PathIterator.SEG_MOVETO:
- if (!closed) {
- boundCount++;
- bounds = checkBufSize(bounds, boundCount);
- bounds[boundCount] = edgesCount;
- }
- addEdge((int)coords[0], (int)coords[1], boundCount);
- closed = false;
- break;
- case PathIterator.SEG_LINETO:
- addEdge((int)coords[0], (int)coords[1], boundCount);
- break;
- case PathIterator.SEG_CLOSE:
- boundCount++;
- bounds = checkBufSize(bounds, boundCount);
- bounds[boundCount] = edgesCount;
- closed = true;
- break;
- default:
- // awt.36=Wrong segment
- throw new RuntimeException(Messages.getString("awt.36")); //$NON-NLS-1$
- }
- path.next();
- }
- if (!closed) {
- boundCount++;
- bounds = checkBufSize(bounds, boundCount);
- bounds[boundCount] = edgesCount;
- }
- }
-
- /**
- * Sort buffers
- */
- void sort(int[] master, int[] slave, int length) {
- for(int i = 0; i < length - 1; i++) {
- int num = i;
- int min = master[num];
- for(int j = i + 1; j < length; j++) {
- if (master[j] < min) {
- num = j;
- min = master[num];
- }
- }
- if (num != i) {
- master[num] = master[i];
- master[i] = min;
- min = slave[num];
- slave[num] = slave[i];
- slave[i] = min;
- }
- }
- }
-
- int getNext(int cur) {
- int n = edgesN[cur];
- int bound = n >> 16;
- int num = (n & 0xFFFF) + 1;
- if (num == bounds[bound + 1]) {
- return bounds[bound];
- }
- return num;
- }
-
- int getPrev(int cur) {
- int n = edgesN[cur];
- int bound = n >> 16;
- int num = (n & 0xFFFF) - 1;
- if (num < bounds[bound]) {
- return bounds[bound + 1] - 1;
- }
- return num;
- }
-
- int getNextShape(int cur) {
- int bound = edgesN[cur] >> 16;
- return bounds[bound + 1];
- }
-
- void init() {
-
- edgesYS = new int[edgesCount];
- System.arraycopy(edgesY, 0, edgesYS, 0, edgesCount);
- // Create edgesDY
- edgesDY = new int[edgesCount];
- for(int i = 0; i < edgesCount; i++) {
- int dy = edgesY[getNext(i)] - edgesY[i];
- edgesDY[i] = dy;
- }
-
- // Create edgesExt
- edgesExt = new boolean[edgesCount];
- int prev = -1;
- int i = 0;
- int pos = 0;
- while(i < edgesCount) {
-
- TOP: {
- do {
- if (edgesDY[i] > 0) {
- break TOP;
- }
- i = getNext(i);
- } while (i != pos);
- i = pos = getNextShape(i);
- continue;
- }
-
- BOTTOM: {
- do {
- if (edgesDY[i] < 0) {
- break BOTTOM;
- }
- if (edgesDY[i] > 0) {
- prev = i;
- }
- i = getNext(i);
- } while (i != pos);
- i = pos = getNextShape(i);
- continue;
- }
-
- if (prev != -1) {
- edgesExt[prev] = true;
- }
- edgesExt[i] = true;
- }
-
- // Sort edgesY and edgesN
- sort(edgesYS, edgesN, edgesCount);
-
- edgeCur = 0;
- activeCount = 0;
- activeX = new float[edgesCount];
- activeYEnd = new int[edgesCount];
- activeXStep = new float[edgesCount];
- activeDY = new int[edgesCount];
- activeExt = new boolean[edgesCount];
-
- crossX = new int[edgesCount];
- crossDY = new int[edgesCount];
- }
-
- /**
- * Marks edge as active
- */
- void addActiveEdge(int levelY, int start, int end, boolean back) {
- int dy = back ? -edgesDY[end] : edgesDY[start];
- if (dy <= 0) {
- return;
- }
- int x1 = edgesX[start];
- int dx = edgesX[end] - x1;
- activeX[activeCount] = x1;
- activeYEnd[activeCount] = edgesY[end];
- activeXStep[activeCount] = dx / (float)dy;
- activeDY[activeCount] = back ? -dy : dy;
- activeExt[activeCount] = back ? edgesExt[end] : edgesExt[start];
- activeCount++;
- }
-
- /**
- * Find new active edges
- */
- int findActiveEdges(int levelY) {
-
- int edgeActive = edgeCur;
- while (edgeActive < edgesCount && edgesYS[edgeActive] == levelY) {
- edgeActive++;
- }
-
- int activeNext = edgeActive;
-
- while (edgeActive > edgeCur) {
- edgeActive--;
- int num = edgesN[edgeActive] & 0xFFFF;
- addActiveEdge(levelY, num, getPrev(edgeActive), true);
- addActiveEdge(levelY, num, getNext(edgeActive), false);
- }
-
- edgeCur = activeNext;
-
- if (activeNext == edgesCount) {
- return edgesY[edgesCount - 1];
- }
- return edgesYS[activeNext];
- }
-
- /**
- * Rasterizes shape with particular flatness
- * @param shape - the souze Shape to be rasterized
- * @param flatness - the rasterization flatness
- * @return a MultiRectArea of rasterized shape
- */
- public MultiRectArea rasterize(Shape shape, double flatness) {
-
- PathIterator path = shape.getPathIterator(null, flatness);
-
- // Shape is empty
- if (path.isDone()) {
- return new MultiRectArea();
- }
-
- makeBuffer(path, flatness);
-
- init();
-
- int y = edgesYS[0];
- int nextY = y;
- int crossCount;
-
- MultiRectArea.LineCash rect = new MultiRectArea.LineCash(edgesCount);
- rect.setLine(y);
-
- while(y <= nextY) {
-
- crossCount = 0;
-
- if (y == nextY) {
-
- int i = activeCount;
- while(i > 0) {
- i--;
- if (activeYEnd[i] == y) {
-
- activeCount--;
- int length = activeCount - i;
- if (length != 0) {
- int pos = i + 1;
- System.arraycopy(activeX, pos, activeX, i, length);
- System.arraycopy(activeYEnd, pos, activeYEnd, i, length);
- System.arraycopy(activeXStep, pos, activeXStep, i, length);
- System.arraycopy(activeDY, pos, activeDY, i, length);
- System.arraycopy(activeExt, pos, activeExt, i, length);
- }
- }
- }
-
- nextY = findActiveEdges(y);
- }
-
- // Get X crossings
- for(int i = 0; i < activeCount; i++) {
- crossX[crossCount] = (int)Math.ceil(activeX[i]);
- crossDY[crossCount] = activeDY[i];
- crossCount++;
- }
-
- if (crossCount == 0) {
- rect.skipLine();
- } else {
- // Sort X crossings
- sort(crossX, crossDY, crossCount);
- filler.add(rect, crossX, crossDY, crossCount, y);
- }
-
- for(int i = 0; i < activeCount; i++) {
- activeX[i] += activeXStep[i];
- }
-
- y++;
- }
-
- return rect;
- }
-
-}