1 /*
   2  * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package sun.java2d.metal;
  26 
  27 import sun.java2d.InvalidPipeException;
  28 import sun.java2d.SunGraphics2D;
  29 import sun.java2d.loops.GraphicsPrimitive;
  30 import sun.java2d.pipe.BufferedRenderPipe;
  31 import sun.java2d.pipe.ParallelogramPipe;
  32 import sun.java2d.pipe.RenderQueue;
  33 import sun.java2d.pipe.SpanIterator;
  34 
  35 import java.awt.*;
  36 import java.awt.geom.Path2D;
  37 
  38 import static sun.java2d.pipe.BufferedOpCodes.COPY_AREA;
  39 
  40 class MTLRenderer extends BufferedRenderPipe {
  41 
  42     MTLRenderer(RenderQueue rq) {
  43         super(rq);
  44     }
  45 
  46     @Override
  47     protected void validateContext(SunGraphics2D sg2d) {
  48         int ctxflags =
  49             sg2d.paint.getTransparency() == Transparency.OPAQUE ?
  50                 MTLContext.SRC_IS_OPAQUE : MTLContext.NO_CONTEXT_FLAGS;
  51         MTLSurfaceData dstData;
  52         try {
  53             dstData = (MTLSurfaceData)sg2d.surfaceData;
  54         } catch (ClassCastException e) {
  55             throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
  56         }
  57         MTLContext.validateContext(dstData, dstData,
  58                                    sg2d.getCompClip(), sg2d.composite,
  59                                    null, sg2d.paint, sg2d, ctxflags);
  60     }
  61 
  62     @Override
  63     protected void validateContextAA(SunGraphics2D sg2d) {
  64         int ctxflags = MTLContext.NO_CONTEXT_FLAGS;
  65         MTLSurfaceData dstData;
  66         try {
  67             dstData = (MTLSurfaceData)sg2d.surfaceData;
  68         } catch (ClassCastException e) {
  69             throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
  70         }
  71         MTLContext.validateContext(dstData, dstData,
  72                                    sg2d.getCompClip(), sg2d.composite,
  73                                    null, sg2d.paint, sg2d, ctxflags);
  74     }
  75 
  76     void copyArea(SunGraphics2D sg2d,
  77                   int x, int y, int w, int h, int dx, int dy)
  78     {
  79         rq.lock();
  80         try {
  81             int ctxflags =
  82                 sg2d.surfaceData.getTransparency() == Transparency.OPAQUE ?
  83                     MTLContext.SRC_IS_OPAQUE : MTLContext.NO_CONTEXT_FLAGS;
  84             MTLSurfaceData dstData;
  85             try {
  86                 dstData = (MTLSurfaceData)sg2d.surfaceData;
  87             } catch (ClassCastException e) {
  88                 throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
  89             }
  90             MTLContext.validateContext(dstData, dstData,
  91                                        sg2d.getCompClip(), sg2d.composite,
  92                                        null, null, null, ctxflags);
  93 
  94             rq.ensureCapacity(28);
  95             buf.putInt(COPY_AREA);
  96             buf.putInt(x).putInt(y).putInt(w).putInt(h);
  97             buf.putInt(dx).putInt(dy);
  98         } finally {
  99             rq.unlock();
 100         }
 101     }
 102 
 103     @Override
 104     protected native void drawPoly(int[] xPoints, int[] yPoints,
 105                                    int nPoints, boolean isClosed,
 106                                    int transX, int transY);
 107 
 108     MTLRenderer traceWrap() {
 109         return new Tracer(this);
 110     }
 111 
 112     private class Tracer extends MTLRenderer {
 113         private MTLRenderer mtlr;
 114         Tracer(MTLRenderer mtlr) {
 115             super(mtlr.rq);
 116             this.mtlr = mtlr;
 117         }
 118         public ParallelogramPipe getAAParallelogramPipe() {
 119             final ParallelogramPipe realpipe = mtlr.getAAParallelogramPipe();
 120             return new ParallelogramPipe() {
 121                 public void fillParallelogram(SunGraphics2D sg2d,
 122                                               double ux1, double uy1,
 123                                               double ux2, double uy2,
 124                                               double x, double y,
 125                                               double dx1, double dy1,
 126                                               double dx2, double dy2)
 127                 {
 128                     GraphicsPrimitive.tracePrimitive("MTLFillAAParallelogram");
 129                     realpipe.fillParallelogram(sg2d,
 130                                                ux1, uy1, ux2, uy2,
 131                                                x, y, dx1, dy1, dx2, dy2);
 132                 }
 133                 public void drawParallelogram(SunGraphics2D sg2d,
 134                                               double ux1, double uy1,
 135                                               double ux2, double uy2,
 136                                               double x, double y,
 137                                               double dx1, double dy1,
 138                                               double dx2, double dy2,
 139                                               double lw1, double lw2)
 140                 {
 141                     GraphicsPrimitive.tracePrimitive("MTLDrawAAParallelogram");
 142                     realpipe.drawParallelogram(sg2d,
 143                                                ux1, uy1, ux2, uy2,
 144                                                x, y, dx1, dy1, dx2, dy2,
 145                                                lw1, lw2);
 146                 }
 147             };
 148         }
 149         protected void validateContext(SunGraphics2D sg2d) {
 150             mtlr.validateContext(sg2d);
 151         }
 152         public void drawLine(SunGraphics2D sg2d,
 153                              int x1, int y1, int x2, int y2)
 154         {
 155             GraphicsPrimitive.tracePrimitive("MTLDrawLine");
 156             mtlr.drawLine(sg2d, x1, y1, x2, y2);
 157         }
 158         public void drawRect(SunGraphics2D sg2d, int x, int y, int w, int h) {
 159             GraphicsPrimitive.tracePrimitive("MTLDrawRect");
 160             mtlr.drawRect(sg2d, x, y, w, h);
 161         }
 162         protected void drawPoly(SunGraphics2D sg2d,
 163                                 int[] xPoints, int[] yPoints,
 164                                 int nPoints, boolean isClosed)
 165         {
 166             GraphicsPrimitive.tracePrimitive("MTLDrawPoly");
 167             mtlr.drawPoly(sg2d, xPoints, yPoints, nPoints, isClosed);
 168         }
 169         public void fillRect(SunGraphics2D sg2d, int x, int y, int w, int h) {
 170             GraphicsPrimitive.tracePrimitive("MTLFillRect");
 171             mtlr.fillRect(sg2d, x, y, w, h);
 172         }
 173         protected void drawPath(SunGraphics2D sg2d,
 174                                 Path2D.Float p2df, int transx, int transy)
 175         {
 176             GraphicsPrimitive.tracePrimitive("MTLDrawPath");
 177             mtlr.drawPath(sg2d, p2df, transx, transy);
 178         }
 179         protected void fillPath(SunGraphics2D sg2d,
 180                                 Path2D.Float p2df, int transx, int transy)
 181         {
 182             GraphicsPrimitive.tracePrimitive("MTLFillPath");
 183             mtlr.fillPath(sg2d, p2df, transx, transy);
 184         }
 185         protected void fillSpans(SunGraphics2D sg2d, SpanIterator si,
 186                                  int transx, int transy)
 187         {
 188             GraphicsPrimitive.tracePrimitive("MTLFillSpans");
 189             mtlr.fillSpans(sg2d, si, transx, transy);
 190         }
 191         public void fillParallelogram(SunGraphics2D sg2d,
 192                                       double ux1, double uy1,
 193                                       double ux2, double uy2,
 194                                       double x, double y,
 195                                       double dx1, double dy1,
 196                                       double dx2, double dy2)
 197         {
 198             GraphicsPrimitive.tracePrimitive("MTLFillParallelogram");
 199             mtlr.fillParallelogram(sg2d,
 200                                    ux1, uy1, ux2, uy2,
 201                                    x, y, dx1, dy1, dx2, dy2);
 202         }
 203         public void drawParallelogram(SunGraphics2D sg2d,
 204                                       double ux1, double uy1,
 205                                       double ux2, double uy2,
 206                                       double x, double y,
 207                                       double dx1, double dy1,
 208                                       double dx2, double dy2,
 209                                       double lw1, double lw2)
 210         {
 211             GraphicsPrimitive.tracePrimitive("MTLDrawParallelogram");
 212             mtlr.drawParallelogram(sg2d,
 213                                    ux1, uy1, ux2, uy2,
 214                                    x, y, dx1, dy1, dx2, dy2, lw1, lw2);
 215         }
 216         public void copyArea(SunGraphics2D sg2d,
 217                              int x, int y, int w, int h, int dx, int dy)
 218         {
 219             GraphicsPrimitive.tracePrimitive("MTLCopyArea");
 220             mtlr.copyArea(sg2d, x, y, w, h, dx, dy);
 221         }
 222     }
 223 }