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 © 2004 Red Hat, Inc 5 * Copyright © 2006 Red Hat, Inc 6 * Copyright © 2007, 2008 Adrian Johnson 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it either under the terms of the GNU Lesser General Public 10 * License version 2.1 as published by the Free Software Foundation 11 * (the "LGPL") or, at your option, under the terms of the Mozilla 12 * Public License Version 1.1 (the "MPL"). If you do not alter this 13 * notice, a recipient may use your version of this file under either 14 * the MPL or the LGPL. 15 * 16 * You should have received a copy of the LGPL along with this library 17 * in the file COPYING-LGPL-2.1; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA 19 * You should have received a copy of the MPL along with this library 20 * in the file COPYING-MPL-1.1 21 * 22 * The contents of this file are subject to the Mozilla Public License 23 * Version 1.1 (the "License"); you may not use this file except in 24 * compliance with the License. You may obtain a copy of the License at 25 * http://www.mozilla.org/MPL/ 26 * 27 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY 28 * OF ANY KIND, either express or implied. See the LGPL or the MPL for 29 * the specific language governing rights and limitations. 30 * 31 * The Original Code is the cairo graphics library. 32 * 33 * The Initial Developer of the Original Code is University of Southern 34 * California. 35 * 36 * Contributor(s): 37 * Kristian Høgsberg <krh@redhat.com> 38 * Carl Worth <cworth@cworth.org> 39 * Adrian Johnson <ajohnson@redneon.com> 40 */ 41 42 #ifndef CAIRO_PDF_SURFACE_PRIVATE_H 43 #define CAIRO_PDF_SURFACE_PRIVATE_H 44 45 #include "cairo-pdf.h" 46 47 #include "cairo-surface-private.h" 48 #include "cairo-surface-clipper-private.h" 49 #include "cairo-pdf-operators-private.h" 50 #include "cairo-path-fixed-private.h" 51 52 typedef struct _cairo_pdf_resource { 53 unsigned int id; 54 } cairo_pdf_resource_t; 55 56 #define CAIRO_NUM_OPERATORS (CAIRO_OPERATOR_HSL_LUMINOSITY + 1) 57 58 typedef struct _cairo_pdf_group_resources { 59 cairo_bool_t operators[CAIRO_NUM_OPERATORS]; 60 cairo_array_t alphas; 61 cairo_array_t smasks; 62 cairo_array_t patterns; 63 cairo_array_t xobjects; 64 cairo_array_t fonts; 65 } cairo_pdf_group_resources_t; 66 67 typedef struct _cairo_pdf_source_surface_entry { 68 cairo_hash_entry_t base; 69 unsigned int id; 70 cairo_bool_t interpolate; 71 cairo_pdf_resource_t surface_res; 72 int width; 73 int height; 74 } cairo_pdf_source_surface_entry_t; 75 76 typedef struct _cairo_pdf_source_surface { 77 cairo_surface_t *surface; 78 cairo_pdf_source_surface_entry_t *hash_entry; 79 } cairo_pdf_source_surface_t; 80 81 typedef struct _cairo_pdf_pattern { 82 double width; 83 double height; 84 cairo_rectangle_int_t extents; 85 cairo_pattern_t *pattern; 86 cairo_pdf_resource_t pattern_res; 87 cairo_pdf_resource_t gstate_res; 88 } cairo_pdf_pattern_t; 89 90 typedef enum _cairo_pdf_operation { 91 PDF_PAINT, 92 PDF_MASK, 93 PDF_FILL, 94 PDF_STROKE, 95 PDF_SHOW_GLYPHS 96 } cairo_pdf_operation_t; 97 98 typedef struct _cairo_pdf_smask_group { 99 double width; 100 double height; 101 cairo_pdf_resource_t group_res; 102 cairo_pdf_operation_t operation; 103 cairo_pattern_t *source; 104 cairo_pdf_resource_t source_res; 105 cairo_pattern_t *mask; 106 cairo_path_fixed_t path; 107 cairo_fill_rule_t fill_rule; 108 cairo_stroke_style_t style; 109 cairo_matrix_t ctm; 110 cairo_matrix_t ctm_inverse; 111 char *utf8; 112 int utf8_len; 113 cairo_glyph_t *glyphs; 114 int num_glyphs; 115 cairo_text_cluster_t *clusters; 116 int num_clusters; 117 cairo_bool_t cluster_flags; 118 cairo_scaled_font_t *scaled_font; 119 } cairo_pdf_smask_group_t; 120 121 typedef struct _cairo_pdf_surface cairo_pdf_surface_t; 122 123 struct _cairo_pdf_surface { 124 cairo_surface_t base; 125 126 /* Prefer the name "output" here to avoid confusion over the 127 * structure within a PDF document known as a "stream". */ 128 cairo_output_stream_t *output; 129 130 double width; 131 double height; 132 cairo_matrix_t cairo_to_pdf; 133 134 cairo_array_t objects; 135 cairo_array_t pages; 136 cairo_array_t rgb_linear_functions; 137 cairo_array_t alpha_linear_functions; 138 cairo_array_t page_patterns; 139 cairo_array_t page_surfaces; 140 cairo_hash_table_t *all_surfaces; 141 cairo_array_t smask_groups; 142 cairo_array_t knockout_group; 143 144 cairo_scaled_font_subsets_t *font_subsets; 145 cairo_array_t fonts; 146 147 cairo_pdf_resource_t next_available_resource; 148 cairo_pdf_resource_t pages_resource; 149 150 cairo_pdf_version_t pdf_version; 151 cairo_bool_t compress_content; 152 153 cairo_pdf_resource_t content; 154 cairo_pdf_resource_t content_resources; 155 cairo_pdf_group_resources_t resources; 156 cairo_bool_t has_fallback_images; 157 cairo_bool_t header_emitted; 158 159 struct { 160 cairo_bool_t active; 161 cairo_pdf_resource_t self; 162 cairo_pdf_resource_t length; 163 long start_offset; 164 cairo_bool_t compressed; 165 cairo_output_stream_t *old_output; 166 } pdf_stream; 167 168 struct { 169 cairo_bool_t active; 170 cairo_output_stream_t *stream; 171 cairo_output_stream_t *mem_stream; 172 cairo_output_stream_t *old_output; 173 cairo_pdf_resource_t resource; 174 cairo_bool_t is_knockout; 175 } group_stream; 176 177 cairo_surface_clipper_t clipper; 178 179 cairo_pdf_operators_t pdf_operators; 180 cairo_paginated_mode_t paginated_mode; 181 cairo_bool_t select_pattern_gstate_saved; 182 183 cairo_bool_t force_fallbacks; 184 185 cairo_operator_t current_operator; 186 cairo_bool_t current_pattern_is_solid_color; 187 cairo_bool_t current_color_is_stroke; 188 double current_color_red; 189 double current_color_green; 190 double current_color_blue; 191 double current_color_alpha; 192 193 cairo_surface_t *paginated_surface; 194 }; 195 196 #endif /* CAIRO_PDF_SURFACE_PRIVATE_H */ 197