home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / quicktime / all java / quicktime for java / vectorgraphics.win / src / qtvector.java
Encoding:
Java Source  |  2000-06-23  |  10.3 KB  |  217 lines

  1. /*
  2.  * quicktime.app: Sample Code for Initial Seeding
  3.  *
  4.  * © 1996, 97 Copyright, Apple Computer
  5.  * All rights reserved
  6.  */
  7. import java.awt.Frame;
  8. import java.awt.Dimension;
  9. import java.awt.BorderLayout;
  10. import java.awt.Insets;
  11. import java.awt.event.*;
  12. import java.io.*;
  13. import java.lang.Math;
  14.  
  15. import quicktime.qd.*;
  16. import quicktime.*;
  17. import quicktime.std.StdQTConstants;
  18. import quicktime.std.image.GraphicsImporter;
  19. import quicktime.io.QTFile;
  20. import quicktime.util.*;
  21. import quicktime.std.movies.*;
  22. import quicktime.std.image.*;
  23.  
  24. import quicktime.app.display.QTCanvas;
  25. import quicktime.app.image.*;
  26.  
  27.  
  28. /** QuickTime Vector Graphics Example */
  29. // Shows the use of an ImagePresenter to display
  30. // a QuickTime vector
  31. public class QTVector extends Frame implements StdQTConstants, QDConstants {        
  32.  
  33.     static final int kWidth = 200;
  34.     static final int kHeight = 200;
  35.  
  36.     static final int kSizeOfSizeAndTagFields = 8;
  37.     static final int kSizeOfZeroAtomHeader   = 0;
  38.     static final int gxEvenOddFill = 3;
  39.  
  40.  
  41.     public static void main (String args[]) {
  42.         try {
  43.             QTSession.open();
  44.             new QTVector().show();
  45.             
  46.         } catch (Exception e) {
  47.             e.printStackTrace();
  48.             QTSession.close();
  49.         }
  50.     }
  51.  
  52.     QTVector () throws NativeGraphicsException, QTException, IOException {
  53.         super ("QTVector");
  54.                 
  55.         QTCanvas canv = new QTCanvas ();
  56.         add ("Center", canv);
  57.         
  58.         //ImagePresenter is what will display the QTVector image to the screen.
  59.         ImagePresenter myCurvePresenter = new ImagePresenter (new QDRect (kWidth, kHeight));
  60.  
  61. //        Create an Image Description and set it to use the the Curve Codec
  62.         ImageDescription curveDescription = ImageDescription.getJavaDefaultPixelDescription (kWidth, kHeight);
  63.         curveDescription.setCType (kVectorCodecType);
  64.         
  65.         //This call set's up the ImageDescription for the vector graphic. Note that we have not
  66.         //set the image data as this will be set later...
  67.         myCurvePresenter.setImageData (null, curveDescription);
  68.         
  69.         //The curve info is stored as atoms in an IntEncodedImage
  70.         IntEncodedImage aCurveObject = createACurveObject();
  71.  
  72.         //Now that we have the Curve Data, we go ahead and set it in the ImagePresenter
  73.         myCurvePresenter.setImageData(aCurveObject);        
  74.  
  75.     
  76.         //NOTES::    
  77.         //It is possible  to create multiple vector images as IntEncodedImages and then later 
  78.         //set them as the ImageData in an ImagePresenter
  79.         
  80.         canv.setClient (myCurvePresenter, true);        
  81.  
  82.         addWindowListener(new WindowAdapter () {
  83.             public void windowClosing (WindowEvent e) {
  84.                 QTSession.close();
  85.                 dispose();
  86.             }
  87.  
  88.             public void windowClosed (WindowEvent e) {
  89.                 System.exit(0);
  90.             }
  91.         });        
  92.         pack();
  93.     }
  94.     
  95.  
  96. //AWK!!!
  97. // Yes we know it's somewhat ugly to have to build up your image this way. QuickTime 4.0 added
  98. //Curve API's that simplify this tremendously, however those API's are not currently accessible from QTJava. Support for  
  99. //the Curve API's will be added at a later date.
  100.  
  101. //It is necessary to endian flip the data if you want this to work under MS Windows. On the MacOS the flipNativeToBigEndian32
  102. //calls do nothing since the data is already in BigEndian format.. 
  103.  
  104.     public IntEncodedImage createACurveObject() throws QTException {
  105.         
  106.         int        curveSample[] = {    
  107.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4),EndianOrder.flipNativeToBigEndian32(kCurveAntialiasControlAtom),
  108.         EndianOrder.flipNativeToBigEndian32(kCurveAntialiasOn),
  109.  
  110.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4),EndianOrder.flipNativeToBigEndian32(kCurveFillTypeAtom),
  111.         EndianOrder.flipNativeToBigEndian32(gxEvenOddFill),
  112.  
  113.         // a big white enclosing rectangle (600 x 600)
  114.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 8), EndianOrder.flipNativeToBigEndian32(kCurveARGBColorAtom),
  115.         EndianOrder.flipNativeToBigEndian32(0xffffffff),    // alpha, red
  116.         EndianOrder.flipNativeToBigEndian32(0xffffffff),    // green, blue
  117.                                         // it's white!
  118.  
  119.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4*11), EndianOrder.flipNativeToBigEndian32(kCurvePathAtom),
  120.             EndianOrder.flipNativeToBigEndian32(1),            // one contour in path
  121.             EndianOrder.flipNativeToBigEndian32(4),            // four points in path
  122.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // all points are on the curve: it's a rectangle! 
  123.             EndianOrder.flipNativeToBigEndian32(0x00000000), EndianOrder.flipNativeToBigEndian32(0x00000000),     // top left
  124.             EndianOrder.flipNativeToBigEndian32(0x02580000), EndianOrder.flipNativeToBigEndian32(0x00000000),        // top right
  125.             EndianOrder.flipNativeToBigEndian32(0x02580000), EndianOrder.flipNativeToBigEndian32(0x02580000),        // bottom right 
  126.             EndianOrder.flipNativeToBigEndian32(0x00000000), EndianOrder.flipNativeToBigEndian32(0x02580000),        // bottom left
  127.  
  128.  
  129.         // a black rounded square, centered at 150,150
  130.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 8), EndianOrder.flipNativeToBigEndian32(kCurveARGBColorAtom),
  131.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // alpha, red
  132.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // green, blue
  133.                                         // it's black!
  134.  
  135.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4*11), EndianOrder.flipNativeToBigEndian32(kCurvePathAtom),
  136.             EndianOrder.flipNativeToBigEndian32(1),            // one contour in path
  137.             EndianOrder.flipNativeToBigEndian32(4),            // four points in path
  138.             EndianOrder.flipNativeToBigEndian32(0xffffffff), // all points are off the curve: it's a rounded square! 
  139.             EndianOrder.flipNativeToBigEndian32(0x00640000), EndianOrder.flipNativeToBigEndian32(0x00640000),
  140.             EndianOrder.flipNativeToBigEndian32(0x00C80000), EndianOrder.flipNativeToBigEndian32(0x00640000),
  141.             EndianOrder.flipNativeToBigEndian32(0x00C80000), EndianOrder.flipNativeToBigEndian32(0x00C80000), 
  142.             EndianOrder.flipNativeToBigEndian32(0x00640000), EndianOrder.flipNativeToBigEndian32(0x00C80000),
  143.  
  144.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4), EndianOrder.flipNativeToBigEndian32(kCurveFillTypeAtom),
  145.         EndianOrder.flipNativeToBigEndian32(gxEvenOddFill),
  146.  
  147.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4), EndianOrder.flipNativeToBigEndian32(kCurvePenThicknessAtom),
  148.         EndianOrder.flipNativeToBigEndian32(0x100000),
  149.                                             
  150.         // enable linear gradient for all following atoms
  151.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4), EndianOrder.flipNativeToBigEndian32(kCurveGradientTypeAtom),
  152.         EndianOrder.flipNativeToBigEndian32(kLinearGradient),
  153.         
  154.         // define the gradient: red -> green -> red -> blue                                    
  155.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + (12*4)), EndianOrder.flipNativeToBigEndian32(kCurveGradientRecordAtom),
  156.                                         
  157.             EndianOrder.flipNativeToBigEndian32(0xffffffff),    // gradient color record 1:
  158.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // red
  159.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // beginning of gradient
  160.                                         
  161.             EndianOrder.flipNativeToBigEndian32(0x77770000),    // gradient color record 2:
  162.             EndianOrder.flipNativeToBigEndian32(0xffff0000),    // green
  163.             EndianOrder.flipNativeToBigEndian32(0x00004000),
  164.                                         
  165.             EndianOrder.flipNativeToBigEndian32(0x3333ffff),    // gradient color record 3:
  166.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // red
  167.             EndianOrder.flipNativeToBigEndian32(0x0000C000),
  168.                                         
  169.             EndianOrder.flipNativeToBigEndian32(0xffff0000),    // gradient color record 4:
  170.             EndianOrder.flipNativeToBigEndian32(0x0000ffff),    // blue
  171.             EndianOrder.flipNativeToBigEndian32(0x00010000),    // end of gradient
  172.  
  173.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4), EndianOrder.flipNativeToBigEndian32(kCurveGradientAngleAtom),
  174.             EndianOrder.flipNativeToBigEndian32(0x00450000),    // gradient at 45˚ angle
  175.         
  176.         // a green rectangle, centered at 40,40, painted with a linear gradient                                    
  177.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 8), EndianOrder.flipNativeToBigEndian32(kCurveARGBColorAtom),
  178.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // alpha, red
  179.             EndianOrder.flipNativeToBigEndian32(0xffff0000),    // green, blue
  180.                                         // it's green!
  181.  
  182.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + (4*11)), EndianOrder.flipNativeToBigEndian32(kCurvePathAtom),
  183.             EndianOrder.flipNativeToBigEndian32(1),            // one contour in path
  184.             EndianOrder.flipNativeToBigEndian32(4),            // four points in path
  185.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // all points are on the curve: it's a rectangle! 
  186.             EndianOrder.flipNativeToBigEndian32(0x00100000), EndianOrder.flipNativeToBigEndian32(0x00100000),
  187.             EndianOrder.flipNativeToBigEndian32(0x00400000), EndianOrder.flipNativeToBigEndian32(0x00100000),
  188.             EndianOrder.flipNativeToBigEndian32(0x00400000), EndianOrder.flipNativeToBigEndian32(0x00400000),
  189.             EndianOrder.flipNativeToBigEndian32(0x00100000), EndianOrder.flipNativeToBigEndian32(0x00400000),
  190.  
  191.         // disable gradient for all following atoms (since no atom data)
  192.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields), EndianOrder.flipNativeToBigEndian32(kCurveGradientRecordAtom),
  193.                                     
  194.         // a red rounded square, centered at 50,50
  195.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 8), EndianOrder.flipNativeToBigEndian32(kCurveARGBColorAtom),
  196.             EndianOrder.flipNativeToBigEndian32(0x3333ffff),    // alpha, red
  197.             EndianOrder.flipNativeToBigEndian32(0x00000000),    // green, blue
  198.                                         // it's red!
  199.  
  200.         EndianOrder.flipNativeToBigEndian32(kSizeOfSizeAndTagFields + 4*11), EndianOrder.flipNativeToBigEndian32(kCurvePathAtom),
  201.             EndianOrder.flipNativeToBigEndian32(1),            // one contour in path
  202.             EndianOrder.flipNativeToBigEndian32(4),            // four points in path
  203.             EndianOrder.flipNativeToBigEndian32(0xffffffff), // all points are off the curve: it's a rounded square! 
  204.             EndianOrder.flipNativeToBigEndian32(0x001e0000), EndianOrder.flipNativeToBigEndian32(0x001e0000),
  205.             EndianOrder.flipNativeToBigEndian32(0x00460000), EndianOrder.flipNativeToBigEndian32(0x001e0000),
  206.             EndianOrder.flipNativeToBigEndian32(0x00460000), EndianOrder.flipNativeToBigEndian32(0x00460000),
  207.             EndianOrder.flipNativeToBigEndian32(0x001e0000), EndianOrder.flipNativeToBigEndian32(0x00460000),
  208.  
  209.         EndianOrder.flipNativeToBigEndian32(kSizeOfZeroAtomHeader), EndianOrder.flipNativeToBigEndian32(kCurveEndAtom),
  210.         };
  211.         
  212.         return IntEncodedImage.fromIntArray(curveSample,EncodedImage.kRowBytesUnknown);
  213.     }
  214. }
  215.  
  216.  
  217.