Rev 1892 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1892 | Rev 3959 | ||
---|---|---|---|
Line 41... | Line 41... | ||
41 | 41 | ||
42 | /* Provide definitions for standalone compilation */ |
42 | /* Provide definitions for standalone compilation */ |
Line 43... | Line 43... | ||
43 | #include "cairoint.h" |
43 | #include "cairoint.h" |
44 | 44 | ||
45 | #include "cairo-error-private.h" |
45 | #include "cairo-error-private.h" |
46 | #include "cairo-list-private.h" |
46 | #include "cairo-list-inline.h" |
Line 47... | Line 47... | ||
47 | #include "cairo-freelist-private.h" |
47 | #include "cairo-freelist-private.h" |
Line 48... | Line 48... | ||
48 | #include "cairo-combsort-private.h" |
48 | #include "cairo-combsort-inline.h" |
49 | 49 | ||
Line 1070... | Line 1070... | ||
1070 | cells->count = 0; |
1070 | cells->count = 0; |
1071 | _cairo_freepool_reset (&cells->pool); |
1071 | _cairo_freepool_reset (&cells->pool); |
1072 | coverage_rewind (cells); |
1072 | coverage_rewind (cells); |
1073 | } |
1073 | } |
Line 1074... | Line 1074... | ||
1074 | 1074 | ||
1075 | inline static struct cell * |
1075 | static struct cell * |
1076 | coverage_alloc (sweep_line_t *sweep_line, |
1076 | coverage_alloc (sweep_line_t *sweep_line, |
1077 | struct cell *tail, |
1077 | struct cell *tail, |
1078 | int x) |
1078 | int x) |
1079 | { |
1079 | { |
Line 1395... | Line 1395... | ||
1395 | int x = cell->x; |
1395 | int x = cell->x; |
1396 | int area; |
1396 | int area; |
Line 1397... | Line 1397... | ||
1397 | 1397 | ||
1398 | if (x > prev_x) { |
1398 | if (x > prev_x) { |
- | 1399 | spans[num_spans].x = prev_x; |
|
1399 | spans[num_spans].x = prev_x; |
1400 | spans[num_spans].inverse = 0; |
1400 | spans[num_spans].coverage = AREA_TO_ALPHA (cover); |
1401 | spans[num_spans].coverage = AREA_TO_ALPHA (cover); |
1401 | ++num_spans; |
1402 | ++num_spans; |
Line 1402... | Line 1403... | ||
1402 | } |
1403 | } |
Line 1411... | Line 1412... | ||
1411 | prev_x = x + 1; |
1412 | prev_x = x + 1; |
1412 | } while ((cell = cell->next) != &sweep_line->coverage.tail); |
1413 | } while ((cell = cell->next) != &sweep_line->coverage.tail); |
Line 1413... | Line 1414... | ||
1413 | 1414 | ||
1414 | if (prev_x <= self->xmax) { |
1415 | if (prev_x <= self->xmax) { |
- | 1416 | spans[num_spans].x = prev_x; |
|
1415 | spans[num_spans].x = prev_x; |
1417 | spans[num_spans].inverse = 0; |
1416 | spans[num_spans].coverage = AREA_TO_ALPHA (cover); |
1418 | spans[num_spans].coverage = AREA_TO_ALPHA (cover); |
1417 | ++num_spans; |
1419 | ++num_spans; |
Line 1418... | Line 1420... | ||
1418 | } |
1420 | } |
1419 | 1421 | ||
- | 1422 | if (cover && prev_x < self->xmax) { |
|
1420 | if (cover && prev_x < self->xmax) { |
1423 | spans[num_spans].x = self->xmax; |
1421 | spans[num_spans].x = self->xmax; |
1424 | spans[num_spans].inverse = 1; |
1422 | spans[num_spans].coverage = 0; |
1425 | spans[num_spans].coverage = 0; |
Line 1423... | Line 1426... | ||
1423 | ++num_spans; |
1426 | ++num_spans; |
Line 2123... | Line 2126... | ||
2123 | self->num_edges++; |
2126 | self->num_edges++; |
Line 2124... | Line 2127... | ||
2124 | 2127 | ||
2125 | return CAIRO_STATUS_SUCCESS; |
2128 | return CAIRO_STATUS_SUCCESS; |
Line 2126... | Line -... | ||
2126 | } |
- | |
2127 | - | ||
2128 | static cairo_status_t |
- | |
2129 | _cairo_botor_scan_converter_add_edge (void *converter, |
- | |
2130 | const cairo_point_t *p1, |
- | |
2131 | const cairo_point_t *p2, |
- | |
2132 | int top, int bottom, |
- | |
2133 | int dir) |
- | |
2134 | { |
- | |
2135 | cairo_botor_scan_converter_t *self = converter; |
- | |
2136 | cairo_edge_t edge; |
- | |
2137 | - | ||
2138 | edge.line.p1 = *p1; |
- | |
2139 | edge.line.p2 = *p2; |
- | |
2140 | edge.top = top; |
- | |
2141 | edge.bottom = bottom; |
- | |
2142 | edge.dir = dir; |
- | |
2143 | - | ||
2144 | return botor_add_edge (self, &edge); |
- | |
2145 | } |
- | |
2146 | - | ||
2147 | static cairo_status_t |
- | |
2148 | _cairo_botor_scan_converter_add_polygon (void *converter, |
- | |
2149 | const cairo_polygon_t *polygon) |
- | |
2150 | { |
- | |
2151 | cairo_botor_scan_converter_t *self = converter; |
- | |
2152 | cairo_status_t status; |
- | |
2153 | int i; |
- | |
2154 | - | ||
2155 | for (i = 0; i < polygon->num_edges; i++) { |
- | |
2156 | status = botor_add_edge (self, &polygon->edges[i]); |
- | |
2157 | if (unlikely (status)) |
- | |
2158 | return status; |
- | |
2159 | } |
- | |
2160 | - | ||
2161 | return CAIRO_STATUS_SUCCESS; |
- | |
2162 | } |
2129 | } |
2163 | 2130 | ||
2164 | static void |
2131 | static void |
2165 | _cairo_botor_scan_converter_destroy (void *converter) |
2132 | _cairo_botor_scan_converter_destroy (void *converter) |
2166 | { |
2133 | { |
Line 2177... | Line 2144... | ||
2177 | _cairo_botor_scan_converter_init (cairo_botor_scan_converter_t *self, |
2144 | _cairo_botor_scan_converter_init (cairo_botor_scan_converter_t *self, |
2178 | const cairo_box_t *extents, |
2145 | const cairo_box_t *extents, |
2179 | cairo_fill_rule_t fill_rule) |
2146 | cairo_fill_rule_t fill_rule) |
2180 | { |
2147 | { |
2181 | self->base.destroy = _cairo_botor_scan_converter_destroy; |
2148 | self->base.destroy = _cairo_botor_scan_converter_destroy; |
2182 | self->base.add_edge = _cairo_botor_scan_converter_add_edge; |
- | |
2183 | self->base.add_polygon = _cairo_botor_scan_converter_add_polygon; |
- | |
2184 | self->base.generate = _cairo_botor_scan_converter_generate; |
2149 | self->base.generate = _cairo_botor_scan_converter_generate; |
Line 2185... | Line 2150... | ||
2185 | 2150 | ||
2186 | self->extents = *extents; |
2151 | self->extents = *extents; |