Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
  2. /* cairo - a vector graphics library with display and print output
  3.  *
  4.  * Copyright (c) 2008  M Joonas Pihlaja
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person
  7.  * obtaining a copy of this software and associated documentation
  8.  * files (the "Software"), to deal in the Software without
  9.  * restriction, including without limitation the rights to use,
  10.  * copy, modify, merge, publish, distribute, sublicense, and/or sell
  11.  * copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following
  13.  * conditions:
  14.  *
  15.  * The above copyright notice and this permission notice shall be
  16.  * included in all copies or substantial portions of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  19.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  20.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  21.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  22.  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  23.  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  24.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  25.  * OTHER DEALINGS IN THE SOFTWARE.
  26.  */
  27. #ifndef CAIRO_SPANS_PRIVATE_H
  28. #define CAIRO_SPANS_PRIVATE_H
  29. #include "cairo-types-private.h"
  30. #include "cairo-compiler-private.h"
  31.  
  32. /* Number of bits of precision used for alpha. */
  33. #define CAIRO_SPANS_UNIT_COVERAGE_BITS 8
  34. #define CAIRO_SPANS_UNIT_COVERAGE ((1 << CAIRO_SPANS_UNIT_COVERAGE_BITS)-1)
  35.  
  36. /* A structure representing an open-ended horizontal span of constant
  37.  * pixel coverage. */
  38. typedef struct _cairo_half_open_span {
  39.     int32_t x; /* The inclusive x-coordinate of the start of the span. */
  40.     uint8_t coverage; /* The pixel coverage for the pixels to the right. */
  41.     uint8_t inverse; /* between regular mask and clip */
  42. } cairo_half_open_span_t;
  43.  
  44. /* Span renderer interface. Instances of renderers are provided by
  45.  * surfaces if they want to composite spans instead of trapezoids. */
  46. typedef struct _cairo_span_renderer cairo_span_renderer_t;
  47. struct _cairo_span_renderer {
  48.     /* Private status variable. */
  49.     cairo_status_t status;
  50.  
  51.     /* Called to destroy the renderer. */
  52.     cairo_destroy_func_t        destroy;
  53.  
  54.     /* Render the spans on row y of the destination by whatever compositing
  55.      * method is required. */
  56.     cairo_warn cairo_status_t
  57.     (*render_rows) (void *abstract_renderer,
  58.                     int y, int height,
  59.                     const cairo_half_open_span_t        *coverages,
  60.                     unsigned num_coverages);
  61.  
  62.     /* Called after all rows have been rendered to perform whatever
  63.      * final rendering step is required.  This function is called just
  64.      * once before the renderer is destroyed. */
  65.     cairo_status_t (*finish) (void *abstract_renderer);
  66. };
  67.  
  68. /* Scan converter interface. */
  69. typedef struct _cairo_scan_converter cairo_scan_converter_t;
  70. struct _cairo_scan_converter {
  71.     /* Destroy this scan converter. */
  72.     cairo_destroy_func_t        destroy;
  73.  
  74.     /* Generates coverage spans for rows for the added edges and calls
  75.      * the renderer function for each row. After generating spans the
  76.      * only valid thing to do with the converter is to destroy it. */
  77.     cairo_status_t (*generate) (void                    *abstract_converter,
  78.                                 cairo_span_renderer_t   *renderer);
  79.  
  80.     /* Private status. Read with _cairo_scan_converter_status(). */
  81.     cairo_status_t status;
  82. };
  83.  
  84. /* Scan converter constructors. */
  85.  
  86. cairo_private cairo_scan_converter_t *
  87. _cairo_tor_scan_converter_create (int                   xmin,
  88.                                   int                   ymin,
  89.                                   int                   xmax,
  90.                                   int                   ymax,
  91.                                   cairo_fill_rule_t     fill_rule,
  92.                                   cairo_antialias_t     antialias);
  93. cairo_private cairo_status_t
  94. _cairo_tor_scan_converter_add_polygon (void             *converter,
  95.                                        const cairo_polygon_t *polygon);
  96.  
  97. cairo_private cairo_scan_converter_t *
  98. _cairo_tor22_scan_converter_create (int                 xmin,
  99.                                     int                 ymin,
  100.                                     int                 xmax,
  101.                                     int                 ymax,
  102.                                     cairo_fill_rule_t   fill_rule,
  103.                                     cairo_antialias_t   antialias);
  104. cairo_private cairo_status_t
  105. _cairo_tor22_scan_converter_add_polygon (void           *converter,
  106.                                          const cairo_polygon_t *polygon);
  107.  
  108. cairo_private cairo_scan_converter_t *
  109. _cairo_mono_scan_converter_create (int                  xmin,
  110.                                    int                  ymin,
  111.                                    int                  xmax,
  112.                                    int                  ymax,
  113.                                    cairo_fill_rule_t    fill_rule);
  114. cairo_private cairo_status_t
  115. _cairo_mono_scan_converter_add_polygon (void            *converter,
  116.                                         const cairo_polygon_t *polygon);
  117.  
  118. cairo_private cairo_scan_converter_t *
  119. _cairo_clip_tor_scan_converter_create (cairo_clip_t *clip,
  120.                                        cairo_polygon_t *polygon,
  121.                                        cairo_fill_rule_t fill_rule,
  122.                                        cairo_antialias_t antialias);
  123.  
  124. typedef struct _cairo_rectangular_scan_converter {
  125.     cairo_scan_converter_t base;
  126.  
  127.     cairo_box_t extents;
  128.  
  129.     struct _cairo_rectangular_scan_converter_chunk {
  130.         struct _cairo_rectangular_scan_converter_chunk *next;
  131.         void *base;
  132.         int count;
  133.         int size;
  134.     } chunks, *tail;
  135.     char buf[CAIRO_STACK_BUFFER_SIZE];
  136.     int num_rectangles;
  137. } cairo_rectangular_scan_converter_t;
  138.  
  139. cairo_private void
  140. _cairo_rectangular_scan_converter_init (cairo_rectangular_scan_converter_t *self,
  141.                                         const cairo_rectangle_int_t *extents);
  142.  
  143. cairo_private cairo_status_t
  144. _cairo_rectangular_scan_converter_add_box (cairo_rectangular_scan_converter_t *self,
  145.                                            const cairo_box_t *box,
  146.                                            int dir);
  147.  
  148. typedef struct _cairo_botor_scan_converter {
  149.     cairo_scan_converter_t base;
  150.  
  151.     cairo_box_t extents;
  152.     cairo_fill_rule_t fill_rule;
  153.  
  154.     int xmin, xmax;
  155.  
  156.     struct _cairo_botor_scan_converter_chunk {
  157.         struct _cairo_botor_scan_converter_chunk *next;
  158.         void *base;
  159.         int count;
  160.         int size;
  161.     } chunks, *tail;
  162.     char buf[CAIRO_STACK_BUFFER_SIZE];
  163.     int num_edges;
  164. } cairo_botor_scan_converter_t;
  165.  
  166. cairo_private void
  167. _cairo_botor_scan_converter_init (cairo_botor_scan_converter_t *self,
  168.                                   const cairo_box_t *extents,
  169.                                   cairo_fill_rule_t fill_rule);
  170.  
  171. /* cairo-spans.c: */
  172.  
  173. cairo_private cairo_scan_converter_t *
  174. _cairo_scan_converter_create_in_error (cairo_status_t error);
  175.  
  176. cairo_private cairo_status_t
  177. _cairo_scan_converter_status (void *abstract_converter);
  178.  
  179. cairo_private cairo_status_t
  180. _cairo_scan_converter_set_error (void *abstract_converter,
  181.                                  cairo_status_t error);
  182.  
  183. cairo_private cairo_span_renderer_t *
  184. _cairo_span_renderer_create_in_error (cairo_status_t error);
  185.  
  186. cairo_private cairo_status_t
  187. _cairo_span_renderer_status (void *abstract_renderer);
  188.  
  189. /* Set the renderer into an error state.  This sets all the method
  190.  * pointers except ->destroy() of the renderer to no-op
  191.  * implementations that just return the error status. */
  192. cairo_private cairo_status_t
  193. _cairo_span_renderer_set_error (void *abstract_renderer,
  194.                                 cairo_status_t error);
  195.  
  196. cairo_private cairo_status_t
  197. _cairo_surface_composite_polygon (cairo_surface_t       *surface,
  198.                                   cairo_operator_t       op,
  199.                                   const cairo_pattern_t *pattern,
  200.                                   cairo_fill_rule_t     fill_rule,
  201.                                   cairo_antialias_t     antialias,
  202.                                   const cairo_composite_rectangles_t *rects,
  203.                                   cairo_polygon_t       *polygon,
  204.                                   cairo_region_t        *clip_region);
  205.  
  206. #endif /* CAIRO_SPANS_PRIVATE_H */
  207.