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(); } } }
/** * 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(); }
/** * 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); }
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); } } }
public void setAntialiased(boolean antialiased) { if (this.antialiased != antialiased) { this.antialiased = antialiased; raster.setAntialiased(antialiased); } }
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"); }
/** * 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"); }
/** * 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; }