source: Thomson/tools/gfx2mo5/libraw2mo5.c @ 35

Last change on this file since 35 was 35, checked in by pulkomandy, 7 years ago

Make sure the last point of a GPL use the same color (FORME or FOND) as the first point of the next GPL.
This avoids a glitch on the EFGJ033 gate array.

File size: 1.9 KB
Line 
1/* GFX2mo5 - libraw2mo5.c
2 * CloudStrife - 20080921
3 * PulkoMandy - 20101221, 20130213
4 * Diffusé sous licence libre CeCILL v2
5 * Voir LICENCE
6 */
7
8#include <stdbool.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
13unsigned char *raw2mo5(unsigned char *input)
14{
15  unsigned char *tmpBuffer;
16  int x,y;
17  int previous = 0;
18
19  tmpBuffer = (unsigned char*)calloc(0x4000,1);
20  if (tmpBuffer == NULL)
21  {
22    printf("Allocation tmpBuffer raté\n");
23    exit(4);
24  }
25        #define width 320
26
27  bool lfo = false;
28  for (y = 0; y < 200; y++)
29        for (x = 0; x < 320; x+=8) {
30                int fore = 255;
31                int back = 255;
32                int pix;
33                bool oldlfo = lfo;
34
35                for(pix = 0; pix < 8; pix++) {
36                        int nc = input[y*width+x+pix];
37                        if (nc > 15) printf("Color over limit!\n");
38                        if (back == nc) {
39                                // Pixel is in backcolor, set FORME to 0
40                                lfo = false;
41                        } else if (fore == nc) {
42                                // Pixel is in forecolor, set FORME to 1
43                                tmpBuffer[(y*320+x)/8] |= 0x80>>pix;
44                                lfo = true;
45                        } else if (back==255) {
46                                // Pixel is in unknown color, back is free : allocate backcolor
47                                back = nc;
48                                lfo = false;
49                        } else if (fore == 255) {
50                                // Pixel is unknown color, back is allocated : allocate front and set FORME
51                                fore = nc;
52                                tmpBuffer[(y*320+x)/8] |= 0x80>>pix;
53                                lfo = true;
54                        } else {
55                                printf("Color clash at %d %d : %d %d %d\n",x+pix,y,fore, back,
56                                        input[y*width+x+pix]);
57                        }
58                }
59
60                if (fore != 255) {
61                        previous &= 0xF;
62                        previous |= fore << 4;
63                }
64                if (back != 255) {
65                        previous &= 0xF0;
66                        previous |= back;
67                }
68
69                // Make sure the last pixel of this GPL and the first of the next GPL
70                // are both FORME or both FOND, else we get an ugly glitch on the
71                // EFGJ033 Gate Array MO5!
72                if(oldlfo == !(tmpBuffer[(y*320+x)/8] & 0x80))
73                {
74                        previous = (previous >> 4) | (previous << 4);
75                        tmpBuffer[(y*320+x)/8] ^= 0xFF;
76
77                        lfo = !lfo;
78                }
79
80                tmpBuffer[0x2000+(y*320+x)/8] = previous;
81  }
82
83  return tmpBuffer;
84}
Note: See TracBrowser for help on using the repository browser.