#include <scale.h>
#include <groupcel.h>
#include "color.h"
#include "vectlib.h"
#include "winds.h"
#include "win2d.h"
#include "3d.h"
#include "filtr.h"
#include "config.h"
#include "ctmenu.h"
#include "setup.h"
#include "measure.h"
#include "ct.h"
#include "ct_ext.h"
#include "console.h"
#include "language.h"
#define POROG (GRAY_BASE+GRAY_LVLS*4/5)
extern int ExistWindow(WinHandle w);
extern WinHandle MainControl;
extern WinHandle H3d_view;
extern void InvRect(int x0, int y0, int x1, int y1, WinHandle w, char *s);
extern void redraw_window(WinHandle w);
extern void redraw_cw(WinHandle w);
extern void SetupLUT(DWIND *winds);
extern void Screen_Save(void);
extern Rect correct_rect(Rect r);
extern Rect Set_Rect(WinHandle w);
extern Rect Set_Sqr(WinHandle w);
extern void cell_to_pcx(char *pcx_name, GCHandle ch,
int xmax, int ymax, char *pallet);
/***********************************************************/
void Do_AddSub_Img(WinHandle w, int fl_sub)
{ GWHandle chl;
HFILE img_fil,tmp_fil;
long *L,*L1;
int *p,*p1,*p2,*p0,*pp,k,i,j,jz,nx,ny,*pq;
char *hc,*c,name[81];
char *s;
unsigned char *uhc,*pc;
Win2d *ud = h_data(w);
if(!ud->img_name || !ud->ch) return;
if(ud->frag) return;
chl = ud->ch;
s = GetFileName(GetCfgItem("image"),H_CREATE); if (*s == 0) return;
img_fil = HOpen(s,H_READ); if (img_fil == 0) return;
HLocate(img_fil,0l,2048); p = HPosit(img_fil);
L = (long*)p; nx = L[2]; ny = L[3]; ud = h_data(w);
if(nx != ud->iw) { HClose(img_fil); return;}
if(ny != ud->ih) { HClose(img_fil); return;}
if (chl == 0) { HClose(img_fil); return;}
ud = h_data(w);
uhc = (char*)&p[256+128];
if(uhc[249] != 2-ud->ps) return;
if(ud->scale2d == 1)
{
pp = h_malloc(nx*4);
pq = h_malloc(nx*4);
for (j = 0; j < ny; j++)
{ ud = h_data(w);
if(ud->ps == 2)
{ HLocate(img_fil,(long)j*nx*2+2048L,nx*2); p = HPosit(img_fil);
}
else
{ HLocate(img_fil,(long)j*nx+2048L,nx); pc = HPosit(img_fil);
for(i = 0; i < nx; i++) pq[i] = (int)pc[i];
p = pq;
GetGWL(chl,(short*)pp,nx,j);
for(i = 0; i < nx; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx,j);
h_mfree(pp); h_mfree(pq);
{ p1 = h_malloc(nx*4); p2 = h_malloc(nx*4);
p0 = h_malloc(nx*4); pp = h_malloc(nx*4);
// Image interpolation
HLocate(img_fil,2048l,nx*2);
p = (int*)HPosit(img_fil);
for (i = 0, k = 0; i < nx-1; i++, k += 2)
{ p1[k] = p[i]; p1[k+1] = (p[i]+p[i+1])/2;
p1[k] = p[i];
for (j = 0, jz = 0; j < ny-1; j++, jz += 2)
{ // Write 1 line
GetGWL(chl,(short*)pp,nx*2-1,jz);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p1[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz);
//Read 2 line
HLocate(img_fil,(long)(j+1)*nx*2+2048l,nx*2);
{ p2[k] = p[i]; p2[k+1] = (p[i]+p[i+1])/2;
p2[k] = p[i];
for (i = 0; i < nx*2-1; i++) p0[i] = (p1[i]+p2[i])/2;
// Write 2 line
GetGWL(chl,(short*)pp,nx*2-1,jz+1);
pp[i] = (pp[i]-2048 + p0[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz+1);
// Line2 to Line1
for (i = 0; i < nx*2-1; i++) p1[i] = p2[i];
h_mfree(p1); h_mfree(p2); h_mfree(p0); h_mfree(pp);
HClose(img_fil);
ud->x0 = (ud->iw-ud->w)/2; // Центровка
ud->y0 = (ud->ih-ud->h)/2; // изображения
redraw_cw(w);
void Do_Inversion(WinHandle w)
{ int i,k; int imin,imax;
WinCon *udc;
DWIND *p = &ud->dw[0];
if (p->on) { if(p->neg) p->neg = 0; else p->neg = 1;
if(!ExistWindow(H3d_view))
{ udc = h_data(MainControl);
udc->inv_prn = p->neg;
SetupLUT(ud->dw);
// Image filtration functions
static void inch(int *u,int *v)
{int temp;
temp=*u; *u=*v; *v=temp;
static int f9(int *mf)
int *max,i,j;
for(i = 0;i < 9; i++)
{max=&mf[i];
for(j = i+1;j < 9; j++) if(*max < mf[j]) max = &mf[j];
if(max != &mf[i]) inch(max,&mf[i]);
return(mf[4]);
static int f1(int *mf)
{long s;
s=(long)mf[0]+2*(long)mf[1]+(long)mf[2]+2*(long)mf[3]
+4*(long)mf[4]+2*(long)mf[5]+(long)mf[6]+2*(long)mf[7]+(long)mf[8];
return(s/16);
static int f2(int *mf)
s=(long)mf[0]+(long)mf[1]+(long)mf[2]+(long)mf[3]
+(long)mf[5]+(long)mf[6]+(long)mf[7]+(long)mf[8];
return(s/8);
static int f3(int *mf)
{long r1,r2;
r1 = (long)mf[0]+(long)mf[1]+(long)mf[2]-(long)mf[6]-(long)mf[7]-(long)mf[8];
r1 = r1*r1;
r2 = (long)mf[0]+(long)mf[3]+(long)mf[6]-(long)mf[2]-(long)mf[5]-(long)mf[8];
r2 = r2*r2;
return((int)(2.0*sqrt((double)(r1+r2))));
static int f4(int *mf)
{return( mf[4]);
static int f5(int *mf)
s=(-2*(long)mf[0]+(long)mf[1]-2*(long)mf[2]+(long)mf[3]
+6*(long)mf[4]+(long)mf[5]-2*(long)mf[6]+(long)mf[7]-2*(long)mf[8])/2;
return((int)s);
static int f6(int *mf)
{int e,s;
s = f1(mf); e = mf[4];
if((2*e - s) > 30) e = 2*e - s;
else e = s;
return(e);
static int f7(int *mf)
s=-(long)mf[0]-(long)mf[1]-(long)mf[2]+(long)mf[3]
+3*(long)mf[4]-(long)mf[5]+(long)mf[6]+(long)mf[7]-(long)mf[8];
static int f8(int *mf)
s=((long)mf[0]+(long)mf[1]+(long)mf[2]+(long)mf[3])/4;
static int f10(int *mf)
static void filt(int *p1,int *p2,int *p3,int *po,int str,int nfilt)
int mf[9],i,tr;
str=str-1; tr=str-1;
mf[0]=*(p1+str);mf[1]=*p1;mf[2]=*(p1+1);
mf[3]=*(p2+str);mf[4]=*p2;mf[5]=*(p2+1);
mf[6]=*(p3+str);mf[7]=*p3;mf[8]=*(p3+1);
switch (nfilt)
{ case 1: *po=f1(mf); break;
case 2: *po=f2(mf); break;
case 3: *po=f3(mf); break;
case 4: *po=f4(mf); break;
case 5: *po=f5(mf); break;
case 6: *po=f6(mf); break;
case 7: *po=f7(mf); break;
case 8: *po=f8(mf); break;
case 9: *po=f9(mf); break;
case 10: *po=f10(mf); break;
for(i = 0; i < tr; i++)
{mf[0] = *(p1+i); mf[1] = *(p1+i+1); mf[2] = *(p1+i+2);
mf[3] = *(p2+i); mf[4] = *(p2+i+1); mf[5] = *(p2+i+2);
mf[6] = *(p3+i); mf[7] = *(p3+i+1); mf[8] = *(p3+i+2);
{ case 1: *(po+i+1) = f1(mf); break;
case 2: *(po+i+1) = f2(mf); break;
case 3: *(po+i+1) = f3(mf); break;
case 4: *(po+i+1) = f4(mf); break;
case 5: *(po+i+1) = f5(mf); break;
case 6: *(po+i+1) = f6(mf); break;
case 7: *(po+i+1) = f7(mf); break;
case 8: *(po+i+1) = f8(mf); break;
case 9: *(po+i+1) = f9(mf); break;
case 10: *(po+i+1) = f10(mf); break;
mf[0]=*(p1+tr);mf[1]=*(p1+str);mf[2]=*p1;
mf[3]=*(p2+tr);mf[4]=*(p2+str);mf[5]=*p2;
mf[6]=*(p3+tr);mf[7]=*(p3+str);mf[8]=*p3;
{ case 1: *(po+str)=f1(mf); break;
case 2: *(po+str)=f2(mf); break;
case 3: *(po+str)=f3(mf); break;
case 4: *(po+str)=f4(mf); break;
case 5: *(po+str)=f5(mf); break;
case 6: *(po+str)=f6(mf); break;
case 7: *(po+str)=f7(mf); break;
case 8: *(po+str)=f8(mf); break;
case 9: *(po+str)=f9(mf); break;
case 10: *(po+str)=f10(mf); break;
void Do_Filters(WinHandle w, int nfilt)
int i,k;
int *po,*p1,*p2,*p3,*p4,*p5,*pn,iw,ih;
double d1,d2;
if ((chl = ud->ch) == 0) return;
iw=ud->iw; ih=ud->ih;
if(nfilt == 10)
po = (int*)h_malloc(iw*2); pn = (int*)h_malloc(iw*2);
p1 = (int*)h_malloc(iw*2); p2 = (int*)h_malloc(iw*2);
p3 = (int*)h_malloc(iw*2); p4 = (int*)h_malloc(iw*2);
p5 = (int*)h_malloc(iw*2);
i = 2;
GetGWL(chl,(short*)p1,iw,i-2);
for(k = 0; k < iw; k++) p1[k] = p1[k]-2048;
GetGWL(chl,(short*)p2,iw,i-1);
for(k = 0; k < iw; k++) p2[k] = p2[k]-2048;
GetGWL(chl,(short*)p3,iw,i);
for(k = 0; k < iw; k++) p3[k] = p3[k]-2048;
GetGWL(chl,(short*)p4,iw,i+1);
for(k = 0; k < iw; k++) p4[k] = p4[k]-2048;
for( i =2; i < ih-2; i++)
GetGWL(chl,(short*)p5,iw,i+2);
for(k = 0; k < iw; k++) p5[k] = p5[k]-2048;
for(k = 2; k < iw-2; k++)
d1 = p1[k-2] - p5[k+2]; d1 = d1*d1;
d2 = p5[k-2] - p1[k+2]; d2 = d2*d2;
po[k] = (int)sqrt(d1+d2)+2048;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10