aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/mimesh/libg3d-0.0.8/src/stream_buffer.c
diff options
context:
space:
mode:
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.c126
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
27typedef struct {
28 gsize size;
29 goffset offset;
30 guint8 *buffer;
31 gboolean free_buffer;
32} G3DStreamBuffer;
33
34static 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
47static 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
73static goffset g3d_stream_buffer_tell(gpointer data)
74{
75 G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data;
76 return sbuf->offset;
77}
78
79static goffset g3d_stream_buffer_size(gpointer data)
80{
81 G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data;
82 return sbuf->size;
83}
84
85static gboolean g3d_stream_buffer_eof(gpointer data)
86{
87 G3DStreamBuffer *sbuf = (G3DStreamBuffer *)data;
88 return (sbuf->offset >= sbuf->size);
89}
90
91static 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
100EAPI
101G3DStream *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