Go to the documentation of this file.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 #ifndef ImageTools_INCLUDE_ONCE
00033 #define ImageTools_INCLUDE_ONCE
00034
00035 #include <memory.h>
00036
00037 namespace vl
00038 {
00039
00040 typedef unsigned char TPalette3x256[256*3];
00041 typedef unsigned char TPalette4x256[256*4];
00042
00043 inline void convertRGBToRGBA(void* buf, int w, int h, unsigned char alpha, int bytealign = 1)
00044 {
00045 int xbytes = w*3;
00046 int pitch = (xbytes / bytealign * bytealign) + ((xbytes % bytealign)? bytealign : 0);
00047
00048 if(bytealign)
00049 {
00050
00051
00052 unsigned char *pxl1 = (unsigned char *)buf;
00053 unsigned char *pxl2 = (unsigned char *)buf;
00054 int count = 0;
00055 for(int i=0; i<pitch*h; ++i, count++)
00056 {
00057 if (count==pitch)
00058 count = 0;
00059
00060 *pxl1 = *pxl2;
00061
00062 if (count < w*3)
00063 pxl1 ++;
00064
00065 pxl2 ++;
00066 }
00067 }
00068
00069 unsigned char * px32 = (unsigned char*)buf + w * h * 4 - 4;
00070 unsigned char * px24 = (unsigned char*)buf + w * h * 3 - 3;
00071 for(int i=0; i<w * h; ++i)
00072 {
00073 px32[0] = px24[0];
00074 px32[1] = px24[1];
00075 px32[2] = px24[2];
00076 px32[3] = alpha;
00077 px24 -= 3;
00078 px32 -= 4;
00079 }
00080 }
00081
00082 inline void convertGrayscaleToRGBA(void* buf, int size, unsigned char alpha)
00083 {
00084 unsigned char* px32 = (unsigned char*)buf + size * 4 - 4;
00085 unsigned char* px8 = (unsigned char*)buf + size * 1 - 1;
00086 for(int i=0; i<size; ++i)
00087 {
00088 px32[0] = *px8;
00089 px32[1] = *px8;
00090 px32[2] = *px8;
00091 px32[3] = alpha;
00092 px8 -= 1;
00093 px32 -= 4;
00094 }
00095 }
00096
00097 inline void convertA1R5G5B5ToRGBA(void* buf, int size, unsigned char alpha)
00098 {
00099 unsigned char* px32 = (unsigned char*)buf + size * 4 - 4;
00100 unsigned char* px8 = (unsigned char*)buf + size * 2 - 2;
00101 for(int i=0; i<size; ++i)
00102 {
00103 unsigned char r = (px8[1] << 1) & ~0x03;
00104 unsigned char g = ((px8[1] << 6) | (px8[0] >> 2)) & ~0x03;
00105 unsigned char b = (px8[0] << 3) & ~0x03;
00106
00107
00108 px32[0] = r;
00109 px32[1] = g;
00110 px32[2] = b;
00111 px32[3] = alpha;
00112 px8 -= 2;
00113 px32 -= 4;
00114 }
00115 }
00116
00117 inline void convert8ToRGBA(const TPalette3x256 & palette, void* buf, int w, int h, unsigned char alpha, int bytealign = 1)
00118 {
00119
00120 int xbytes = w;
00121 int pitch = (xbytes / bytealign * bytealign) + ((xbytes % bytealign)? bytealign : 0);
00122
00123 if(bytealign)
00124 {
00125
00126
00127 unsigned char *pxl1 = (unsigned char *)buf;
00128 unsigned char *pxl2 = (unsigned char *)buf;
00129 int count = 0;
00130 for(int i=0; i<pitch*h; ++i, count++)
00131 {
00132 if (count==pitch)
00133 count = 0;
00134
00135 *pxl1 = *pxl2;
00136
00137 if (count < w)
00138 pxl1 ++;
00139
00140 pxl2 ++;
00141 }
00142 }
00143
00144 unsigned char* px32 = (unsigned char*)buf + w * h * 4 - 4;
00145 unsigned char* px8 = (unsigned char*)buf + w * h * 1 - 1;
00146 for(int i=0; i<w * h; ++i)
00147 {
00148 px32[0] = palette[*px8*3+0];
00149 px32[1] = palette[*px8*3+1];
00150 px32[2] = palette[*px8*3+2];
00151 px32[3] = alpha;
00152 px8 -= 1;
00153 px32 -= 4;
00154 }
00155 }
00156
00157 inline void convert8ToRGBA(const TPalette4x256 & palette, void* buf, int w, int h, int bytealign = 1)
00158 {
00159
00160 int xbytes = w;
00161 int pitch = (xbytes / bytealign * bytealign) + ((xbytes % bytealign)? bytealign : 0);
00162
00163 if(bytealign)
00164 {
00165
00166
00167 unsigned char *pxl1 = (unsigned char *)buf;
00168 unsigned char *pxl2 = (unsigned char *)buf;
00169 int count = 0;
00170 for(int i=0; i<pitch*h; ++i, count++)
00171 {
00172 if (count==pitch)
00173 count = 0;
00174
00175 *pxl1 = *pxl2;
00176
00177 if (count < w)
00178 pxl1 ++;
00179
00180 pxl2 ++;
00181 }
00182 }
00183
00184 unsigned char * px32 = (unsigned char*)buf + w * h * 4 - 4;
00185 unsigned char * px8 = (unsigned char*)buf + w * h * 1 - 1;
00186 for(int i=0; i<w * h; ++i)
00187 {
00188 px32[0] = palette[*px8*4+0];
00189 px32[1] = palette[*px8*4+1];
00190 px32[2] = palette[*px8*4+2];
00191 px32[3] = palette[*px8*4+3];
00192 px8 -= 1;
00193 px32 -= 4;
00194 }
00195 }
00196
00197 inline void swapBytes32(void* buf, int size)
00198 {
00199 unsigned char* p = (unsigned char*)buf;
00200 unsigned char dw[4];
00201 for(int i=0; i<size; i+=4, p+=4)
00202 {
00203 memcpy(dw, p, 4);
00204 p[0] = dw[3];
00205 p[3] = dw[0];
00206 p[1] = dw[2];
00207 p[2] = dw[1];
00208 }
00209 }
00210
00211 inline void swapBytes32_BGRA_RGBA(void* buf, int bytecount)
00212 {
00213 unsigned char* p = (unsigned char*)buf;
00214 unsigned char dw[4];
00215 for(int i=0; i<bytecount; i+=4, p+=4)
00216 {
00217 memcpy(dw, p, 4);
00218 p[0] = dw[2];
00219 p[2] = dw[0];
00220 }
00221 }
00222
00223 inline void swapBytes24_BGR_RGB(void* buf, int bytecount)
00224 {
00225 unsigned char* p = (unsigned char*)buf;
00226 unsigned char dw[4];
00227 int pxl = bytecount / 3;
00228 for(int i=0; i<pxl; ++i, p+=3)
00229 {
00230 memcpy(dw, p, 3);
00231 p[0] = dw[2];
00232 p[2] = dw[0];
00233 }
00234 }
00235
00236 inline void fillRGBA32_Alpha(void* buf, int bytecount, unsigned char alpha)
00237 {
00238 unsigned char* pxl = (unsigned char*)buf;
00239 for(int i=0; i<bytecount; i+=4)
00240 {
00241 pxl[i+3] = alpha;
00242 }
00243 }
00244
00245 inline void fillGray8Alpha8_Alpha(void* buf, int bytecount, unsigned char alpha)
00246 {
00247 unsigned char* pxl = (unsigned char*)buf;
00248 for(int i=0; i<bytecount; i+=2)
00249 {
00250 pxl[i+1] = alpha;
00251 }
00252 }
00253
00254 }
00255
00256 #endif