1 /* QtGraphics.java --
2    Copyright (C)  2005, 2006  Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 package gnu.java.awt.peer.qt;
39 
40 import java.awt.AlphaComposite;
41 import java.awt.AWTPermission;
42 import java.awt.BasicStroke;
43 import java.awt.Color;
44 import java.awt.Composite;
45 import java.awt.GradientPaint;
46 import java.awt.GraphicsConfiguration;
47 import java.awt.Font;
48 import java.awt.FontMetrics;
49 import java.awt.Graphics;
50 import java.awt.Graphics2D;
51 import java.awt.Image;
52 import java.awt.RenderingHints;
53 import java.awt.Rectangle;
54 import java.awt.Paint;
55 import java.awt.Polygon;
56 import java.awt.Shape;
57 import java.awt.Stroke;
58 import java.awt.font.FontRenderContext;
59 import java.awt.font.GlyphVector;
60 import java.awt.geom.AffineTransform;
61 import java.awt.geom.Arc2D;
62 import java.awt.geom.Ellipse2D;
63 import java.awt.geom.Line2D;
64 import java.awt.geom.Rectangle2D;
65 import java.awt.geom.RoundRectangle2D;
66 import java.awt.image.BufferedImage;
67 import java.awt.image.BufferedImageOp;
68 import java.awt.image.ImageObserver;
69 import java.awt.image.RenderedImage;
70 import java.awt.image.renderable.RenderableImage;
71 
72 import java.text.AttributedCharacterIterator;
73 import java.text.CharacterIterator;
74 import java.util.Map;
75 
76 /**
77  * QtGraphics is an abstract implementation of Graphics2D over a QPainter
78  * object. This is to be subclassed for different drawing contexts,
79  * which may have different requirements.
80  */
81 public abstract class QtGraphics extends Graphics2D
82 {
83   /**
84    * Native QPainter pointer.
85    */
86   protected long nativeObject;
87 
88   private static final AffineTransform identity = new AffineTransform();
89 
90   // Graphics state
91   protected Font font;              // Current font.
92   protected Color color, bgcolor;   // Current color and background color.
93   protected Shape clip;             // Current clipping area.
94   protected Shape initialClip;      // Initial clip bounds
95   protected AffineTransform xform;  // Current transform
96   protected Stroke currentStroke;   // the current stroke
97   protected boolean nativeStroking; // whether we're using Qt's stroking or not
98   protected Composite composite; // current composite operator
99   protected double currentAlpha; // current alpha
100   protected Paint currentPaint;  // current paint
101   protected RenderingHints renderingHints; // the rendering hints.
102 
103   /**
104    * Owner Graphics, used by subcontext created by create()
105    * to avoid GC of the original context.
106    */
107   Graphics parent;
108 
109   /**
110    * Do-nothing constructor.
111    */
QtGraphics()112   QtGraphics()
113   {
114   }
115 
116   /**
117    * Copying constructor - used by copy() and subclasses.
118    */
QtGraphics(QtGraphics parent)119   QtGraphics(QtGraphics parent)
120   {
121     cloneNativeContext( parent );
122     setFont( parent.getFont() );
123     setAlpha( parent.currentAlpha );
124     setBackground( parent.getBackground() );
125     setColor( parent.getColor() );
126     setClip( (initialClip = parent.getClip()) );
127     setTransform( parent.getTransform() );
128     setStroke( parent.getStroke() );
129     setComposite( parent.getComposite() );
130     setPaint( parent.getPaint() );
131     setRenderingHints( parent.getRenderingHints() );
132   }
133 
134   /**
135    * Set up some generic defaults.
136    */
setup()137   protected void setup()
138   {
139     font = new Font ("Dialog", Font.PLAIN, 12);
140     setTransform( identity );
141     setStroke( new BasicStroke() );
142     renderingHints = new RenderingHints( null );
143   }
144 
delete()145   public synchronized native void delete();
146 
dispose()147   public void dispose()
148   {
149   }
150 
151   // ********************** etc *******************************
152 
resetClip()153   private void resetClip()
154   {
155     AffineTransform current = getTransform();
156     setTransform( identity );
157     setClip( initialClip );
158     setTransform( current );
159   }
160 
initImage(QtImage image)161   protected native void initImage(QtImage image);
initVolatileImage(QtVolatileImage image)162   protected native void initVolatileImage(QtVolatileImage image);
163 
164   // Creates a new native QPainter object on the same context.
cloneNativeContext( QtGraphics parent )165   private native void cloneNativeContext( QtGraphics parent );
setColor(int r, int g, int b, int a)166   private native void setColor(int r, int g, int b, int a);
drawNative( QPainterPath p )167   private native void drawNative( QPainterPath p );
fillNative( QPainterPath p )168   private native void fillNative( QPainterPath p );
setClipNative( QPainterPath p )169   private native void setClipNative( QPainterPath p );
setClipRectNative( int x, int y, int w, int h )170   private native void setClipRectNative( int x, int y, int w, int h );
intersectClipNative( QPainterPath p )171   private native void intersectClipNative( QPainterPath p );
intersectClipRectNative( int x, int y, int w, int h )172   private native void intersectClipRectNative( int x, int y, int w, int h );
setQtTransform(QMatrix m)173   private native void setQtTransform(QMatrix m);
setNativeStroke(QPen p)174   private native void setNativeStroke(QPen p);
setNativeComposite(int alphaMode)175   private native void setNativeComposite(int alphaMode);
drawStringNative(String string, double x, double y)176   private native void drawStringNative(String string, double x, double y);
setLinearGradient(int r1, int g1, int b1, int r2, int g2, int b2, double x1, double y1, double x2, double y2, boolean cyclic)177   private native void setLinearGradient(int r1, int g1, int b1,
178                                         int r2, int g2, int b2,
179                                         double x1, double y1,
180                                         double x2, double y2, boolean cyclic);
setAlphaNative(double alpha)181   private native void setAlphaNative(double alpha);
setFontNative(QtFontPeer font)182   private native void setFontNative(QtFontPeer font);
getClipNative()183   private native QPainterPath getClipNative();
184 
setAlpha(double alpha)185   void setAlpha(double alpha)
186   {
187     currentAlpha = alpha;
188     setAlphaNative(currentAlpha);
189   }
190 
191   // ************ Public methods *********************
192 
193   /**
194    * Context-sensitive methods are declared abstract.
195    */
create()196   public abstract Graphics create();
197 
copyArea(int x, int y, int width, int height, int dx, int dy)198   public abstract void copyArea(int x, int y, int width, int height,
199                                 int dx, int dy);
200 
getDeviceConfiguration()201   public abstract GraphicsConfiguration getDeviceConfiguration();
202 
203 
getColor()204   public Color getColor()
205   {
206     return new Color(color.getRed(), color.getGreen(), color.getBlue());
207   }
208 
setColor(Color c)209   public void setColor(Color c)
210   {
211     if( c == null )
212       c = Color.white;
213     this.color = c;
214     int alpha = (int)(c.getAlpha() * currentAlpha);
215     setColor(c.getRed(), c.getGreen(), c.getBlue(), alpha);
216   }
217 
setBackground(Color color)218   public void setBackground(Color color)
219   {
220     bgcolor = new Color(color.getRed(), color.getGreen(), color.getBlue());
221   }
222 
getBackground()223   public Color getBackground()
224   {
225     return new Color(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue());
226   }
227 
setPaintMode()228   public void setPaintMode()
229   {
230   }
231 
setXORMode(Color color)232   public void setXORMode(Color color)
233   {
234     // FIXME
235   }
236 
hit(Rectangle rect, Shape s, boolean onStroke)237   public boolean hit(Rectangle rect, Shape s, boolean onStroke)
238   {
239     if( onStroke )
240       {
241         Shape stroked = currentStroke.createStrokedShape( s );
242         return stroked.intersects( (double)rect.x, (double)rect.y,
243                                    (double)rect.width, (double)rect.height );
244       }
245     return s.intersects( (double)rect.x, (double)rect.y,
246                          (double)rect.width, (double)rect.height );
247   }
248 
249   // ******************* Font ***********************
getFont()250   public Font getFont()
251   {
252     return font;
253   }
254 
setFont(Font font)255   public void setFont(Font font)
256   {
257     if( font == null )
258       return;
259     this.font = font;
260     if(font.getPeer() != null && font.getPeer() instanceof QtFontPeer)
261       setFontNative( (QtFontPeer)font.getPeer() );
262   }
263 
getFontMetrics(Font font)264   public FontMetrics getFontMetrics(Font font)
265   {
266     return new QtFontMetrics(font, this);
267   }
268 
269   // ***************** Clipping *********************
270 
271   /**
272    * Intersects the current clip with the shape
273    */
clip(Shape s)274   public void clip(Shape s)
275   {
276     intersectClipNative( new QPainterPath( s ) );
277   }
278 
clipRect(int x, int y, int width, int height)279   public void clipRect(int x, int y, int width, int height)
280   {
281     intersectClipRectNative( x, y, width, height );
282   }
283 
setClip(int x, int y, int width, int height)284   public void setClip(int x, int y, int width, int height)
285   {
286     setClipRectNative( x, y, width, height );
287   }
288 
getClip()289   public Shape getClip()
290   {
291     return getClipNative().getPath();
292   }
293 
getClipBounds()294   public native Rectangle getClipBounds();
295 
296   /**
297    * Sets the clip
298    */
setClip(Shape clip)299   public void setClip(Shape clip)
300   {
301     if (clip == null)
302       resetClip();
303     else
304       setClipNative(new QPainterPath( clip ));
305   }
306 
307   // ***************** Drawing primitives *********************
308 
draw(Shape s)309   public void draw(Shape s)
310   {
311     if( nativeStroking )
312       drawNative( new QPainterPath(s) );
313     else
314       fillNative( new QPainterPath( currentStroke.createStrokedShape( s ) ) );
315   }
316 
fill(Shape s)317   public void fill(Shape s)
318   {
319     fillNative( new QPainterPath(s) );
320   }
321 
drawLine(int x1, int y1, int x2, int y2)322   public void drawLine(int x1, int y1, int x2, int y2)
323   {
324     if( nativeStroking )
325       drawNative( new QPainterPath((double)x1, (double)y1, (double)x2, (double)y2, true) );
326     else
327       draw( new Line2D.Double((double)x1, (double)y1, (double)x2, (double)y2) );
328   }
329 
drawRect(int x, int y, int width, int height)330   public void drawRect(int x, int y, int width, int height)
331   {
332     if( nativeStroking )
333       drawNative( new QPainterPath((double)x, (double)y,
334                                    (double)width, (double)height) );
335     else
336       fillNative( new QPainterPath
337                   ( currentStroke.createStrokedShape
338                     (new Rectangle2D.Double
339                      ((double)x, (double)y,
340                       (double)width, (double)height) ) ) );
341   }
342 
fillRect(int x, int y, int width, int height)343   public void fillRect(int x, int y, int width, int height)
344   {
345     fillNative( new QPainterPath( x, y, width, height ) );
346   }
347 
clearRect(int x, int y, int width, int height)348   public void clearRect(int x, int y, int width, int height)
349   {
350     Color c = color;
351     setColor( bgcolor ); // FIXME
352     fillRect( x, y, width, height );
353     setColor( c );
354   }
355 
drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)356   public void drawRoundRect(int x, int y, int width, int height,
357                             int arcWidth, int arcHeight)
358   {
359     draw( new RoundRectangle2D.Double(x, y, width, height,
360                                       arcWidth, arcHeight) );
361   }
362 
fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)363   public void fillRoundRect(int x, int y, int width, int height,
364                             int arcWidth, int arcHeight)
365   {
366     fill( new RoundRectangle2D.Double(x, y, width, height,
367                                       arcWidth, arcHeight) );
368   }
369 
drawOval(int x, int y, int width, int height)370   public void drawOval(int x, int y, int width, int height)
371   {
372     draw( new Ellipse2D.Double((double)x, (double)y,
373                                (double)width, (double)height) );
374   }
375 
fillOval(int x, int y, int width, int height)376   public void fillOval(int x, int y, int width, int height)
377   {
378     fill( new Ellipse2D.Double(x, y, width, height) );
379   }
380 
drawArc(int x, int y, int width, int height, int arcStart, int arcAngle)381   public void drawArc(int x, int y, int width, int height,
382                       int arcStart, int arcAngle)
383   {
384     draw( new Arc2D.Double(x, y, width, height, arcStart, arcAngle,
385                            Arc2D.OPEN) );
386   }
387 
fillArc(int x, int y, int width, int height, int arcStart, int arcAngle)388   public void fillArc(int x, int y, int width, int height,
389                       int arcStart, int arcAngle)
390   {
391     fill( new Arc2D.Double(x, y, width, height, arcStart, arcAngle,
392                            Arc2D.CHORD) );
393   }
394 
drawPolyline(int xPoints[], int yPoints[], int npoints)395   public void drawPolyline(int xPoints[], int yPoints[], int npoints)
396   {
397     for( int i = 0; i < npoints - 1; i++)
398       drawLine(xPoints[i], yPoints[i], xPoints[i + 1], yPoints[i + 1]);
399   }
400 
drawPolygon(int xPoints[], int yPoints[], int npoints)401   public void drawPolygon(int xPoints[], int yPoints[], int npoints)
402   {
403     draw( new Polygon(xPoints, yPoints, npoints) );
404   }
405 
fillPolygon(int xPoints[], int yPoints[], int npoints)406   public void fillPolygon(int xPoints[], int yPoints[], int npoints)
407   {
408     fill( new Polygon(xPoints, yPoints, npoints) );
409   }
410 
fill3DRect(int x, int y, int width, int height, boolean raised)411   public native void fill3DRect(int x, int y, int width, int height, boolean raised);
412 
draw3DRect(int x, int y, int width, int height, boolean raised)413   public native void draw3DRect(int x, int y, int width, int height, boolean raised);
414 
415   // *********************** Text rendering *************************
416 
drawString(String string, int x, int y)417   public void drawString(String string, int x, int y)
418   {
419     drawStringNative(string, (double)x, (double)y);
420   }
421 
drawString(String string, float x, float y)422   public void drawString(String string, float x, float y)
423   {
424     drawStringNative(string, (double)x, (double)y);
425   }
426 
drawString(AttributedCharacterIterator ci, int x, int y)427   public void drawString (AttributedCharacterIterator ci, int x, int y)
428   {
429     // FIXME - to something more correct ?
430     String s = "";
431     for(char c = ci.first(); c != CharacterIterator.DONE; c = ci.next())
432       s += c;
433     drawString(s, x, y);
434   }
435 
drawString(AttributedCharacterIterator ci, float x, float y)436   public void drawString(AttributedCharacterIterator ci,
437                          float x, float y)
438   {
439     // FIXME - to something more correct ?
440     String s = "";
441     for(char c = ci.first(); c != CharacterIterator.DONE; c = ci.next())
442       s += c;
443     drawString(s, x, y);
444   }
445 
drawGlyphVector(GlyphVector v, float x, float y)446   public void drawGlyphVector(GlyphVector v, float x, float y)
447   {
448     throw new RuntimeException("Not implemented");
449   }
450 
451   // ******************* Image drawing ******************************
drawImage(Image image, AffineTransform Tx, ImageObserver obs)452   public boolean drawImage(Image image,
453                            AffineTransform Tx,
454                            ImageObserver obs)
455   {
456     if (image instanceof QtImage)
457       return ((QtImage)image).drawImage(this, new QMatrix( Tx ), obs);
458 
459     return (new QtImage(image.getSource())).drawImage(this,
460                                                       new QMatrix( Tx ),
461                                                       obs);
462   }
463 
drawImage(Image image, int x, int y, Color bgcolor, ImageObserver observer)464   public boolean drawImage(Image image, int x, int y, Color bgcolor,
465                            ImageObserver observer)
466   {
467     if (image instanceof QtImage)
468       return ((QtImage)image).drawImage (this, x, y, bgcolor, observer);
469     return (new QtImage(image.getSource())).drawImage (this, x, y,
470                                                        bgcolor, observer);
471   }
472 
drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)473   public boolean drawImage(Image image,
474                            int dx1, int dy1, int dx2, int dy2,
475                            int sx1, int sy1, int sx2, int sy2,
476                            Color bgcolor, ImageObserver observer)
477   {
478     if (image instanceof QtImage)
479       return ((QtImage)image).drawImage(this, dx1, dy1, dx2, dy2,
480                                         sx1, sy1, sx2, sy2, bgcolor, observer);
481 
482     return (new QtImage(image.getSource())).drawImage(this, dx1, dy1,
483                                                       dx2, dy2,
484                                                       sx1, sy1, sx2, sy2,
485                                                       bgcolor, observer);
486   }
487 
drawImage(Image image, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)488   public boolean drawImage(Image image, int x, int y,
489                            int width, int height, Color bgcolor,
490                            ImageObserver observer)
491   {
492     if (image instanceof QtImage)
493       return ((QtImage)image).drawImage (this, x, y, width, height,
494                                          bgcolor, observer);
495     return (new QtImage(image.getSource())).drawImage (this, x, y,
496                                                        width, height,
497                                                        bgcolor, observer);
498   }
499 
drawImage(Image image, int x, int y, int width, int height, ImageObserver observer)500   public boolean drawImage(Image image, int x, int y, int width, int height,
501                            ImageObserver observer)
502   {
503     return drawImage(image, x, y, width, height, null, observer);
504   }
505 
drawImage(Image image, int x, int y, ImageObserver observer)506   public boolean drawImage(Image image, int x, int y, ImageObserver observer)
507   {
508     return drawImage(image, x, y, null, observer);
509   }
510 
drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)511   public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
512   {
513     return drawImage(image, dx1, dy1, dx2, dy2,
514                      sx1, sy1, sx2, sy2, null, observer);
515   }
516 
517   // *********************** Transform methods *************************
getTransform()518   public AffineTransform getTransform()
519   {
520     return new AffineTransform( xform );
521   }
522 
setTransform(AffineTransform Tx)523   public void setTransform(AffineTransform Tx)
524   {
525     xform = new AffineTransform( Tx );
526     setQtTransform( new QMatrix( xform ) );
527   }
528 
rotate(double theta)529   public void rotate(double theta)
530   {
531     xform.rotate( theta );
532     setQtTransform( new QMatrix( xform ) );
533   }
534 
rotate(double theta, double x, double y)535   public void rotate(double theta, double x, double y)
536   {
537     xform.rotate(theta, x, y);
538     setQtTransform( new QMatrix( xform ) );
539   }
540 
scale(double sx, double sy)541   public void scale(double sx, double sy)
542   {
543     xform.scale(sx, sy);
544     setQtTransform( new QMatrix( xform ) );
545   }
546 
shear(double shx, double shy)547   public void shear(double shx, double shy)
548   {
549     xform.shear(shx, shy);
550     setQtTransform( new QMatrix( xform ) );
551   }
552 
transform(AffineTransform Tx)553   public void transform(AffineTransform Tx)
554   {
555     xform.concatenate( Tx );
556     setQtTransform( new QMatrix( xform ) );
557   }
558 
translate(double tx, double ty)559   public void translate(double tx, double ty)
560   {
561     xform.translate( tx, ty );
562     setQtTransform( new QMatrix( xform ) );
563   }
564 
translate(int x, int y)565   public void translate(int x, int y)
566   {
567     translate((double)x, (double)y);
568   }
569 
570   // *************** Stroking, Filling, Compositing *****************
setStroke(Stroke s)571   public void setStroke(Stroke s)
572   {
573     try  // ..to convert the stroke into a native one.
574       {
575         QPen pen = new QPen( s );
576         nativeStroking = true;
577         setNativeStroke( pen );
578         setColor( color );
579       }
580     catch (IllegalArgumentException e)
581       {
582         nativeStroking = false;
583       }
584     currentStroke = s;
585   }
586 
getStroke()587   public Stroke getStroke()
588   { // FIXME: return copy?
589     return currentStroke;
590   }
591 
setComposite(Composite comp)592   public void setComposite(Composite comp)
593   {
594     if( comp == null)
595       {
596         setNativeComposite( AlphaComposite.SRC_OVER );
597         return;
598       }
599 
600     if( comp instanceof AlphaComposite )
601       {
602         if( ((AlphaComposite)comp).getRule() != AlphaComposite.XOR )
603           setAlpha( ((AlphaComposite)comp).getAlpha() );
604         setNativeComposite( ((AlphaComposite)comp).getRule() );
605         composite = comp;
606       }
607     else
608       {
609         // FIXME: this check is only required "if this Graphics2D
610         // context is drawing to a Component on the display screen".
611         SecurityManager sm = System.getSecurityManager();
612         if (sm != null)
613           sm.checkPermission(new AWTPermission("readDisplayPixels"));
614 
615         throw new UnsupportedOperationException("We don't support custom"+
616                                                 " composites yet.");
617       }
618   }
619 
getComposite()620   public Composite getComposite()
621   {
622     return composite;
623   }
624 
setPaint(Paint p)625   public void setPaint(Paint p)
626   {
627     if( p == null )
628       return;
629 
630     // FIXME
631     currentPaint = p;
632     if( p instanceof GradientPaint )
633       {
634         GradientPaint lg = (GradientPaint)p;
635         setLinearGradient(lg.getColor1().getRed(), lg.getColor1().getGreen(),
636                           lg.getColor1().getBlue(), lg.getColor2().getRed(),
637                           lg.getColor2().getGreen(), lg.getColor2().getBlue(),
638                           lg.getPoint1().getX(), lg.getPoint1().getY(),
639                           lg.getPoint2().getX(), lg.getPoint2().getY(),
640                           lg.isCyclic() );
641         return;
642       }
643     if( p instanceof Color )
644       {
645         setColor((Color) p);
646         return;
647       }
648     throw new UnsupportedOperationException("We don't support custom"+
649                                             " paints yet.");
650   }
651 
getPaint()652   public Paint getPaint()
653   {
654     // FIXME
655     return currentPaint;
656   }
657 
658   // ********************** Rendering Hints *************************
659 
addRenderingHints(Map hints)660   public void addRenderingHints(Map hints)
661   {
662     renderingHints.putAll( hints );
663   }
664 
getRenderingHint(RenderingHints.Key hintKey)665   public Object getRenderingHint(RenderingHints.Key hintKey)
666   {
667     return renderingHints.get( hintKey );
668   }
669 
getRenderingHints()670   public RenderingHints getRenderingHints()
671   {
672     return (RenderingHints) renderingHints.clone();
673   }
674 
setRenderingHints(Map<?,?> hints)675   public void setRenderingHints(Map<?,?> hints)
676   {
677     renderingHints = new RenderingHints( null );
678     renderingHints.putAll(hints);
679     updateRenderingHints();
680   }
681 
setRenderingHint(RenderingHints.Key hintKey, Object hintValue)682   public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)
683   {
684     renderingHints.put( hintKey, hintValue );
685     updateRenderingHints();
686   }
687 
updateRenderingHints()688   private void updateRenderingHints()
689   {
690     // FIXME - update native settings.
691   }
692 
693   ////////////////////////////// unimplemented /////////////////////
694 
getFontRenderContext()695   public FontRenderContext getFontRenderContext()
696   {
697     throw new UnsupportedOperationException("Not implemented yet");
698   }
699 
drawRenderableImage(RenderableImage image, AffineTransform xform)700   public void drawRenderableImage(RenderableImage image, AffineTransform xform)
701   {
702     throw new UnsupportedOperationException("Not implemented yet");
703   }
704 
drawRenderedImage(RenderedImage image, AffineTransform xform)705   public void drawRenderedImage(RenderedImage image, AffineTransform xform)
706   {
707     throw new UnsupportedOperationException("Not implemented yet");
708   }
709 
drawImage(BufferedImage image, BufferedImageOp op, int x, int y)710   public void drawImage(BufferedImage image, BufferedImageOp op, int x, int y)
711   {
712     throw new UnsupportedOperationException("Not implemented yet");
713   }
714 }
715