World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Пространство имен PCX

Функции

bool IsValid (const void *pcx_data)
 
void GetSize (const void *pcx_data, unsigned int *width, unsigned int *height)
 
bool Decode (const void *pcx_data, uint16_t *pOutPixels, unsigned int *width, unsigned int *height)
 
void Encode16 (const void *picture_data, unsigned int width, unsigned int height, void *pcx_data, int max_buff_size, unsigned int *packed_size)
 
void Encode32 (const void *picture_data, unsigned int width, unsigned int height, void *pcx_data, int max_buff_size, unsigned int *packed_size)
 

Функции

◆ IsValid()

bool PCX::IsValid ( const void pcx_data)

См. определение в файле PCX.cpp строка 30

30  {
31  PCXHeader *header = (PCXHeader *)pcx_data;
32  return (header->bpp == 8) && (header->planes == 3);
33 }

Перекрестные ссылки PCXHeader::bpp и PCXHeader::planes.

Используется в Decode(), PCX_File_Loader::InternalLoad() и PCX_LOD_Loader::Load().

+ Граф вызова функции:

◆ GetSize()

void PCX::GetSize ( const void pcx_data,
unsigned int *  width,
unsigned int *  height 
)

См. определение в файле PCX.cpp строка 35

35  {
36  PCXHeader *header = (PCXHeader *)pcx_data;
37  *width = header->right - header->left + 1;
38  *height = header->bottom - header->up + 1;
39 }

Перекрестные ссылки PCXHeader::bottom, PCXHeader::left, PCXHeader::right и PCXHeader::up.

Используется в Decode(), PCX_File_Loader::InternalLoad() и PCX_LOD_Loader::Load().

+ Граф вызова функции:

◆ Decode()

bool PCX::Decode ( const void pcx_data,
uint16_t pOutPixels,
unsigned int *  width,
unsigned int *  height 
)

См. определение в файле PCX.cpp строка 41

42  {
43  PCXHeader *header = (PCXHeader *)pcx_data;
44 
45  if (!IsValid(pcx_data)) {
46  return false;
47  }
48 
49  GetSize(pcx_data, width, height);
50 
51  memset(pOutPixels, 0, *width * *height * sizeof(int16_t));
52 
53  unsigned int r_mask = 0xF800;
54  unsigned int num_r_bits = 5;
55  unsigned int g_mask = 0x07E0;
56  unsigned int num_g_bits = 6;
57  unsigned int b_mask = 0x001F;
58  unsigned int num_b_bits = 5;
59 
60  unsigned char test_byte; // edx@3
61  unsigned int row_position; // edi@40
62  unsigned char value; // cl@63
63  char count; // [sp+50h] [bp-Ch]@43
64  unsigned short *dec_position;
65  unsigned short *temp_dec_position;
66 
67  uint8_t *input = (uint8_t*)pcx_data;
68 
69  // При сохранении изображения подряд идущие пиксели одинакового цвета
70  // объединяются и вместо указания цвета для каждого пикселя указывается цвет
71  // группы пикселей и их количество.
72  unsigned int read_offset = sizeof(PCXHeader);
73  unsigned short current_line = 0;
74  if (*height > 0) {
75  dec_position = pOutPixels;
76  do {
77  temp_dec_position = dec_position;
78  row_position = 0;
79  // decode red line
80  if (header->pitch) {
81  do {
82  test_byte = input[read_offset];
83  ++read_offset;
84  if ((test_byte & 0xC0) == 0xC0) { // имеется ли объединение
85  value = input[read_offset];
86  ++read_offset;
87 
88  if ((test_byte & 0x3F) > 0) {
89  count = test_byte &
90  0x3F; // количество одинаковых пикселей
91  do {
92  ++row_position;
93  *temp_dec_position |=
94  r_mask & ((uint8_t)value
95  << (num_g_bits + num_r_bits +
96  num_b_bits - 8));
97  temp_dec_position++;
98  if (row_position == header->pitch) break;
99  } while (count-- != 1);
100  }
101  } else {
102  ++row_position;
103  *temp_dec_position |=
104  r_mask &
105  ((uint8_t)test_byte
106  << (num_g_bits + num_r_bits + num_b_bits - 8));
107  temp_dec_position++;
108  }
109  } while (row_position < header->pitch);
110  }
111 
112  temp_dec_position = dec_position;
113  row_position = 0;
114  // decode green line
115  while (row_position < header->pitch) {
116  test_byte = *(input + read_offset);
117  ++read_offset;
118  if ((test_byte & 0xC0) == 0xC0) {
119  value = *(input + read_offset);
120  ++read_offset;
121  if ((test_byte & 0x3F) > 0) {
122  count = test_byte & 0x3F;
123  do {
124  *temp_dec_position |=
125  g_mask &
127  << (num_g_bits + num_b_bits - 8));
128 
129  temp_dec_position++;
130  ++row_position;
131  if (row_position == header->pitch) break;
132  } while (count-- != 1);
133  }
134  } else {
135  *temp_dec_position |=
136  g_mask & (uint16_t)((uint8_t)test_byte
137  << (num_g_bits + num_b_bits - 8));
138  temp_dec_position++;
139  ++row_position;
140  }
141  }
142 
143  temp_dec_position = dec_position;
144  row_position = 0;
145  // decode blue line
146  while (row_position < header->pitch) {
147  test_byte = *(input + read_offset);
148  read_offset++;
149  if ((test_byte & 0xC0) == 0xC0) {
150  value = *(input + read_offset);
151  ++read_offset;
152  if ((test_byte & 0x3F) > 0) {
153  count = test_byte & 0x3F;
154  do {
155  *temp_dec_position |= value >> (8 - num_b_bits);
156  temp_dec_position++;
157 
158  ++row_position;
159  if (row_position == header->pitch) break;
160  } while (count-- != 1);
161  }
162  } else {
163  *temp_dec_position |= test_byte >> (8 - num_b_bits);
164  temp_dec_position++;
165  ++row_position;
166  }
167  }
168  ++current_line;
169  dec_position += *width;
170  } while (current_line < *height);
171  }
172 
173  return true;
174 }

Перекрестные ссылки GetSize(), IsValid() и PCXHeader::pitch.

Используется в PCX_Loader::DecodePCX().

+ Граф вызовов:
+ Граф вызова функции:

◆ Encode16()

void PCX::Encode16 ( const void picture_data,
unsigned int  width,
unsigned int  height,
void pcx_data,
int  max_buff_size,
unsigned int *  packed_size 
)

См. определение в файле PCX.cpp строка 297

299  {
300  Format f(16, 0xF800, 0x07E0, 0x001F);
301  Encode(f, picture_data, width, height, pcx_data, max_buff_size,
302  packed_size);
303 }

Перекрестные ссылки Encode().

Используется в Render::PackScreenshot(), SaveGame() и Render::SavePCXImage16().

+ Граф вызовов:
+ Граф вызова функции:

◆ Encode32()

void PCX::Encode32 ( const void picture_data,
unsigned int  width,
unsigned int  height,
void pcx_data,
int  max_buff_size,
unsigned int *  packed_size 
)

См. определение в файле PCX.cpp строка 305

307  {
308  Format f(32, 0x00FF0000, 0x0000FF00, 0x000000FF);
309  Encode(f, picture_data, width, height, pcx_data, max_buff_size,
310  packed_size);
311 }

Перекрестные ссылки Encode().

Используется в Render::SavePCXImage32().

+ Граф вызовов:
+ Граф вызова функции:
uint16_t
unsigned __int16 uint16_t
Definition: SDL_config.h:37
int16_t
signed __int16 int16_t
Definition: SDL_config.h:36
PCXHeader
Definition: PCX.cpp:8
height
EGLSurface EGLint EGLint EGLint EGLint height
Definition: SDL_egl.h:1596
PCXHeader::left
int16_t left
Definition: PCX.cpp:13
count
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
PCXHeader::bottom
int16_t bottom
Definition: PCX.cpp:16
input
GLenum GLenum GLenum input
Definition: SDL_opengl_glext.h:9377
PCXHeader::up
int16_t up
Definition: PCX.cpp:14
PCXHeader::pitch
int16_t pitch
Definition: PCX.cpp:22
width
EGLSurface EGLint EGLint EGLint width
Definition: SDL_egl.h:1596
Format
Definition: PCX.cpp:249
f
GLfloat f
Definition: SDL_opengl_glext.h:1873
value
EGLSyncKHR EGLint EGLint * value
Definition: SDL_egl.h:899
PCX::IsValid
bool IsValid(const void *pcx_data)
Definition: PCX.cpp:30
PCX::GetSize
void GetSize(const void *pcx_data, unsigned int *width, unsigned int *height)
Definition: PCX.cpp:35
uint8_t
unsigned __int8 uint8_t
Definition: SDL_config.h:35
PCXHeader::planes
int8_t planes
Definition: PCX.cpp:21
PCXHeader::bpp
int8_t bpp
Definition: PCX.cpp:12
PCXHeader::right
int16_t right
Definition: PCX.cpp:15
Encode
void Encode(Format f, const void *picture_data, unsigned int width, unsigned int height, void *pcx_data, int max_buff_size, unsigned int *packed_size)
Definition: PCX.cpp:258