| /* |
| * ==================================================================== |
| * 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. |
| * ==================================================================== |
| */ |
| |
| package org.apache.poi.sl.draw.geom; |
| |
| import java.awt.geom.Path2D; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.apache.poi.sl.draw.binding.CTAdjPoint2D; |
| import org.apache.poi.sl.draw.binding.CTPath2D; |
| import org.apache.poi.sl.draw.binding.CTPath2DArcTo; |
| import org.apache.poi.sl.draw.binding.CTPath2DClose; |
| import org.apache.poi.sl.draw.binding.CTPath2DCubicBezierTo; |
| import org.apache.poi.sl.draw.binding.CTPath2DLineTo; |
| import org.apache.poi.sl.draw.binding.CTPath2DMoveTo; |
| import org.apache.poi.sl.draw.binding.CTPath2DQuadBezierTo; |
| import org.apache.poi.sl.draw.binding.STPathFillMode; |
| |
| /** |
| * Specifies a creation path consisting of a series of moves, lines and curves |
| * that when combined forms a geometric shape |
| * |
| * @author Yegor Kozlov |
| */ |
| public class Path { |
| private final List<PathCommand> commands; |
| boolean _fill, _stroke; |
| long _w, _h; |
| |
| public Path(){ |
| this(true, true); |
| } |
| |
| public Path(boolean fill, boolean stroke){ |
| commands = new ArrayList<PathCommand>(); |
| _w = -1; |
| _h = -1; |
| _fill = fill; |
| _stroke = stroke; |
| } |
| |
| public Path(CTPath2D spPath){ |
| _fill = spPath.getFill() != STPathFillMode.NONE; |
| _stroke = spPath.isStroke(); |
| _w = spPath.isSetW() ? spPath.getW() : -1; |
| _h = spPath.isSetH() ? spPath.getH() : -1; |
| |
| commands = new ArrayList<PathCommand>(); |
| |
| for(Object ch : spPath.getCloseOrMoveToOrLnTo()){ |
| if(ch instanceof CTPath2DMoveTo){ |
| CTAdjPoint2D pt = ((CTPath2DMoveTo)ch).getPt(); |
| commands.add(new MoveToCommand(pt)); |
| } else if (ch instanceof CTPath2DLineTo){ |
| CTAdjPoint2D pt = ((CTPath2DLineTo)ch).getPt(); |
| commands.add(new LineToCommand(pt)); |
| } else if (ch instanceof CTPath2DArcTo){ |
| CTPath2DArcTo arc = (CTPath2DArcTo)ch; |
| commands.add(new ArcToCommand(arc)); |
| } else if (ch instanceof CTPath2DQuadBezierTo){ |
| CTPath2DQuadBezierTo bez = ((CTPath2DQuadBezierTo)ch); |
| CTAdjPoint2D pt1 = bez.getPt().get(0); |
| CTAdjPoint2D pt2 = bez.getPt().get(1); |
| commands.add(new QuadToCommand(pt1, pt2)); |
| } else if (ch instanceof CTPath2DCubicBezierTo){ |
| CTPath2DCubicBezierTo bez = ((CTPath2DCubicBezierTo)ch); |
| CTAdjPoint2D pt1 = bez.getPt().get(0); |
| CTAdjPoint2D pt2 = bez.getPt().get(1); |
| CTAdjPoint2D pt3 = bez.getPt().get(2); |
| commands.add(new CurveToCommand(pt1, pt2, pt3)); |
| } else if (ch instanceof CTPath2DClose){ |
| commands.add(new ClosePathCommand()); |
| } else { |
| throw new IllegalStateException("Unsupported path segment: " + ch); |
| } |
| } |
| } |
| |
| public void addCommand(PathCommand cmd){ |
| commands.add(cmd); |
| } |
| |
| /** |
| * Convert the internal represenation to java.awt.geom.Path2D |
| */ |
| public Path2D.Double getPath(Context ctx) { |
| Path2D.Double path = new Path2D.Double(); |
| for(PathCommand cmd : commands) |
| cmd.execute(path, ctx); |
| return path; |
| } |
| |
| public boolean isStroked(){ |
| return _stroke; |
| } |
| |
| public boolean isFilled(){ |
| return _fill; |
| } |
| |
| public long getW(){ |
| return _w; |
| } |
| |
| public long getH(){ |
| return _h; |
| } |
| } |