packages feed

bitmap-0.0.0: cbits/bm.c

/*
the C part of the Data.Bitmap library
(c) 2009 Balazs Komuves
*/

#include <string.h>
#include "bm.h"

// -----------------------------------------------------------------------------
 
void c_memset(word8 *q, int count, word8 x)
{ memset(q,x,count);
}

// (from, to, count)
void c_memcpy(word8 *p, word8 *q, int count)
{ memcpy(q,p,count);
}

// -----------------------------------------------------------------------------

#define K_WORD8  1
#define K_WORD16 2
#define K_WORD32 3
#define K_FLOAT  4

#define PLUSPTR(P,TYP,K) P=(TYP*)(((word8*)P)+K);

// -----------------------------------------------------------------------------

#define C_EXTRACT_CHANNEL(TYP) \
void c_extract_channel_ ## TYP \
  ( int width, int height \
  , TYP *p1, int nchn1, int pad1, int ofs1 \
  , TYP *p2, int nchn2, int pad2, int ofs2 \
  ) \
{ int x,y;        \
  TYP *q1,*q2;    \
  q1 = p1 + ofs1; \
  q2 = p2 + ofs2; \
  for(y=0;y<height;y++)   \
  { for(x=0;x<width;x++)  \
    { *q2 = *q1;    \
      q1 += nchn1;  \
      q2 += nchn2;  \
    }               \
    PLUSPTR(q1,TYP,pad1); \
    PLUSPTR(q2,TYP,pad2); \
  }   \
} 

C_EXTRACT_CHANNEL(word8 )
C_EXTRACT_CHANNEL(word16)
C_EXTRACT_CHANNEL(word32)
C_EXTRACT_CHANNEL(float )

void c_extract_channel
  ( int k_type
  , int width, int height 
  , void *p1, int nchn1, int pad1, int ofs1 
  , void *p2, int nchn2, int pad2, int ofs2 
  ) 
{ switch(k_type)
  { case K_WORD8: 
      c_extract_channel_word8 ( width,height, p1,nchn1,pad1,ofs1, p2,nchn2,pad2,ofs2 );
      break;
    case K_WORD16: 
      c_extract_channel_word16( width,height, p1,nchn1,pad1,ofs1, p2,nchn2,pad2,ofs2 );
      break;
    case K_WORD32: 
      c_extract_channel_word32( width,height, p1,nchn1,pad1,ofs1, p2,nchn2,pad2,ofs2 );
      break;
    case K_FLOAT: 
      c_extract_channel_float ( width,height, p1,nchn1,pad1,ofs1, p2,nchn2,pad2,ofs2 );
      break;
  }
}