+ buf = buf0 + 14 + ihsize; //palette location
+ // OS/2 bitmap, 3 bytes per palette entry
+ if ((hsize-ihsize-14) < (colors << 2)) {
+ for (i = 0; i < colors; i++)
+ ((uint32_t*)p->data[1])[i] = bytestream_get_le24(&buf);
+ } else {
+ for (i = 0; i < colors; i++)
+ ((uint32_t*)p->data[1])[i] = bytestream_get_le32(&buf);
+ }
+ buf = buf0 + hsize;
+ }
+ if (comp == BMP_RLE4 || comp == BMP_RLE8) {
+ if (height < 0) {
+ p->data[0] += p->linesize[0] * (avctx->height - 1);
+ p->linesize[0] = -p->linesize[0];
+ }
+ bytestream2_init(&gb, buf, dsize);
+ ff_msrle_decode(avctx, (AVPicture*)p, depth, &gb);
+ if (height < 0) {
+ p->data[0] += p->linesize[0] * (avctx->height - 1);
+ p->linesize[0] = -p->linesize[0];
+ }
+ } else {
+ switch (depth) {
+ case 1:
+ for (i = 0; i < avctx->height; i++) {
+ int j;
+ for (j = 0; j < n; j++) {
+ ptr[j*8+0] = buf[j] >> 7;
+ ptr[j*8+1] = (buf[j] >> 6) & 1;
+ ptr[j*8+2] = (buf[j] >> 5) & 1;
+ ptr[j*8+3] = (buf[j] >> 4) & 1;
+ ptr[j*8+4] = (buf[j] >> 3) & 1;
+ ptr[j*8+5] = (buf[j] >> 2) & 1;
+ ptr[j*8+6] = (buf[j] >> 1) & 1;
+ ptr[j*8+7] = buf[j] & 1;
+ }
+ buf += n;
+ ptr += linesize;
+ }
+ break;
+ case 8:
+ case 24:
+ for (i = 0; i < avctx->height; i++) {
+ memcpy(ptr, buf, n);
+ buf += n;
+ ptr += linesize;
+ }
+ break;
+ case 4:
+ for (i = 0; i < avctx->height; i++) {
+ int j;
+ for (j = 0; j < n; j++) {
+ ptr[j*2+0] = (buf[j] >> 4) & 0xF;
+ ptr[j*2+1] = buf[j] & 0xF;
+ }
+ buf += n;
+ ptr += linesize;