1 namespace gfx::drivers;
5 //////////////////////////////////////////////////////////////////////////////
6 // CONVERSION ROUTINES ///////////////////////////////////////////////////////
7 //////////////////////////////////////////////////////////////////////////////
9 #define CONVERT(function, sourcetype, dsttype) \
12 for(y = 0; y < dst.height; y++) \
15 ic = y * src.stride; \
16 for(x = 0; x < dst.width; x++, c++, ic++) \
18 pixel = ((sourcetype *)src.picture)[ic];\
19 ((dsttype *)dst.picture)[c] = (dsttype)(function); \
24 static void BMP8_8(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
30 if(lfbSystem && lfbSystem.palette == dst.palette)
33 ( (pixel = lfbSystem.rgbLookup[(uint16)(Color555)(src.palette[pixel])]) ?
36 lfbSystem.rgbLookup[0x421])
41 CONVERT(BestColorMatch(dst.palette,1,255,src.palette[pixel]), byte,byte)
45 if(lfbSystem && lfbSystem.palette == dst.palette)
46 CONVERT(lfbSystem.rgbLookup[(uint16)(Color555)(src.palette[pixel])], byte,byte)
48 CONVERT(BestColorMatch(dst.palette,1,255,src.palette[pixel]), byte,byte)
52 static void BMP8_444(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
57 CONVERT(pixel ? ( (pixel = (Color444)(src.palette[pixel])) ? pixel : 0x111) : 0, byte, Color444)
59 CONVERT((Color444)(src.palette[pixel]), byte, Color444)
62 static void BMP8_555(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
67 CONVERT(pixel ? ( (pixel = (Color555)(src.palette[pixel])) ? pixel : 0x421) : 0, byte, Color555)
69 CONVERT((Color555)(src.palette[pixel]), byte, Color555)
72 static void BMP8_565(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
77 CONVERT(pixel ? ( (pixel = (Color565)(src.palette[pixel])) ? pixel : 0x821) : 0, byte, Color565)
79 CONVERT((Color565)(src.palette[pixel]), byte, Color565);
82 static void BMP8_888(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
87 // (src.palette[pixel] & 0xFFFFFF)
88 CONVERT(pixel ? src.palette[pixel] : 0, byte, ColorAlpha)
90 CONVERT(src.palette[pixel], byte, ColorAlpha)
93 static void BMP8_RGBA(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
98 // (src.palette[pixel] & 0xFFFFFF)
99 CONVERT(pixel ? (ColorRGBA)(src.palette[pixel]) : 0, byte, ColorRGBA)
101 CONVERT((ColorRGBA)(src.palette[pixel]), byte, ColorRGBA)
104 static void BMP444_8(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
110 if(lfbSystem && lfbSystem.palette == dst.palette)
113 ( (pixel = lfbSystem.rgbLookup[(uint16)(Color555)(pixel)]) ?
116 lfbSystem.rgbLookup[0x421])
121 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), Color444, byte)
125 if(lfbSystem && lfbSystem.palette == dst.palette)
126 CONVERT(lfbSystem.rgbLookup[(uint16)(Color555)(pixel)],Color444,byte)
128 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), Color444,byte)
132 static void BMP444_555(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
137 CONVERT(pixel ? ( (pixel = (Color555)(pixel)) ? pixel : 0x421) : 0, Color444, Color555)
139 CONVERT((Color555)(pixel), Color444, Color555);
142 static void BMP444_565(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
147 CONVERT(pixel ? ( (pixel = (Color565)(pixel) ) ? pixel : 0x821) : 0, Color444, Color565)
149 CONVERT((Color565)(pixel), Color444, Color565);
152 static void BMP444_888(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
157 CONVERT(pixel ? ((ColorAlpha)(pixel) | 0xFF000000) : (ColorAlpha)(pixel), Color444, ColorAlpha)
159 CONVERT((ColorAlpha)(pixel) | 0xFF000000, Color444, ColorAlpha)
162 static void BMP555_8(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
168 if(lfbSystem && lfbSystem.palette == dst.palette)
171 ( (pixel = lfbSystem.rgbLookup[pixel]) ?
174 lfbSystem.rgbLookup[0x421])
179 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), Color555, byte)
183 if(lfbSystem && lfbSystem.palette == dst.palette)
184 CONVERT(lfbSystem.rgbLookup[(uint16)pixel], Color555, byte)
186 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), Color555, byte)
190 static void BMP555_444(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
195 CONVERT(pixel ? ( (pixel = (Color444)(pixel) ) ? pixel : 0x111) : 0, Color555, Color444)
197 CONVERT((Color444)(pixel), Color555, Color444);
200 static void BMP555_565(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
205 CONVERT(pixel ? ( (pixel = (Color565)(pixel) ) ? pixel : 0x821) : 0, Color555, Color565)
207 CONVERT((Color565)(pixel), Color555, Color565);
210 static void BMP555_888(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
215 CONVERT(pixel ? ((ColorAlpha)(pixel) | 0xFF000000) : (ColorAlpha)(pixel), Color555, ColorAlpha)
217 CONVERT((ColorAlpha)(pixel) | 0xFF000000, Color555, ColorAlpha)
220 static void BMP565_8(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
226 if(lfbSystem && lfbSystem.palette == dst.palette)
229 ( (pixel = lfbSystem.rgbLookup[(uint16)(Color555)(pixel)]) ?
232 lfbSystem.rgbLookup[0x421])
237 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), Color565, byte)
241 if(lfbSystem && lfbSystem.palette == dst.palette)
242 CONVERT(lfbSystem.rgbLookup[(uint16)(Color555)(pixel)], Color565, byte)
244 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), Color565, byte)
248 static void BMP565_444(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
253 CONVERT(pixel ? ( (pixel = (Color444)(pixel) ) ? pixel : 0x111) : 0, Color565, Color444)
255 CONVERT((Color444)(pixel), Color565, Color444);
258 static void BMP565_555(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
263 CONVERT(pixel ? ( (pixel = (Color555)(pixel) ) ? pixel : 0x421) : 0, Color565, Color555)
265 CONVERT((Color555)(pixel), Color565, Color555);
268 static void BMP565_888(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
273 CONVERT(pixel ? ((ColorAlpha)(pixel) | 0xFF000000) : (ColorAlpha)(pixel), Color565, ColorAlpha)
275 CONVERT((ColorAlpha)(pixel) | 0xFF000000, Color565, ColorAlpha)
278 static void BMP888_8(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
284 if(lfbSystem && lfbSystem.palette == dst.palette)
287 ( (pixel = lfbSystem.rgbLookup[(Color555)(pixel)]) ?
290 lfbSystem.rgbLookup[0x421])
295 CONVERT(BestColorMatch(dst.palette,1,255,pixel), ColorAlpha,byte)
299 if(lfbSystem && lfbSystem.palette == dst.palette)
300 CONVERT(lfbSystem.rgbLookup[(Color555)(pixel)], ColorAlpha,byte)
302 CONVERT(BestColorMatch(dst.palette,1,255,pixel), ColorAlpha,byte)
306 static void BMP888_444(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
311 CONVERT((pixel & 0xFFFFFFFF) ? ( (pixel = (Color444)((ColorAlpha)pixel)) ? pixel : 0x111) : 0, ColorAlpha, Color444)
313 CONVERT((Color444)((ColorAlpha)pixel), ColorAlpha, Color444);
316 static void BMP888_555(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
321 CONVERT((pixel & 0xFFFFFFFF) ? ( (pixel = (Color555)((ColorAlpha)pixel)) ? pixel : 0x421) : 0, ColorAlpha, Color555)
323 CONVERT((Color555)((ColorAlpha)pixel), ColorAlpha, Color555)
326 static void BMP888_565(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
331 CONVERT((pixel & 0xFFFFFFFF) ? ( (pixel = (Color565)((ColorAlpha)pixel)) ? pixel : 0x821) : 0, ColorAlpha, Color565)
333 CONVERT((Color565)((ColorAlpha)pixel), ColorAlpha, Color565);
336 static void BMP888_RGBA(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
340 CONVERT(pixel /* = (ColorRGBA)(pixel)*/, ColorAlpha, ColorRGBA);
343 static void BMPA_888(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
347 CONVERT((ColorAlpha { pixel, white }), byte, ColorAlpha)
350 static void BMPRGBA_555(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
355 CONVERT((pixel & 0xFF000000) ? ( (pixel = (Color555)(*(ColorRGBA *)&pixel)) ? pixel : 0x421) : 0, uint, Color555)
357 CONVERT((Color555)(*(ColorRGBA *)&pixel), ColorRGBA, Color555);
359 // CONVERT(pixel /*= (Color555)(pixel)*/, ColorRGBA, Color555);
362 static void BMPRGBA_565(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
367 CONVERT((pixel & 0xFF000000) ? ( (pixel = (Color565)(*(ColorRGBA *)&pixel)) ? pixel : 0x821) : 0, uint, Color565)
369 CONVERT((Color565)(*(ColorRGBA *)&pixel), ColorRGBA, Color565);
372 static void BMPRGBA_888(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
376 CONVERT(pixel /* = (ColorAlpha)(pixel)*/, ColorRGBA, ColorAlpha);
379 static void BMPRGBA_8(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
383 if(true) //src.transparent)
385 if(lfbSystem && lfbSystem.palette == dst.palette)
387 //(pixel & 0xFF000000) ?
389 ( (pixel = lfbSystem.rgbLookup[(uint16)(Color555)(pixel)]) ?
392 lfbSystem.rgbLookup[0x421])
398 //CONVERT((pixel & 0xFF000000) ?
399 CONVERT((pixel.a > 192) ?
400 (BestColorMatch(dst.palette,1,255, (ColorAlpha)(pixel))) : 0, ColorRGBA, byte)
405 if(lfbSystem && lfbSystem.palette == dst.palette)
406 CONVERT(lfbSystem.rgbLookup[(uint16)(Color555)(pixel)], ColorRGBA, byte)
408 CONVERT(BestColorMatch(dst.palette,1,255,(ColorAlpha)(pixel)), ColorRGBA, byte)
412 static void BMP888_A(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
416 CONVERT(pixel.a, ColorAlpha,byte)
419 static void BMPRGBA_A(LFBSystem lfbSystem, Bitmap src, Bitmap dst)
423 CONVERT(pixel.a, ColorRGBA, byte)
426 void (* converters_table[PixelFormat][PixelFormat]) (LFBSystem, Bitmap src, Bitmap dst) =
428 { null,null,null,null,null,null,null, null },
429 { null, BMP8_8, BMP8_444, BMP8_555, BMP8_565, BMP8_888, null, null, BMP8_RGBA },
430 { null, BMP444_8, null, BMP444_555, BMP444_565, BMP444_888, null, null },
431 { null, BMP555_8, BMP555_444, null, BMP555_565, BMP555_888, null, null },
432 { null, BMP565_8, BMP565_444, BMP565_555, null, BMP565_888, null, null },
433 { null, BMP888_8, BMP888_444, BMP888_555, BMP888_565, null, BMP888_A, null, BMP888_RGBA },
434 { null, null, null, null, null, BMPA_888, null, null },
435 { null,null,null,null,null,null,null, null },
436 { null,BMPRGBA_8,null,BMPRGBA_555,BMPRGBA_565,BMPRGBA_888,BMPRGBA_A, null }