libbluray | branch: master | Ian Curtis <[email protected]> | Tue Mar 25 13:26:34 2014 +0200| [d79c6c8eb37d15a40091e331e593db92642c0a58] | committer: hpi1
BDGraphics: implement fillPolygon() > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=d79c6c8eb37d15a40091e331e593db92642c0a58 --- .../bdj/java-j2se/java/awt/BDGraphics.java | 66 +++++++++++++++++- src/libbluray/bdj/java/java/awt/PolyEdge.java | 73 ++++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/src/libbluray/bdj/java-j2se/java/awt/BDGraphics.java b/src/libbluray/bdj/java-j2se/java/awt/BDGraphics.java index 49c274e..bc1016b 100644 --- a/src/libbluray/bdj/java-j2se/java/awt/BDGraphics.java +++ b/src/libbluray/bdj/java-j2se/java/awt/BDGraphics.java @@ -21,7 +21,10 @@ package java.awt; import java.lang.reflect.Field; import java.text.AttributedCharacterIterator; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.awt.image.AreaAveragingScaleFilter; import java.awt.image.BufferedImage; import java.awt.image.ImageConsumer; @@ -643,7 +646,68 @@ class BDGraphics extends Graphics2D implements ConstrainableGraphics { /** Fills a polygon with the current fill mask */ public void fillPolygon(int xPoints[], int yPoints[], int nPoints) { - logger.unimplemented("fillPolygon"); + + int minY = Integer.MAX_VALUE; + int maxY = Integer.MIN_VALUE; + int colour = foreground.getRGB(); + + if (nPoints < 3) { + return; + } + + for (int i = 0; i < nPoints; i++) { + if (yPoints[i] > maxY) { + maxY = yPoints[i]; + } + if (yPoints[i] < minY) { + minY = yPoints[i]; + } + } + + // check the last point to see if its the same as the first + if (xPoints[0] == xPoints[nPoints - 1] && yPoints[0] == yPoints[nPoints - 1]) { + nPoints--; + } + + PolyEdge[] polyEdges = new PolyEdge[nPoints]; + + for (int i = 0; i < nPoints - 1; i++) { + polyEdges[i] = new PolyEdge(xPoints[i], yPoints[i], xPoints[i + 1], yPoints[i + 1]); + } + + // add the last one + polyEdges[nPoints - 1] = new PolyEdge(xPoints[nPoints - 1], yPoints[nPoints - 1], xPoints[0], yPoints[0]); + ArrayList xList = new ArrayList(); + for (int i = minY; i <= maxY; i++) { + for (int j = 0; j < nPoints; j++) { + if (polyEdges[j].intersects(i)) { + int x = polyEdges[j].intersectionX(i); + xList.add(new Integer(x)); + } + } + + // probably a better way of doing this (removing duplicates); + HashSet hs = new HashSet(); + hs.addAll(xList); + xList.clear(); + xList.addAll(hs); + + if (xList.size() % 2 > 0) { + xList.clear(); + continue; // this should be impossible unless the poly is open somewhere + } + + Collections.sort(xList); + + for (int j = 0; j < xList.size(); j +=2 ) { + int x1 = ((Integer)xList.get(j)).intValue(); + int x2 = ((Integer)xList.get(j + 1)).intValue(); + + drawSpan(x1, i, x2 - x1, colour); + } + + xList.clear(); + } } /** Draws an oval to fit in the given rectangle */ diff --git a/src/libbluray/bdj/java/java/awt/PolyEdge.java b/src/libbluray/bdj/java/java/awt/PolyEdge.java new file mode 100644 index 0000000..f83558d --- /dev/null +++ b/src/libbluray/bdj/java/java/awt/PolyEdge.java @@ -0,0 +1,73 @@ +/* + * This file is part of libbluray + * Copyright (C) 2014 libbluray + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + +package java.awt; + +class PolyEdge { + + private int x1; + private int y1; + private int x2; + private int y2; + private float m; + private float c; + private boolean vertical; + + PolyEdge(int x1, int y1, int x2, int y2) { + + // sort lowest to highest + if (y2 < y1) { + int swap; + swap = x1; x1 = x2; x2 = swap; + swap = y1; y1 = y2; y2 = swap; + } + + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + + if (x1 == x2) { + vertical = true; + m = 0; + } else { + m = (float)(y2 - y1) / (float)(x2 - x1); + c = (-x1 * m) + y1; + vertical = false; + } + } + + public boolean intersects(int y) { + + if (y <= y2 && y >= y1 && y1 != y2) { + return true; + } + + return false; + } + + public int intersectionX(int y) { + + if (vertical) { + return x1; + } + + return (int)((y - c) / m); + } +} _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
