/** Stops the processing of the current tree. */
 public void stopProcessing() {
   if (gvtTreeRenderer != null) {
     needRender = false;
     gvtTreeRenderer.halt();
     haltProgressivePaintThread();
   }
 }
 /** Schedules a new GVT rendering. */
 protected void scheduleGVTRendering() {
   if (gvtTreeRenderer != null) {
     needRender = true;
     gvtTreeRenderer.halt();
   } else {
     renderGVTTree();
   }
 }
  /** Renders the GVT tree. */
  protected void renderGVTTree() {
    Rectangle visRect = getRenderRect();
    if (gvtRoot == null || visRect.width <= 0 || visRect.height <= 0) {
      return;
    }

    // Renderer setup.
    if (renderer == null || renderer.getTree() != gvtRoot) {
      renderer = createImageRenderer();
      renderer.setTree(gvtRoot);
    }

    // Area of interest computation.
    AffineTransform inv;
    try {
      inv = renderingTransform.createInverse();
    } catch (NoninvertibleTransformException e) {
      throw new IllegalStateException("NoninvertibleTransformEx:" + e.getMessage());
    }
    Shape s = inv.createTransformedShape(visRect);

    // Rendering thread setup.
    gvtTreeRenderer =
        new GVTTreeRenderer(
            renderer,
            renderingTransform,
            doubleBufferedRendering,
            s,
            visRect.width,
            visRect.height);
    gvtTreeRenderer.setPriority(Thread.MIN_PRIORITY);

    Iterator it = gvtTreeRendererListeners.iterator();
    while (it.hasNext()) {
      gvtTreeRenderer.addGVTTreeRendererListener((GVTTreeRendererListener) it.next());
    }

    // Disable the dispatch during the rendering
    // to avoid concurrent access to the GVT tree.
    if (eventDispatcher != null) {
      eventDispatcher.setEventDispatchEnabled(false);
    }

    gvtTreeRenderer.start();
  }