diff options
Diffstat (limited to 'src/others/mimesh/libg3d-0.0.8/src/stream_buffer.c')
-rw-r--r-- | src/others/mimesh/libg3d-0.0.8/src/stream_buffer.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/others/mimesh/libg3d-0.0.8/src/stream_buffer.c b/src/others/mimesh/libg3d-0.0.8/src/stream_buffer.c new file mode 100644 index 0000000..1956aa7 --- /dev/null +++ b/src/others/mimesh/libg3d-0.0.8/src/stream_buffer.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* $Id:$ */ | ||
2 | |||
3 | /* | ||
4 | libg3d - 3D object loading library | ||
5 | |||
6 | Copyright (C) 2005-2009 Markus Dahms <mad@automagically.de> | ||
7 | |||
8 | This library is free software; you can redistribute it and/or | ||
9 | modify it under the terms of the GNU Lesser General Public | ||
10 | License as published by the Free Software Foundation; either | ||
11 | version 2.1 of the License, or (at your option) any later version. | ||
12 | |||
13 | This library is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | Lesser General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Lesser General Public | ||
19 | License along with this library; if not, write to the Free Software | ||
20 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
21 | */ | ||
22 | |||
23 | #include <string.h> | ||
24 | |||
25 | #include <g3d/stream.h> | ||
26 | |||
27 | typedef struct { | ||
28 | gsize size; | ||
29 | goffset offset; | ||
30 | guint8 *buffer; | ||
31 | gboolean free_buffer; | ||
32 | } G3DStreamBuffer; | ||
33 | |||
34 | static gsize g3d_stream_buffer_read(gpointer ptr, gsize size, gpointer data) | ||
35 | { | ||
36 | G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data; | ||
37 | guint8 *outbufp = (guint8 *)ptr; | ||
38 | gsize max_size; | ||
39 | |||
40 | max_size = MIN(sbuf->size - sbuf->offset, size); | ||
41 | memcpy(outbufp, sbuf->buffer + sbuf->offset, max_size); | ||
42 | sbuf->offset += max_size; | ||
43 | |||
44 | return max_size; | ||
45 | } | ||
46 | |||
47 | static gint g3d_stream_buffer_seek(gpointer data, goffset offset, | ||
48 | GSeekType whence) | ||
49 | { | ||
50 | G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data; | ||
51 | switch(whence) { | ||
52 | case G_SEEK_SET: | ||
53 | if((offset >= sbuf->size) || (offset < 0)) | ||
54 | return -1; | ||
55 | sbuf->offset = offset; | ||
56 | break; | ||
57 | case G_SEEK_CUR: | ||
58 | if(((sbuf->offset + offset) >= sbuf->size) || | ||
59 | ((sbuf->offset + offset) < 0)) | ||
60 | return -1; | ||
61 | sbuf->offset += offset; | ||
62 | break; | ||
63 | case G_SEEK_END: | ||
64 | if(((sbuf->size - 1 + offset) >= sbuf->size) || | ||
65 | ((sbuf->size - 1 + offset) < 0)) | ||
66 | return -1; | ||
67 | sbuf->offset = sbuf->size - 1 + offset; | ||
68 | break; | ||
69 | } | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static goffset g3d_stream_buffer_tell(gpointer data) | ||
74 | { | ||
75 | G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data; | ||
76 | return sbuf->offset; | ||
77 | } | ||
78 | |||
79 | static goffset g3d_stream_buffer_size(gpointer data) | ||
80 | { | ||
81 | G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data; | ||
82 | return sbuf->size; | ||
83 | } | ||
84 | |||
85 | static gboolean g3d_stream_buffer_eof(gpointer data) | ||
86 | { | ||
87 | G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data; | ||
88 | return (sbuf->offset >= sbuf->size); | ||
89 | } | ||
90 | |||
91 | static gint g3d_stream_buffer_close(gpointer data) | ||
92 | { | ||
93 | G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data; | ||
94 | if(sbuf->free_buffer) | ||
95 | g_free(sbuf->buffer); | ||
96 | g_free(sbuf); | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | EAPI | ||
101 | G3DStream *g3d_stream_from_buffer(guint8 *buffer, gsize size, | ||
102 | const gchar *title, gboolean free_buffer) | ||
103 | { | ||
104 | G3DStream *stream; | ||
105 | G3DStreamBuffer *sbuf; | ||
106 | guint32 flags = 0; | ||
107 | gchar *uri; | ||
108 | unsigned int usize = ((unsigned int)size); | ||
109 | |||
110 | sbuf = g_new0(G3DStreamBuffer, 1); | ||
111 | sbuf->buffer = buffer; | ||
112 | sbuf->size = size; | ||
113 | sbuf->free_buffer = free_buffer; | ||
114 | flags |= (1 << G3D_STREAM_SEEKABLE) | (1 << G3D_STREAM_READABLE); | ||
115 | uri = g_strdup_printf("buffer://0x%8p:%u/%s", buffer, usize, | ||
116 | (title ? title : "unnamed")); | ||
117 | stream = g3d_stream_new_custom(flags, uri, | ||
118 | g3d_stream_buffer_read, | ||
119 | NULL /* use generic implementation of *_read_line */, | ||
120 | g3d_stream_buffer_seek, g3d_stream_buffer_tell, | ||
121 | g3d_stream_buffer_size, g3d_stream_buffer_eof, | ||
122 | g3d_stream_buffer_close, sbuf, NULL); | ||
123 | g_free(uri); | ||
124 | return stream; | ||
125 | } | ||
126 | |||