Cairo FAQ Cairo backends

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
(Удалено по требованию автора...)
 
Строка 1: Строка 1:
-
The Cairo library supports various backends. In this section of the Cairo graphics tutorial, we will use Cairo to create a PNG image, PDF file, SVG file and we will draw on a GTK window.
 
-
== PNG image ==
 
-
 
-
In the first example, we will create a PNG image.
 
-
 
-
<source lang="cpp">
 
-
#include <cairo.h>
 
-
 
-
int main (int argc, char *argv[])
 
-
{
 
-
  cairo_surface_t *surface;
 
-
  cairo_t *cr;
 
-
 
-
  surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 390, 60);
 
-
  cr = cairo_create(surface);
 
-
 
-
  cairo_set_source_rgb(cr, 0, 0, 0);
 
-
  cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
 
-
      CAIRO_FONT_WEIGHT_NORMAL);
 
-
  cairo_set_font_size(cr, 40.0);
 
-
 
-
  cairo_move_to(cr, 10.0, 50.0);
 
-
  cairo_show_text(cr, "Disziplin ist Macht.");
 
-
 
-
  cairo_surface_write_to_png(surface, "image.png");
 
-
 
-
  cairo_destroy(cr);
 
-
  cairo_surface_destroy(surface);
 
-
 
-
  return 0;
 
-
}
 
-
</source>
 
-
 
-
This example is a small console application, that will create a PNG image.
 
-
 
-
<source lang="cpp">
 
-
#include <cairo.h>
 
-
 
-
</source>
 
-
 
-
In this header file, we will find declarations of our functions and constants.
 
-
 
-
<source lang="cpp">
 
-
cairo_surface_t *surface;
 
-
cairo_t *cr;
 
-
</source>
 
-
 
-
Here we declare a surface and a Cairo context.
 
-
 
-
<source lang="cpp">
 
-
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 390, 60);
 
-
cr = cairo_create(surface);
 
-
 
-
</source>
 
-
 
-
We create a surface and a Cairo context. The surface is an 390x60 px image.
 
-
 
-
<source lang="cpp">
 
-
cairo_set_source_rgb(cr, 0, 0, 0);
 
-
</source>
 
-
 
-
We will draw in black ink.
 
-
 
-
<source lang="cpp">
 
-
 
-
cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
 
-
      CAIRO_FONT_WEIGHT_NORMAL);
 
-
cairo_set_font_size(cr, 40.0);
 
-
</source>
 
-
 
-
We choose a font type and set it's size.
 
-
 
-
<source lang="cpp">
 
-
cairo_move_to(cr, 10.0, 50.0);
 
-
cairo_show_text(cr, "Disziplin ist Macht.");
 
-
</source>
 
-
 
-
We move to a (10.0, 50.0) position within the image and draw the text.
 
-
 
-
<source lang="cpp">
 
-
cairo_surface_write_to_png(surface, "image.png");
 
-
</source>
 
-
 
-
This function call creates the PNG image.
 
-
 
-
<source lang="cpp">
 
-
cairo_destroy(cr);
 
-
cairo_surface_destroy(surface);
 
-
</source>
 
-
 
-
In the end, we clean the resources.
 
-
 
-
[[image: cairo_faq_image.png | center]]
 
-
 
-
== PDF file ==
 
-
 
-
In the second example, we will use the Cairo library to create a simple PDF file.
 
-
 
-
<source lang="cpp">
 
-
#include <cairo/cairo.h>
 
-
 
-
#include <cairo/cairo-pdf.h>
 
-
 
-
int main() {
 
-
 
-
  cairo_surface_t *surface;
 
-
  cairo_t *cr;
 
-
 
-
  surface = cairo_pdf_surface_create("pdffile.pdf", 504, 648);
 
-
  cr = cairo_create(surface);
 
-
 
-
  cairo_set_source_rgb(cr, 0, 0, 0);
 
-
  cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
 
-
      CAIRO_FONT_WEIGHT_NORMAL);
 
-
  cairo_set_font_size (cr, 40.0);
 
-
 
-
  cairo_move_to(cr, 10.0, 50.0);
 
-
  cairo_show_text(cr, "Disziplin ist Macht.");
 
-
 
-
  cairo_show_page(cr);
 
-
 
-
  cairo_surface_destroy(surface);
 
-
  cairo_destroy(cr);
 
-
 
-
  return 0;
 
-
}
 
-
</source>
 
-
 
-
We must open the pdf file in a pdf viewer. Linux users can use KPDF or Evince viewers.
 
-
 
-
<source lang="cpp">
 
-
surface = cairo_pdf_surface_create("pdffile.pdf", 504, 648);
 
-
</source>
 
-
 
-
To render a pdf file, we must create a pdf surface using the <b>cairo_pdf_surface_create()</b> funcion call.
 
-
The size of the pdf file is specified in points, which is a standard in typesetting.
 
-
 
-
<source lang="cpp">
 
-
cairo_show_page(cr);
 
-
</source>
 
-
 
-
The <b>cairo_show_page()</b> finishes rendering of the pdf file.
 
-
 
-
[[image: cairo_faq_pdffile.png | center]]
 
-
 
-
== SVG file ==
 
-
 
-
The next example creates a simple SVG (Scalable Vector Graphics) file. The SVG is one of the hottest  technologies these days.
 
-
 
-
<source lang="cpp">
 
-
#include <cairo.h>
 
-
 
-
#include <cairo-svg.h>
 
-
 
-
int main() {
 
-
 
-
  cairo_surface_t *surface;
 
-
  cairo_t *cr;
 
-
 
-
  surface = cairo_svg_surface_create("svgfile.svg", 390, 60);
 
-
  cr = cairo_create(surface);
 
-
 
-
  cairo_set_source_rgb(cr, 0, 0, 0);
 
-
  cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
 
-
      CAIRO_FONT_WEIGHT_NORMAL);
 
-
  cairo_set_font_size (cr, 40.0);
 
-
 
-
  cairo_move_to(cr, 10.0, 50.0);
 
-
  cairo_show_text(cr, "Disziplin ist Macht.");
 
-
 
-
  cairo_surface_destroy(surface);
 
-
  cairo_destroy(cr);
 
-
 
-
  return 0;
 
-
}
 
-
</source>
 
-
 
-
We can use Firefox, Opera or Inkscape programs to open the svgfile.svg file.
 
-
 
-
<source lang="cpp">
 
-
surface = cairo_svg_surface_create("svgfile.svg", 390, 60);
 
-
</source>
 
-
 
-
To create a SVG file in Cairo, we must create a svg surface using the <b>cairo_svg_surface_create()</b> function call.
 
-
 
-
The Rest of the code is identical to the previous examples.
 
-
 
-
[[image: cairo_faq_svgfile.png | center]]
 
-
 
-
== GTK Window ==
 
-
 
-
In the last example, we will draw on the GTK window. This backend will be used  throughout the rest of the tutorial
 
-
 
-
<source lang="cpp">
 
-
#include <cairo.h>
 
-
#include <gtk/gtk.h>
 
-
 
-
static gboolean
 
-
on_expose_event(GtkWidget      *widget,
 
-
GdkEventExpose *event,
 
-
gpointer        data)
 
-
{
 
-
  cairo_t *cr;
 
-
 
-
  cr = gdk_cairo_create(widget->window);
 
-
 
-
  cairo_set_source_rgb(cr, 0, 0, 0);
 
-
  cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
 
-
      CAIRO_FONT_WEIGHT_NORMAL);
 
-
  cairo_set_font_size(cr, 40.0);
 
-
 
-
  cairo_move_to(cr, 10.0, 50.0);
 
-
  cairo_show_text(cr, "Disziplin ist Macht.");
 
-
 
-
  cairo_destroy(cr);
 
-
 
-
  return FALSE;
 
-
}
 
-
 
-
 
-
int
 
-
main (int argc, char *argv[])
 
-
{
 
-
 
-
  GtkWidget *window;
 
-
 
-
  gtk_init(&argc, &argv);
 
-
 
-
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
-
 
-
  g_signal_connect(window, "expose-event",
 
-
    G_CALLBACK (on_expose_event), NULL);
 
-
  g_signal_connect(window, "destroy",
 
-
    G_CALLBACK (gtk_main_quit), NULL);
 
-
 
-
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 
-
  gtk_window_set_default_size(GTK_WINDOW(window), 400, 90);
 
-
  gtk_widget_set_app_paintable(window, TRUE);
 
-
 
-
  gtk_widget_show_all(window);
 
-
 
-
  gtk_main();
 
-
 
-
  return 0;
 
-
}
 
-
</source>
 
-
 
-
The example pops up a centered GTK+ window, on which we draw the "Disziplin ist Macht" text.
 
-
 
-
<source lang="cpp">
 
-
#include <cairo.h>
 
-
#include <gtk/gtk.h>
 
-
</source>
 
-
 
-
We include the necessary Cairo and GTK headers.
 
-
 
-
<source lang="cpp">
 
-
g_signal_connect(window, "expose-event",
 
-
    G_CALLBACK(on_expose_event), NULL);
 
-
 
-
</source>
 
-
 
-
When the window is redrawn, an <b>expose-event</b> signal is emitted. We connect that signal to the <b>on_expose_event()</b> callback.
 
-
 
-
y gtk, part of a toolkits responsiveness is to redraw exposed regions which for normal windows will just 'clear' the background. if you want to draw you own things in such a window, you need to inform gtk about that with the gtk_widget_set_app_paintable () function.
 
-
 
-
<source lang="cpp">
 
-
gtk_widget_set_app_paintable(window, TRUE)
 
-
</source>
 
-
 
-
If we want to draw in GTK+, we can draw on a <b>GtkDrawingArea</b> widget or on a simple <b>GtkWindow</b> widget. I chose to draw on the latter. In order to draw on the <b>GtkWindow</b> widget, we must inform the GTK+ by calling the <b>gtk_widget_set_app_paintable()</b> call. The function call wil suppress the default themed drawing of the widget's background. In case of the <b>GtkDrawingArea</b>, we do not need to call the function.
 
-
 
-
<source lang="cpp">
 
-
cairo_t *cr;
 
-
 
-
cr = gdk_cairo_create(widget->window);
 
-
</source>
 
-
 
-
The drawing is done inside the <b>on_expose_event()</b> callback function. We create a Cairo context for the GTK+ system and draw our text as usual on that context.
 
-
 
-
[[image: cairo_faq_gtkwindow.png | center]]
 
-
 
-
 
-
[[Категория:GTK+]]
 
-
[[Категория:Cairo]]
 

Текущая версия на 11:30, 7 апреля 2009