}
for(k = 0; k < iw; k++) p1[k] = p2[k];
for(k = 0; k < iw; k++) p2[k] = p3[k];
for(k = 0; k < iw; k++) p3[k] = p4[k];
for(k = 0; k < iw; k++) p4[k] = p5[k];
PutGWL(chl,(short*)po,iw,i);
h_mfree(pn); h_mfree(po); h_mfree(p1); h_mfree(p2); h_mfree(p3);
h_mfree(p4); h_mfree(p5);
redraw_cw(w);
return;
if(nfilt == 4)
{
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);
i = 1;
GetGWL(chl,(short*)p1,iw,i-1);
for(k = 0; k < iw; k++) p1[k] = p1[k]-2048;
GetGWL(chl,(short*)p2,iw,i);
for(k = 0; k < iw; k++) p2[k] = p2[k]-2048;
for( i =1; i < ih-1; i++)
GetGWL(chl,(short*)p3,iw,i+1);
for(k = 0; k < iw; k++) p3[k] = p3[k]-2048;
filt(p1,p2,p3,po,iw,nfilt);
// memcpy(p1,p2,iw); memcpy(pn,p3,iw);
for(k = 0; k < iw; k++) pn[k] = p3[k];
for(k = 0; k < iw; k++) po[k] = po[k]+2048;
// memcpy(p2,pn,iw);
for(k = 0; k < iw; k++) p2[k] = pn[k];
/***********************************************************/
void Do_Scale_Rotate(WinHandle w)
{ int i,k;
int nx,ny,ix,iy;
int *po;
int q1,q2,q3,q4;
double angle;
double hi,hi_t,x,y,u,v,si,co,dx,dy;
double cox = 65536.0;
long cx,cy,cx1,cy1,s1,s2;
long lx,ly,ldx,ldy,lix,liy;
unsigned char *pc,s,p;
IJ ij;
GWHandle ch,chol;
Win2d *ud = h_data(w);
if ((chol=ud->ch) == 0) return;
angle = 3.14159265*ud->angle/180.0;
hi = 1.0/ud->iw; hi_t = hi/ud->scale;
nx = ud->scale*ud->iw; ny = ud->scale*ud->ih;
si = sin(angle); co = cos(angle);
u = -hi_t*(nx/2.0); v = -hi_t*(ny/2.0 - 1);
dx = hi_t*co/hi; dy = hi_t*si/hi;
ldx= cox*dx; ldy = cox*dy;
po = (int*)h_malloc(nx*sizeof(int));
ch = NewGW(f_create("rout.tmp",F_CREATE_NORMAL),0);
for( i = 0; i < ny; i++)
{v+= hi_t;
lx = cox*( u*co - v*si + hi_t*(nx/2.0) )/hi;
ly = cox*( u*si + v*co + hi_t*(ny/2.0) )/hi;
for(k = 0; k < nx; k++)
ix = lx >> 16; lx+= ldx;
iy = ly >> 16; ly+= ldy;
liy = iy; liy = liy << 16;
cy = ly - liy;
cy1= 65537L - cy;
lix = ix; lix = lix << 16;
cx = lx - lix;
cx1= 65537L - cx;
ij.i = ix; ij.j = iy; GetGWA(chol, (short*)&q1, 1, &ij);
ij.i = ix+1; ij.j = iy; GetGWA(chol, (short*)&q2, 1, &ij);
ij.i = ix; ij.j = iy+1; GetGWA(chol, (short*)&q3, 1, &ij);
ij.i = ix+1; ij.j = iy+1; GetGWA(chol, (short*)&q4, 1, &ij);
s1 = ((long)q1*cx1+(long)q2*cx) >> 16;
s1 = (s1*cy1)>>16;
s2 = ((long)q3*cx1 + (long)q4*cx) >> 16;
s2 = (s2*cy)>>16;
po[k] = s1+s2;
PutGWL(ch, (short*)po, nx, i);
h_mfree(po);
if (chol) DisposeGW(chol);
ud = h_data(w);
ud->ch = ch;
ud->iw = nx; ud->ih = ny;
ud->x0 = (ud->iw-ud->w)/2; // Центровка
ud->y0 = (ud->ih-ud->h)/2; // изображения
redraw_window(w);
// зеркальное отображение
void Do_Mirrow(WinHandle w)
{ int i,j,vol;
int nx,ny;
GWHandle ch;
if ((ch=ud->ch) == 0) return;
nx = ud->iw; ny = ud->ih;
{ GetGWL(ch, (short*)po, nx, i);
for(j=0;j<nx/2;j++)
{ vol = po[j]; po[j] = po[nx-j-1]; po[nx-j-1] = vol;
ud = h_data(w); ud->flef^=1;
static void Do_ResZo(WinHandle w, int nxi, int nyi, int reszo, int type)
int nx,ny,ix,iy,new_nx,new_ny,x0,y0;
double x,y,dx,dy;
double sc_x,sc_y,cox = 65536.0;
Rect r;
Rect wr = WorkRect(w);
if(reszo)
{ nx=nxi; ny=nyi;
new_nx = ud->iw; new_ny = ud->ih;
if(new_nx==nx && new_ny==ny) return;
else
r = type ? Set_Rect(w) : Set_Sqr(w);
if(r.x0 == -1) return;
new_nx = r.x1-r.x0+1; new_ny = r.y1-r.y0+1;
sc_x = (double)ud->iw/new_nx;
sc_y = (double)ud->ih/new_ny;
if( sc_x < sc_y)
{ nx = ud->iw; ny = new_ny*sc_x;
if(ny%2) ny--; ud->scale = sc_x;
{ ny = ud->ih; nx = new_nx*sc_y;
if(nx%2) nx--; ud->scale = sc_y;
OnScale(wr.x0,wr.y0);
dx = (double)new_nx/(double)nx;
dy = (double)new_ny/(double)ny;
x0 = y0 = 0;
{ ud = h_data(w);
x0 = r.x0-wr.x0+ud->x0;
y0 = r.y0-wr.y0+ud->y0;
ly = cox*y0;
lx = cox*x0;
ly+= ldy;
iy = ly>>16;
lx+= ldx;
ix = lx>>16;
DoneVisSave((int)((i+1)*100.0/ny+0.5));
ud->r0 = (double)ud->r0*(double)new_nx/ud->iw;
OffScale();
{ if (ud->size_big)
SetRectShape(w,&CommonRect);
else SetRectShape(w,&ud->own_size);
void Do_Zoom(WinHandle w, int type)
Do_ResZo(w,0,0,0,type);
void Do_Resemple(WinHandle w, int nx, int ny, int type)
Do_ResZo(w,nx,ny,1,type);
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
typedef struct tagBITMAPFILEHEADER
{ WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{ DWORD biSize;
long biWidth;
long biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
void Fr_Save(WinHandle w, int select)
{ int i,k,x,y,x1,y1,nx,ny,format,ii,fin;
BYTE rr,gg,bb;
BYTE *filp,*pallet,*pal;
GCHandle ch;
USGC *s;
BITMAPFILEHEADER *hfile;
BITMAPINFOHEADER *hinfo;
long hi;
int L = wr.x1 - wr.x0 + 1;
int H = wr.y1 - wr.y0 + 1;
if(ud->r0<500 && ud->r0>10)
hi = 100.0/(0.2*(double)ud->r0/(double)(ud->iw-1));
else hi = 0l;
if(!ud->img_name || !ud->ch) return;
// BringToFront(w); VisSetWin(w); // ?????
format = 0;
if(select == 0)
{r = Set_Rect(w); if(r.x0 < 0) return;
else if(select == 1)
{r.x0 = wr.x0; r.y0 = wr.y0; r.x1 = wr.x1; r.y1 = wr.y1;}
else if(select == 2)
if((ud->iw > L) || (ud->ih > H))
{ r.x0 = wr.x0-ud->x0; r.y0 = wr.y0-ud->y0;
r.x1 = r.x0 + ud->iw-1; r.y1 = r.y0 + ud->ih-1;
else return;
nx = r.x1-r.x0+1; ny = r.y1-r.y0+1;
if(nx%4) { nx-=nx%4; r.x0++; }
if(ny%2) { ny--; r.y0++; }
i = InputForm(mesman,&format);
if (i != 1) return;
s = h_malloc(4096); if(!s) return;
if(format == 2) // BMP save
hfile =h_malloc(sizeof(BITMAPFILEHEADER));
hinfo =h_malloc(sizeof(BITMAPINFOHEADER));
// Select name and open BMP file
filp = GetFileName(GetCfgItem("bmp"),H_CREATE);
if (*filp == 0) {h_mfree(s); h_mfree(hfile); h_mfree(hinfo); return;}
if ((fin = f_create(filp, F_CREATE_NORMAL)) == -1)
{h_mfree(s); h_mfree(hfile); h_mfree(hinfo); return;}
// Save BITMAPFILEHEADER
hfile->bfType = 0x4D42; // BM - символы идентифицирующие формат
hfile->bfSize = 0l; // размер файла в long-ах
hfile->bfReserved1 = 0;
hfile->bfReserved2 = 0;
hfile->bfOffBits = sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)+1024L;
// смещение начала собственно битового массива в байтах
f_write(fin, hfile, sizeof(BITMAPFILEHEADER));
// Save BITMAPIMFOHEADER
hinfo->biSize = (long)sizeof(BITMAPINFOHEADER);
hinfo->biWidth = (long)nx;
// кратно long-ам (если надо, добавить нули)
hinfo->biHeight = (long)ny;
hinfo->biPlanes = 1;
hinfo->biBitCount = 8;
hinfo->biCompression = 0L;
hinfo->biSizeImage = 0L;
hinfo->biXPelsPerMeter = hi;
hinfo->biYPelsPerMeter = hi;
hinfo->biClrUsed = 0L; // к-во цветов в таблице цветности
hinfo->biClrImportant = 0L; // обязательное к-во цветов
f_write(fin, hinfo, sizeof(BITMAPINFOHEADER));
// Save PALLETE
pallet = h_malloc(1024); pal = pallet;
for(ii=0; ii<256; ii++)
{ g_get_pal((USGC)ii,&rr,&gg,&bb);
*pal++ = rr*4; *pal++ = gg*4; *pal++ = bb*4; *pal++ = 0;
f_write(fin, pallet, 1024);
h_mfree(pallet);
// Save BITMAP
for(y=r.y1; y>=r.y0; y--)
{ for(x=r.x0,k=0; x<=r.x1; x++,k++)
{ s[k] = g_point(x, y, 0); g_point(x, y, s[k]);}
f_write(fin, s, nx);
f_close(fin); h_mfree(hfile); h_mfree(hinfo);
else if(format == 0) // IMG save
filp = GetFileName(GetCfgItem("frag"),H_CREATE);
if (*filp == 0) { h_mfree(s); return;}
if ((fin = f_create(filp, F_CREATE_NORMAL)) == -1) {h_mfree(s); return;}
f_write(fin, &nx, sizeof(int)); f_write(fin, &ny, sizeof(int));
for(y=r.y0; y<=r.y1; y++)
{ s[k] = g_point(x, y, 0); g_point(x, y, s[k]);
f_close(fin);
ShowCursor(x,y,CURT_HAND);
else if(format == 1) // PCX save
{ if ((fin = f_create("frag.tmp", F_CREATE_NORMAL)) == -1)
{h_mfree(s); return;}
ch = NewGC(fin,0);
pallet = h_malloc(768);
for(y=r.y0,i = 0; y<=r.y1; y++,i++)
PutGCL(ch, s, nx, i);
pal = pallet;
*pal++ = rr*4;
*pal++ = gg*4;
*pal++ = bb*4;
filp = GetFileName(GetCfgItem("pcx"),H_CREATE);
if (*filp)
cell_to_pcx(filp, ch, nx, ny, pallet);
DisposeGC(ch); f_delete("frag.tmp");
h_mfree(s);
void PCX_Save(WinHandle w)
{ int i,k,x,y,x1,y1,nx,ny,ii,fin;
USGC rr,gg,bb;
USGC *filp,*pallet,*pal;
Win2d *ud;
USGC *s,*s1,name[13],ss[81];
ud = h_data(w); if(!ud->img_name || !ud->ch) return;
r.x0 = wr.x0; r.y0 = wr.y0; r.x1 = wr.x1; r.y1 = wr.y1;
if(nx%2) { nx--; r.x0++; }
s = h_malloc(1024); if(!s) return;
// PCX save
if ((fin = f_create("frag.tmp", F_CREATE_NORMAL)) == -1)
strcpy(ss,GetCfgItem("pcx"));
if(*ss != 0)
{ s1=strrchr(ss,'\\'); if(!s1) return ; else { s1++; *s1=0; }
sprintf(name,"%ld-%d.pcx",ud->no,ud->ns);
strcat(ss,name);
if (*ss) cell_to_pcx(ss, ch, nx, ny, pallet);
void Fr_Load(WinHandle w)
{ GWHandle chl;
int i,k,x,y,x1,y1,nx,ny;
Rect r; EventRecord e;
char name[81],s[81],*s1;
int *pi;
unsigned char *c,*pc,*p,*pp;
int fin;
char *filp;
filp = GetFileName(GetCfgItem("frag"),H_READ);
if (*filp == 0) return;
if ((fin = f_open(filp, F_OPEN_READ)) == -1) return;
f_read(fin, &nx, sizeof(int)); f_read(fin, &ny, sizeof(int));
get_ct_handle(w, ct);
get_ctsys();
ct->l[2] = nx; ct->l[3] = ny;
ct->b[249] = 1;
ud->iw = nx;
ud->ih = ny;
ud->ps = 1;
ud->frag = 1;
ud->objtype = 0;
// GW file name definition
strcpy(name,GetCfgItem("image"));
pc = name+strlen(name); while (pc > name && pc[-1] != '\\') pc--;
sprintf(pc,"w%d.tmp",ud->temp_name);
if (ud->ch) { DisposeGW(ud->ch); f_delete(name); }
ud->ch = NewGW(f_create(name,F_CREATE_NORMAL),0);
chl = ud->ch;
p = h_malloc(nx); pi = (int*)h_malloc(nx*2);
for( k = 0; k < ny; k++)
{f_read(fin, p, nx);
for (i = 0; i < nx; i++) pi[i] = (int)p[i]+2048;
PutGWL(chl,(short*)pi,nx,k); // Write to GW file
h_mfree(p); h_mfree(pi);
VisSetWin(w);
strcpy(s,filp);
if(!ud->img_old && ud->img_name)
{ int len = strlen(h_data(ud->img_name));
ud->img_old = h_alloc(len+1);
strcpy(h_data(ud->img_old),h_data(ud->img_name));
if(ud->img_name)
{ if (ud->tempimg) f_delete(h_data(ud->img_name)); h_free(ud->img_name);
else h_free(ud->win.title);
ud->img_name = h_alloc(strlen(s)+1);
strcpy(h_data(ud->img_name),s);
ud->tempimg = 0;
ud->win.title = ud->img_name;
PaintTitle(w);
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10