# Cinder

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

# include/cinder/cairo/Cairo.h

Go to the documentation of this file.

    00001 /*
    00002  Copyright (c) 2010, The Barbarian Group
    00003  All rights reserved.
    00004
    00005  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
    00006  the following conditions are met:
    00007
    00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and
    00009     the following disclaimer.
    00010     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
    00011     the following disclaimer in the documentation and/or other materials provided with the distribution.
    00012
    00013  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
    00014  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    00015  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
    00016  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
    00017  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00018  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    00019  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    00020  POSSIBILITY OF SUCH DAMAGE.
    00021 */
    00022
    00023 #pragma once
    00024
    00025 #include "cinder/Cinder.h"
    00026 #include "cinder/Surface.h"
    00027 #include "cinder/Color.h"
    00028 #include "cinder/Rect.h"
    00029 #include "cinder/BSpline.h"
    00030 #include "cinder/Shape2d.h"
    00031 #include "cinder/Font.h"
    00032
    00033 #if defined( CINDER_COCOA_TOUCH )
    00034     #include <CoreGraphics/CoreGraphics.h>
    00035 #elif defined( CINDER_MAC )
    00036     #include <ApplicationServices/ApplicationServices.h>
    00037 #endif
    00038
    00039 #include <string>
    00040 #include <vector>
    00041
    00042 // Forward declarations used by our cairo wrappers
    00043 struct _cairo_surface;
    00044 typedef struct _cairo_surface cairo_surface_t;
    00045
    00046 struct _cairo;
    00047 typedef struct _cairo cairo_t;
    00048
    00049 struct cairo_path;
    00050 typedef struct cairo_path cairo_path_t;
    00051
    00052 struct _cairo_pattern;
    00053 typedef struct _cairo_pattern cairo_pattern_t;
    00054
    00055 /*
    00056 struct _cairo_rectangle;
    00057 typedef struct _cairo_rectangle cairo_rectangle_t;
    00058
    00059 struct _cairo_rectangle_list;
    00060 typedef struct _cairo_rectangle_list cairo_rectangle_list_t;
    00061 */
    00062
    00063 struct _cairo_font_options;
    00064 typedef struct _cairo_font_options cairo_font_options_t;
    00065
    00066 struct _cairo_matrix;
    00067 typedef struct _cairo_matrix cairo_matrix_t;
    00068
    00069 struct _cairo_font_face;
    00070 typedef struct _cairo_font_face cairo_font_face_t;
    00071
    00072 struct _cairo_scaled_font;
    00073 typedef struct _cairo_scaled_font cairo_scaled_font_t;
    00074
    00075 /*struct _cairo_glyph;
    00076 typedef struct _cairo_glyph cairo_glyph_t;*/
    00077
    00078 struct _cairo_text_extents;
    00079 typedef struct _cairo_text_extents cairo_text_extents_t;
    00080
    00081 struct _cairo_font_extents;
    00082 typedef struct _cairo_font_extents cairo_font_extents_t;
    00083
    00084 namespace cinder { namespace cairo {
    00086 // SurfaceBase
    00087 class SurfaceBase {
    00088  public:
    00089     SurfaceBase() : mCairoSurface( 0 ) {}
    00090     SurfaceBase( const SurfaceBase &other );
    00091     SurfaceBase& operator=( const SurfaceBase &other );
    00092
    00093     virtual ~SurfaceBase();
    00094
    00095     cairo_surface_t*    getCairoSurface() const { return mCairoSurface; }
    00096
    00097     int32_t getWidth() const { return mWidth; }
    00098     int32_t getHeight() const { return mHeight; }
    00099     float   getAspectRatio() const { return getWidth() / (float)getHeight(); }
    00100     Area    getBounds() const { return Area( 0, 0, getWidth(), getHeight() ); }
    00101     Vec2i   getSize() const { return Vec2i( getWidth(), getHeight() ); }
    00102
    00103     void    flush();
    00104
    00105  protected:
    00106     SurfaceBase( int32_t aWidth, int32_t aHeight ) : mWidth( aWidth ), mHeight( aHeight ), mCairoSurface( 0 ) {}
    00107
    00108     cairo_surface_t     *mCairoSurface;
    00109     int32_t             mWidth, mHeight;
    00110 };
    00111
    00113 // SurfaceImage
    00114 class SurfaceImage : public SurfaceBase {
    00115  public:
    00116     SurfaceImage() : SurfaceBase() {}
    00117     SurfaceImage( int32_t width, int32_t height, bool hasAlpha = false );
    00118     SurfaceImage( const uint8_t *dataPtr, int32_t width, int32_t height, int32_t stride, bool hasAlpha = false );
    00119     SurfaceImage( const cinder::Surface &ciSurface );
    00120     SurfaceImage( const SurfaceImage &other );
    00121
    00122     uint8_t*        getData();
    00123     const uint8_t*  getData() const { return getData(); }
    00124     int32_t         getStride() const;
    00125
    00126     cinder::Surface&        getSurface();
    00127     const cinder::Surface&  getSurface() const { return getSurface(); }
    00128
    00129  protected:
    00130     void    initCinderSurface( bool alpha, uint8_t *data, int32_t stride );
    00131
    00132     cinder::Surface     mCinderSurface;
    00133 };
    00134
    00136 // SurfaceSvg
    00137 class SurfaceSvg : public SurfaceBase {
    00138  public:
    00139     SurfaceSvg() : SurfaceBase() {}
    00140     SurfaceSvg( const std::string &filePath, uint32_t aWidth, uint32_t aHeight );
    00141     SurfaceSvg( const SurfaceSvg &other );
    00142 };
    00143
    00145 // SurfacePdf
    00146 class SurfacePdf : public SurfaceBase {
    00147  public:
    00148     SurfacePdf() : SurfaceBase() {}
    00149     SurfacePdf( const std::string &filePath, double widthInPoints, double heightInPoints );
    00150     SurfacePdf( const SurfacePdf &other );
    00151
    00152     void    setSize( double widthInPoints, double heightInPoints );
    00153 };
    00154
    00156 // SurfacePs
    00157 class SurfacePs : public SurfaceBase {
    00158  public:
    00159     SurfacePs() : SurfaceBase() {}
    00160     SurfacePs( const std::string &filePath, double widthInPoints, double heightInPoints, bool enableLevel3 = true );
    00161     SurfacePs( const SurfacePs &other );
    00162
    00163     void    setSize( double widthInPoints, double heightInPoints );
    00166     void    dscBeginSetup();;
    00169     void    dscBeginPageSetup();
    00171     void    dscComment( const std::string &comment ) { dscComment( comment.c_str() ); }
    00173     void    dscComment( const char *comment );
    00174 };
    00175
    00177 // SurfaceEps
    00178 class SurfaceEps : public SurfaceBase {
    00179  public:
    00180     SurfaceEps() : SurfaceBase() {}
    00181     SurfaceEps( const std::string &filePath, double widthInPoints, double heightInPoints, bool enableLevel3 = true );
    00182     SurfaceEps( const SurfaceEps &other );
    00183
    00184     void    setSize( double widthInPoints, double heightInPoints );
    00187     void    dscBeginSetup();;
    00190     void    dscBeginPageSetup();
    00192     void    dscComment( const std::string &comment ) { dscComment( comment.c_str() ); }
    00194     void    dscComment( const char *comment );
    00195 };
    00196
    00198 // SurfaceQuartz
    00199 #if defined( CINDER_COCOA )
    00200 class SurfaceQuartz : public SurfaceBase {
    00201  public:
    00202     SurfaceQuartz() : SurfaceBase() {}
    00203     SurfaceQuartz( CGContextRef cgContext, int32_t width, int32_t height );
    00204     SurfaceQuartz( const SurfaceQuartz &other );
    00205
    00206     CGContextRef    getCgContextRef();
    00207
    00208  protected:
    00209     CGContextRef    mCgContextRef;
    00210 };
    00211
    00213 // SurfaceCgBitmapContext
    00214 class SurfaceCgBitmapContext : public SurfaceBase {
    00215  public:
    00216     SurfaceCgBitmapContext() : SurfaceBase() {}
    00217     SurfaceCgBitmapContext( int32_t width, int32_t height, bool alpha );
    00218     SurfaceCgBitmapContext( const SurfaceCgBitmapContext &other );
    00219
    00220     cinder::Surface&            getSurface() { return mSurface; }
    00221     const cinder::Surface&      getSurface() const { return getSurface(); }
    00222
    00223     CGContextRef                getCgContextRef() { return mCgContextRef; }
    00224
    00225  protected:
    00226     cinder::Surface     mSurface;
    00227     CGContextRef        mCgContextRef;
    00228 };
    00229 #endif // defined( CINDER_COCOA )
    00230
    00232 // SurfaceGdi
    00233 #if defined( CINDER_MSW )
    00234 class SurfaceGdi : public SurfaceBase {
    00235   public:
    00236     SurfaceGdi() : SurfaceBase() {}
    00237     SurfaceGdi( HDC hdc );
    00238     SurfaceGdi( const SurfaceGdi &other );
    00239
    00240     HDC     getDc() const { return mDc; }
    00241
    00242   protected:
    00243     HDC     mDc;
    00244 };
    00245 #endif // defined( CINDER_MSW )
    00246
    00248 // Matrix
    00249 class Matrix
    00250 {
    00251   public:
    00252     Matrix();
    00253     Matrix( double xx, double yx, double xy, double yy, double x0, double y0 );
    00254
    00255     // This is a sort of horrible technique, but we will replace this with the ci::Matrix32 that will exist one day
    00256     cairo_matrix_t&         getCairoMatrix() { return *reinterpret_cast<cairo_matrix_t*>( this ); }
    00257     const cairo_matrix_t&   getCairoMatrix() const { return *reinterpret_cast<const cairo_matrix_t*>( this ); }
    00258
    00259     void    init( double xx, double yx, double xy, double yy, double x0, double y0 );
    00260     void        initIdentity();
    00261     void        initTranslate( double tx, double ty );
    00262     void        initScale( double sx, double sy );
    00263     void        initRotate( double radians );
    00264     void        translate( double tx, double ty );
    00265     void        scale( double sx, double sy );
    00266     void        rotate( double radians );
    00267     int32_t     invert();
    00268
    00270     Vec2f   transformPoint( const Vec2f &v ) const;
    00272     Vec2f   transformDistance( const Vec2f &v ) const;
    00273
    00274     // this is designed to mimic cairo_matrix_t exactly
    00275     double xx; double yx;
    00276     double xy; double yy;
    00277     double x0; double y0;
    00278 };
    00279
    00280 class Pattern {
    00281   public:
    00282     Pattern( cairo_pattern_t *aPattern ) : mCairoPattern( aPattern ) {}
    00284     Pattern( const Pattern &other );
    00285     ~Pattern();
    00286
    00287     Pattern&    operator=( const Pattern &other );
    00288
    00289     cairo_pattern_t* getCairoPattern() { return mCairoPattern; }
    00290
    00291     void        setExtend( int extend );
    00292     void        setExtendNone();
    00293     void        setExtendRepeat();
    00294     void        setExtendReflect();
    00295     void        setExtendPad();
    00296     int         getExtend() const;
    00297
    00298     void        setFilter( int filter );
    00299     int         getFilter() const;
    00300
    00301     void        setMatrix( const Matrix &matrix );
    00302     Matrix      getMatrix() const;
    00303
    00304   protected:
    00305     Pattern() : mCairoPattern( 0 ) {}
    00306
    00307     cairo_pattern_t *mCairoPattern;
    00308 };
    00309
    00310 class PatternSolid : public Pattern {
    00311   public:
    00312     PatternSolid( const ColorA &color );
    00313     PatternSolid( const Color &color );
    00314 };
    00315
    00316 class PatternSurface : public Pattern {
    00317   public:
    00318     PatternSurface( SurfaceBase &surface );
    00319 };
    00320
    00321 class Gradient : public Pattern {
    00322   public:
    00323     void        addColorStopRgb( double offset, double red, double green, double blue );
    00324     void        addColorStopRgba( double offset, double red, double green, double blue, double alpha );
    00325     void        addColorStop( double offset, const Color &color ) { addColorStopRgb( offset, (double)color.r, (double)color.g, (double)color.b ); }
    00326     void        addColorStop( double offset, const ColorA &color ) { addColorStopRgba( offset, (double)color.r, (double)color.g, (double)color.b, (double)color.a ); }
    00328     int         getColorStopCount();
    00329     void        getColorStopRgba( int index, double *offset, double *red, double *green, double *blue, double *alpha );
    00330
    00331   protected:
    00332     Gradient( cairo_pattern_t *pattern );
    00333 };
    00334
    00335 class GradientRadial : public Gradient {
    00336   public:
    00337     GradientRadial( double x0, double y0, double radius0, double x1, double y1, double radius1 );
    00338     GradientRadial( const Vec2f &center0, float radius0, const Vec2f &center1, float radius1 );
    00339 };
    00340
    00341 class GradientLinear : public Gradient {
    00342   public:
    00343     GradientLinear( double x0, double y0, double x1, double y1 );
    00344     GradientLinear( Vec2f point0, Vec2f point1 );
    00345 };
    00346
    00347 class FontOptions
    00348 {
    00349 public:
    00350     FontOptions() { mCairoFontOptions = 0; }
    00351     FontOptions( cairo_font_options_t *aCairoFontOptions );
    00352     virtual ~FontOptions();
    00353
    00354     cairo_font_options_t* getCairoFontOptions() { return mCairoFontOptions; }
    00355
    00356     FontOptions*    create();
    00357
    00358     int32_t         status();
    00359     void            merge( const FontOptions *other );
    00360     unsigned long   hash();
    00361     bool            equal( const FontOptions *other );
    00362     void            setAntiAlias( int32_t antialias );
    00363     int32_t         getAntiAlias();
    00364     void            setSubPixelOrder( int32_t subpixel_order );
    00365     int32_t         getSubPixelOrder();
    00366     void            setHintStyle( int32_t hint_style );
    00367     int32_t         getHintStyle();
    00368     void            setHintMetrics( int32_t hint_metrics );
    00369     int32_t         getHintMetrics();
    00370
    00371 private:
    00372     cairo_font_options_t    *mCairoFontOptions;
    00373 };
    00374
    00375 class FontFace
    00376 {
    00377 public:
    00378     FontFace() { mCairoFontFace = 0; }
    00379     FontFace( const std::string &fontName );
    00380     FontFace( cairo_font_face_t *aCairoFontFace );
    00381     virtual ~FontFace();
    00382
    00383     cairo_font_face_t* getCairoFontFace() const { return mCairoFontFace; }
    00384
    00385     int32_t     getType();
    00386
    00387 private:
    00388     cairo_font_face_t   *mCairoFontFace;
    00389 };
    00390
    00391 class ScaledFont
    00392 {
    00393 public:
    00394     ScaledFont() { mCairoScaledFont = 0; }
    00395     ScaledFont( cairo_scaled_font_t *aCairoScaledFont );
    00396     virtual ~ScaledFont();
    00397
    00398     cairo_scaled_font_t* getCairoScaledFont() { return mCairoScaledFont; }
    00399
    00400     int32_t     status();
    00401 //  void        fontExtents( class FontExtents *extents );
    00402 //  void        textExtents( const char *utf8, class TextExtents *extents );
    00403     //void      glyphExents( const class Glyph *glyphs, int32_t num_glyphs ); // Needs to change to accept arrays
    00404     FontFace*   getFontFace();
    00405     void        getFontOptions( FontOptions *options );
    00406     void        getFontMatrix( Matrix *font_matrix );
    00407     void        getCtm( Matrix *ctm);
    00408     int32_t     getType();
    00409
    00410 private:
    00411     cairo_scaled_font_t *mCairoScaledFont;
    00412 };
    00413
    00414 /*class Glyph
    00415 {
    00416 public:
    00417     Glyph();
    00418     Glyph( cairo_glyph_t *aCairoGlyph );
    00419     virtual ~Glyph();
    00420
    00421     cairo_glyph_t* getCairoGlyph() { return mCairoGlyph.get(); }
    00422
    00423     const unsigned long&    index() const;
    00424     unsigned long&          index();
    00425     const double&           x() const;
    00426     double&                 x();
    00427     const double&           y() const;
    00428     double&                 y();
    00429
    00430 private:
    00431     shared_ptr<cairo_glyph_t>   mCairoGlyph;
    00432 };
    00433
    00434 // This stores a std::vector of cairo_glyph_t
    00435 class GlyphArray
    00436 {
    00437 public:
    00438     GlyphArray();
    00439
    00440     Glyph   getAtIndex( size_t idx );
    00441     void    append( Glyph &aGlyph );
    00442     void    clear();
    00443
    00444 private:
    00445     std::vector<cairo_glyph_t>  mGlyphs;
    00446
    00447     friend class Context;
    00448 };
    00449 */
    00450 class FontExtents
    00451 {
    00452 public:
    00453     FontExtents();
    00454     FontExtents( cairo_font_extents_t *aCairoFontExtents );
    00455     virtual ~FontExtents();
    00456
    00457     cairo_font_extents_t* getCairoFontExtents() { return mCairoFontExtents.get(); }
    00458
    00459     const double&   ascent() const;
    00460     double&         ascent();
    00461     const double&   descent() const;
    00462     double&         descent();
    00463     const double&   height() const;
    00464     double&         height();
    00465     const double&   maxXAdvance() const;
    00466     double&         maxXAdvance();
    00467     const double&   maxYAdvance() const;
    00468     double&         maxYAdvance();
    00469
    00470 private:
    00471     shared_ptr<cairo_font_extents_t>    mCairoFontExtents;
    00472 };
    00473
    00474 class TextExtents
    00475 {
    00476 public:
    00477     TextExtents();
    00478     TextExtents( cairo_text_extents_t *aCairoTextExtents );
    00479     virtual ~TextExtents();
    00480
    00481     cairo_text_extents_t* getCairoTextExtents() { return mCairoTextExtents.get(); }
    00482
    00483     const double&   xBearing() const;
    00484     double&         xBearing();
    00485     const double&   yBearing() const;
    00486     double&         yBearing();
    00487     const double&   width() const;
    00488     double&         width();
    00489     const double&   height() const;
    00490     double&         height();
    00491     const double&   xAdvance() const;
    00492     double&         xAdvance();
    00493     const double&   yAdvance() const;
    00494     double&         yAdvance();
    00495
    00496 private:
    00497     shared_ptr<cairo_text_extents_t>    mCairoTextExtents;
    00498 };
    00499
    00501 // Context
    00502 class Context
    00503 {
    00504  public:
    00505     Context() : mCairo( 0 ) {}
    00506     Context( const SurfaceBase &surface );
    00507     Context( const Context &other );
    00508     ~Context();
    00509
    00510     Context& operator=( const Context &other );
    00511
    00513     cairo_t*            getCairo();
    00515     cairo_surface_t*    getCairoSuface();
    00516
    00517     void        save();
    00518     void        restore();
    00519     void        flush();
    00520
    00521     void        pushGroup();
    00522
    00523     void        pushGroupWithContent( int32_t content );
    00524     Pattern*    popGroup();
    00525     void        popGroupToSource();
    00526
    00527     void        setSourceRgb( double red, double green, double blue );
    00528     void        setSourceRgba( double red, double green, double blue, double alpha );
    00529     void        setSource( const Color &col ) { setSourceRgb( col.r, col.g, col.b ); }
    00530     void        setSource( const ColorAf &col ) { setSourceRgba( col.r, col.g, col.b, col.a ); }
    00531     void        setSource( const Pattern &source );
    00532     void        setSourceSurface( SurfaceBase &surface, double x, double y );
    00533     Pattern*    getSource();
    00534
    00535     void        copySurface( const SurfaceBase &surface, const Area &srcArea, const Vec2i &dstOffset = Vec2i::zero() );
    00536
    00537     void        setAntiAlias( int32_t antialias );
    00538     int32_t     getAntiAlias();
    00539
    00540     void        setDash( const double *dashes, int numDashes, double offset );
    00541     void        setDash( const std::vector<double> &dashes, double offset = 0 );
    00542     void        unsetDash();
    00543     int         getDashCount() const;
    00544     void        getDash( double *dashes, double *offset );
    00545
    00546     void        setFillRule( int32_t fill_rule );
    00547     int32_t     getFillRule();
    00548     void        setLineCap( int32_t line_cap );
    00549     int32_t     getLineCap();
    00550     void        setLineJoin( int32_t line_join );
    00551     int32_t     getLineJoin();
    00552     void        setLineWidth( double width );
    00553     double      getLineWidth() const;
    00554     void        setMiterLimit( double limit );
    00555     double      getMiterLimit() const;
    00556
    00557     void        setOperator( int32_t op );
    00558     int32_t     getOperator();
    00559
    00560     void        setTolerance( double tolerance );
    00561     double      getTolerance() const;
    00562     void        clip();
    00563     void        clipPerserve();
    00564     void        clipExtents( double *x1, double *y1, double *x2, double *y2 );
    00565     void        resetClip();
    00566
    00567     // TODO: This stuff needs to be reviewed before we implement.
    00568 //  enum        cairo_rectangle_t;
    00569 //  enum        cairo_rectangle_list_t;
    00570 //  void        cairo_rectangle_list_destroy    (cairo_rectangle_list_t *rectangle_list);
    00571 //  cairo_rectangle_list_t* cairo_copy_clip_rectangle_list(cairo_t *cr);
    00572
    00573     void        fill();
    00574     void        fillPreserve();
    00575     void        fillExtents( double *x1, double *y1, double *x2, double *y2 );
    00576     bool        inFill( double x, double y );
    00577
    00578 //  void        cairo_mask                      (cairo_t *cr, cairo_pattern_t *pattern);
    00579 //  void        cairo_mask_surface              (cairo_t *cr, cairo_surface_t *surface, double surface_x, double surface_y);
    00580     void        mask( Pattern *pattern );
    00581     void        maskSurface( SurfaceBase *surface, double surface_x, double surface_y );
    00582
    00583     void        paint();
    00584     void        paintWithAlpha( double alpha );
    00585     void        stroke();
    00586     void        strokePreserve();
    00587     void        strokeExtents( double *x1, double *y1, double *x2, double *y2 );
    00588     bool        inStroke( double x, double y );
    00589     void        copyPage();
    00590     void        showPage();
    00591
    00593     void        copyPath( cinder::Shape2d *resultPath );
    00595     void        copyPathFlat( cinder::Shape2d *resultPath );
    00596     /*void      pathDestroy( class Path *path );
    00597     void        appendPath( const class Path *path );
    00598     */
    00599     void        getCurrentPoint( double *x, double *y );
    00600     void        newPath();
    00601     void        newSubPath();
    00602     void        closePath();
    00603     void        arc( double xc, double yc, double radius, double angle1, double angle2 );
    00604     void        arc( const Vec2f &center, double radius, double angle1, double angle2 ) { arc( center.x, center.y, radius, angle1, angle2 ); }
    00605     void        arcNegative( double xc, double yc, double radius, double angle1, double angle2 );
    00606     void        arcNegative( const Vec2f &center, double radius, double angle1, double angle2 ) { arcNegative( center.x, center.y, radius, angle1, angle2 ); }
    00607     void        quadTo( double x1, double y1, double x2, double y2 );
    00608     void        quadTo( const Vec2f &v1, const Vec2f &v2 ) { quadTo( (double)v1.x, (double)v1.y, (double)v2.x, (double)v2.y ); }
    00609     void        curveTo( double x1, double y1, double x2, double y2, double x3, double y3 );
    00610     void        curveTo( const Vec2f &v1, const Vec2f &v2, const Vec2f &v3 ) { curveTo( (double)v1.x, (double)v1.y, (double)v2.x, (double)v2.y, (double)v3.x, (double)v3.y ); }
    00611     void        line( const Vec2f &v1, const Vec2f &v2 ) { moveTo( v1 ); lineTo( v2 ); }
    00612     void        lineTo( double x, double y );
    00613     void        lineTo( const Vec2f &v ) { lineTo( (double)v.x, (double)v.y ); }
    00614     void        moveTo( double x, double y );
    00615     void        moveTo( const Vec2f &v ) { moveTo( (double)v.x, (double)v.y ); }
    00616     void        rectangle( double x, double y, double width, double height );
    00617     void        rectangle( const Rectf &r ) { rectangle( r.x1, r.y1, r.getWidth(), r.getHeight() ); }
    00618     void        rectangle( const Vec2f &upperLeft, const Vec2f &lowerRight );
    00619     //void        glyphPath( const cairo_glyph_t *glyphs, int num_glyphs );
    00620     void        textPath( const char *utf8 );
    00621     void        relCurveTo( double dx1, double dy1, double dx2, double dy2, double dx3, double dy3 );
    00622     void        relLineTo( double dx, double dy );
    00623     void        relMoveTo( double dx, double dy );
    00624     void        appendPath( const cinder::Shape2d &path );
    00625     void        appendPath( const cinder::Path2d &path );
    00626     void        circle( double dx, double dy, double radius );
    00627     void        circle( const Vec2f &v, double radius ) { circle( (double)v.x, (double)v.y, radius ); }
    00628
    00629 // Transformation functions
    00630     void        translate( double tx, double ty );
    00631     void        translate( const Vec2f &v ) { translate( (double)v.x, (double)v.y ); }
    00632     void        scale( double sx, double sy );
    00633     void        rotate( double angle );
    00634     void        transform( const Matrix &aMatrix );
    00635     void        setMatrix( const Matrix &aMatrix );
    00636     void        getMatrix( Matrix *aMatrix );
    00637     void        identityMatrix();
    00638     void        userToDevice( double *x, double *y );
    00639     void        userToDeviceDistance( double *dx, double *dy );
    00640     void        deviceToUser( double *x, double *y );
    00641     void        deviceToUserDistance( double *dx, double *dy );
    00642
    00643 // Text/font functions
    00644     void        setFont( const cinder::Font &font );
    00645     void        selectFontFace( const std::string &family, int32_t slant, int32_t weight );
    00646     void        setFontSize( double size );
    00647     void        setFontMatrix( const Matrix &matrix );
    00648     void        getFontMatrix( Matrix *matrix );
    00649     void        setFontOptions( const FontOptions *options );
    00650     void        getFontOptions( FontOptions *options );
    00651     void        setFontFace( const FontFace &font_face );
    00652     FontFace*   getFontFace();
    00653     void        setScaledFont( const ScaledFont *scaled_font );
    00654     ScaledFont* getScaledFont();
    00655     void        showText( const std::string &s );
    00656     //void        showGlyphs( const Glyph *glyphs, int num_glyphs );                            // glyphs is an array of cairo_glyph_t
    00657     //void      showGlyphs( const GlyphArray &glyphs );
    00658     FontExtents fontExtents();
    00659     TextExtents textExtents( const std::string &s );
    00660     //void        glyphExtents( const Glyph *glyphs, int num_glyphs, TextExtents *extents );    // glyphs is an array of cairo_glyph_t
    00661     //void      glyphExtents( const GlyphArray &glyphs, int num_glyphs, TextExtents *extents );
    00662
    00663   protected:
    00664     cairo_t                     *mCairo;
    00665     cairo_surface_t             *mCairoSurface;
    00666 };
    00667
    00668 #if defined( CINDER_COCOA )
    00669 SurfaceQuartz   createWindowSurface();
    00670 #else
    00671 SurfaceGdi      createWindowSurface();
    00672 #endif
    00673
    00674 // CONSTANTS
    00675 extern const int32_t    FONT_SLANT_NORMAL;
    00676 extern const int32_t    FONT_SLANT_ITALIC;
    00677 extern const int32_t    FONT_SLANT_OBLIQUE;
    00678 extern const int32_t    FONT_WEIGHT_NORMAL;
    00679 extern const int32_t    FONT_WEIGHT_BOLD;
    00680
    00681 extern const int32_t    FILL_RULE_WINDING;
    00682 extern const int32_t    FILL_RULE_EVEN_ODD;
    00683
    00684 extern const int32_t    EXTEND_NONE;
    00685 extern const int32_t    EXTEND_REPEAT;
    00686 extern const int32_t    EXTEND_REFLECT;
    00687 extern const int32_t    EXTEND_PAD;
    00688
    00689 extern const int32_t    LINE_CAP_BUTT;
    00690 extern const int32_t    LINE_CAP_ROUND;
    00691 extern const int32_t    LINE_CAP_SQUARE;
    00692
    00693 extern const int32_t    LINE_JOIN_MITER;
    00694 extern const int32_t    LINE_JOIN_ROUND;
    00695 extern const int32_t    LINE_JOIN_BEVEL;
    00696
    00697 extern const int32_t    HINT_METRICS_DEFAULT;
    00698 extern const int32_t    HINT_METRICS_OFF;
    00699 extern const int32_t    HINT_METRICS_ON;
    00700 extern const int32_t    HINT_STYLE_DEFAULT;
    00701 extern const int32_t    HINT_STYLE_NONE;
    00702 extern const int32_t    HINT_STYLE_SLIGHT;
    00703 extern const int32_t    HINT_STYLE_MEDIUM;
    00704 extern const int32_t    HINT_STYLE_FULL;
    00705
    00706 extern const int32_t    ANTIALIAS_DEFAULT;
    00707 extern const int32_t    ANTIALIAS_NONE;
    00708 extern const int32_t    ANTIALIAS_GRAY;
    00709 extern const int32_t    ANTIALIAS_SUBPIXEL;
    00710
    00711 extern const int32_t    SUBPIXEL_ORDER_DEFAULT;
    00712 extern const int32_t    SUBPIXEL_ORDER_RGB;
    00713 extern const int32_t    SUBPIXEL_ORDER_BGR;
    00714 extern const int32_t    SUBPIXEL_ORDER_VRGB;
    00715 extern const int32_t    SUBPIXEL_ORDER_VBGR;
    00716
    00717 extern const int32_t    STATUS_SUCCESS;
    00718 extern const int32_t    STATUS_NO_AVAILABLE_MEMORY;
    00719 extern const int32_t    STATUS_INVALID_RESTORE;
    00720 extern const int32_t    STATUS_INVALID_POP_GROUP;
    00721 extern const int32_t    STATUS_NO_CURRENT_POINT;
    00722 extern const int32_t    STATUS_INVALID_MATRIX;
    00723 extern const int32_t    STATUS_INVALID_STATUS;
    00724 extern const int32_t    STATUS_NULL_POINTER;
    00725 extern const int32_t    STATUS_INVALID_STRING;
    00726 extern const int32_t    STATUS_INVALID_PATH_DATA;
    00727 extern const int32_t    STATUS_READ_ERROR;
    00728 extern const int32_t    STATUS_WRITE_ERROR;
    00729 extern const int32_t    STATUS_SURFACE_FINISHED;
    00730 extern const int32_t    STATUS_SURFACE_TYPE_MISMATCH;
    00731 extern const int32_t    STATUS_PATTERN_TYPE_MISMATCH;
    00732 extern const int32_t    STATUS_INVALID_CONTENT;
    00733 extern const int32_t    STATUS_INVALID_FORMAT;
    00734 extern const int32_t    STATUS_INVALID_VISUAL;
    00735 extern const int32_t    STATUS_FILE_NOT_FOUND;
    00736 extern const int32_t    STATUS_INVALID_DASH;
    00737 extern const int32_t    STATUS_INVALID_DSC_COMMENT;
    00738 extern const int32_t    STATUS_INVALID_INDEX;
    00739 extern const int32_t    STATUS_CLIP_NOT_REPRESENTABLE;
    00740
    00741 } } // namespace cinder::cairo
    00742
    00743 namespace cinder {
    00744
    00745 class SurfaceConstraintsCairo : public cinder::SurfaceConstraints {
    00746  public:
    00747     virtual SurfaceChannelOrder getChannelOrder( bool alpha ) const;
    00748     virtual int32_t             getRowBytes( int requestedWidth, const SurfaceChannelOrder &sco, int elementSize ) const;
    00749 };
    00750
    00751 } // namespace cinder