ultimatepp/uppdev/plugin/cairo/Cairo.h
cxl b7eba97090 Sdraw...
git-svn-id: svn://ultimatepp.org/upp/trunk@733 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2009-01-06 22:20:15 +00:00

223 lines
5.6 KiB
C++

#ifndef _plugin_cairo_Cairo_h_
#define _plugin_cairo_Cairo_h_
#include <Core/Core.h>
#include <Draw/Draw.h>
#include "lib/cairo.h"
#include "lib/cairo-svg.h"
#include "lib/cairo-pdf.h"
#include "CairoPattern.h"
NAMESPACE_UPP
class Cairo : public NoCopy
{
private:
cairo_surface_t *_surface;
cairo_t *_context;
int _width, _height;
void DestroySurface()
{
if (_context != NULL)
{
cairo_status_t status = cairo_status(_context);
ASSERT_(status == CAIRO_STATUS_SUCCESS, cairo_status_to_string(status));
cairo_destroy(_context);
}
if (_surface != NULL)
cairo_surface_destroy(_surface);
}
public:
Cairo()
: _surface(NULL),
_context(NULL)
{
}
~Cairo()
{
DestroySurface();
}
int GetWidth() { return _width; }
int GetHeight() { return _height; }
void SetSurface(cairo_surface_t *surface, int width, int height);
void SetSurface(ImageBuffer &img);
void CreateSvgSurface(String const &filename, double widthInPoints = 595, double heightInPoints = 841); // DIN-A4 default size
void CreatePdfSurface(String const &filename, double widthInPoints = 595, double heightInPoints = 841); // DIN-A4 default size
cairo_t *GetContext()
{
return _context;
}
cairo_surface_t *GetSurface()
{
return _surface;
}
bool HasContext()
{
return _context != NULL;
}
void Clear(Color const &color)
{
SetSourceRGB(color);
Paint();
}
/*******************************************************************************************************/
/************** TODO: remove the following 2 methods!!! Replace them with a dedicated font system ******/
/*******************************************************************************************************/
void DrawText(double x, double y, char const * const text, double size, Color ink)
{
cairo_t *context = GetContext();
ASSERT(context != NULL);
cairo_set_font_size(context, size);
Save();
Translate(x, y + size);
SetSourceRGB(ink);
cairo_show_text(context, text);
NewPath();
Restore();
}
void DrawTextCenter(double x, double y, double width, char const * const text, double size, Color ink)
{
cairo_t *context = GetContext();
ASSERT(context != NULL);
cairo_set_font_size(context, size);
// measure string
cairo_text_extents_t extents;
cairo_text_extents(context, text, &extents);
double startX = x + (width / 2.0) - (extents.width / 2.0);
Save();
Translate(startX, y + size);
SetSourceRGB(ink);
cairo_show_text(context, text);
NewPath();
Restore();
}
/*
* Cairo cairo_t methods
* http://cairographics.org/manual/cairo-cairo-t.html
*/
void Save();
void Restore();
void PushGroup();
//cairo_push_group_with_content
void PopGroup();
void PopGroupToSource();
//cairo_get_group_target
void SetSourceRGB(double r, double g, double b);
void SetSourceRGB(Color const &color);
void SetSourceRGBA(double r, double g, double b, double a);
void SetSource(CairoPattern &pattern);
//cairo_set_source_surface
//cairo_get_source
void SetAntialias(cairo_antialias_t antialias);
cairo_antialias_t GetAntialias();
void SetDash(double const * dashes, int numDashes, double offset);
//cairo_get_dash_count
//cairo_get_dash
void SetFillRule(cairo_fill_rule_t fillRule);
cairo_fill_rule_t GetFillRule();
void SetLineCap(cairo_line_cap_t lineCap);
cairo_line_cap_t GetLineCap();
void SetLineJoin(cairo_line_join_t lineJoin);
cairo_line_join_t GetLineJoin();
void SetLineWidth(double width);
double GetLineWidth();
void SetMiterLimit(double limit);
double GetMiterLimit();
void SetOperator(cairo_operator_t op);
cairo_operator_t GetOperator();
void SetTolerance(double tolerance);
double GetTolerance();
void Clip(bool preserve = false);
//cairo_clip_extents
//cairo_reset_clip
//cairo_rectangle_list_destroy
//cairo_copy_clip_rectangle_list
void Fill(bool preserve = false);
//cairo_fill_extents
//cairo_in_fill
//cairo_mask
//cairo_mask_surface
void Paint(double alpha = 1.0);
void Stroke(bool preserve = false);
//cairo_stroke_extents
//cairo_in_stroke
//cairo_copy_page
//cairo_show_page
//cairo_get_reference_count probably not needed
//cairo_set_user_data probably not needed
//cairo_get_user_data probably not needed
/*
* Cairo transformation methods
* http://cairographics.org/manual/cairo-Transformations.html
*/
void Translate(double tx, double ty);
void Scale(double sx, double sy);
void Rotate(double angle);
//cairo_transform
//cairo_set_matrix
//cairo_get_matrix
void IdentityMatrix();
//cairo_user_to_device
//cairo_user_to_device_distance
//cairo_device_to_user
//cairo_device_to_user_distance
/*
* Cairo path methods
* http://cairographics.org/manual/cairo-Paths.html
*/
//cairo_copy_path
//cairo_copy_path_flat
//cairo_path_destroy
//cairo_append_path
//cairo_has_current_point
Pointf GetCurrentPoint();
void NewPath();
//cairo_new_sub_path
void ClosePath();
void Arc(double xc, double yc, double radius, double angle1, double angle2);
//cairo_arc_negative
void CurveTo(double x1, double y1, double x2, double y2, double x3, double y3);
void LineTo(double x, double y);
void MoveTo(double x, double y);
void Rectangle(double x, double y, double width, double height);
//cairo_glyph_path
//cairo_text_path
void RelCurveTo(double x1, double y1, double x2, double y2, double x3, double y3);
void RelLineTo(double x, double y);
void RelMoveTo(double x, double y);
//cairo_path_extents
};
END_UPP_NAMESPACE
#endif