diff -r 1b7871df7e4f modules/web/src/main/java/com/sun/javafx/sg/prism/NGWebView.java --- a/modules/web/src/main/java/com/sun/javafx/sg/prism/NGWebView.java Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/java/com/sun/javafx/sg/prism/NGWebView.java Wed Sep 18 13:01:15 2013 +0400 @@ -8,8 +8,10 @@ import com.sun.javafx.geom.BaseBounds; import com.sun.javafx.geom.RectBounds; import com.sun.javafx.geom.transform.BaseTransform; +import com.sun.javafx.geom.transform.GeneralTransform3D; import com.sun.prism.Graphics; import com.sun.prism.PrinterGraphics; +import com.sun.prism.paint.Color; import com.sun.webkit.WebPage; import com.sun.webkit.graphics.WCGraphicsContext; import com.sun.webkit.graphics.WCGraphicsManager; @@ -60,22 +62,46 @@ // Invoked on Render Thread. @Override protected void renderContent(Graphics g) { - log.log(Level.FINEST, "rendering into {0}", g); - if (g == null || page == null || width <= 0 || height <= 0) - return; + NGCamera oldCamera = g.getCameraNoClone(); + + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m1 = new GeneralTransform3D(); + m1.set(new double[]{ + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1, + }); - WCGraphicsContext gc = - WCGraphicsManager.getGraphicsManager().createGraphicsContext(g); - try { - if (g instanceof PrinterGraphics) { - page.print(gc, 0, 0, (int) width, (int) height); - } else { - page.paint(gc, 0, 0, (int) width, (int) height); - } - } finally { - gc.dispose(); - } + GeneralTransform3D m2 = new GeneralTransform3D(); + m2.set(new double[]{ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, -0.001, 1, + }); + GeneralTransform3D t = m2.mul(m1); + + apply(g, t); + + g.setPaint(new Color(0, 0, 1, 1)); + g.fillRect(0, 0, 600, 100); + + g.setCamera(oldCamera); + } + + private static void apply(Graphics g, GeneralTransform3D m) { + NGDefaultCamera camera = new NGDefaultCamera(); + camera.validate( + g.getRenderTarget().getPhysicalWidth(), + g.getRenderTarget().getPhysicalHeight()); + GeneralTransform3D t = camera.getProjViewTx(null); + t = t.mul(m); + camera.setProjViewTransform(t); + g.setCamera(camera); } @Override public boolean hasOverlappingContents() { diff -r 1b7871df7e4f modules/web/src/main/java/com/sun/javafx/webkit/prism/WCGraphicsPrismContext.java --- a/modules/web/src/main/java/com/sun/javafx/webkit/prism/WCGraphicsPrismContext.java Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/java/com/sun/javafx/webkit/prism/WCGraphicsPrismContext.java Wed Sep 18 13:01:15 2013 +0400 @@ -10,6 +10,8 @@ import com.sun.javafx.geom.transform.Affine2D; import com.sun.javafx.geom.transform.Affine3D; import com.sun.javafx.geom.transform.BaseTransform; +import com.sun.javafx.geom.transform.GeneralTransform3D; +import com.sun.javafx.geom.transform.NoninvertibleTransformException; import com.sun.javafx.scene.text.GlyphList; import com.sun.javafx.scene.text.TextLayout; import com.sun.javafx.sg.prism.*; @@ -676,6 +678,201 @@ srcx, srcy, srcw, srch}); } + if (dsth < 300) { + Graphics g = getGraphics(true); + int test = 4; + + if (test == 0) { // Order of operations + // GREEN + g.setPaint(new Color(0, 1, 0, 1)); + g.fillRect(0, 60, 5, 40); + + // BLUE + { + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m = new GeneralTransform3D(); + m.set(new double[]{ + c, s, 0, 0, + -s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + }); + + apply(g, m); + + g.setPaint(new Color(0, 0, 1, 1)); + g.fillRect(0, 60, 5, 40); + } + + // CYAN + { + GeneralTransform3D m = new GeneralTransform3D(); + m.set(new double[]{ + 1, 0, 0, 0, + 0, 1, 0, -40, + 0, 0, 1, 0, + 0, 0, 0, 1, + }); + + apply(g, m); + + g.setPaint(new Color(0, 1, 1, 1)); + g.fillRect(0, 60, 5, 40); + } + + // RED + { + GeneralTransform3D m1 = new GeneralTransform3D(); + m1.set(new double[]{ + 1, 0, 0, 0, + 0, 1, 0, -40, + 0, 0, 1, 0, + 0, 0, 0, 1, + }); + + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m2 = new GeneralTransform3D(); + m2.set(new double[]{ + c, s, 0, 0, + -s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + }); + + GeneralTransform3D t = m2.mul(m1); + apply(g, t); + + g.setPaint(new Color(1, 0, 0, 1)); + g.fillRect(0, 60, 5, 40); + } + + // MAGENTA + { + GeneralTransform3D m1 = new GeneralTransform3D(); + m1.set(new double[]{ + 1, 0, 0, 0, + 0, 1, 0, -40, + 0, 0, 1, 0, + 0, 0, 0, 1, + }); + + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m2 = new GeneralTransform3D(); + m2.set(new double[]{ + c, s, 0, 0, + -s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + }); + + GeneralTransform3D t = m1.mul(m2); + apply(g, t); + + g.setPaint(new Color(1, 0, 1, 1)); + g.fillRect(0, 60, 5, 40); + } + } else if (test == 1) { // Shows nothing + // GREEN + //g.setPaint(new Color(0, 1, 0, 1)); + //g.fillRect(0, 0, 600, 100); + + // BLUE + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m = new GeneralTransform3D(); + m.set(new double[]{ + c, 0, s, 0, + 0, 1, 0, 0, + -s, 0, c, 0, + 0, 0, 0, 1, + }); + + apply(g, m); + + g.setPaint(new Color(0, 0, 1, 1)); + g.fillRect(0, 0, 600, 100); + } else if (test == 2) { // Shows something + // GREEN + //g.setPaint(new Color(0, 1, 0, 1)); + //g.fillRect(0, 0, 600, 100); + + // BLUE + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m = new GeneralTransform3D(); + m.set(new double[]{ + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1, + }); + + apply(g, m); + + g.setPaint(new Color(0, 0, 1, 1)); + g.fillRect(0, 0, 600, 100); + } else if (test == 3) { // Perspective, shows something + double b = Math.toRadians(20); + double s = Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m1 = new GeneralTransform3D(); + m1.set(new double[]{ + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1, + }); + + GeneralTransform3D m2 = new GeneralTransform3D(); + m2.set(new double[]{ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, -0.001, 1, + }); + + GeneralTransform3D t = m2.mul(m1); + + apply(g, t); + + g.setPaint(new Color(0, 0, 1, 1)); + g.fillRect(0, 0, 600, 100); + } else if (test == 4) { // Perspective, shows nothing + double b = Math.toRadians(20); + double s = -Math.sin(b); + double c = Math.cos(b); + GeneralTransform3D m1 = new GeneralTransform3D(); + m1.set(new double[]{ + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1, + }); + + GeneralTransform3D m2 = new GeneralTransform3D(); + m2.set(new double[]{ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, -0.001, 1, + }); + + GeneralTransform3D t = m2.mul(m1); + + apply(g, t); + + g.setPaint(new Color(0, 0, 1, 1)); + g.fillRect(0, 0, 600, 100); + } + } else { if (img instanceof PrismImage) { new Composite() { @Override void doPaint(Graphics g) { @@ -699,6 +896,18 @@ } }.paint(); } + } + } + + private static void apply(Graphics g, GeneralTransform3D m) { + NGDefaultCamera camera = new NGDefaultCamera(); + camera.validate( + g.getRenderTarget().getPhysicalWidth(), + g.getRenderTarget().getPhysicalHeight()); + GeneralTransform3D t = camera.getProjViewTx(null); + t = t.mul(m); + camera.setProjViewTransform(t); + g.setCamera(camera); } @Override @@ -998,6 +1207,7 @@ private DropShadow shadow; private Affine3D xform; +// private GeneralTransform3D transform3D; private Layer layer; private int compositeOperation; @@ -1018,6 +1228,8 @@ clip = new Rectangle(clip); } xform = new Affine3D(state.getTransformNoClone()); +// transform3D = state.transform3D == null +// ? null : state.transform3D.copy(); setShadow(state.getShadowNoClone()); setLayer(state.getLayerNoClone()); setAlpha(state.getAlpha()); @@ -1135,6 +1347,14 @@ xform.concatenate(at); } +// private void concatTransform3D(GeneralTransform3D t) { +// if (transform3D == null) { +// transform3D = t; +// } else { +// transform3D.mul(t); +// } +// } +// private void translate(double dx, double dy) { xform.translate(dx, dy); } @@ -1571,6 +1791,25 @@ resetCachedGraphics(); } + public void concatTransform3D( + double m11, double m12, double m13, double m14, + double m21, double m22, double m23, double m24, + double m31, double m32, double m33, double m34, + double m41, double m42, double m43, double m44) + { +// GeneralTransform3D gt3d = new GeneralTransform3D(); +// gt3d.set(new double[] { +// m11, m12, m13, m14, +// m21, m22, m23, m24, +// m31, m32, m33, m34, +// m41, m42, m43, m44, +// }); +// if (!gt3d.isIdentity()) { +// state.concatTransform3D(gt3d); +// resetCachedGraphics(); +// } + } + public void dispose() { if (!states.isEmpty()) { new IllegalStateException("Unbalanced saveState/restoreState") diff -r 1b7871df7e4f modules/web/src/main/java/com/sun/webkit/graphics/GraphicsDecoder.java --- a/modules/web/src/main/java/com/sun/webkit/graphics/GraphicsDecoder.java Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/java/com/sun/webkit/graphics/GraphicsDecoder.java Wed Sep 18 13:01:15 2013 +0400 @@ -60,6 +60,7 @@ public final static int SET_LINE_JOIN = 53; public final static int SET_MITER_LIMIT = 54; public final static int SET_TEXT_MODE = 55; + public final static int CONCAT_TRANSFORM_3D = 56; private final static Logger log = Logger.getLogger(GraphicsDecoder.class.getName()); @@ -355,6 +356,17 @@ buf.getInt(), // width buf.getInt()); // height break; + case CONCAT_TRANSFORM_3D: + gc.concatTransform3D( + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat(), + buf.getFloat(), buf.getFloat()); + break; default: log.fine("ERROR. Unknown primitive found"); break; diff -r 1b7871df7e4f modules/web/src/main/java/com/sun/webkit/graphics/WCGraphicsContext.java --- a/modules/web/src/main/java/com/sun/webkit/graphics/WCGraphicsContext.java Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/java/com/sun/webkit/graphics/WCGraphicsContext.java Wed Sep 18 13:01:15 2013 +0400 @@ -69,6 +69,12 @@ public abstract WCTransform getTransform(); public abstract void concatTransform(WCTransform t); + public abstract void concatTransform3D( + double m11, double m12, double m13, double m14, + double m21, double m22, double m23, double m24, + double m31, double m32, double m33, double m34, + double m41, double m42, double m43, double m44); + public abstract void saveState(); public abstract void restoreState(); diff -r 1b7871df7e4f modules/web/src/main/java/com/sun/webkit/perf/WCGraphicsPerfLogger.java --- a/modules/web/src/main/java/com/sun/webkit/perf/WCGraphicsPerfLogger.java Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/java/com/sun/webkit/perf/WCGraphicsPerfLogger.java Wed Sep 18 13:01:15 2013 +0400 @@ -433,6 +433,22 @@ } @Override + public void concatTransform3D( + double m11, double m12, double m13, double m14, + double m21, double m22, double m23, double m24, + double m31, double m32, double m33, double m34, + double m41, double m42, double m43, double m44) + { + logger.resumeCount("CONCAT_TRANSFORM_3D"); + gc.concatTransform3D( + m11, m12, m13, m14, + m21, m22, m23, m24, + m31, m32, m33, m34, + m41, m42, m43, m44); + logger.suspendCount("CONCAT_TRANSFORM_3D"); + } + + @Override public void drawBitmapImage(ByteBuffer image, int x, int y, int w, int h) { logger.resumeCount("DRAWBITMAPIMAGE"); gc.drawBitmapImage(image, x, y, w, h); diff -r 1b7871df7e4f modules/web/src/main/native/Source/WebCore/platform/graphics/java/GraphicsContextJava.cpp --- a/modules/web/src/main/native/Source/WebCore/platform/graphics/java/GraphicsContextJava.cpp Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/native/Source/WebCore/platform/graphics/java/GraphicsContextJava.cpp Wed Sep 18 13:01:15 2013 +0400 @@ -866,9 +866,17 @@ return getCTM().toTransformationMatrix(); } -void GraphicsContext::concat3DTransform(const TransformationMatrix& transform) +void GraphicsContext::concat3DTransform(const TransformationMatrix& t) { - concatCTM(transform.toAffineTransform()); + if (paintingDisabled()) + return; + + platformContext()->rq().freeSpace(4 + 16 * 4) + << (jint)com_sun_webkit_graphics_GraphicsDecoder_CONCAT_TRANSFORM_3D + << (float) t.m11() << (float) t.m21() << (float) t.m31() << (float) t.m41() + << (float) t.m12() << (float) t.m22() << (float) t.m32() << (float) t.m42() + << (float) t.m13() << (float) t.m23() << (float) t.m33() << (float) t.m43() + << (float) t.m14() << (float) t.m24() << (float) t.m34() << (float) t.m44(); } void GraphicsContext::set3DTransform(const TransformationMatrix& transform) diff -r 1b7871df7e4f modules/web/src/main/native/Source/WebCore/platform/graphics/texmap/TextureMapperImageBuffer.cpp --- a/modules/web/src/main/native/Source/WebCore/platform/graphics/texmap/TextureMapperImageBuffer.cpp Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/native/Source/WebCore/platform/graphics/texmap/TextureMapperImageBuffer.cpp Wed Sep 18 13:01:15 2013 +0400 @@ -152,9 +152,31 @@ context->restore(); } -void TextureMapperImageBuffer::drawBorder(const Color&, float /* borderWidth */, const FloatRect&, const TransformationMatrix&) +void TextureMapperImageBuffer::drawBorder(const Color& color, float width, const FloatRect& rect, const TransformationMatrix& matrix) { - notImplemented(); + return; + GraphicsContext* context = currentContext(); + if (!context) + return; + + context->save(); +#if ENABLE(3D_RENDERING) + context->concat3DTransform(matrix); +#else + context->concatCTM(matrix.toAffineTransform()); +#endif + + float x = rect.x(); + float y = rect.y(); + float w = rect.width(); + float h = rect.height(); + ColorSpace cs(ColorSpaceDeviceRGB); + context->fillRect(FloatRect(x, y, w, width), color, cs); + context->fillRect(FloatRect(x, y + h - width, w, width), color, cs); + context->fillRect(FloatRect(x, y, width, h), color, cs); + context->fillRect(FloatRect(x + w - width, y, width, h), color, cs); + + context->restore(); } void TextureMapperImageBuffer::drawNumber(int /* number */, const Color&, const FloatPoint&, const TransformationMatrix&) diff -r 1b7871df7e4f modules/web/src/main/native/Source/WebCore/platform/java/WebPage.cpp --- a/modules/web/src/main/native/Source/WebCore/platform/java/WebPage.cpp Mon Sep 09 16:21:42 2013 +0200 +++ b/modules/web/src/main/native/Source/WebCore/platform/java/WebPage.cpp Wed Sep 18 13:01:15 2013 +0400 @@ -802,6 +802,7 @@ settings->setUserAgent(defaultUserAgent()); settings->setMaximumHTMLParserDOMTreeDepth(180); settings->setXSSAuditorEnabled(true); +// settings->setShowDebugBorders(true); /* Using java logical fonts as defaults */ settings->setSerifFontFamily("Serif");