2370N/A/*
2685N/A * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2370N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2370N/A *
2370N/A * This code is free software; you can redistribute it and/or modify it
2370N/A * under the terms of the GNU General Public License version 2 only, as
2685N/A * published by the Free Software Foundation. Oracle designates this
2370N/A * particular file as subject to the "Classpath" exception as provided
2685N/A * by Oracle in the LICENSE file that accompanied this code.
2370N/A *
2370N/A * This code is distributed in the hope that it will be useful, but WITHOUT
2370N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2370N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2370N/A * version 2 for more details (a copy is included in the LICENSE file that
2370N/A * accompanied this code).
2370N/A *
2370N/A * You should have received a copy of the GNU General Public License version
2370N/A * 2 along with this work; if not, write to the Free Software Foundation,
2370N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2370N/A *
2685N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2685N/A * or visit www.oracle.com if you need additional information or have any
2685N/A * questions.
2370N/A */
2370N/A
2370N/Apackage sun.java2d.xr;
2370N/A
2370N/Aimport sun.awt.SunToolkit;
2370N/Aimport sun.awt.image.*;
2370N/Aimport sun.java2d.loops.*;
2370N/Aimport sun.java2d.pipe.*;
2370N/Aimport sun.java2d.*;
2370N/Aimport java.awt.*;
2370N/Aimport java.awt.geom.*;
2370N/Aimport java.lang.ref.*;
2370N/A
2370N/Apublic class XRPMBlitLoops {
2370N/A
2370N/A static WeakReference<SunVolatileImage> argbTmpPM = new WeakReference<SunVolatileImage>(null);
2370N/A static WeakReference<SunVolatileImage> rgbTmpPM = new WeakReference<SunVolatileImage>(null);
2370N/A
2370N/A public XRPMBlitLoops() {
2370N/A }
2370N/A
2370N/A public static void register() {
2370N/A GraphicsPrimitive[] primitives = { new XRPMBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntRgbX11),
2370N/A new XRPMBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntArgbPreX11),
2370N/A new XRPMBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntRgbX11),
2370N/A new XRPMBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntArgbPreX11),
2370N/A
2370N/A new XRPMScaledBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntRgbX11),
2370N/A new XRPMScaledBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntArgbPreX11),
2370N/A new XRPMScaledBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntRgbX11),
2370N/A new XRPMScaledBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntArgbPreX11),
2370N/A
2370N/A new XRPMTransformedBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntRgbX11),
2370N/A new XRPMTransformedBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntArgbPreX11),
2370N/A new XRPMTransformedBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntRgbX11),
2370N/A new XRPMTransformedBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntArgbPreX11),
2370N/A
2370N/A /* SW -> Surface Blits */
2370N/A new XrSwToPMBlit(SurfaceType.IntArgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMBlit(SurfaceType.IntRgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMBlit(SurfaceType.IntBgr, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntRgbX11),
2370N/A
2370N/A new XrSwToPMBlit(SurfaceType.IntArgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMBlit(SurfaceType.IntRgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMBlit(SurfaceType.IntBgr, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntArgbPreX11),
2370N/A
2370N/A /* SW->Surface Scales */
2370N/A new XrSwToPMScaledBlit(SurfaceType.IntArgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.IntRgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.IntBgr, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntRgbX11),
2370N/A
2370N/A new XrSwToPMScaledBlit(SurfaceType.IntArgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.IntRgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.IntBgr, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMScaledBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntArgbPreX11),
2370N/A
2370N/A /* SW->Surface Transforms */
2370N/A new XrSwToPMTransformedBlit(SurfaceType.IntArgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.IntRgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.IntBgr, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntRgbX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntRgbX11),
2370N/A
2370N/A new XrSwToPMTransformedBlit(SurfaceType.IntArgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.IntRgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.IntBgr, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntArgbPreX11),
2370N/A new XrSwToPMTransformedBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntArgbPreX11), };
2370N/A GraphicsPrimitiveMgr.register(primitives);
2370N/A }
2370N/A
2370N/A /**
2370N/A * Caches a SW surface using a temporary pixmap. The pixmap is held by a WeakReference,
2370N/A * allowing it to shrink again after some time.
2370N/A */
2370N/A protected static XRSurfaceData cacheToTmpSurface(SurfaceData src, XRSurfaceData dst, int w, int h, int sx, int sy) {
2370N/A SunVolatileImage vImg;
2370N/A SurfaceType vImgSurfaceType;
2370N/A
2370N/A if (src.getTransparency() == Transparency.OPAQUE) {
2370N/A vImg = rgbTmpPM.get();
2370N/A vImgSurfaceType = SurfaceType.IntRgb;
2370N/A } else {
2370N/A vImg = argbTmpPM.get();
2370N/A vImgSurfaceType = SurfaceType.IntArgbPre;
2370N/A }
2370N/A
2370N/A if (vImg == null || vImg.getWidth() < w || vImg.getHeight() < h) {
2370N/A if (vImg != null) {
2370N/A vImg.flush();
2370N/A }
2370N/A vImg = (SunVolatileImage) dst.getGraphicsConfig().createCompatibleVolatileImage(w, h, src.getTransparency());
2370N/A vImg.setAccelerationPriority(1.0f);
2370N/A
2370N/A if (src.getTransparency() == SurfaceData.OPAQUE) {
2370N/A rgbTmpPM = new WeakReference<SunVolatileImage>(vImg);
2370N/A } else {
2370N/A argbTmpPM = new WeakReference<SunVolatileImage>(vImg);
2370N/A }
2370N/A }
2370N/A
2370N/A Blit swToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, vImgSurfaceType);
2370N/A XRSurfaceData vImgSurface = (XRSurfaceData) vImg.getDestSurface();
3814N/A swToSurfaceBlit.Blit(src, vImgSurface, AlphaComposite.Src, null,
3814N/A sx, sy, 0, 0, w, h);
2370N/A
2370N/A return vImgSurface;
2370N/A }
2370N/A}
2370N/A
2370N/Aclass XRPMBlit extends Blit {
2370N/A public XRPMBlit(SurfaceType srcType, SurfaceType dstType) {
2370N/A super(srcType, CompositeType.AnyAlpha, dstType);
2370N/A }
2370N/A
2370N/A public void Blit(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx, int sy, int dx, int dy, int w, int h) {
2370N/A try {
2370N/A SunToolkit.awtLock();
2370N/A
2370N/A XRSurfaceData x11sdDst = (XRSurfaceData) dst;
2370N/A x11sdDst.validateAsDestination(null, clip);
2370N/A XRSurfaceData x11sdSrc = (XRSurfaceData) src;
2370N/A x11sdSrc.validateAsSource(null, XRUtils.RepeatNone, XRUtils.FAST);
2370N/A
2370N/A x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
2370N/A
2370N/A x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, sx, sy, dx, dy, w, h);
2370N/A } finally {
2370N/A SunToolkit.awtUnlock();
2370N/A }
2370N/A }
2370N/A}
2370N/A
2370N/Aclass XRPMScaledBlit extends ScaledBlit {
2370N/A public XRPMScaledBlit(SurfaceType srcType, SurfaceType dstType) {
2370N/A super(srcType, CompositeType.AnyAlpha, dstType);
2370N/A }
2370N/A
2370N/A /*
2370N/A * TODO: This breaks scales with non-integer coordinates!?!?!
2370N/A */
2370N/A public void Scale(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx1, int sy1, int sx2, int sy2, double dx1, double dy1,
2370N/A double dx2, double dy2) {
2370N/A try {
2370N/A SunToolkit.awtLock();
2370N/A
2370N/A XRSurfaceData x11sdDst = (XRSurfaceData) dst;
2370N/A x11sdDst.validateAsDestination(null, clip);
2370N/A XRSurfaceData x11sdSrc = (XRSurfaceData) src;
2370N/A x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
2370N/A
2370N/A double xScale = (dx2 - dx1) / (sx2 - sx1);
2370N/A double yScale = (dy2 - dy1) / (sy2 - sy1);
2370N/A
2370N/A sx1 *= xScale;
2370N/A sx2 *= xScale;
2370N/A sy1 *= yScale;
2370N/A sy2 *= yScale;
2370N/A
2370N/A AffineTransform xForm = AffineTransform.getScaleInstance(1 / xScale, 1 / yScale);
2370N/A
2370N/A x11sdSrc.validateAsSource(xForm, XRUtils.RepeatNone, XRUtils.FAST); /*
2370N/A * TODO:
2370N/A * padded
2370N/A * blit
2370N/A * required
2370N/A * :
2370N/A * -
2370N/A * /
2370N/A * ?
2370N/A * ?
2370N/A */
2370N/A x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, (int) sx1, (int) sy1, (int) dx1, (int) dy1, (int) (dx2 - dx1), (int) (dy2 - dy1));
2370N/A } finally {
2370N/A SunToolkit.awtUnlock();
2370N/A }
2370N/A }
2370N/A}
2370N/A
2370N/A/**
2370N/A * Called also if scale+transform is set
2370N/A *
2370N/A * @author Clemens Eisserer
2370N/A */
2370N/Aclass XRPMTransformedBlit extends TransformBlit {
2370N/A
2370N/A public XRPMTransformedBlit(SurfaceType srcType, SurfaceType dstType) {
2370N/A super(srcType, CompositeType.AnyAlpha, dstType);
2370N/A }
2370N/A
2370N/A /*
2370N/A * Calculates the composite-rectangle required for transformed blits. This
2370N/A * method is functionally equal to: Shape shp =
2370N/A * xform.createTransformedShape(rect); Rectangle bounds = shp.getBounds();
2370N/A * but performs significantly better.
2370N/A */
2370N/A public Rectangle getCompositeBounds(AffineTransform tr, int dstx, int dsty, int width, int height) {
2370N/A double[] compBounds = new double[8];
2370N/A compBounds[0] = dstx;
2370N/A compBounds[1] = dsty;
2370N/A compBounds[2] = dstx + width;
2370N/A compBounds[3] = dsty;
2370N/A compBounds[4] = dstx + width;
2370N/A compBounds[5] = dsty + height;
2370N/A compBounds[6] = dstx;
2370N/A compBounds[7] = dsty + height;
2370N/A
2370N/A tr.transform(compBounds, 0, compBounds, 0, 4);
2370N/A
2370N/A double minX = Math.min(compBounds[0], Math.min(compBounds[2], Math.min(compBounds[4], compBounds[6])));
2370N/A double minY = Math.min(compBounds[1], Math.min(compBounds[3], Math.min(compBounds[5], compBounds[7])));
2370N/A double maxX = Math.max(compBounds[0], Math.max(compBounds[2], Math.max(compBounds[4], compBounds[6])));
2370N/A double maxY = Math.max(compBounds[1], Math.max(compBounds[3], Math.max(compBounds[5], compBounds[7])));
2370N/A
2370N/A minX = Math.floor(minX);
2370N/A minY = Math.floor(minY);
2370N/A maxX = Math.ceil(maxX);
2370N/A maxY = Math.ceil(maxY);
2370N/A
2370N/A return new Rectangle((int) minX, (int) minY, (int) (maxX - minX), (int) (maxY - minY));
2370N/A }
2370N/A
2370N/A public void Transform(SurfaceData src, SurfaceData dst, Composite comp, Region clip, AffineTransform xform, int hint, int srcx, int srcy,
2370N/A int dstx, int dsty, int width, int height) {
2370N/A try {
2370N/A SunToolkit.awtLock();
2370N/A
2370N/A int filter = XRUtils.ATransOpToXRQuality(hint);
2370N/A
2370N/A XRSurfaceData x11sdDst = (XRSurfaceData) dst;
2370N/A x11sdDst.validateAsDestination(null, clip);
2370N/A XRSurfaceData x11sdSrc = (XRSurfaceData) src;
2370N/A x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
2370N/A
2370N/A Rectangle bounds = getCompositeBounds(xform, dstx, dsty, width, height);
2370N/A
2370N/A AffineTransform trx = AffineTransform.getTranslateInstance((-bounds.x), (-bounds.y));
2370N/A trx.concatenate(xform);
2370N/A AffineTransform maskTX = (AffineTransform) trx.clone();
2370N/A
2370N/A trx.translate(-srcx, -srcy);
2370N/A
2370N/A try {
2370N/A trx.invert();
2370N/A } catch (NoninvertibleTransformException ex) {
2370N/A trx.setToIdentity();
2370N/A System.err.println("Reseted to identity!");
2370N/A }
2370N/A
2370N/A boolean omitMask = isMaskOmittable(trx, comp, filter);
2370N/A
2370N/A if (!omitMask) {
2370N/A XRMaskImage mask = x11sdSrc.maskBuffer.getMaskImage();
2370N/A
2370N/A x11sdSrc.validateAsSource(trx, XRUtils.RepeatPad, filter);
2370N/A int maskPicture = mask.prepareBlitMask(x11sdDst, maskTX, width, height);
2370N/A x11sdDst.maskBuffer.con.renderComposite(XRCompositeManager.getInstance(x11sdSrc).getCompRule(), x11sdSrc.picture, maskPicture, x11sdDst.picture,
2370N/A 0, 0, 0, 0, bounds.x, bounds.y, bounds.width, bounds.height);
2370N/A } else {
2370N/A int repeat = filter == XRUtils.FAST ? XRUtils.RepeatNone : XRUtils.RepeatPad;
2370N/A
2370N/A x11sdSrc.validateAsSource(trx, repeat, filter);
2370N/A x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, 0, 0, bounds.x, bounds.y, bounds.width, bounds.height);
2370N/A }
2370N/A } finally {
2370N/A SunToolkit.awtUnlock();
2370N/A }
2370N/A }
2370N/A
2370N/A /* TODO: Is mask ever omitable??? ... should be for 90 degree rotation and no shear, but we always need to use RepeatPad */
2370N/A protected static boolean isMaskOmittable(AffineTransform trx, Composite comp, int filter) {
2370N/A return (filter == XRUtils.FAST || trx.getTranslateX() == (int) trx.getTranslateX() /*
2370N/A * If
2370N/A * translate
2370N/A * is
2370N/A * integer
2370N/A * only
2370N/A */
2370N/A && trx.getTranslateY() == (int) trx.getTranslateY() && (trx.getShearX() == 0 && trx.getShearY() == 0 // Only
2370N/A // 90 degree
2370N/A // rotation
2370N/A || trx.getShearX() == -trx.getShearY())) && ((AlphaComposite) comp).getAlpha() == 1.0f; // No
2370N/A // ExtraAlpha!=1
2370N/A }
2370N/A}
2370N/A
2370N/Aclass XrSwToPMBlit extends Blit {
2370N/A Blit pmToSurfaceBlit;
2370N/A
2370N/A XrSwToPMBlit(SurfaceType srcType, SurfaceType dstType) {
2370N/A super(srcType, CompositeType.AnyAlpha, dstType);
2370N/A pmToSurfaceBlit = new XRPMBlit(dstType, dstType);
2370N/A }
2370N/A
2370N/A public void Blit(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx, int sy, int dx, int dy, int w, int h) {
2370N/A /*
2370N/A * If the blit is write-only (putimge), no need for a temporary VI.
2370N/A */
2370N/A if (CompositeType.SrcOverNoEa.equals(comp) && (src.getTransparency() == Transparency.OPAQUE)) {
2370N/A Blit opaqueSwToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, dst.getSurfaceType());
2370N/A opaqueSwToSurfaceBlit.Blit(src, dst, comp, clip, sx, sy, dx, dy, w, h);
2370N/A } else {
2370N/A try {
2370N/A SunToolkit.awtLock();
2370N/A
2370N/A XRSurfaceData vImgSurface = XRPMBlitLoops.cacheToTmpSurface(src, (XRSurfaceData) dst, w, h, sx, sy);
2370N/A pmToSurfaceBlit.Blit(vImgSurface, dst, comp, clip, 0, 0, dx, dy, w, h);
2370N/A } finally {
2370N/A SunToolkit.awtUnlock();
2370N/A }
2370N/A }
2370N/A }
2370N/A}
2370N/A
2370N/Aclass XrSwToPMScaledBlit extends ScaledBlit {
2370N/A ScaledBlit pmToSurfaceBlit;
2370N/A
2370N/A XrSwToPMScaledBlit(SurfaceType srcType, SurfaceType dstType) {
2370N/A super(srcType, CompositeType.AnyAlpha, dstType);
2370N/A pmToSurfaceBlit = new XRPMScaledBlit(dstType, dstType);
2370N/A }
2370N/A
2370N/A public void Scale(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx1, int sy1, int sx2, int sy2, double dx1, double dy1,
2370N/A double dx2, double dy2) {
2370N/A {
2370N/A int w = sx2 - sx1;
2370N/A int h = sy2 - sy1;
2370N/A
2370N/A try {
2370N/A SunToolkit.awtLock();
2370N/A XRSurfaceData vImgSurface = XRPMBlitLoops.cacheToTmpSurface(src, (XRSurfaceData) dst, w, h, sx1, sy1);
2370N/A pmToSurfaceBlit.Scale(vImgSurface, dst, comp, clip, 0, 0, w, h, dx1, dy1, dx2, dy2);
2370N/A } finally {
2370N/A SunToolkit.awtUnlock();
2370N/A }
2370N/A }
2370N/A }
2370N/A}
2370N/A
2370N/Aclass XrSwToPMTransformedBlit extends TransformBlit {
2370N/A TransformBlit pmToSurfaceBlit;
2370N/A
2370N/A XrSwToPMTransformedBlit(SurfaceType srcType, SurfaceType dstType) {
2370N/A super(srcType, CompositeType.AnyAlpha, dstType);
2370N/A pmToSurfaceBlit = new XRPMTransformedBlit(dstType, dstType);
2370N/A }
2370N/A
2370N/A public void Transform(SurfaceData src, SurfaceData dst, Composite comp, Region clip, AffineTransform xform, int hint, int sx, int sy, int dstx,
2370N/A int dsty, int w, int h) {
2370N/A try {
2370N/A SunToolkit.awtLock();
2370N/A
2370N/A XRSurfaceData vImgSurface = XRPMBlitLoops.cacheToTmpSurface(src, (XRSurfaceData) dst, w, h, sx, sy);
2370N/A pmToSurfaceBlit.Transform(vImgSurface, dst, comp, clip, xform, hint, 0, 0, dstx, dsty, w, h);
2370N/A } finally {
2370N/A SunToolkit.awtUnlock();
2370N/A }
2370N/A }
2370N/A}