示例#1
0
  public void drawSVG() {
    Enumeration en = drawListeners.elements();
    while (en.hasMoreElements()) {
      ((SVGViewerDrawListener) en.nextElement()).beginDraw();
    }

    try {
      raster.setCamera();

      en = rasterTransformListeners.elements();
      while (en.hasMoreElements()) {
        SVGViewerRasterTransformListener l = (SVGViewerRasterTransformListener) en.nextElement();
        l.rasterTransformed();
      }
      raster.update();
      en = rasterUpdateListeners.elements();
      while (en.hasMoreElements()) {
        SVGViewerRasterUpdateListener l = (SVGViewerRasterUpdateListener) en.nextElement();
        l.rasterUpdated();
      }
      raster.sendPixels();
      logger.debug("Draw svg finalizado");

    } catch (Exception e) {
      e.printStackTrace();
      logger.error(e);
    } finally {
      en = drawListeners.elements();
      while (en.hasMoreElements()) {
        ((SVGViewerDrawListener) en.nextElement()).endDraw();
      }
    }
  }
示例#2
0
  /**
   * Realiza la carga desde una url de una imagen en formato SVGTiny, en este caso no se espera que
   * tenga información basada en capas o layers.
   *
   * @param url
   */
  public void loadSVGUrl(URL url) {
    //		SVGEvent event = new SVGEvent(SVGEvent.EVENT_LOAD, url);
    //		postEvent(event);

    // Si el componente no esta inicializado, el documento se guarda como pendiente de cargar
    if (raster == null) {
      pendingSVG = url;
      return;
    }

    currentSVG = url;

    // 1. Reset the event queue
    eventQueue.reset();
    // 2. Load the document
    SVGDocument document = loadSVG(url);
    if (document == null) return;
    Enumeration e = loadListeners.elements();
    while (e.hasMoreElements()) {
      ((SVGViewerLoadListener) e.nextElement()).documentLoaded(document);
    }
    // 3. Set the loaded document to be current document
    // canvas.currentURL = new String(url);
    raster.setSVGDocument(document);
    // 4. Set the original view
    raster.view.x = raster.origview.x;
    raster.view.y = raster.origview.y;
    raster.view.width = raster.origview.width;
    raster.view.height = raster.origview.height;
    // 5. Set the camera transform
    // raster.setCamera();
    // 6. Draw
    drawSVG();
  }
示例#3
0
 /**
  * Escribe en el stream de salida que se le pasa por parámetro el contenido del árbol DOM en xml,
  * solamente para los nodos del SVG que han sido modificados. Devuelve un Vector con los nodos que
  * contienen imagenes asociadas.
  */
 public Vector serializeModifiedNodes2XML(
     OutputStream outputStream,
     boolean generateIds,
     boolean generateHeader,
     String idValueNotSerialized)
     throws IOException {
   logger.debug("Serializando Cambios del SVG...");
   SVGDocument document = raster.getSVGDocument();
   return document.serializeModifiedNodes2XML(
       outputStream, generateIds, generateHeader, idValueNotSerialized);
 }
示例#4
0
  private void viewerResized() {
    width = getSize().x;
    height = getSize().y;
    logger.debug("Tamaño del viewer: " + width + "x" + height);

    if (svgImage != null && !svgImage.isDisposed()) svgImage.dispose();

    if (offscreenImage != null && !offscreenImage.isDisposed()) {
      offscreenImage.dispose();
    }
    offscreenImage = new Image(getDisplay(), width, height);

    // Crea el raster SVG
    TinyPixbuf buffer = new TinyPixbuf(width, height);
    raster = new SVGRaster(buffer);
    imageProducer = new ImageProducer(raster);
    imageProducer.setConsumer(this);
    raster.setSVGImageProducer(imageProducer);

    // Antialiasing
    raster.setAntialiased(antialiased);

    // Poner fondo transparente
    raster.setBackground(0x00FFFFFF);

    // Avisar al manejador de eventos de que el tamaño ha cambiado
    if (mouseHandler != null) {
      mouseHandler.viewerResized();
    }

    // Cargar el documento pendiente, si existe
    if (pendingSVG != null) {
      loadSVGUrl(pendingSVG);
      pendingSVG = null;
    } else {
      if (currentSVG != null) {
        loadSVGUrl(currentSVG);
      }
    }
  }
示例#5
0
 public void setAntialiased(boolean antialiased) {
   if (this.antialiased != antialiased) {
     this.antialiased = antialiased;
     raster.setAntialiased(antialiased);
   }
 }
示例#6
0
  public void setPixels(
      final int xmin,
      final int ymin,
      final int width,
      final int height,
      final int[] pixels32,
      final int pixeloffset,
      final int pixelscan) {
    logger.debug("Actualizando imagen de pantalla");
    // Zona actual e imagen de fondo
    if (loaded) {
      SVGNode root = raster.document.root;
      // Zona actual
      TinyMatrix inverse = root.getGlobalTransform().inverse();
      TinyPoint p1 = new TinyPoint(0, 0);
      inverse.transform(p1);
      TinyPoint p2 = new TinyPoint(width << TinyUtil.FIX_BITS, height << TinyUtil.FIX_BITS);
      inverse.transform(p2);

      if (currentZone.isEmpty()
          || currentZone.xmin != p1.x
          || currentZone.ymin != p1.y
          || currentZone.xmax != p2.x
          || currentZone.ymax != p2.y) {
        currentZone.xmin = p1.x;
        currentZone.ymin = p1.y;
        currentZone.xmax = p2.x;
        currentZone.ymax = p2.y;
        // Nueva imagen de fondo
        if (backImage != null && !backImage.isDisposed()) {
          backImage.dispose();
          backImage = null;
        }
        backImage = getBackImage();
      }
    }

    // Imagen del SVG
    int totalHeight = 0;
    try {
      totalHeight = pixels32.length / pixelscan;

      // Establecer los pixeles y los alphas
      ImageData imData =
          new ImageData(pixelscan, totalHeight, 32, new PaletteData(0xFF0000, 0xFF00, 0xFF));

      byte[] alphaData = new byte[pixels32.length];
      for (int i = 0; i < pixels32.length; i++) {
        alphaData[i] = (byte) (pixels32[i] >> 24);
      }
      imData.setPixels(0, 0, pixels32.length, pixels32, 0);
      imData.setAlphas(0, 0, pixels32.length, alphaData, 0);
      if (svgImage != null && !svgImage.isDisposed()) svgImage.dispose();
      // logger.debug("Antes de generar la imagen1:");
      // logger.debug("Antes de generar la imagen2:"+imData.height);
      svgImage = new Image(Display.getDefault(), imData);
      logger.debug("Imagen generada");
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      logger.debug("ERROR");
    }

    logger.debug("Verificando clipping");
    // Clipping
    if (width < pixelscan || height < totalHeight) {
      logger.debug("Hay clipping");
      GC gc = new GC(svgImage);
      int rasterBackground = raster.getBackground();
      Color rasterBackgroundColor =
          new Color(
              Display.getDefault(),
              (rasterBackground & 0x00FF0000) >> 16,
              (rasterBackground & 0x0000FF00) >> 8,
              (rasterBackground & 0x000000FF));
      gc.setBackground(rasterBackgroundColor);
      if (xmin > 0) {
        gc.fillRectangle(0, 0, xmin, totalHeight);
      }
      if (xmin + width < pixelscan) {
        gc.fillRectangle(xmin + width, 0, pixelscan - xmin - width, totalHeight);
      }
      if (ymin > 0) {
        gc.fillRectangle(0, 0, pixelscan, ymin);
      }
      if (ymin + height < totalHeight) {
        gc.fillRectangle(0, ymin + height, pixelscan, totalHeight - ymin - height);
      }
      rasterBackgroundColor.dispose();
      gc.dispose();
    }

    // logger.debug("Arrancando thread de display");
    if (synchPaint) {
      getDisplay().syncExec(new redrawThread());
    } else {
      getDisplay().asyncExec(new redrawThread());
    }
    logger.debug("Imagen de pantalla actualizada");
  }
示例#7
0
 /**
  * Escribe en el stream de salida que se le pasa por parámetro el contenido del árbol DOM en xml.
  */
 public void serializeSVG2XML(OutputStream outputStream) throws IOException {
   logger.debug("Serializando SVG...");
   SVGDocument document = raster.getSVGDocument();
   document.serializeSVG2XML(outputStream);
   logger.debug("SVG serializado");
 }
示例#8
0
 /**
  * Loads an SVGT document from the given InputStream.
  *
  * @param is The InputStream.
  * @return An SVGT document.
  */
 private SVGDocument loadSVG(InputStream is) {
   loaded = false;
   String errorMessage = null;
   Throwable throwable = null;
   SVGDocument doc = raster.createSVGDocument();
   try {
     // Read and parse the SVGT stream
     TinyPixbuf pixbuf = raster.getPixelBuffer();
     // Create the SVGT attributes parser
     SVGAttr attrParser = new SVGAttr(pixbuf.width, pixbuf.height);
     // Create the SVGT stream parser
     SVGParser parser = new SVGParser(attrParser);
     // Parse the input SVGT stream parser into the document
     int errorCode = parser.load(doc, is);
     errorCode = errorCode >> 10;
     if (errorCode != 0) {
       logger.error("Error al parsear SVG. Código:" + errorCode);
       errorMessage = "Error de sintaxis XML";
     } else {
       if (doc.root.children == null || doc.root.children.data[0] instanceof SVGUnknownElem) {
         errorMessage = "El fichero no es un SVG válido";
       } else {
         // Fichero correcto
         logger.debug("Fichero cargado correctamente");
         loaded = true;
       }
     }
   } catch (OutOfMemoryError memerror) {
     doc = null;
     Runtime.getRuntime().gc();
     logger.error("Not enought memory", memerror);
     errorMessage = "Memoria insuficiente";
     throwable = memerror;
     // memerror.printStackTrace();
   } catch (SecurityException secex) {
     doc = null;
     logger.error("Security violation", secex);
     errorMessage = "Violación de seguridad";
     throwable = secex;
     // secex.printStackTrace();
   } catch (Exception ex) {
     doc = null;
     logger.error("Not in SVGT format", ex);
     errorMessage = "El fichero no está en formato SVG Tiny";
     throwable = ex;
     // ex.printStackTrace();
   } catch (Throwable t) {
     doc = null;
     logger.error("Not in SVGT format", t);
     errorMessage = "El fichero no está en formato SVG Tiny";
     throwable = t;
     // thr.printStackTrace();
   } finally {
     if (errorMessage != null) {
       Enumeration en = errorListeners.elements();
       while (en.hasMoreElements()) {
         SVGViewerErrorListener l = (SVGViewerErrorListener) en.nextElement();
         l.error(new SVGViewerErrorEvent(errorMessage, throwable));
       }
     }
     try {
       if (is != null) is.close();
     } catch (IOException ioe) {
       logger.error(ioe);
       // ioe.printStackTrace();
     }
   }
   return doc;
 }