File: vtkSwtComponent.java

package info (click to toggle)
vtk9 9.5.2%2Bdfsg3-4
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 205,916 kB
  • sloc: cpp: 2,336,565; ansic: 327,116; python: 111,200; yacc: 4,104; java: 3,977; sh: 3,032; xml: 2,771; perl: 2,189; lex: 1,787; makefile: 178; javascript: 165; objc: 153; tcl: 59
file content (136 lines) | stat: -rw-r--r-- 3,604 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package vtk.rendering.swt;

import org.eclipse.swt.widgets.Composite;

import com.jogamp.opengl.swt.GLCanvas;

import vtk.vtkRenderWindow;
import vtk.rendering.vtkAbstractComponent;

/**
 * Provide SWT based vtk rendering component
 *
 * @author    Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012
 * @thanks    This work was supported by CEA/CESTA
 *            Commissariat a l'Energie Atomique et aux Energies Alternatives,
 *            15 avenue des Sablieres, CS 60001, 33116 Le Barp, France.
 */
public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {

  protected vtkInternalSwtComponent uiComponent;
  protected boolean isWindowCreated;

  public vtkSwtComponent(Composite parentComposite) {
    this(new vtkRenderWindow(), parentComposite);
  }

  public vtkSwtComponent(vtkRenderWindow renderWindowToUse, Composite parentComposite) {
    super(renderWindowToUse);
    this.eventForwarder = new vtkSwtInteractorForwarderDecorator(this, this.eventForwarder);
    this.isWindowCreated = true;
    this.uiComponent = new vtkInternalSwtComponent(this, parentComposite);

    renderWindow.AddObserver("StartEvent", this, "startEvent");
    renderWindow.AddObserver("EndEvent", this, "endEvent");
  }

  /**
   * Set the size of the VTK component
   * @param x width
   * @param y height
   */
  @Override
  public void setSize(int x, int y) {
    x = x < 1 ? 1 : x;
    y = y < 1 ? 1 : y;
    super.setSize(x, y);
    this.uiComponent.setSize(x, y);
    this.uiComponent.redraw();
    this.uiComponent.update();
  }

  /**
   * Render the VTK component. Should not be called externally.
   * Call update() to refresh the window content.
   */
  @Override
  public void Render() {
    // Make sure we can render
    if (inRenderCall || renderer == null || renderWindow == null) {
      return;
    }

    // Try to render
    try {
      lock.lockInterruptibly();
      inRenderCall = true;
      // Trigger the real render
      renderWindow.SetFrameBlitModeToBlitToCurrent();
      renderWindow.Render();
    } catch (InterruptedException e) {
      // Nothing that we can do except skipping execution
    } finally {
      lock.unlock();
      inRenderCall = false;
    }
  }

  /**
   * Redraw the VTK component
   */
  public void update() {
    this.uiComponent.redraw();
    this.uiComponent.update();
  }

  /**
   * @return the encapsulated SWT component (a GLCanvas instance)
   * @see vtk.rendering.vtkAbstractComponent#getComponent()
   */
  @Override
  public GLCanvas getComponent() {
    return this.uiComponent;
  }

  @Override
  public void Delete() {
    this.lock.lock();
    // We prevent any further rendering
    this.inRenderCall = true;
    this.renderWindow = null;
    super.Delete();
    this.lock.unlock();
  }

  /**
   * @return true if the graphical component has been properly set and
   *         operation can be performed on it.
   */
  public boolean isWindowSet() {
    return this.isWindowCreated;
  }

  /**
   * Just allow class in same package to affect inRenderCall boolean
   *
   * @param value
   */
  protected void updateInRenderCall(boolean value) {
    this.inRenderCall = value;
  }

  /** This method is called by the VTK JNI code. Do not remove. */
  void startEvent() {
    if (!getComponent().getContext().isCurrent()) {
      getComponent().getContext().makeCurrent();
    }
  }

  /** This method is called by the VTK JNI code. Do not remove. */
  void endEvent() {
    if (getComponent().getContext().isCurrent()) {
      getComponent().swapBuffers();
      getComponent().getContext().release();
    }
  }
}