Tizen 2.0 Release
[framework/graphics/cairo.git] / src / cairo-output-stream-private.h
1 /* cairo - a vector graphics library with display and print output
2  *
3  * Copyright © 2006 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  * Author(s):
33  *      Kristian Høgsberg <krh@redhat.com>
34  */
35
36 #ifndef CAIRO_OUTPUT_STREAM_PRIVATE_H
37 #define CAIRO_OUTPUT_STREAM_PRIVATE_H
38
39 #include "cairo-compiler-private.h"
40 #include "cairo-types-private.h"
41
42 #include <stdlib.h>
43 #include <stdio.h>
44 #include <stdarg.h>
45
46 typedef cairo_status_t
47 (*cairo_output_stream_write_func_t) (cairo_output_stream_t *output_stream,
48                                      const unsigned char   *data,
49                                      unsigned int           length);
50
51 typedef cairo_status_t
52 (*cairo_output_stream_flush_func_t) (cairo_output_stream_t *output_stream);
53
54 typedef cairo_status_t
55 (*cairo_output_stream_close_func_t) (cairo_output_stream_t *output_stream);
56
57 struct _cairo_output_stream {
58     cairo_output_stream_write_func_t write_func;
59     cairo_output_stream_flush_func_t flush_func;
60     cairo_output_stream_close_func_t close_func;
61     unsigned long                    position;
62     cairo_status_t                   status;
63     cairo_bool_t                     closed;
64 };
65
66 extern const cairo_private cairo_output_stream_t _cairo_output_stream_nil;
67
68 cairo_private void
69 _cairo_output_stream_init (cairo_output_stream_t            *stream,
70                            cairo_output_stream_write_func_t  write_func,
71                            cairo_output_stream_flush_func_t  flush_func,
72                            cairo_output_stream_close_func_t  close_func);
73
74 cairo_private cairo_status_t
75 _cairo_output_stream_fini (cairo_output_stream_t *stream);
76
77
78 /* We already have the following declared in cairo.h:
79
80 typedef cairo_status_t (*cairo_write_func_t) (void                *closure,
81                                               const unsigned char *data,
82                                               unsigned int         length);
83 */
84 typedef cairo_status_t (*cairo_close_func_t) (void *closure);
85
86
87 /* This function never returns %NULL. If an error occurs (NO_MEMORY)
88  * while trying to create the output stream this function returns a
89  * valid pointer to a nil output stream.
90  *
91  * Note that even with a nil surface, the close_func callback will be
92  * called by a call to _cairo_output_stream_close or
93  * _cairo_output_stream_destroy.
94  */
95 cairo_private cairo_output_stream_t *
96 _cairo_output_stream_create (cairo_write_func_t         write_func,
97                              cairo_close_func_t         close_func,
98                              void                       *closure);
99
100 cairo_private cairo_output_stream_t *
101 _cairo_output_stream_create_in_error (cairo_status_t status);
102
103 /* Tries to flush any buffer maintained by the stream or its delegates. */
104 cairo_private cairo_status_t
105 _cairo_output_stream_flush (cairo_output_stream_t *stream);
106
107 /* Returns the final status value associated with this object, just
108  * before its last gasp. This final status value will capture any
109  * status failure returned by the stream's close_func as well. */
110 cairo_private cairo_status_t
111 _cairo_output_stream_close (cairo_output_stream_t *stream);
112
113 /* Returns the final status value associated with this object, just
114  * before its last gasp. This final status value will capture any
115  * status failure returned by the stream's close_func as well. */
116 cairo_private cairo_status_t
117 _cairo_output_stream_destroy (cairo_output_stream_t *stream);
118
119 cairo_private void
120 _cairo_output_stream_write (cairo_output_stream_t *stream,
121                             const void *data, size_t length);
122
123 cairo_private void
124 _cairo_output_stream_write_hex_string (cairo_output_stream_t *stream,
125                                        const unsigned char *data,
126                                        size_t length);
127
128 cairo_private void
129 _cairo_output_stream_vprintf (cairo_output_stream_t *stream,
130                               const char *fmt,
131                               va_list ap) CAIRO_PRINTF_FORMAT ( 2, 0);
132
133 cairo_private void
134 _cairo_output_stream_printf (cairo_output_stream_t *stream,
135                              const char *fmt,
136                              ...) CAIRO_PRINTF_FORMAT (2, 3);
137
138 cairo_private long
139 _cairo_output_stream_get_position (cairo_output_stream_t *stream);
140
141 cairo_private cairo_status_t
142 _cairo_output_stream_get_status (cairo_output_stream_t *stream);
143
144 /* This function never returns %NULL. If an error occurs (NO_MEMORY or
145  * WRITE_ERROR) while trying to create the output stream this function
146  * returns a valid pointer to a nil output stream.
147  *
148  * Note: Even if a nil surface is returned, the caller should still
149  * call _cairo_output_stream_destroy (or _cairo_output_stream_close at
150  * least) in order to ensure that everything is properly cleaned up.
151  */
152 cairo_private cairo_output_stream_t *
153 _cairo_output_stream_create_for_filename (const char *filename);
154
155 /* This function never returns %NULL. If an error occurs (NO_MEMORY or
156  * WRITE_ERROR) while trying to create the output stream this function
157  * returns a valid pointer to a nil output stream.
158  *
159  * The caller still "owns" file and is responsible for calling fclose
160  * on it when finished. The stream will not do this itself.
161  */
162 cairo_private cairo_output_stream_t *
163 _cairo_output_stream_create_for_file (FILE *file);
164
165 cairo_private cairo_output_stream_t *
166 _cairo_memory_stream_create (void);
167
168 cairo_private void
169 _cairo_memory_stream_copy (cairo_output_stream_t *base,
170                            cairo_output_stream_t *dest);
171
172 cairo_private int
173 _cairo_memory_stream_length (cairo_output_stream_t *stream);
174
175 cairo_private cairo_status_t
176 _cairo_memory_stream_destroy (cairo_output_stream_t *abstract_stream,
177                               unsigned char **data_out,
178                               unsigned long *length_out);
179
180 cairo_private cairo_output_stream_t *
181 _cairo_null_stream_create (void);
182
183 /* cairo-base85-stream.c */
184 cairo_private cairo_output_stream_t *
185 _cairo_base85_stream_create (cairo_output_stream_t *output);
186
187 /* cairo-base64-stream.c */
188 cairo_private cairo_output_stream_t *
189 _cairo_base64_stream_create (cairo_output_stream_t *output);
190
191 /* cairo-deflate-stream.c */
192 cairo_private cairo_output_stream_t *
193 _cairo_deflate_stream_create (cairo_output_stream_t *output);
194
195
196 #endif /* CAIRO_OUTPUT_STREAM_PRIVATE_H */