< prev index next >

modules/javafx.graphics/src/main/java/com/sun/prism/sw/SWContext.java

Print this page

        

*** 27,36 **** --- 27,39 ---- import com.sun.javafx.geom.Path2D; import com.sun.javafx.geom.Rectangle; import com.sun.javafx.geom.Shape; import com.sun.javafx.geom.transform.BaseTransform; + import com.sun.marlin.DMarlinRenderer; + import com.sun.marlin.DMarlinRenderingEngine; + import com.sun.marlin.DRendererContext; import com.sun.marlin.IntArrayCache; import com.sun.marlin.MarlinAlphaConsumer; import com.sun.marlin.MarlinConst; import com.sun.marlin.MarlinRenderer; import com.sun.marlin.MarlinRenderingEngine;
*** 40,49 **** --- 43,54 ---- import com.sun.prism.BasicStroke; import com.sun.prism.PixelFormat; import com.sun.prism.ResourceFactory; import com.sun.prism.Texture; import com.sun.prism.impl.PrismSettings; + import com.sun.prism.impl.shape.DMarlinPrismUtils; + import com.sun.prism.impl.shape.DMarlinRasterizer; import com.sun.prism.impl.shape.MarlinPrismUtils; import com.sun.prism.impl.shape.MaskData; import com.sun.prism.impl.shape.OpenPiscesPrismUtils; import com.sun.prism.impl.shape.ShapeUtil;
*** 175,281 **** } } @Override public void dispose() { } ! private static final class DirectRTMarlinAlphaConsumer implements MarlinAlphaConsumer { ! private byte alpha_map[]; ! private int x; ! private int y; ! private int w; ! private int h; ! private int rowNum; ! private PiscesRenderer pr; ! public void initConsumer(int x, int y, int w, int h, PiscesRenderer pr) { ! this.x = x; ! this.y = y; ! this.w = w; ! this.h = h; ! rowNum = 0; ! this.pr = pr; ! } ! @Override ! public int getOriginX() { ! return x; ! } ! @Override ! public int getOriginY() { ! return y; ! } ! @Override ! public int getWidth() { ! return w; } ! @Override ! public int getHeight() { ! return h; ! } ! @Override ! public void setMaxAlpha(int maxalpha) { ! if ((alpha_map == null) || (alpha_map.length != maxalpha+1)) { ! alpha_map = new byte[maxalpha+1]; ! for (int i = 0; i <= maxalpha; i++) { ! alpha_map[i] = (byte) ((i*255 + maxalpha/2)/maxalpha); ! } ! } ! } ! @Override ! public boolean supportBlockFlags() { ! return false; } ! @Override ! public void clearAlphas(final int pix_y) { ! // noop } ! @Override ! public void setAndClearRelativeAlphas(final int[] alphaDeltas, final int pix_y, ! final int pix_from, final int pix_to) ! { ! // use x instead of pix_from as it cause artefacts: ! // note: it would be more efficient to skip all those empty pixels [x to pix_from[ ! // but the native implementation must be fixed too. ! // pr.emitAndClearAlphaRow(alpha_map, alphaDeltas, pix_y, pix_from, pix_to, rowNum); ! pr.emitAndClearAlphaRow(alpha_map, alphaDeltas, pix_y, x, pix_to, rowNum); ! rowNum++; ! // clear properly the end of the alphaDeltas: ! final int to = pix_to - x; ! if (to <= w) { ! alphaDeltas[to] = 0; ! } else { ! alphaDeltas[w] = 0; ! } ! if (MarlinConst.DO_CHECKS) { ! IntArrayCache.check(alphaDeltas, pix_from - x, to + 1, 0); ! } } ! ! @Override ! public void setAndClearRelativeAlphas(final int[] blkFlags, final int[] alphaDeltas, final int pix_y, ! final int pix_from, final int pix_to) ! { ! throw new UnsupportedOperationException(); } } } SWContext(ResourceFactory factory) { this.factory = factory; if (PrismSettings.useMarlinRasterizer) { ! this.shapeRenderer = new MarlinShapeRenderer(); } else if (PrismSettings.doNativePisces) { this.shapeRenderer = new NativeShapeRenderer(); } else { this.shapeRenderer = new JavaShapeRenderer(); } --- 180,340 ---- } } @Override public void dispose() { } + } ! static final class DirectRTMarlinAlphaConsumer implements MarlinAlphaConsumer { ! private byte alpha_map[]; ! private int x; ! private int y; ! private int w; ! private int h; ! private int rowNum; ! ! private PiscesRenderer pr; ! ! public void initConsumer(int x, int y, int w, int h, PiscesRenderer pr) { ! this.x = x; ! this.y = y; ! this.w = w; ! this.h = h; ! rowNum = 0; ! this.pr = pr; ! } ! @Override ! public int getOriginX() { ! return x; ! } ! @Override ! public int getOriginY() { ! return y; ! } ! @Override ! public int getWidth() { ! return w; ! } ! @Override ! public int getHeight() { ! return h; ! } ! @Override ! public void setMaxAlpha(int maxalpha) { ! if ((alpha_map == null) || (alpha_map.length != maxalpha+1)) { ! alpha_map = new byte[maxalpha+1]; ! for (int i = 0; i <= maxalpha; i++) { ! alpha_map[i] = (byte) ((i*255 + maxalpha/2)/maxalpha); ! } } + } ! @Override ! public boolean supportBlockFlags() { ! return false; ! } ! @Override ! public void clearAlphas(final int pix_y) { ! // noop ! } ! ! @Override ! public void setAndClearRelativeAlphas(final int[] alphaDeltas, final int pix_y, ! final int pix_from, final int pix_to) ! { ! // use x instead of pix_from as it cause artefacts: ! // note: it would be more efficient to skip all those empty pixels [x to pix_from[ ! // but the native implementation must be fixed too. ! // pr.emitAndClearAlphaRow(alpha_map, alphaDeltas, pix_y, pix_from, pix_to, rowNum); ! pr.emitAndClearAlphaRow(alpha_map, alphaDeltas, pix_y, x, pix_to, rowNum); ! rowNum++; ! // clear properly the end of the alphaDeltas: ! final int to = pix_to - x; ! if (to <= w) { ! alphaDeltas[to] = 0; ! } else { ! alphaDeltas[w] = 0; } ! if (MarlinConst.DO_CHECKS) { ! IntArrayCache.check(alphaDeltas, pix_from - x, to + 1, 0); } + } ! @Override ! public void setAndClearRelativeAlphas(final int[] blkFlags, final int[] alphaDeltas, final int pix_y, ! final int pix_from, final int pix_to) ! { ! throw new UnsupportedOperationException(); ! } ! } ! static final class DMarlinShapeRenderer implements ShapeRenderer { ! private final DirectRTMarlinAlphaConsumer alphaConsumer = new DirectRTMarlinAlphaConsumer(); ! @Override ! public void renderShape(PiscesRenderer pr, Shape shape, BasicStroke stroke, BaseTransform tr, Rectangle clip, boolean antialiasedShape) { ! if (stroke != null && stroke.getType() != BasicStroke.TYPE_CENTERED) { ! // RT-27427 ! // TODO: Optimize the combinatorial strokes for simple ! // shapes and/or teach the rasterizer to be able to ! // do a "differential fill" between two shapes. ! // Note that most simple shapes will use a more optimized path ! // than this method for the INNER/OUTER strokes anyway. ! shape = stroke.createStrokedShape(shape); ! stroke = null; } ! final DRendererContext rdrCtx = DMarlinRenderingEngine.getRendererContext(); ! DMarlinRenderer renderer = null; ! try { ! if (shape instanceof Path2D) { ! renderer = DMarlinPrismUtils.setupRenderer(rdrCtx, (Path2D) shape, stroke, tr, clip, ! antialiasedShape); ! } ! if (renderer == null) { ! renderer = DMarlinPrismUtils.setupRenderer(rdrCtx, shape, stroke, tr, clip, ! antialiasedShape); ! } ! final int outpix_xmin = renderer.getOutpixMinX(); ! final int outpix_xmax = renderer.getOutpixMaxX(); ! final int outpix_ymin = renderer.getOutpixMinY(); ! final int outpix_ymax = renderer.getOutpixMaxY(); ! final int w = outpix_xmax - outpix_xmin; ! final int h = outpix_ymax - outpix_ymin; ! if ((w <= 0) || (h <= 0)) { ! return; ! } ! alphaConsumer.initConsumer(outpix_xmin, outpix_ymin, w, h, pr); ! renderer.produceAlphas(alphaConsumer); ! } finally { ! if (renderer != null) { ! renderer.dispose(); ! } ! // recycle the RendererContext instance ! DMarlinRenderingEngine.returnRendererContext(rdrCtx); } } + + @Override + public void dispose() { } } SWContext(ResourceFactory factory) { this.factory = factory; if (PrismSettings.useMarlinRasterizer) { ! if (PrismSettings.useMarlinRasterizerDP) { ! this.shapeRenderer = new DMarlinShapeRenderer(); ! } else { ! this.shapeRenderer = new MarlinShapeRenderer(); ! } } else if (PrismSettings.doNativePisces) { this.shapeRenderer = new NativeShapeRenderer(); } else { this.shapeRenderer = new JavaShapeRenderer(); }
< prev index next >