29 #include <netinet/in.h>
61 #define CHANNEL_BYTE(ch, mask) (( ch & mask) ? 1 : 0)
85 int result = dev->read((
char*) & channels[c],
CHANNEL_SIZE);
92 }
while (channels[c - 1].chained);
102 std::fill(cmap, cmap + 8, 0);
105 unsigned rgba[] = {3, 2, 1, 0};
107 for (
unsigned compo = 0; compo < 4; compo++) {
109 cmap[pos++] = rgba[compo];
121 inline static void pic2RGBA(
unsigned char *src_pixel,
unsigned char *target_pixel,
unsigned char *cmap,
unsigned components) {
122 for (
unsigned i = 0; i < components; i++) {
123 target_pixel[cmap[i]] = src_pixel[i];
134 for (
unsigned i = 0; i < 8; i++) {
135 if (channels[i].channel != 0) {
152 static int decodeRLE(QIODevice *dev,
void *row,
unsigned max,
unsigned bpp,
unsigned channels) {
153 unsigned char buf[512];
154 unsigned *ptr = (
unsigned *) row;
155 unsigned char component_map[8];
160 if (dev->read((
char*) buf, 1) != 1) {
170 unsigned count = dev->read((
char*) buf, bpp);
174 for (
unsigned i = 0; i < len; i++) {
175 pic2RGBA(buf, (
unsigned char*) (ptr + i), component_map, bpp);
178 else if (buf[0] == 128) {
179 unsigned count = dev->read((
char*) buf, bpp + 2);
180 if (count != bpp + 2) {
183 len = (buf[0] << 8) | buf[1];
187 for (
unsigned i = 0; i < len; i++) {
188 pic2RGBA(buf + 2, (
unsigned char*) (ptr + i), component_map, bpp);
196 unsigned count = dev->read((
char*) buf, len * bpp);
197 if (count != len * bpp) {
200 for (
unsigned i = 0; i < len; i++) {
201 pic2RGBA(buf + (i * bpp), (
unsigned char*) (ptr + i), component_map, bpp);
216 for (
int c = 0; channels[c].
channel != 0; c++) {
217 unsigned remain = width;
219 if (channels[c].type == (
int)
RLE) {
220 unsigned *rowpos = row;
222 int readed =
decodeRLE(dev, rowpos, remain, bpp, channels[c].channel);
230 unsigned char component_map[8];
231 unsigned count = dev->read((
char*) row, width * bpp);
232 if (count != width * bpp) {
237 for (
unsigned i = 0; i < width; i++) {
238 pic2RGBA(((
unsigned char*) row) + (i * bpp), (
unsigned char*) (row + i), component_map, bpp);
246 std::cout << "ERROR Reading PIC!" << std::endl; \
257 }
while (channels[channel - 1].chained);
271 QImage img(header.
width, header.
height, QImage::Format_ARGB32);
273 for (
int r = 0; r < header.
height; r++) {
274 unsigned *row = (
unsigned*) img.scanLine(r);
275 std::fill(row, row + header.
width, 0);