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
00047
00048
00049
00050
00051
00052 slong
00053 file_manager_c::putch
00054 (
00055 slong c,
00056 file_t * file
00057 )
00058 {
00059 AssertReturnValue2(file, file->buf, EOF);
00060
00061 char ch = c & 0xFF;
00062
00063 write(&ch, 1, 1, file);
00064
00065 return c;
00066 }
00067
00068 slong
00069 file_manager_c::puts
00070 (
00071 const char * string,
00072 file_t * file
00073 )
00074 {
00075 slong c = strlen(string);
00076 slong count = 0;
00077
00078 AssertReturnValue3(string, file, file->buf, EOF);
00079
00080 do
00081 {
00082 putch(*string, file);
00083 c--; string++; count ++;
00084 }
00085 while(c);
00086
00087 return count;
00088 }
00089
00090 void
00091 file_manager_c::putpixel
00092 (
00093 file_t * file,
00094 char r,
00095 char g,
00096 char b,
00097 char a,
00098 char bpp
00099 )
00100 {
00101 AssertReturn1(file);
00102
00103 switch(bpp)
00104 {
00105 case 32:
00106 putch( r, file );
00107 putch( g, file );
00108 putch( b, file );
00109 putch( a, file );
00110 break;
00111
00112 case 24:
00113 putch( r, file );
00114 putch( g, file );
00115 putch( b, file );
00116 break;
00117
00118 case 16:
00119
00120
00121
00122 char c1,c2;
00123
00124 c1 = ((a?0x80:0)) | ((r>>1)&124) | ((g>>6)&3);
00125 c2 = ((g<<2)&224) | ((b>>3)&31);
00126
00127 putch( c1, file );
00128 putch( c2, file );
00129 break;
00130 }
00131
00132 }
00133
00134 ulong
00135 file_manager_c::write
00136 (
00137 void * buf,
00138 ulong size,
00139 ulong n,
00140 file_t * file
00141 )
00142 {
00143 ulong i;
00144
00145 AssertReturnValue2(buf, file, 0);
00146
00147 if (file->pos+size*n>file->size)
00148 resize(file, file->pos+size*n);
00149
00150 for (i=0; i<n; i++)
00151 {
00152 if (file->pos+size > file->size)
00153 break;
00154
00155 memcpy( file->buf+file->pos, (char*)buf+size*i, size );
00156 file->pos += size;
00157 }
00158
00159 return i;
00160 }