⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extension.c

📁 JPEG2000实现的源码
💻 C
字号:
/*****************************************************************************/
/* Author: Brendt Wohlberg (Los Alamos National Laboratory).                 */
/* Copyright 2001 University of California.                                  */
/*****************************************************************************/

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "Extension.h"

const char* stdext_string(StdExtension stdext) {
  static const char* strings[] = {"Z00", "C00", "S11", "S12", "S21", "S22",
				  "A11", "A12", "A21", "A22", "NullStdExt"};

  return (stdext >= 0 && stdext < NullStdExt)?(strings[stdext]):0;
}

StdExtension string_to_stdext(const char* s) {
  StdExtension stdext;
  static const char* strings[] = {"Z00", "C00", "S11", "S12", "S21", "S22",
				  "A11", "A12", "A21", "A22"};

  stdext = 0;
  while (stdext < NullStdExt && strcmp(strings[stdext], s) != 0)
    stdext++;
  return stdext;
}


const ExtensionDesc* stdext_to_extdesc(StdExtension stdext) {
  static const ExtensionDesc stdtable[] = {{{ZExtType, NullExtSymm, 0},
					    {ZExtType, NullExtSymm, 0}},
					   {{CExtType, NullExtSymm, 0},
					    {CExtType, NullExtSymm, 0}},
					   {{SExtType, WExtSymm, 1},
					    {SExtType, WExtSymm, 1}},
					   {{SExtType, WExtSymm, 1},
					    {SExtType, HExtSymm, 1}},
					   {{SExtType, HExtSymm, 1},
					    {SExtType, WExtSymm, 1}},
					   {{SExtType, HExtSymm, 1},
					    {SExtType, HExtSymm, 1}},
					   {{SExtType, WExtSymm, -1},
					    {SExtType, WExtSymm, -1}},
					   {{SExtType, WExtSymm, -1},
					    {SExtType, HExtSymm, -1}},
					   {{SExtType, HExtSymm, -1},
					    {SExtType, WExtSymm, -1}},
					   {{SExtType, HExtSymm, -1},
					    {SExtType, HExtSymm, -1}}};

  return (stdext >= 0 && stdext < NullStdExt)?(stdtable+stdext):0;
}


int extend_channel_float(const ExtensionDesc* ext, int left, int rght,
			 const float* in_channel, int in_channel_length,
			 float* out_channel) {
  BndExt lext, rext;
  float* ext_buffer;
  int ext_buffer_length, out_channel_length;
  int left_ext, left_crop, rght_ext, rght_crop, left_over, rght_over;
  int lsrc, ldst, rsrc, rdst;
  int state_changed;
  int k;

  lext = ext->leftext;
  rext = ext->rghtext;
  out_channel_length = in_channel_length + left + rght;

  left_ext = (left > 0)?left:0;
  left_crop = (left < 0)?-left:0;
  rght_ext = (rght > 0)?rght:0;
  rght_crop = (rght < 0)?-rght:0;
  rght_over = left_ext-rght_ext-in_channel_length+1;
  if (lext.exttype != SExtType || rght_over<0)
    rght_over = 0;
  left_over = rght_ext-left_ext-in_channel_length+1;
  if (rext.exttype != SExtType || left_over<0)
    left_over = 0;

  ext_buffer_length = left_over + left_ext + in_channel_length + 
    rght_ext + rght_over;
  ext_buffer = malloc(sizeof(float)*ext_buffer_length);
  if (!ext_buffer)
    return 0;
  for (k = 0; k < ext_buffer_length; k++)
    ext_buffer[k] = 0;


  for (k = left_over+left_ext; k < in_channel_length+left_ext+left_over; k++) {
    ext_buffer[k] = in_channel[k+left_crop-left_ext-left_over];
  }
  
  /* Take care of undefined 1-pt cases */
  if (((lext.exttype == SExtType && lext.extsign>0) ||
       (rext.exttype == SExtType && rext.extsign>0)) &&
      in_channel_length == 1) {
    BndExt cnst = {CExtType, NullExtSymm, 0};
    lext = cnst;
    rext = cnst;
  }
    
  /* Set up extension on left */
  if (lext.exttype == CExtType || 
      (lext.exttype == SExtType && lext.extsymm == HExtSymm)) {
    lsrc = left_ext+left_over;
    ldst = lsrc-1;
  } else if (lext.exttype == SExtType && lext.extsymm == WExtSymm) {
    lsrc = left_ext+left_over + (lext.extsign > 0);
    ldst = lsrc-2;
  }

  /* Set up extension on right */
  if (rext.exttype == CExtType || 
      (rext.exttype == SExtType && rext.extsymm == HExtSymm)) {
    rsrc = left_over+left_ext+in_channel_length-1;
    rdst = rsrc+1;
  } else if (rext.exttype == SExtType && rext.extsymm == WExtSymm) {
    rsrc = left_over+left_ext+in_channel_length-1 - (rext.extsign > 0);
    rdst = rsrc+2;
  }


  while ((ldst >= 0 && lext.exttype != ZExtType) || 
	 (rdst < ext_buffer_length && rext.exttype != ZExtType)) {

    state_changed = 0;
    assert(lsrc < ext_buffer_length && rsrc >= 0);

    if (ldst >= 0 && lext.exttype != ZExtType) {
      if (lext.exttype == CExtType) {
	ext_buffer[ldst] = ext_buffer[lsrc];
	ldst--;
	state_changed = 1;
      } else if (lext.exttype == SExtType) {
	ext_buffer[ldst] = lext.extsign * ext_buffer[lsrc];
	ldst--;
	lsrc++;
	state_changed = 1;
      }
    }

    if (rdst < ext_buffer_length && rext.exttype != ZExtType) {
      if (rext.exttype == CExtType) {
	ext_buffer[rdst] = ext_buffer[rsrc];
	rdst++;
	state_changed = 1;
      } else if (rext.exttype == SExtType) {
	ext_buffer[rdst] = rext.extsign * ext_buffer[rsrc];
	rdst++;
	rsrc--;
	state_changed = 1;
      }
    }

    assert(state_changed);
  }

  for (k = 0; k < out_channel_length; k++)
    out_channel[k] = ext_buffer[k + left_over];

  free(ext_buffer);
  return 1;
}


int extend_channel_int(const ExtensionDesc* ext, int left, int rght,
		       const int* in_channel, int in_channel_length,
		       int* out_channel) {
   BndExt lext, rext;
  int* ext_buffer;
  int ext_buffer_length, out_channel_length;
  int left_ext, left_crop, rght_ext, rght_crop, left_over, rght_over;
  int lsrc, ldst, rsrc, rdst;
  int state_changed;
  int k;

  lext = ext->leftext;
  rext = ext->rghtext;
  out_channel_length = in_channel_length + left + rght;

  left_ext = (left > 0)?left:0;
  left_crop = (left < 0)?-left:0;
  rght_ext = (rght > 0)?rght:0;
  rght_crop = (rght < 0)?-rght:0;
  rght_over = left_ext-rght_ext-in_channel_length+1;
  if (lext.exttype != SExtType || rght_over<0)
    rght_over = 0;
  left_over = rght_ext-left_ext-in_channel_length+1;
  if (rext.exttype != SExtType || left_over<0)
    left_over = 0;

  ext_buffer_length = left_over + left_ext + in_channel_length + 
    rght_ext + rght_over;
  ext_buffer = malloc(sizeof(int)*ext_buffer_length);
  if (!ext_buffer)
    return 0;
  for (k = 0; k < ext_buffer_length; k++)
    ext_buffer[k] = 0;


  for (k = left_over+left_ext; k < in_channel_length+left_ext+left_over; k++) {
    ext_buffer[k] = in_channel[k+left_crop-left_ext-left_over];
  }
  
  /* Take care of undefined 1-pt cases */
  if (((lext.exttype == SExtType && lext.extsign>0) ||
       (rext.exttype == SExtType && rext.extsign>0)) &&
      in_channel_length == 1) {
    BndExt cnst = {CExtType, NullExtSymm, 0};
    lext = cnst;
    rext = cnst;
  }
    
  /* Set up extension on left */
  if (lext.exttype == CExtType || 
      (lext.exttype == SExtType && lext.extsymm == HExtSymm)) {
    lsrc = left_ext+left_over;
    ldst = lsrc-1;
  } else if (lext.exttype == SExtType && lext.extsymm == WExtSymm) {
    lsrc = left_ext+left_over + (lext.extsign > 0);
    ldst = lsrc-2;
  }

  /* Set up extension on right */
  if (rext.exttype == CExtType || 
      (rext.exttype == SExtType && rext.extsymm == HExtSymm)) {
    rsrc = left_over+left_ext+in_channel_length-1;
    rdst = rsrc+1;
  } else if (rext.exttype == SExtType && rext.extsymm == WExtSymm) {
    rsrc = left_over+left_ext+in_channel_length-1 - (rext.extsign > 0);
    rdst = rsrc+2;
  }


  while ((ldst >= 0 && lext.exttype != ZExtType) || 
	 (rdst < ext_buffer_length && rext.exttype != ZExtType)) {

    state_changed = 0;
    assert(lsrc < ext_buffer_length && rsrc >= 0);

    if (ldst >= 0 && lext.exttype != ZExtType) {
      if (lext.exttype == CExtType) {
	ext_buffer[ldst] = ext_buffer[lsrc];
	ldst--;
	state_changed = 1;
      } else if (lext.exttype == SExtType) {
	ext_buffer[ldst] = lext.extsign * ext_buffer[lsrc];
	ldst--;
	lsrc++;
	state_changed = 1;
      }
    }

    if (rdst < ext_buffer_length && rext.exttype != ZExtType) {
      if (rext.exttype == CExtType) {
	ext_buffer[rdst] = ext_buffer[rsrc];
	rdst++;
	state_changed = 1;
      } else if (rext.exttype == SExtType) {
	ext_buffer[rdst] = rext.extsign * ext_buffer[rsrc];
	rdst++;
	rsrc--;
	state_changed = 1;
      }
    }

    assert(state_changed);
  }

  for (k = 0; k < out_channel_length; k++)
    out_channel[k] = ext_buffer[k + left_over];

  free(ext_buffer);
  return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -