]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkprintcontext.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkprintcontext.c
index c280881f80c0c091e53cb3f7a98d69ac936992f9..4d55b75e7858bbedfc07c522e5ea8ab054230e6c 100644 (file)
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 #include "gtkprintoperation-private.h"
-#include "gtkalias.h"
+
+
+/**
+ * SECTION:gtkprintcontext
+ * @Short_description: Encapsulates context for drawing pages
+ * @Title: GtkPrintContext
+ *
+ * A GtkPrintContext encapsulates context information that is required when
+ * drawing pages for printing, such as the cairo context and important
+ * parameters like page size and resolution. It also lets you easily
+ * create #PangoLayout and #PangoContext objects that match the font metrics
+ * of the cairo surface.
+ *
+ * GtkPrintContext objects gets passed to the #GtkPrintOperation::begin-print,
+ * #GtkPrintOperation::end-print, #GtkPrintOperation::request-page-setup and
+ * #GtkPrintOperation::draw-page signals on the #GtkPrintOperation.
+ *
+ * <example>
+ * <title>Using GtkPrintContext in a #GtkPrintOperation::draw-page callback</title>
+ * <programlisting>
+ * static void
+ * draw_page (GtkPrintOperation *operation,
+ *        GtkPrintContext   *context,
+ *        int                page_nr)
+ * {
+ *   cairo_t *cr;
+ *   PangoLayout *layout;
+ *   PangoFontDescription *desc;
+ *
+ *   cr = gtk_print_context_get_cairo_context (context);
+ *
+ *   // Draw a red rectangle, as wide as the paper (inside the margins)
+ *   cairo_set_source_rgb (cr, 1.0, 0, 0);
+ *   cairo_rectangle (cr, 0, 0, gtk_print_context_get_width (context), 50);
+ *
+ *   cairo_fill (cr);
+ *
+ *   // Draw some lines
+ *   cairo_move_to (cr, 20, 10);
+ *   cairo_line_to (cr, 40, 20);
+ *   cairo_arc (cr, 60, 60, 20, 0, M_PI);
+ *   cairo_line_to (cr, 80, 20);
+ *
+ *   cairo_set_source_rgb (cr, 0, 0, 0);
+ *   cairo_set_line_width (cr, 5);
+ *   cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+ *   cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
+ *
+ *   cairo_stroke (cr);
+ *
+ *   // Draw some text
+ *   layout = gtk_print_context_create_layout (context);
+ *   pango_layout_set_text (layout, "Hello World! Printing is easy", -1);
+ *   desc = pango_font_description_from_string ("sans 28");
+ *   pango_layout_set_font_description (layout, desc);
+ *   pango_font_description_free (desc);
+ *
+ *   cairo_move_to (cr, 30, 20);
+ *   pango_cairo_layout_path (cr, layout);
+ *
+ *   // Font Outline
+ *   cairo_set_source_rgb (cr, 0.93, 1.0, 0.47);
+ *   cairo_set_line_width (cr, 0.5);
+ *   cairo_stroke_preserve (cr);
+ *
+ *   // Font Fill
+ *   cairo_set_source_rgb (cr, 0, 0.0, 1.0);
+ *   cairo_fill (cr);
+ *
+ *   g_object_unref (layout);
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * Printing support was added in GTK+ 2.10.
+ */
+
 
 typedef struct _GtkPrintContextClass GtkPrintContextClass;
 
@@ -44,6 +118,13 @@ struct _GtkPrintContext
   
   gdouble pixels_per_unit_x;
   gdouble pixels_per_unit_y;
+
+  gboolean has_hard_margins;
+  gdouble hard_margin_top;
+  gdouble hard_margin_bottom;
+  gdouble hard_margin_left;
+  gdouble hard_margin_right;
+
 };
 
 struct _GtkPrintContextClass
@@ -90,6 +171,7 @@ _gtk_print_context_new (GtkPrintOperation *op)
 
   context->op = op;
   context->cr = NULL;
+  context->has_hard_margins = FALSE;
   
   return context;
 }
@@ -132,7 +214,7 @@ gtk_print_context_set_cairo_context (GtkPrintContext *context,
   switch (context->op->priv->unit)
     {
     default:
-    case GTK_UNIT_PIXEL:
+    case GTK_UNIT_NONE:
       /* Do nothing, this is the cairo default unit */
       context->pixels_per_unit_x = 1.0;
       context->pixels_per_unit_y = 1.0;
@@ -177,11 +259,11 @@ _gtk_print_context_rotate_according_to_orientation (GtkPrintContext *context)
     case GTK_PAGE_ORIENTATION_PORTRAIT:
       break;
     case GTK_PAGE_ORIENTATION_LANDSCAPE:
-      cairo_translate (cr, width, 0);
+      cairo_translate (cr, 0, height);
       cairo_matrix_init (&matrix,
-                         0,  1,
-                        -1,  0,
-                         0,  0);
+                        0, -1,
+                        1,  0,
+                        0,  0);
       cairo_transform (cr, &matrix);
       break;
     case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT:
@@ -193,11 +275,41 @@ _gtk_print_context_rotate_according_to_orientation (GtkPrintContext *context)
       cairo_transform (cr, &matrix);
       break;
     case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE:
-      cairo_translate (cr, 0, height);
+      cairo_translate (cr, width, 0);
       cairo_matrix_init (&matrix,
-                        0, -1,
-                        1,  0,
-                        0,  0);
+                         0,  1,
+                        -1,  0,
+                         0,  0);
+      cairo_transform (cr, &matrix);
+      break;
+    }
+}
+
+void
+_gtk_print_context_reverse_according_to_orientation (GtkPrintContext *context)
+{
+  cairo_t *cr = context->cr;
+  cairo_matrix_t matrix;
+  gdouble width, height;
+
+  width = gtk_page_setup_get_paper_width (context->page_setup, GTK_UNIT_INCH);
+  width = width * context->surface_dpi_x / context->pixels_per_unit_x;
+  height = gtk_page_setup_get_paper_height (context->page_setup, GTK_UNIT_INCH);
+  height = height * context->surface_dpi_y / context->pixels_per_unit_y;
+
+  switch (gtk_page_setup_get_orientation (context->page_setup))
+    {
+    default:
+    case GTK_PAGE_ORIENTATION_PORTRAIT:
+    case GTK_PAGE_ORIENTATION_LANDSCAPE:
+      break;
+    case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT:
+    case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE:
+      cairo_translate (cr, width, height);
+      cairo_matrix_init (&matrix,
+                        -1,  0,
+                         0, -1,
+                         0,  0);
       cairo_transform (cr, &matrix);
       break;
     }
@@ -206,21 +318,17 @@ _gtk_print_context_rotate_according_to_orientation (GtkPrintContext *context)
 void
 _gtk_print_context_translate_into_margin (GtkPrintContext *context)
 {
-  GtkPrintOperationPrivate *priv;
   gdouble left, top;
 
   g_return_if_fail (GTK_IS_PRINT_CONTEXT (context));
 
-  priv = context->op->priv;
-
-  /* We do it this way to also handle GTK_UNIT_PIXELS */
-  
+  /* We do it this way to also handle GTK_UNIT_NONE */
   left = gtk_page_setup_get_left_margin (context->page_setup, GTK_UNIT_INCH);
   top = gtk_page_setup_get_top_margin (context->page_setup, GTK_UNIT_INCH);
 
   cairo_translate (context->cr,
-                  left * context->surface_dpi_x / context->pixels_per_unit_x,
-                  top * context->surface_dpi_y / context->pixels_per_unit_y);
+                   left * context->surface_dpi_x / context->pixels_per_unit_x,
+                   top * context->surface_dpi_y / context->pixels_per_unit_y);
 }
 
 void
@@ -246,7 +354,7 @@ _gtk_print_context_set_page_setup (GtkPrintContext *context,
  * Obtains the cairo context that is associated with the
  * #GtkPrintContext.
  *
- * Return value: the cairo context of @context
+ * Return value: (transfer none): the cairo context of @context
  *
  * Since: 2.10
  */
@@ -265,7 +373,7 @@ gtk_print_context_get_cairo_context (GtkPrintContext *context)
  * Obtains the #GtkPageSetup that determines the page
  * dimensions of the #GtkPrintContext.
  *
- * Return value: the page setup of @context
+ * Return value: (transfer none): the page setup of @context
  *
  * Since: 2.10
  */
@@ -373,14 +481,70 @@ gtk_print_context_get_dpi_y (GtkPrintContext *context)
   return context->surface_dpi_y;
 }
 
+/**
+ * gtk_print_context_get_hard_margins:
+ * @context: a #GtkPrintContext
+ * @top: (out): top hardware printer margin
+ * @bottom: (out): bottom hardware printer margin
+ * @left: (out): left hardware printer margin
+ * @right: (out): right hardware printer margin
+ *
+ * Obtains the hardware printer margins of the #GtkPrintContext, in units.
+ *
+ * Return value: %TRUE if the hard margins were retrieved
+ *
+ * Since: 2.20
+ */
+gboolean
+gtk_print_context_get_hard_margins (GtkPrintContext *context,
+                                   gdouble         *top,
+                                   gdouble         *bottom,
+                                   gdouble         *left,
+                                   gdouble         *right)
+{
+  if (context->has_hard_margins)
+    {
+      *top    = context->hard_margin_top / context->pixels_per_unit_y;
+      *bottom = context->hard_margin_bottom / context->pixels_per_unit_y;
+      *left   = context->hard_margin_left / context->pixels_per_unit_x;
+      *right  = context->hard_margin_right / context->pixels_per_unit_x;
+    }
+
+  return context->has_hard_margins;
+}
+
+/**
+ * gtk_print_context_set_hard_margins:
+ * @context: a #GtkPrintContext
+ * @top: top hardware printer margin
+ * @bottom: bottom hardware printer margin
+ * @left: left hardware printer margin
+ * @right: right hardware printer margin
+ *
+ * set the hard margins in pixel coordinates
+ */
+void
+_gtk_print_context_set_hard_margins (GtkPrintContext *context,
+                                    gdouble          top,
+                                    gdouble          bottom,
+                                    gdouble          left,
+                                    gdouble          right)
+{
+  context->hard_margin_top    = top;
+  context->hard_margin_bottom = bottom;
+  context->hard_margin_left   = left;
+  context->hard_margin_right  = right;
+  context->has_hard_margins   = TRUE;
+}
+
 /**
  * gtk_print_context_get_pango_fontmap:
  * @context: a #GtkPrintContext
  *
- * Returns a #PangoFontMap that is suitable for use 
+ * Returns a #PangoFontMap that is suitable for use
  * with the #GtkPrintContext.
  *
- * Return value: the font map of @context
+ * Return value: (transfer none): the font map of @context
  *
  * Since: 2.10
  */
@@ -394,12 +558,12 @@ gtk_print_context_get_pango_fontmap (GtkPrintContext *context)
 
 /**
  * gtk_print_context_create_pango_context:
- * @context: a #GtkPrintContext 
+ * @context: a #GtkPrintContext
  *
  * Creates a new #PangoContext that can be used with the
  * #GtkPrintContext.
  *
- * Return value: a new Pango context for @context
+ * Return value: (transfer full): a new Pango context for @context
  * 
  * Since: 2.10
  */
@@ -411,7 +575,7 @@ gtk_print_context_create_pango_context (GtkPrintContext *context)
 
   g_return_val_if_fail (GTK_IS_PRINT_CONTEXT (context), NULL);
   
-  pango_context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (_gtk_print_context_get_fontmap (context)));
+  pango_context = pango_font_map_create_context (_gtk_print_context_get_fontmap (context));
 
   options = cairo_font_options_create ();
   cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF);
@@ -433,7 +597,7 @@ gtk_print_context_create_pango_context (GtkPrintContext *context)
  * Creates a new #PangoLayout that is suitable for use
  * with the #GtkPrintContext.
  * 
- * Return value: a new Pango layout for @context
+ * Return value: (transfer full): a new Pango layout for @context
  *
  * Since: 2.10
  */
@@ -453,7 +617,3 @@ gtk_print_context_create_pango_layout (GtkPrintContext *context)
 
   return layout;
 }
-
-
-#define __GTK_PRINT_CONTEXT_C__
-#include "gtkaliasdef.c"