Blob Blame Raw


#include <windows.h>
#include "assert.h"

#include "ttwainP.h"
#include "ttwain_utilPD.h"
#include "ttwain_global_def.h"

#ifdef __cplusplus
extern "C" {
#endif

static int getColorCount(LPBITMAPINFOHEADER pbi)
{
	if (pbi->biSize == sizeof(BITMAPCOREHEADER)) {
		LPBITMAPCOREHEADER lpbc = ((LPBITMAPCOREHEADER)pbi);
		return 1 << lpbc->bcBitCount;
	} else if (pbi->biClrUsed == 0)
		return 0xFFF & (1 << pbi->biBitCount);
	else
		return (int)pbi->biClrUsed;
}
/*---------------------------------------------------------------------------*/
static size_t BmiColorTableBytes(LPBITMAPINFOHEADER pbi)
{
	return getColorCount(pbi) * sizeof(RGBQUAD);
}
/*---------------------------------------------------------------------------*/
static LPBYTE get_buffer(LPBITMAPINFOHEADER lpbi, int *iud)
{
	LPBYTE buf = (LPBYTE)lpbi + lpbi->biSize + BmiColorTableBytes(lpbi);
	*iud = (lpbi->biHeight > 0);
	return buf;
}
/*---------------------------------------------------------------------------*/
#define PelsPerMeter2DPI(ppm) (((float)ppm * 2.54) / 100.0)
/*---------------------------------------------------------------------------*/
int TTWAIN_Native2RasterPD(void *handle, void *the_ras, int *lx, int *ly)
{
	assert(!"DAFARE");
#if 0
LPBITMAPINFOHEADER lpBIH;
LPBYTE buffer;
int is_upside_down;
int ras_type = 0;
int linesize;
float ras_bpp = 0;
TUINT32 rebound;
UCHAR *ras_out;
int y,x;
float xDpi, yDpi;
DWORD bitmap_size;
int extraX, extraY, extraByteX;
TUINT32 tot_rebound = 0;

RASTER *ras = (RASTER *) the_ras;
if (!handle)
  return FALSE;
/*DAFARE
if (!ras)
  return FALSE;
*/
lpBIH = (LPBITMAPINFOHEADER) GLOBAL_LOCK(handle);

extraX = (int)lpBIH->biWidth - ras->lx;
extraY = (int)lpBIH->biHeight- ras->ly;

*lx = lpBIH->biWidth ;
*ly = lpBIH->biHeight;

assert(extraX>=0);
assert(extraY>=0);

xDpi = PelsPerMeter2DPI(lpBIH->biXPelsPerMeter);
yDpi = PelsPerMeter2DPI(lpBIH->biYPelsPerMeter);

switch (lpBIH->biBitCount)
  {
  CASE 1:
    ras_type = RAS_BW;
    ras_bpp  = 1.0/8.0;
  CASE 8:
    ras_type = RAS_GR8;
    ras_bpp  = 1;
  CASE 24:
    ras_type = RAS_RGB;
    ras_bpp  = 3;
  DEFAULT:
    assert(0);
  }
extraByteX = CEIL(extraX * ras_bpp);
bitmap_size = ((((lpBIH->biWidth * lpBIH->biBitCount) + 31) & ~31) >> 3) * lpBIH->biHeight;
/* cfr. DIBs and Their Use
   Ron Gery
   Microsoft Developer Network Technology Group
*/
ras_out = ras->buffer;

buffer = 0;
buffer = get_buffer(lpBIH, &is_upside_down);

if (is_upside_down)
  {
  ras_out = ras->buffer;
  if (!TTwainData.transferInfo.nextImageNeedsToBeInverted)
    {
    switch (ras_type)
      {
      CASE RAS_GR8:
      __OR RAS_RGB:
      __OR RAS_BW:
      linesize = CEIL(ras->lx * ras_bpp);
      for (y =0; y<ras->ly; y++, ras_out += linesize)
        {
        memcpy(ras_out, buffer, linesize);
        buffer += linesize;
        buffer += extraByteX;
        rebound = (TUINT32) buffer;
        rebound = 4 - (rebound %4);
        tot_rebound +=rebound;
        buffer += rebound;
        }
      }
    }
  else
    {
    switch (ras_type)
      {
      CASE RAS_BW:
        linesize = CEIL(ras->lx * ras_bpp);
        for (y =0; y<ras->ly; y++, ras_out)
          {
          for (x = 0; x<linesize; x++)
            {
            UCHAR eight_bit;
            eight_bit = *buffer;
            *ras_out = (UCHAR) ~eight_bit;
            buffer++;
            ras_out++;
            }
          buffer += extraByteX;
          rebound = (TUINT32) buffer;
          rebound = 4 - (rebound %4);
          buffer += rebound;
          }
      DEFAULT:
        assert(0); /*only BW images may need to be inverted*/
      }
    }
  }
else
  {
  assert(!"Not IMPL!");
  }
GLOBAL_UNLOCK(handle);
#ifdef _DEBUG
{
char msg[1024];
sprintf(msg,"tot rebounded byte=%d\n", tot_rebound);
OutputDebugString(msg);
if (lpBIH->biSize)
  {
  assert((lpBIH->biSizeImage-CEIL(ras->lx*ras->ly*ras_bpp))==tot_rebound);
  }
}
#endif
return TRUE;
#endif
	return 1;
}

#ifdef __cplusplus
}
#endif