src/java.desktop/share/classes/sun/java2d/pisces/TransformingPathConsumer2D.java
branchhttp-client-branch
changeset 55844 dbcbcda0e413
parent 55842 cb8fcde5b5c8
parent 47873 7944849362f3
child 55845 a88515bdd90a
equal deleted inserted replaced
55842:cb8fcde5b5c8 55844:dbcbcda0e413
     1 /*
       
     2  * Copyright (c) 2007, 2011, 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 
       
    26 package sun.java2d.pisces;
       
    27 
       
    28 import sun.awt.geom.PathConsumer2D;
       
    29 import java.awt.geom.AffineTransform;
       
    30 
       
    31 final class TransformingPathConsumer2D {
       
    32     public static PathConsumer2D
       
    33         transformConsumer(PathConsumer2D out,
       
    34                           AffineTransform at)
       
    35     {
       
    36         if (at == null) {
       
    37             return out;
       
    38         }
       
    39         float Mxx = (float) at.getScaleX();
       
    40         float Mxy = (float) at.getShearX();
       
    41         float Mxt = (float) at.getTranslateX();
       
    42         float Myx = (float) at.getShearY();
       
    43         float Myy = (float) at.getScaleY();
       
    44         float Myt = (float) at.getTranslateY();
       
    45         if (Mxy == 0f && Myx == 0f) {
       
    46             if (Mxx == 1f && Myy == 1f) {
       
    47                 if (Mxt == 0f && Myt == 0f) {
       
    48                     return out;
       
    49                 } else {
       
    50                     return new TranslateFilter(out, Mxt, Myt);
       
    51                 }
       
    52             } else {
       
    53                 if (Mxt == 0f && Myt == 0f) {
       
    54                     return new DeltaScaleFilter(out, Mxx, Myy);
       
    55                 } else {
       
    56                     return new ScaleFilter(out, Mxx, Myy, Mxt, Myt);
       
    57                 }
       
    58             }
       
    59         } else if (Mxt == 0f && Myt == 0f) {
       
    60             return new DeltaTransformFilter(out, Mxx, Mxy, Myx, Myy);
       
    61         } else {
       
    62             return new TransformFilter(out, Mxx, Mxy, Mxt, Myx, Myy, Myt);
       
    63         }
       
    64     }
       
    65 
       
    66     public static PathConsumer2D
       
    67         deltaTransformConsumer(PathConsumer2D out,
       
    68                                AffineTransform at)
       
    69     {
       
    70         if (at == null) {
       
    71             return out;
       
    72         }
       
    73         float Mxx = (float) at.getScaleX();
       
    74         float Mxy = (float) at.getShearX();
       
    75         float Myx = (float) at.getShearY();
       
    76         float Myy = (float) at.getScaleY();
       
    77         if (Mxy == 0f && Myx == 0f) {
       
    78             if (Mxx == 1f && Myy == 1f) {
       
    79                 return out;
       
    80             } else {
       
    81                 return new DeltaScaleFilter(out, Mxx, Myy);
       
    82             }
       
    83         } else {
       
    84             return new DeltaTransformFilter(out, Mxx, Mxy, Myx, Myy);
       
    85         }
       
    86     }
       
    87 
       
    88     public static PathConsumer2D
       
    89         inverseDeltaTransformConsumer(PathConsumer2D out,
       
    90                                       AffineTransform at)
       
    91     {
       
    92         if (at == null) {
       
    93             return out;
       
    94         }
       
    95         float Mxx = (float) at.getScaleX();
       
    96         float Mxy = (float) at.getShearX();
       
    97         float Myx = (float) at.getShearY();
       
    98         float Myy = (float) at.getScaleY();
       
    99         if (Mxy == 0f && Myx == 0f) {
       
   100             if (Mxx == 1f && Myy == 1f) {
       
   101                 return out;
       
   102             } else {
       
   103                 return new DeltaScaleFilter(out, 1.0f/Mxx, 1.0f/Myy);
       
   104             }
       
   105         } else {
       
   106             float det = Mxx * Myy - Mxy * Myx;
       
   107             return new DeltaTransformFilter(out,
       
   108                                             Myy / det,
       
   109                                             -Mxy / det,
       
   110                                             -Myx / det,
       
   111                                             Mxx / det);
       
   112         }
       
   113     }
       
   114 
       
   115     static final class TranslateFilter implements PathConsumer2D {
       
   116         private final PathConsumer2D out;
       
   117         private final float tx;
       
   118         private final float ty;
       
   119 
       
   120         TranslateFilter(PathConsumer2D out,
       
   121                         float tx, float ty)
       
   122         {
       
   123             this.out = out;
       
   124             this.tx = tx;
       
   125             this.ty = ty;
       
   126         }
       
   127 
       
   128         public void moveTo(float x0, float y0) {
       
   129             out.moveTo(x0 + tx, y0 + ty);
       
   130         }
       
   131 
       
   132         public void lineTo(float x1, float y1) {
       
   133             out.lineTo(x1 + tx, y1 + ty);
       
   134         }
       
   135 
       
   136         public void quadTo(float x1, float y1,
       
   137                            float x2, float y2)
       
   138         {
       
   139             out.quadTo(x1 + tx, y1 + ty,
       
   140                        x2 + tx, y2 + ty);
       
   141         }
       
   142 
       
   143         public void curveTo(float x1, float y1,
       
   144                             float x2, float y2,
       
   145                             float x3, float y3)
       
   146         {
       
   147             out.curveTo(x1 + tx, y1 + ty,
       
   148                         x2 + tx, y2 + ty,
       
   149                         x3 + tx, y3 + ty);
       
   150         }
       
   151 
       
   152         public void closePath() {
       
   153             out.closePath();
       
   154         }
       
   155 
       
   156         public void pathDone() {
       
   157             out.pathDone();
       
   158         }
       
   159 
       
   160         public long getNativeConsumer() {
       
   161             return 0;
       
   162         }
       
   163     }
       
   164 
       
   165     static final class ScaleFilter implements PathConsumer2D {
       
   166         private final PathConsumer2D out;
       
   167         private final float sx;
       
   168         private final float sy;
       
   169         private final float tx;
       
   170         private final float ty;
       
   171 
       
   172         ScaleFilter(PathConsumer2D out,
       
   173                     float sx, float sy, float tx, float ty)
       
   174         {
       
   175             this.out = out;
       
   176             this.sx = sx;
       
   177             this.sy = sy;
       
   178             this.tx = tx;
       
   179             this.ty = ty;
       
   180         }
       
   181 
       
   182         public void moveTo(float x0, float y0) {
       
   183             out.moveTo(x0 * sx + tx, y0 * sy + ty);
       
   184         }
       
   185 
       
   186         public void lineTo(float x1, float y1) {
       
   187             out.lineTo(x1 * sx + tx, y1 * sy + ty);
       
   188         }
       
   189 
       
   190         public void quadTo(float x1, float y1,
       
   191                            float x2, float y2)
       
   192         {
       
   193             out.quadTo(x1 * sx + tx, y1 * sy + ty,
       
   194                        x2 * sx + tx, y2 * sy + ty);
       
   195         }
       
   196 
       
   197         public void curveTo(float x1, float y1,
       
   198                             float x2, float y2,
       
   199                             float x3, float y3)
       
   200         {
       
   201             out.curveTo(x1 * sx + tx, y1 * sy + ty,
       
   202                         x2 * sx + tx, y2 * sy + ty,
       
   203                         x3 * sx + tx, y3 * sy + ty);
       
   204         }
       
   205 
       
   206         public void closePath() {
       
   207             out.closePath();
       
   208         }
       
   209 
       
   210         public void pathDone() {
       
   211             out.pathDone();
       
   212         }
       
   213 
       
   214         public long getNativeConsumer() {
       
   215             return 0;
       
   216         }
       
   217     }
       
   218 
       
   219     static final class TransformFilter implements PathConsumer2D {
       
   220         private final PathConsumer2D out;
       
   221         private final float Mxx;
       
   222         private final float Mxy;
       
   223         private final float Mxt;
       
   224         private final float Myx;
       
   225         private final float Myy;
       
   226         private final float Myt;
       
   227 
       
   228         TransformFilter(PathConsumer2D out,
       
   229                         float Mxx, float Mxy, float Mxt,
       
   230                         float Myx, float Myy, float Myt)
       
   231         {
       
   232             this.out = out;
       
   233             this.Mxx = Mxx;
       
   234             this.Mxy = Mxy;
       
   235             this.Mxt = Mxt;
       
   236             this.Myx = Myx;
       
   237             this.Myy = Myy;
       
   238             this.Myt = Myt;
       
   239         }
       
   240 
       
   241         public void moveTo(float x0, float y0) {
       
   242             out.moveTo(x0 * Mxx + y0 * Mxy + Mxt,
       
   243                        x0 * Myx + y0 * Myy + Myt);
       
   244         }
       
   245 
       
   246         public void lineTo(float x1, float y1) {
       
   247             out.lineTo(x1 * Mxx + y1 * Mxy + Mxt,
       
   248                        x1 * Myx + y1 * Myy + Myt);
       
   249         }
       
   250 
       
   251         public void quadTo(float x1, float y1,
       
   252                            float x2, float y2)
       
   253         {
       
   254             out.quadTo(x1 * Mxx + y1 * Mxy + Mxt,
       
   255                        x1 * Myx + y1 * Myy + Myt,
       
   256                        x2 * Mxx + y2 * Mxy + Mxt,
       
   257                        x2 * Myx + y2 * Myy + Myt);
       
   258         }
       
   259 
       
   260         public void curveTo(float x1, float y1,
       
   261                             float x2, float y2,
       
   262                             float x3, float y3)
       
   263         {
       
   264             out.curveTo(x1 * Mxx + y1 * Mxy + Mxt,
       
   265                         x1 * Myx + y1 * Myy + Myt,
       
   266                         x2 * Mxx + y2 * Mxy + Mxt,
       
   267                         x2 * Myx + y2 * Myy + Myt,
       
   268                         x3 * Mxx + y3 * Mxy + Mxt,
       
   269                         x3 * Myx + y3 * Myy + Myt);
       
   270         }
       
   271 
       
   272         public void closePath() {
       
   273             out.closePath();
       
   274         }
       
   275 
       
   276         public void pathDone() {
       
   277             out.pathDone();
       
   278         }
       
   279 
       
   280         public long getNativeConsumer() {
       
   281             return 0;
       
   282         }
       
   283     }
       
   284 
       
   285     static final class DeltaScaleFilter implements PathConsumer2D {
       
   286         private final float sx, sy;
       
   287         private final PathConsumer2D out;
       
   288 
       
   289         public DeltaScaleFilter(PathConsumer2D out, float Mxx, float Myy) {
       
   290             sx = Mxx;
       
   291             sy = Myy;
       
   292             this.out = out;
       
   293         }
       
   294 
       
   295         public void moveTo(float x0, float y0) {
       
   296             out.moveTo(x0 * sx, y0 * sy);
       
   297         }
       
   298 
       
   299         public void lineTo(float x1, float y1) {
       
   300             out.lineTo(x1 * sx, y1 * sy);
       
   301         }
       
   302 
       
   303         public void quadTo(float x1, float y1,
       
   304                            float x2, float y2)
       
   305         {
       
   306             out.quadTo(x1 * sx, y1 * sy,
       
   307                        x2 * sx, y2 * sy);
       
   308         }
       
   309 
       
   310         public void curveTo(float x1, float y1,
       
   311                             float x2, float y2,
       
   312                             float x3, float y3)
       
   313         {
       
   314             out.curveTo(x1 * sx, y1 * sy,
       
   315                         x2 * sx, y2 * sy,
       
   316                         x3 * sx, y3 * sy);
       
   317         }
       
   318 
       
   319         public void closePath() {
       
   320             out.closePath();
       
   321         }
       
   322 
       
   323         public void pathDone() {
       
   324             out.pathDone();
       
   325         }
       
   326 
       
   327         public long getNativeConsumer() {
       
   328             return 0;
       
   329         }
       
   330     }
       
   331 
       
   332     static final class DeltaTransformFilter implements PathConsumer2D {
       
   333         private PathConsumer2D out;
       
   334         private final float Mxx;
       
   335         private final float Mxy;
       
   336         private final float Myx;
       
   337         private final float Myy;
       
   338 
       
   339         DeltaTransformFilter(PathConsumer2D out,
       
   340                              float Mxx, float Mxy,
       
   341                              float Myx, float Myy)
       
   342         {
       
   343             this.out = out;
       
   344             this.Mxx = Mxx;
       
   345             this.Mxy = Mxy;
       
   346             this.Myx = Myx;
       
   347             this.Myy = Myy;
       
   348         }
       
   349 
       
   350         public void moveTo(float x0, float y0) {
       
   351             out.moveTo(x0 * Mxx + y0 * Mxy,
       
   352                        x0 * Myx + y0 * Myy);
       
   353         }
       
   354 
       
   355         public void lineTo(float x1, float y1) {
       
   356             out.lineTo(x1 * Mxx + y1 * Mxy,
       
   357                        x1 * Myx + y1 * Myy);
       
   358         }
       
   359 
       
   360         public void quadTo(float x1, float y1,
       
   361                            float x2, float y2)
       
   362         {
       
   363             out.quadTo(x1 * Mxx + y1 * Mxy,
       
   364                        x1 * Myx + y1 * Myy,
       
   365                        x2 * Mxx + y2 * Mxy,
       
   366                        x2 * Myx + y2 * Myy);
       
   367         }
       
   368 
       
   369         public void curveTo(float x1, float y1,
       
   370                             float x2, float y2,
       
   371                             float x3, float y3)
       
   372         {
       
   373             out.curveTo(x1 * Mxx + y1 * Mxy,
       
   374                         x1 * Myx + y1 * Myy,
       
   375                         x2 * Mxx + y2 * Mxy,
       
   376                         x2 * Myx + y2 * Myy,
       
   377                         x3 * Mxx + y3 * Mxy,
       
   378                         x3 * Myx + y3 * Myy);
       
   379         }
       
   380 
       
   381         public void closePath() {
       
   382             out.closePath();
       
   383         }
       
   384 
       
   385         public void pathDone() {
       
   386             out.pathDone();
       
   387         }
       
   388 
       
   389         public long getNativeConsumer() {
       
   390             return 0;
       
   391         }
       
   392     }
       
   393 }