1 /*
2  * $RCSfile: MlibWarpRIF.java,v $
3  *
4  * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
5  *
6  * Use is subject to license terms.
7  *
8  * $Revision: 1.1 $
9  * $Date: 2005/02/11 04:56:09 $
10  * $State: Exp $
11  */
12 package com.lightcrafts.media.jai.mlib;
13 import java.awt.RenderingHints;
14 import java.awt.image.RenderedImage;
15 import java.awt.image.renderable.ParameterBlock;
16 import java.awt.image.renderable.RenderedImageFactory;
17 import com.lightcrafts.mediax.jai.BorderExtender;
18 import com.lightcrafts.mediax.jai.ImageLayout;
19 import com.lightcrafts.mediax.jai.Interpolation;
20 import com.lightcrafts.mediax.jai.InterpolationNearest;
21 import com.lightcrafts.mediax.jai.InterpolationBilinear;
22 import com.lightcrafts.mediax.jai.InterpolationBicubic;
23 import com.lightcrafts.mediax.jai.InterpolationBicubic2;
24 import com.lightcrafts.mediax.jai.InterpolationTable;
25 import com.lightcrafts.mediax.jai.Warp;
26 import com.lightcrafts.mediax.jai.WarpGrid;
27 import com.lightcrafts.mediax.jai.WarpPolynomial;
28 import com.lightcrafts.media.jai.opimage.RIFUtil;
29 
30 import com.sun.medialib.mlib.*;
31 
32 /**
33  * A <code>RIF</code> supporting the "Warp" operation in the
34  * rendered image mode using MediaLib.
35  *
36  * @see com.lightcrafts.mediax.jai.operator.WarpDescriptor
37  * @see MlibWarpNearestOpImage
38  * @see MlibWarpBilinearOpImage
39  * @see MlibWarpBicubicOpImage
40  *
41  * @since 1.0
42  *
43  */
44 public class MlibWarpRIF implements RenderedImageFactory {
45 
46     /** Constructor. */
MlibWarpRIF()47     public MlibWarpRIF() {}
48 
49     /**
50      * Creates a new instance of <code>MlibWarpOpImage</code> in
51      * the rendered image mode.
52      *
53      * @param args  The source images.
54      * @param hints  May contain rendering hints and destination image layout.
55      */
create(ParameterBlock args, RenderingHints hints)56     public RenderedImage create(ParameterBlock args,
57                                 RenderingHints hints) {
58         /* Get ImageLayout and TileCache from RenderingHints. */
59         ImageLayout layout = RIFUtil.getImageLayoutHint(hints);
60 
61         RenderedImage source = args.getRenderedSource(0);
62 
63 
64         if (!MediaLibAccessor.isMediaLibCompatible(args, layout) ||
65             !MediaLibAccessor.hasSameNumBands(args, layout) ||
66 	    // Medialib cannot deal with source image having tiles with any
67 	    // dimension greater than or equal to 32768
68 	    source.getTileWidth() >= 32768 ||
69 	    source.getTileHeight() >= 32768) {
70             return null;
71         }
72 
73         /* Get BorderExtender from hints if any. */
74         BorderExtender extender = RIFUtil.getBorderExtenderHint(hints);
75 
76         Warp warp = (Warp)args.getObjectParameter(0);
77         Interpolation interp = (Interpolation)args.getObjectParameter(1);
78         double[] backgroundValues = (double[])args.getObjectParameter(2);
79 
80         int filter = -1;
81         if (interp instanceof InterpolationNearest)  {
82             filter = Constants.MLIB_NEAREST;
83         } else if (interp instanceof InterpolationBilinear) {
84             filter = Constants.MLIB_BILINEAR;
85         } else if (interp instanceof InterpolationBicubic) {
86             filter = Constants.MLIB_BICUBIC;
87         } else if (interp instanceof InterpolationBicubic2) {
88             filter = Constants.MLIB_BICUBIC2;
89         } else if (interp instanceof InterpolationTable) {
90 	    ;
91 	    // filter =  Constants.MLIB_TABLE; not defined yet;
92         } else {
93             /* Other kinds of interpolation cannot be handled via mlib. */
94             return null;
95         }
96 
97         if (warp instanceof WarpGrid) {
98 	  if (interp instanceof InterpolationTable){
99             return new MlibWarpGridTableOpImage(source,
100                                            extender, hints, layout,
101                                            (WarpGrid)warp,
102                                            interp,
103                                            backgroundValues);
104 	  }else{
105             return new MlibWarpGridOpImage(source,
106                                            extender, hints, layout,
107                                            (WarpGrid)warp,
108                                            interp, filter,
109                                            backgroundValues);
110 	  }
111 
112         } else if (warp instanceof WarpPolynomial) {
113 	  if (interp instanceof InterpolationTable){
114             return new MlibWarpPolynomialTableOpImage(source,
115                                                  extender, hints, layout,
116                                                  (WarpPolynomial)warp,
117                                                  interp,
118                                                  backgroundValues);
119 	  }else{
120             return new MlibWarpPolynomialOpImage(source,
121                                                  extender, hints, layout,
122                                                  (WarpPolynomial)warp,
123                                                  interp, filter,
124                                                  backgroundValues);
125 	  }
126         } else {
127             return null;
128         }
129 
130     }
131 }
132