00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00040 #include "omicron/internal.h"
00041 #include "omicron/file.h"
00042 #include "omicron/list.h"
00043 #include "omicron/array.h"
00044 #include <string.h>
00045
00046 #undef DBGSTAMP
00047 #define DBGSTAMP
00048
00049
00050
00051
00052
00053
00054
00055 ulong
00056 file_manager_c::getch
00057 (
00058 file_t * file
00059 )
00060 {
00061 ulong c;
00062
00063 c = *(file->buf+file->pos)&0xFF;
00064 file->pos++;
00065 return c;
00066 }
00067
00068
00069 const char *
00070 file_manager_c::gets
00071 (
00072 char * dst,
00073 ulong count,
00074 file_t * file
00075 )
00076 {
00077 ulong c = count-1;
00078 ulong ch;
00079 char *r = dst;
00080
00081 do
00082 {
00083 ch = getch(file);
00084 *dst = (char)ch;
00085 c--; dst++;
00086 }
00087 while(c && ch && ch!='\n');
00088
00089 *dst = 0;
00090 return r;
00091 }
00092
00093 void
00094 file_manager_c::getpixel
00095 (
00096 file_t * file,
00097 char * r,
00098 char * g,
00099 char * b,
00100 char * a,
00101 char bpp
00102 )
00103 {
00104 switch(bpp)
00105 {
00106 case 32:
00107 *b = (char)getch( file );
00108 *g = (char)getch( file );
00109 *r = (char)getch( file );
00110 *a = (char)getch( file );
00111 break;
00112
00113 case 24:
00114 *a = (char)255;
00115 *b = (char)getch( file );
00116 *g = (char)getch( file );
00117 *r = (char)getch( file );
00118 break;
00119
00120 case 16:
00121
00122
00123
00124 char c1,c2;
00125
00126 c1 = (char)getch( file );
00127 c2 = (char)getch( file );
00128
00129 *a = c1&0x80?255:0;
00130
00131 *r = (c1&124)<<1;
00132 *g = (c1&3<<6) | (c2&224)>>2;
00133 *b = (c2&31)<<3;
00134 break;
00135 }
00136
00137 }
00138
00139 ulong
00140 file_manager_c::read
00141 (
00142 void * out,
00143 ulong size,
00144 ulong n,
00145 file_t * file
00146 )
00147 {
00148 ulong i;
00149
00150 if (!file) return 0;
00151
00152 for (i=0; i<n; i++)
00153 {
00154 if (file->pos+size > file->size)
00155 break;
00156
00157 memcpy( (char*)out+size*i, file->buf+file->pos, size );
00158 file->pos += size;
00159 }
00160
00161 return i;
00162 }