java.awt.AlphaComposite#SrcOver ( )源码实例Demo

下面列出了java.awt.AlphaComposite#SrcOver ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: dragonwell8_jdk   文件: BufferedTextPipe.java
@Override
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
        /*
         * In addition to the composite types listed above, the logic
         * in OGL/D3DSurfaceData.validatePipe() allows for
         * CompositeType.SrcNoEa, but only in the presence of an opaque
         * color.  If we reach this case, we know the color is opaque,
         * and therefore SrcNoEa is the same as SrcOverNoEa, so we
         * override the composite here.
         */
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp);
        enqueueGlyphList(sg2d, gl);
    } finally {
        rq.unlock();
    }
}
 
源代码2 项目: pumpernickel   文件: AbstractGraphics2D.java
public void reset() {
	hints = new RenderingHints(RenderingHints.KEY_RENDERING,
			RenderingHints.VALUE_RENDER_DEFAULT);
	composite = AlphaComposite.SrcOver;
	paint = Color.white;
	background = Color.white;
	stroke = new BasicStroke(1);
	transform = new AffineTransform();
	font = UIManager.getFont("Label.font") == null ? new Font("Default", 0,
			12) : UIManager.getFont("Label.font");
	clipping = null;
}
 
源代码3 项目: TencentKona-8   文件: BufferedTextPipe.java
@Override
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
        /*
         * In addition to the composite types listed above, the logic
         * in OGL/D3DSurfaceData.validatePipe() allows for
         * CompositeType.SrcNoEa, but only in the presence of an opaque
         * color.  If we reach this case, we know the color is opaque,
         * and therefore SrcNoEa is the same as SrcOverNoEa, so we
         * override the composite here.
         */
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp);
        enqueueGlyphList(sg2d, gl);
    } finally {
        rq.unlock();
    }
}
 
源代码4 项目: openjdk-8   文件: BufferedTextPipe.java
@Override
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
        /*
         * In addition to the composite types listed above, the logic
         * in OGL/D3DSurfaceData.validatePipe() allows for
         * CompositeType.SrcNoEa, but only in the presence of an opaque
         * color.  If we reach this case, we know the color is opaque,
         * and therefore SrcNoEa is the same as SrcOverNoEa, so we
         * override the composite here.
         */
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp);
        enqueueGlyphList(sg2d, gl);
    } finally {
        rq.unlock();
    }
}
 
源代码5 项目: jdk8u60   文件: BufferedTextPipe.java
@Override
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
        /*
         * In addition to the composite types listed above, the logic
         * in OGL/D3DSurfaceData.validatePipe() allows for
         * CompositeType.SrcNoEa, but only in the presence of an opaque
         * color.  If we reach this case, we know the color is opaque,
         * and therefore SrcNoEa is the same as SrcOverNoEa, so we
         * override the composite here.
         */
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp);
        enqueueGlyphList(sg2d, gl);
    } finally {
        rq.unlock();
    }
}
 
源代码6 项目: openjdk-jdk9   文件: BufferedTextPipe.java
@Override
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
        /*
         * In addition to the composite types listed above, the logic
         * in OGL/D3DSurfaceData.validatePipe() allows for
         * CompositeType.SrcNoEa, but only in the presence of an opaque
         * color.  If we reach this case, we know the color is opaque,
         * and therefore SrcNoEa is the same as SrcOverNoEa, so we
         * override the composite here.
         */
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp);
        enqueueGlyphList(sg2d, gl);
    } finally {
        rq.unlock();
    }
}
 
源代码7 项目: hottub   文件: BufferedTextPipe.java
@Override
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
        /*
         * In addition to the composite types listed above, the logic
         * in OGL/D3DSurfaceData.validatePipe() allows for
         * CompositeType.SrcNoEa, but only in the presence of an opaque
         * color.  If we reach this case, we know the color is opaque,
         * and therefore SrcNoEa is the same as SrcOverNoEa, so we
         * override the composite here.
         */
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp);
        enqueueGlyphList(sg2d, gl);
    } finally {
        rq.unlock();
    }
}
 
源代码8 项目: openjdk-8   文件: BufferedMaskBlit.java
@Override
public void MaskBlit(SurfaceData src, SurfaceData dst,
                     Composite comp, Region clip,
                     int srcx, int srcy,
                     int dstx, int dsty,
                     int width, int height,
                     byte[] mask, int maskoff, int maskscan)
{
    if (width <= 0 || height <= 0) {
        return;
    }

    if (mask == null) {
        // no mask involved; delegate to regular blit loop
        if (blitop == null) {
            blitop = Blit.getFromCache(src.getSurfaceType(),
                                       CompositeType.AnyAlpha,
                                       this.getDestType());
        }
        blitop.Blit(src, dst,
                    comp, clip,
                    srcx, srcy, dstx, dsty,
                    width, height);
        return;
    }

    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(dst, comp, clip);

        RenderBuffer buf = rq.getBuffer();
        int totalBytesRequired = 20 + (width * height * 4);

        /*
         * REMIND: we should fix this so that it works with tiles that
         *         are larger than the entire buffer, but the native
         *         OGL/D3DMaskBlit isn't even prepared for tiles larger
         *         than 32x32 pixels, so there's no urgency here...
         */
        rq.ensureCapacity(totalBytesRequired);

        // enqueue parameters and tile pixels
        int newpos = enqueueTile(buf.getAddress(), buf.position(),
                                 src, src.getNativeOps(), srcTypeVal,
                                 mask, mask.length, maskoff, maskscan,
                                 srcx, srcy, dstx, dsty,
                                 width, height);

        buf.position(newpos);
    } finally {
        rq.unlock();
    }
}
 
源代码9 项目: jdk8u-jdk   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码10 项目: TencentKona-8   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码11 项目: hottub   文件: BufferedMaskBlit.java
@Override
public void MaskBlit(SurfaceData src, SurfaceData dst,
                     Composite comp, Region clip,
                     int srcx, int srcy,
                     int dstx, int dsty,
                     int width, int height,
                     byte[] mask, int maskoff, int maskscan)
{
    if (width <= 0 || height <= 0) {
        return;
    }

    if (mask == null) {
        // no mask involved; delegate to regular blit loop
        if (blitop == null) {
            blitop = Blit.getFromCache(src.getSurfaceType(),
                                       CompositeType.AnyAlpha,
                                       this.getDestType());
        }
        blitop.Blit(src, dst,
                    comp, clip,
                    srcx, srcy, dstx, dsty,
                    width, height);
        return;
    }

    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(dst, comp, clip);

        RenderBuffer buf = rq.getBuffer();
        int totalBytesRequired = 20 + (width * height * 4);

        /*
         * REMIND: we should fix this so that it works with tiles that
         *         are larger than the entire buffer, but the native
         *         OGL/D3DMaskBlit isn't even prepared for tiles larger
         *         than 32x32 pixels, so there's no urgency here...
         */
        rq.ensureCapacity(totalBytesRequired);

        // enqueue parameters and tile pixels
        int newpos = enqueueTile(buf.getAddress(), buf.position(),
                                 src, src.getNativeOps(), srcTypeVal,
                                 mask, mask.length, maskoff, maskscan,
                                 srcx, srcy, dstx, dsty,
                                 width, height);

        buf.position(newpos);
    } finally {
        rq.unlock();
    }
}
 
源代码12 项目: jdk8u_jdk   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码13 项目: jdk8u-jdk   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码14 项目: jdk8u-dev-jdk   文件: BufferedMaskBlit.java
@Override
public void MaskBlit(SurfaceData src, SurfaceData dst,
                     Composite comp, Region clip,
                     int srcx, int srcy,
                     int dstx, int dsty,
                     int width, int height,
                     byte[] mask, int maskoff, int maskscan)
{
    if (width <= 0 || height <= 0) {
        return;
    }

    if (mask == null) {
        // no mask involved; delegate to regular blit loop
        if (blitop == null) {
            blitop = Blit.getFromCache(src.getSurfaceType(),
                                       CompositeType.AnyAlpha,
                                       this.getDestType());
        }
        blitop.Blit(src, dst,
                    comp, clip,
                    srcx, srcy, dstx, dsty,
                    width, height);
        return;
    }

    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(dst, comp, clip);

        RenderBuffer buf = rq.getBuffer();
        int totalBytesRequired = 20 + (width * height * 4);

        /*
         * REMIND: we should fix this so that it works with tiles that
         *         are larger than the entire buffer, but the native
         *         OGL/D3DMaskBlit isn't even prepared for tiles larger
         *         than 32x32 pixels, so there's no urgency here...
         */
        rq.ensureCapacity(totalBytesRequired);

        // enqueue parameters and tile pixels
        int newpos = enqueueTile(buf.getAddress(), buf.position(),
                                 src, src.getNativeOps(), srcTypeVal,
                                 mask, mask.length, maskoff, maskscan,
                                 srcx, srcy, dstx, dsty,
                                 width, height);

        buf.position(newpos);
    } finally {
        rq.unlock();
    }
}
 
源代码15 项目: openjdk-jdk8u-backup   文件: BufferedMaskBlit.java
@Override
public void MaskBlit(SurfaceData src, SurfaceData dst,
                     Composite comp, Region clip,
                     int srcx, int srcy,
                     int dstx, int dsty,
                     int width, int height,
                     byte[] mask, int maskoff, int maskscan)
{
    if (width <= 0 || height <= 0) {
        return;
    }

    if (mask == null) {
        // no mask involved; delegate to regular blit loop
        if (blitop == null) {
            blitop = Blit.getFromCache(src.getSurfaceType(),
                                       CompositeType.AnyAlpha,
                                       this.getDestType());
        }
        blitop.Blit(src, dst,
                    comp, clip,
                    srcx, srcy, dstx, dsty,
                    width, height);
        return;
    }

    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(dst, comp, clip);

        RenderBuffer buf = rq.getBuffer();
        int totalBytesRequired = 20 + (width * height * 4);

        /*
         * REMIND: we should fix this so that it works with tiles that
         *         are larger than the entire buffer, but the native
         *         OGL/D3DMaskBlit isn't even prepared for tiles larger
         *         than 32x32 pixels, so there's no urgency here...
         */
        rq.ensureCapacity(totalBytesRequired);

        // enqueue parameters and tile pixels
        int newpos = enqueueTile(buf.getAddress(), buf.position(),
                                 src, src.getNativeOps(), srcTypeVal,
                                 mask, mask.length, maskoff, maskscan,
                                 srcx, srcy, dstx, dsty,
                                 width, height);

        buf.position(newpos);
    } finally {
        rq.unlock();
    }
}
 
源代码16 项目: jdk8u_jdk   文件: BufferedMaskBlit.java
@Override
public void MaskBlit(SurfaceData src, SurfaceData dst,
                     Composite comp, Region clip,
                     int srcx, int srcy,
                     int dstx, int dsty,
                     int width, int height,
                     byte[] mask, int maskoff, int maskscan)
{
    if (width <= 0 || height <= 0) {
        return;
    }

    if (mask == null) {
        // no mask involved; delegate to regular blit loop
        if (blitop == null) {
            blitop = Blit.getFromCache(src.getSurfaceType(),
                                       CompositeType.AnyAlpha,
                                       this.getDestType());
        }
        blitop.Blit(src, dst,
                    comp, clip,
                    srcx, srcy, dstx, dsty,
                    width, height);
        return;
    }

    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(dst, comp, clip);

        RenderBuffer buf = rq.getBuffer();
        int totalBytesRequired = 20 + (width * height * 4);

        /*
         * REMIND: we should fix this so that it works with tiles that
         *         are larger than the entire buffer, but the native
         *         OGL/D3DMaskBlit isn't even prepared for tiles larger
         *         than 32x32 pixels, so there's no urgency here...
         */
        rq.ensureCapacity(totalBytesRequired);

        // enqueue parameters and tile pixels
        int newpos = enqueueTile(buf.getAddress(), buf.position(),
                                 src, src.getNativeOps(), srcTypeVal,
                                 mask, mask.length, maskoff, maskscan,
                                 srcx, srcy, dstx, dsty,
                                 width, height);

        buf.position(newpos);
    } finally {
        rq.unlock();
    }
}
 
源代码17 项目: Bytecoder   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码18 项目: jdk8u-dev-jdk   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码19 项目: openjdk-jdk9   文件: BufferedMaskFill.java
@Override
public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
                     Composite comp,
                     final int x, final int y, final int w, final int h,
                     final byte[] mask,
                     final int maskoff, final int maskscan)
{
    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(sg2d, comp, BufferedContext.USE_MASK);

        // we adjust the mask length so that the mask ends on a
        // 4-byte boundary
        int maskBytesRequired;
        if (mask != null) {
            // we adjust the mask length so that the mask ends on a
            // 4-byte boundary
            maskBytesRequired = (mask.length + 3) & (~3);
        } else {
            // mask not needed
            maskBytesRequired = 0;
        }
        int totalBytesRequired = 32 + maskBytesRequired;

        RenderBuffer buf = rq.getBuffer();
        if (totalBytesRequired <= buf.capacity()) {
            if (totalBytesRequired > buf.remaining()) {
                // process the queue first and then enqueue the mask
                rq.flushNow();
            }

            buf.putInt(MASK_FILL);
            // enqueue parameters
            buf.putInt(x).putInt(y).putInt(w).putInt(h);
            buf.putInt(maskoff);
            buf.putInt(maskscan);
            buf.putInt(maskBytesRequired);
            if (mask != null) {
                // enqueue the mask
                int padding = maskBytesRequired - mask.length;
                buf.put(mask);
                if (padding != 0) {
                    buf.position(buf.position() + padding);
                }
            }
        } else {
            // queue is too small to accommodate entire mask; perform
            // the operation directly on the queue flushing thread
            rq.flushAndInvokeNow(new Runnable() {
                public void run() {
                    maskFill(x, y, w, h,
                             maskoff, maskscan, mask.length, mask);
                }
            });
        }
    } finally {
        rq.unlock();
    }
}
 
源代码20 项目: openjdk-jdk9   文件: BufferedMaskBlit.java
@Override
public void MaskBlit(SurfaceData src, SurfaceData dst,
                     Composite comp, Region clip,
                     int srcx, int srcy,
                     int dstx, int dsty,
                     int width, int height,
                     byte[] mask, int maskoff, int maskscan)
{
    if (width <= 0 || height <= 0) {
        return;
    }

    if (mask == null) {
        // no mask involved; delegate to regular blit loop
        if (blitop == null) {
            blitop = Blit.getFromCache(src.getSurfaceType(),
                                       CompositeType.AnyAlpha,
                                       this.getDestType());
        }
        blitop.Blit(src, dst,
                    comp, clip,
                    srcx, srcy, dstx, dsty,
                    width, height);
        return;
    }

    AlphaComposite acomp = (AlphaComposite)comp;
    if (acomp.getRule() != AlphaComposite.SRC_OVER) {
        comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
        validateContext(dst, comp, clip);

        RenderBuffer buf = rq.getBuffer();
        int totalBytesRequired = 20 + (width * height * 4);

        /*
         * REMIND: we should fix this so that it works with tiles that
         *         are larger than the entire buffer, but the native
         *         OGL/D3DMaskBlit isn't even prepared for tiles larger
         *         than 32x32 pixels, so there's no urgency here...
         */
        rq.ensureCapacity(totalBytesRequired);

        // enqueue parameters and tile pixels
        int newpos = enqueueTile(buf.getAddress(), buf.position(),
                                 src, src.getNativeOps(), srcTypeVal,
                                 mask, mask.length, maskoff, maskscan,
                                 srcx, srcy, dstx, dsty,
                                 width, height);

        buf.position(newpos);
    } finally {
        rq.unlock();
    }
}