Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* cairo - a vector graphics library with display and print output
  2.  *
  3.  * Copyright © 2005 Red Hat, Inc
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it either under the terms of the GNU Lesser General Public
  7.  * License version 2.1 as published by the Free Software Foundation
  8.  * (the "LGPL") or, at your option, under the terms of the Mozilla
  9.  * Public License Version 1.1 (the "MPL"). If you do not alter this
  10.  * notice, a recipient may use your version of this file under either
  11.  * the MPL or the LGPL.
  12.  *
  13.  * You should have received a copy of the LGPL along with this library
  14.  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
  16.  * You should have received a copy of the MPL along with this library
  17.  * in the file COPYING-MPL-1.1
  18.  *
  19.  * The contents of this file are subject to the Mozilla Public License
  20.  * Version 1.1 (the "License"); you may not use this file except in
  21.  * compliance with the License. You may obtain a copy of the License at
  22.  * http://www.mozilla.org/MPL/
  23.  *
  24.  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
  25.  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
  26.  * the specific language governing rights and limitations.
  27.  *
  28.  * The Original Code is the cairo graphics library.
  29.  *
  30.  * The Initial Developer of the Original Code is Red Hat, Inc.
  31.  *
  32.  * Contributor(s):
  33.  *      Carl Worth <cworth@cworth.org>
  34.  */
  35.  
  36. #ifndef CAIRO_PAGINATED_H
  37. #define CAIRO_PAGINATED_H
  38.  
  39. #include "cairoint.h"
  40.  
  41. struct _cairo_paginated_surface_backend {
  42.     /* Optional. Will be called once for each page.
  43.      *
  44.      * Note: With respect to the order of drawing operations as seen
  45.      * by the target, this call will occur before any drawing
  46.      * operations for the relevant page. However, with respect to the
  47.      * function calls as made by the user, this call will be *after*
  48.      * any drawing operations for the page, (that is, it will occur
  49.      * during the user's call to cairo_show_page or cairo_copy_page).
  50.      */
  51.     cairo_warn cairo_int_status_t
  52.     (*start_page)               (void                   *surface);
  53.  
  54.     /* Required. Will be called twice for each page, once with an
  55.      * argument of CAIRO_PAGINATED_MODE_ANALYZE and once with
  56.      * CAIRO_PAGINATED_MODE_RENDER. See more details in the
  57.      * documentation for _cairo_paginated_surface_create below.
  58.      */
  59.     void
  60.     (*set_paginated_mode)       (void                   *surface,
  61.                                  cairo_paginated_mode_t  mode);
  62.  
  63.     /* Optional. Specifies the smallest box that encloses all objects
  64.      * on the page. Will be called at the end of the ANALYZE phase but
  65.      * before the mode is changed to RENDER.
  66.      */
  67.     cairo_warn cairo_int_status_t
  68.     (*set_bounding_box) (void           *surface,
  69.                          cairo_box_t    *bbox);
  70.  
  71.     /* Optional. Indicates whether the page requires fallback images.
  72.      * Will be called at the end of the ANALYZE phase but before the
  73.      * mode is changed to RENDER.
  74.      */
  75.     cairo_warn cairo_int_status_t
  76.     (*set_fallback_images_required) (void           *surface,
  77.                                      cairo_bool_t    fallbacks_required);
  78.  
  79.     cairo_bool_t
  80.     (*supports_fine_grained_fallbacks) (void                *surface);
  81. };
  82.  
  83. /* A #cairo_paginated_surface_t provides a very convenient wrapper that
  84.  * is well-suited for doing the analysis common to most surfaces that
  85.  * have paginated output, (that is, things directed at printers, or
  86.  * for saving content in files such as PostScript or PDF files).
  87.  *
  88.  * To use the paginated surface, you'll first need to create your
  89.  * 'real' surface using _cairo_surface_init() and the standard
  90.  * #cairo_surface_backend_t. Then you also call
  91.  * _cairo_paginated_surface_create which takes its own, much simpler,
  92.  * #cairo_paginated_surface_backend_t. You are free to return the result
  93.  * of _cairo_paginated_surface_create() from your public
  94.  * cairo_<foo>_surface_create(). The paginated backend will be careful
  95.  * to not let the user see that they really got a "wrapped"
  96.  * surface. See test-paginated-surface.c for a fairly minimal example
  97.  * of a paginated-using surface. That should be a reasonable example
  98.  * to follow.
  99.  *
  100.  * What the paginated surface does is first save all drawing
  101.  * operations for a page into a recording-surface. Then when the user calls
  102.  * cairo_show_page(), the paginated surface performs the following
  103.  * sequence of operations (using the backend functions passed to
  104.  * cairo_paginated_surface_create()):
  105.  *
  106.  * 1. Calls start_page() (if not %NULL). At this point, it is appropriate
  107.  *    for the target to emit any page-specific header information into
  108.  *    its output.
  109.  *
  110.  * 2. Calls set_paginated_mode() with an argument of %CAIRO_PAGINATED_MODE_ANALYZE
  111.  *
  112.  * 3. Replays the recording-surface to the target surface, (with an
  113.  *    analysis surface inserted between which watches the return value
  114.  *    from each operation). This analysis stage is used to decide which
  115.  *    operations will require fallbacks.
  116.  *
  117.  * 4. Calls set_bounding_box() to provide the target surface with the
  118.  *    tight bounding box of the page.
  119.  *
  120.  * 5. Calls set_paginated_mode() with an argument of %CAIRO_PAGINATED_MODE_RENDER
  121.  *
  122.  * 6. Replays a subset of the recording-surface operations to the target surface
  123.  *
  124.  * 7. Calls set_paginated_mode() with an argument of %CAIRO_PAGINATED_MODE_FALLBACK
  125.  *
  126.  * 8. Replays the remaining operations to an image surface, sets an
  127.  *    appropriate clip on the target, then paints the resulting image
  128.  *    surface to the target.
  129.  *
  130.  * So, the target will see drawing operations during three separate
  131.  * stages, (ANALYZE, RENDER and FALLBACK). During the ANALYZE phase
  132.  * the target should not actually perform any rendering, (for example,
  133.  * if performing output to a file, no output should be generated
  134.  * during this stage). Instead the drawing functions simply need to
  135.  * return %CAIRO_STATUS_SUCCESS or %CAIRO_INT_STATUS_UNSUPPORTED to
  136.  * indicate whether rendering would be supported. And it should do
  137.  * this as quickly as possible. The FALLBACK phase allows the surface
  138.  * to distinguish fallback images from native rendering in case they
  139.  * need to be handled as a special case.
  140.  *
  141.  * Note: The paginated surface layer assumes that the target surface
  142.  * is "blank" by default at the beginning of each page, without any
  143.  * need for an explicit erase operation, (as opposed to an image
  144.  * surface, for example, which might have uninitialized content
  145.  * originally). As such, it optimizes away CLEAR operations that
  146.  * happen at the beginning of each page---the target surface will not
  147.  * even see these operations.
  148.  */
  149. cairo_private cairo_surface_t *
  150. _cairo_paginated_surface_create (cairo_surface_t                                *target,
  151.                                  cairo_content_t                                 content,
  152.                                  const cairo_paginated_surface_backend_t        *backend);
  153.  
  154. cairo_private cairo_surface_t *
  155. _cairo_paginated_surface_get_target (cairo_surface_t *surface);
  156.  
  157. cairo_private cairo_surface_t *
  158. _cairo_paginated_surface_get_recording (cairo_surface_t *surface);
  159.  
  160. cairo_private cairo_bool_t
  161. _cairo_surface_is_paginated (cairo_surface_t *surface);
  162.  
  163. cairo_private cairo_status_t
  164. _cairo_paginated_surface_set_size (cairo_surface_t      *surface,
  165.                                    int                   width,
  166.                                    int                   height);
  167.  
  168. #endif /* CAIRO_PAGINATED_H */
  169.