JDIMENSION get_16bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
{
  bmp_source_ptr source = (bmp_source_ptr) sinfo;
  JSAMPARRAY image_ptr;
  register JSAMPROW inptr, outptr;
  register JDIMENSION col;
  unsigned long bit32_pix;
  char a,b;
  char *pix_ptr;
  /* Fetch next row from virtual array */
  source->source_row--;
  image_ptr = (*cinfo->mem->access_virt_sarray)
    ((j_common_ptr) cinfo, source->whole_image,
     source->source_row, (JDIMENSION) 1, FALSE);

  /* Transfer data.  Note source values are in BGR order
   * (even though Microsoft's own documents say the opposite).
   */
  inptr = image_ptr[0];
  outptr = source->pub.buffer[0];
  for (col = cinfo->image_width; col > 0; col--) {
    // Need to pull 16 bits at a time. 
	a = *inptr++; // First 8
	b = *inptr++; // Second 8
	bit32_pix = rgb16_to_rgb32( a << 8 | b ); //Send all 16bits to be converted
	pix_ptr = (char *)&bit32_pix;
    outptr[2] = *pix_ptr++; 
    outptr[1] = *pix_ptr++; 
    outptr[0] = *pix_ptr++; 
    outptr += 3;
  }

  return 1;
}
Beispiel #2
0
void BMP_buildImageData(struct bitmap* bitm)
{
	Xuint32 rows = bitm->dibHeader.height;
	Xuint32 columns = bitm->dibHeader.width;
	Xint32 i, j;
	bitm->addr += 2;

	/*bitm->imageData = (Xuint32**)malloc(rows * sizeof(Xuint32*));
	for (i = 0; i < rows; i++) {
		bitm->imageData[i] = (Xuint32*)malloc(columns * sizeof(Xuint32));
	}*/

	//Xuint32 addr = XPAR_FLASH_MEM0_BASEADDR + 40 + 14 + 256*4;

	Xuint32 padding = 4 - (columns*(bitm->dibHeader.bpp/8))%4;
	if (padding == 4) {
		padding = 0;
	}
	//xil_printf("%d\n",padding);
	//xil_printf("%d	%d\n",rows,columns);

	for (i = 0; i < rows; ++i)
	{
		for (j = 0; j < columns; ++j)
		{
			if(bitm->dibHeader.bpp == 8)
			{
				bitm->imageData[i][j] = XIo_In8(bitm->addr);
				bitm->addr += 1;
				//addr += 1;
			}
			else if (bitm->dibHeader.bpp == 16)
			{
				bitm->imageData[i][j] = rgb16_to_rgb32(Xil_EndianSwap16(XIo_In16 (bitm->addr)));
				bitm->addr += 2;
			}
			else if (bitm->dibHeader.bpp == 24)
			{
				bitm->imageData[i][j] = (XIo_In8(bitm->addr)) | (XIo_In8(bitm->addr + 1) << 8) | (XIo_In8(bitm->addr + 2) << 16);
				bitm->addr += 3;
			}
		}
		bitm->addr += padding;
	}
}