modules/graphics/src/main/java/com/sun/prism/impl/ps/BaseShaderGraphics.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -445,58 +445,56 @@
         context.validateTextureOp(this, IDENT, tex, null, tex.getPixelFormat());
         vb.addQuad(dx1, dy1, dx2, dy2, tx1, ty1, tx2, ty2);
         tex.unlock();
     }
 
+    private static RectBounds TMP_BOUNDS = new RectBounds();
     @Override
     protected void renderShape(Shape shape, BasicStroke stroke,
                                float bx, float by, float bw, float bh)
     {
         if (isComplexPaint) {
             renderWithComplexPaint(shape, stroke, bx, by, bw, bh);
             return;
         }
 
-        // creating/updating the mask texture may unset the current
-        // texture used by pending vertices, so flush the vertex buffer first
-        context.flushVertexBuffer();
-
         // The following is safe; this method does not mutate the transform
         BaseTransform xform = getTransformNoClone();
         MaskData maskData =
             ShapeUtil.rasterizeShape(shape, stroke, getFinalClipNoClone(), xform, true, isAntialiasedShape());
-        Texture maskTex = context.getMaskTexture(maskData, false);
-        int maskW = maskData.getWidth();
-        int maskH = maskData.getHeight();
-
-        float dx1 = maskData.getOriginX();
-        float dy1 = maskData.getOriginY();
-        float dx2 = dx1 + maskW;
-        float dy2 = dy1 + maskH;
-        float tx1 = 0f;
-        float ty1 = 0f;
-        float tx2 = tx1 + ((float)maskW) / maskTex.getPhysicalWidth();
-        float ty2 = ty1 + ((float)maskH) / maskTex.getPhysicalHeight();
+        Texture maskTex = context.validateMaskTexture(maskData, false);
 
+        AffineBase paintTx;
         if (PrismSettings.primTextureSize != 0) {
             // the mask has been generated in device space, so we use
             // identity transform here
             Shader shader =
                 context.validatePaintOp(this, IDENT, MaskType.ALPHA_TEXTURE, maskTex,
                                         bx, by, bw, bh);
 
-            VertexBuffer vb = context.getVertexBuffer();
-            vb.addQuad(dx1, dy1, dx2, dy2, tx1, ty1, tx2, ty2,
-                    getPaintTextureTx(xform, shader, bx, by, bw, bh));
+            paintTx = getPaintTextureTx(xform, shader, bx, by, bw, bh);
         } else {        
             // the mask has been generated in device space, so we use
             // identity transform here
             context.validatePaintOp(this, IDENT, maskTex, bx, by, bw, bh);
+            paintTx = null;
+        }
+
+        context.updateMaskTexture(maskData, TMP_BOUNDS, false);
+
+        float dx1 = maskData.getOriginX();
+        float dy1 = maskData.getOriginY();
+        float dx2 = dx1 + maskData.getWidth();
+        float dy2 = dy1 + maskData.getHeight();
+        float tx1 = TMP_BOUNDS.getMinX();
+        float ty1 = TMP_BOUNDS.getMinY();
+        float tx2 = TMP_BOUNDS.getMaxX();
+        float ty2 = TMP_BOUNDS.getMaxY();
 
             VertexBuffer vb = context.getVertexBuffer();
-            vb.addQuad(dx1, dy1, dx2, dy2, tx1, ty1, tx2, ty2);
-        }
+        vb.addQuad(dx1, dy1, dx2, dy2, tx1, ty1, tx2, ty2, paintTx);
+
         maskTex.unlock();
     }
 
     private static float getStrokeExpansionFactor(BasicStroke stroke) {
         if (stroke.getType() == BasicStroke.TYPE_OUTER) {