View Javadoc

1   // Copyright 2002, FreeHEP.
2   package org.freehep.graphicsio.emf.gdi;
3   
4   import java.io.IOException;
5   import java.awt.geom.GeneralPath;
6   
7   import org.freehep.graphicsio.emf.EMFConstants;
8   import org.freehep.graphicsio.emf.EMFInputStream;
9   import org.freehep.graphicsio.emf.EMFOutputStream;
10  import org.freehep.graphicsio.emf.EMFTag;
11  import org.freehep.graphicsio.emf.EMFRenderer;
12  
13  /**
14   * SetPolyFillMode TAG.
15   * 
16   * @author Mark Donszelmann
17   * @version $Id: SetPolyFillMode.java 10367 2007-01-22 19:26:48Z duns $
18   */
19  public class SetPolyFillMode extends EMFTag implements EMFConstants {
20  
21      private int mode;
22  
23      public SetPolyFillMode() {
24          super(19, 1);
25      }
26  
27      public SetPolyFillMode(int mode) {
28          this();
29          this.mode = mode;
30      }
31  
32      public EMFTag read(int tagID, EMFInputStream emf, int len)
33              throws IOException {
34  
35          return new SetPolyFillMode(emf.readDWORD());
36      }
37  
38      public void write(int tagID, EMFOutputStream emf) throws IOException {
39          emf.writeDWORD(mode);
40      }
41  
42      public String toString() {
43          return super.toString() + "\n  mode: " + mode;
44      }
45  
46      /**
47       * displays the tag using the renderer
48       *
49       * @param renderer EMFRenderer storing the drawing session data
50       */
51      public void render(EMFRenderer renderer) {
52          renderer.setWindingRule(getWindingRule(mode));
53      }
54  
55      /**
56       * gets a winding rule for GeneralPath creation based on
57       * EMF SetPolyFillMode.
58       *
59       * @param polyFillMode PolyFillMode to convert
60       * @return winding rule
61       */
62      private int getWindingRule(int polyFillMode) {
63          if (polyFillMode == EMFConstants.WINDING) {
64              return GeneralPath.WIND_EVEN_ODD;
65          } else if (polyFillMode == EMFConstants.ALTERNATE) {
66              return GeneralPath.WIND_NON_ZERO;
67          } else {
68              return GeneralPath.WIND_EVEN_ODD;
69          }
70      }
71  
72  }