0,0 → 1,575 |
#include "kosSyst.h" |
#include "gfx.cpp" |
#include "dlgopen.h" |
#include "formats\pcx.h" |
#include "formats\bmp.h" |
#include "formats\tga.h" |
|
#define btn_open 10 |
#define btn_prev 11 |
#define btn_next 12 |
#define btn_fit 13 |
|
#define scrl_up 30 |
#define scrl_down 31 |
#define scrl_left 32 |
#define scrl_right 33 |
|
char params[2048] = "PARAM"; |
const char header[] = "ImageView v 0.08"; |
int image_opened=0; |
|
Byte* image_buffer=NULL; // Ïîëíîå RAW-Èçîáðàæåíèå |
Byte* img_cuted=NULL; // Óñå÷åííîå RAW-èçîáðàæåíèå (èñïîëüçóåòñÿ ïðè ïðîêðóòêå èëè ìàñøòàáèðîâàíèè) |
Byte* cur_files=NULL; // Áóôåð äëÿ îáùåãî ñïèñêà ôàéëîâ òåêóùåé ïàïêè |
Word* img_files=NULL; // Óêàçàòåëü ìàññèâ ñî ñïèñîê ãðàô.ôàéëîâ â òåêóùåé ïàïêå |
Dword cnt_imgfiles; // Êîëè÷åñòâî ýëåìåíòîâ ìàññèâà img_files[] |
Dword cur_image; // Íîìåð òåêóùåãî èçîáðàæåíèÿ â ìàññèâå |
char cur_folder[512]; // Ïóòü ê òåêóùåé ïàïêå ñ / íà êîíöå |
|
Dword image_width; |
Dword image_height; |
Dword old_status_size=0; |
|
char szStatus[256]; |
bool scale=0; |
|
|
sProcessInfo proc; |
Dword img_area_left,img_area_top,img_area_width,img_area_height; |
int vscrl_max=100,vscrl_value=0,vscrl_coord_x,vscrl_coord_y,vscrl_coord_min,vscrl_coord_max,vscrl_using=0; |
int hscrl_max=100,hscrl_value=0,hscrl_coord_x,hscrl_coord_y,hscrl_coord_min,hscrl_coord_max,hscrl_using=0; |
Dword width_old,height_old; |
|
/* Âûðåçàåò êâàäðàò èç èçîáðàæåíèÿ ïî êîîðäèíàòàì*/ |
void GetRectImage(Byte* src, Byte* dst, Dword left,Dword top,Dword width,Dword height) |
{ |
int x,y; |
int pImgS,pImgD=0; |
|
for(y=top;y<top+height;y++) |
{ |
for(x=left;x<left+width;x++) |
{ |
pImgS=y*image_width*3+x*3; |
*(dst+pImgD+0)=*(src+pImgS+0); |
*(dst+pImgD+1)=*(src+pImgS+1); |
*(dst+pImgD+2)=*(src+pImgS+2); |
pImgD=pImgD+3; |
} |
} |
} |
|
/* Ðàñòÿãèâàåò èçîáðàæåíèå â ìåíüøóþ ñòîðîíó (èíà÷å íóæíî âûäåëÿòü áîëüøå ïàìÿòè ïîä img_cuted) */ |
void ResizeImage(Byte* src, Byte* dst, Dword new_width,Dword new_height) |
{ |
int x,y,src_y,src_x; |
int pImgS,pImgD=0; |
for(y=0;y<new_height;y++) |
{ |
for(x=0;x<new_width;x++) |
{ |
__asm |
{ |
finit |
fild image_width |
fidiv new_width |
fild x |
fmul st(0),st(1) |
fistp src_x |
fild image_height |
fidiv new_height |
fild y |
fmul st(0),st(1) |
fistp src_y |
} |
pImgS=src_y*image_width*3+src_x*3; |
pImgD=y*new_width*3+x*3; |
*(dst+pImgD+0)=*(src+pImgS+0); |
*(dst+pImgD+1)=*(src+pImgS+1); |
*(dst+pImgD+2)=*(src+pImgS+2); |
} |
} |
} |
|
void set_vscroll_values(Dword max, Dword value) |
{ |
vscrl_max=max; |
vscrl_value=value; |
kos_DrawBar(vscrl_coord_x,vscrl_coord_y,15,35,0xDADADA); |
vscrl_coord_y=vscrl_coord_min+((value*(vscrl_coord_max-vscrl_coord_min-35))/vscrl_max); |
kos_PutImage(scroll_v,15,35,vscrl_coord_x,vscrl_coord_y); |
} |
|
void set_hscroll_values(Dword max, Dword value) |
{ |
hscrl_max=max; |
hscrl_value=value; |
kos_DrawBar(hscrl_coord_x,hscrl_coord_y,35,15,0xDADADA); |
hscrl_coord_x=hscrl_coord_min+((value*(hscrl_coord_max-hscrl_coord_min-35))/hscrl_max); |
kos_PutImage(scroll_h,35,15,hscrl_coord_x,hscrl_coord_y); |
} |
|
void draw_image() |
{ |
Dword new_width,new_height,scale_left,scale_top; |
if (!image_opened) return; |
|
if (scale==0) |
{ |
/* Çäåñü âûâîä èçîáðàæåíèÿ ñ èñïîëüçîâàíèåì ïîëîñ ïðîêðóòêè */ |
new_width = image_width <= img_area_width ? image_width : img_area_width; |
new_height = image_height <= img_area_height ? image_height : img_area_height; |
GetRectImage(image_buffer, img_cuted, hscrl_value, vscrl_value, new_width, new_height); |
kos_PutImage((RGB*)img_cuted, new_width, new_height, img_area_left,img_area_top); |
} else { |
/* Çäåñü âûâîä èçîáðàæåíèÿ ñ èñïîëüçîâàíèåì ìàñøòàáèðîâàíèÿ, ñîõðàíÿÿ ïðîïîðöèè */ |
__asm |
{ |
finit |
fild img_area_width |
fidiv image_width |
fild image_width |
fmul st(0),st(1) |
fistp new_width |
fild image_height |
fmul st(0),st(1) |
fistp new_height |
} |
if (img_area_height<new_height) |
{ |
__asm |
{ |
finit |
fild img_area_height |
fidiv image_height |
fild image_width |
fmul st(0),st(1) |
fistp new_width |
fild image_height |
fmul st(0),st(1) |
fistp new_height |
} |
} |
|
/* ýòî â ñëó÷àå íå ïðîïîðöèîíàëüíîãî ìàñøòàáèðîâàíèÿ */ |
//new_width=img_area_width; |
//new_height=img_area_height; |
|
if (new_width>image_width) new_width=image_width; |
if (new_height>image_height) new_height=image_height; |
|
ResizeImage(image_buffer,img_cuted,new_width,new_height); |
/* Öåíòðèðîâàíèå èçîáðàæåíèÿ */ |
scale_left=(img_area_width/2)-(new_width/2); |
scale_top=(img_area_height/2)-(new_height/2); |
kos_PutImage((RGB*)img_cuted,new_width,new_height,img_area_left+scale_left,img_area_top+scale_top); |
} |
} |
|
void draw_window(void) |
{ |
kos_WindowRedrawStatus(1); |
kos_DefineAndDrawWindow(0,0,450,350,0x33,0xEFEBEF,0,0,(Dword)header); |
|
//ToolBar |
//open |
kos_DefineButton(2,4,20,20,btn_open+0x40000000,0xEFEBEF); |
kos_PutImage(tbOpen,21,21,2,4); |
//prev |
kos_DefineButton(25,4,20,20,btn_prev+0x40000000,0xEFEBEF); |
kos_PutImage(tbPrev,21,21,25,4); |
//next |
kos_DefineButton(48,4,20,20,btn_next+0x40000000,0xEFEBEF); |
kos_PutImage(tbNext,21,21,48,4); |
//fit image |
kos_DefineButton(71,4,20,20,btn_fit+0x40000000,0xEFEBEF); |
kos_PutImage(tbFit,21,21,71,4); |
|
//Lines |
kos_ProcessInfo(&proc,-1); |
kos_DrawBar(2,30,proc.processInfo.work_width-3,1,0x94AECE); |
|
//Scroll controls |
//vertical scroll bar |
vscrl_coord_x=proc.processInfo.work_width-16; |
vscrl_coord_max=proc.processInfo.work_height-46; |
kos_DrawBar(proc.processInfo.work_width-16,33,15,proc.processInfo.work_height-79,0xDADADA); |
kos_DefineButton(proc.processInfo.work_width-16,33,14,14,scrl_up+0x40000000,0xEFEBEF); |
kos_DefineButton(proc.processInfo.work_width-16,proc.processInfo.work_height-46,14,14,scrl_down+0x40000000,0xEFEBEF); |
kos_PutImage(arrow_up,15,15,proc.processInfo.work_width-16,33); |
kos_PutImage(arrow_down,15,15,proc.processInfo.work_width-16,proc.processInfo.work_height-46); |
kos_PutImage(scroll_v,15,35,vscrl_coord_x,vscrl_coord_y); |
|
|
//horisontal scroll bar |
hscrl_coord_y=proc.processInfo.work_height-31; |
hscrl_coord_max=proc.processInfo.work_width-31; |
kos_DrawBar(2,proc.processInfo.work_height-31,proc.processInfo.work_width-18,15,0xDADADA); |
kos_DefineButton(2,proc.processInfo.work_height-31,14,14,scrl_left+0x40000000,0xEFEBEF); |
kos_DefineButton(proc.processInfo.work_width-31,proc.processInfo.work_height-31,14,14,scrl_right+0x40000000,0xEFEBEF); |
kos_PutImage(arrow_left,15,15,2,proc.processInfo.work_height-31); |
kos_PutImage(arrow_right,15,15,proc.processInfo.work_width-31,proc.processInfo.work_height-31); |
kos_PutImage(scroll_h,35,15,hscrl_coord_x,hscrl_coord_y); |
|
img_area_left=2; |
img_area_top=33; |
img_area_width=proc.processInfo.work_width-img_area_left-3-16; |
img_area_height=proc.processInfo.work_height-img_area_top-3-16-15; |
|
kos_WriteTextToWindow(2,proc.processInfo.work_height-12, 0x80, 0, szStatus, 0); |
|
if (img_area_width<image_width) set_hscroll_values(image_width-img_area_width,0); else set_hscroll_values(1,0); |
if (img_area_height<image_height) set_vscroll_values(image_height-img_area_height,0); else set_vscroll_values(1,0); |
|
draw_image(); |
|
kos_WindowRedrawStatus(2); |
} |
|
void LoadPCX(Byte* filebuff, Dword filesize) |
{ |
PCXFile pcx; |
if (!pcx.LoadPCXFile(filebuff,filesize)) |
{ |
image_opened=1; |
image_buffer=pcx.buffer; |
image_width=pcx.width; |
image_height=pcx.height; |
} else { |
image_opened=0; |
} |
} |
|
void LoadBMP(Byte* filebuff, Dword filesize) |
{ |
BMPFile bmp; |
if (!bmp.LoadBMPFile(filebuff,filesize)) |
{ |
image_opened=1; |
image_buffer=bmp.buffer; |
image_width=bmp.width; |
image_height=bmp.height; |
} else { |
image_opened=0; |
} |
} |
|
void LoadTGA(Byte* filebuff, Dword filesize) |
{ |
TGAFile tga; |
if (!tga.LoadTGAFile(filebuff,filesize)) |
{ |
image_opened=1; |
image_buffer=tga.buffer; |
image_width=tga.width; |
image_height=tga.height; |
} else { |
image_opened=0; |
} |
} |
|
//Çàãðóçèòü ñïèñîê ôàéëîâ, ïîääåðæèâàåìûõ ïðîãðàììîé èç ïàïêè ñ òåêóùèì ôàéëîì |
void load_folder(char* imgfile) |
{ |
kosFileInfo fi; |
char* cPtr; |
int i; |
|
// Èçâëå÷åì èìÿ ïàïêè |
strcpy(fi.fileURL, imgfile); |
cPtr=strrchr(fi.fileURL,'/'); |
cPtr[1]=0; |
strcpy(cur_folder,fi.fileURL); |
|
if (cur_files) { kos_FreeMemory(cur_files); cur_files=NULL;} |
if (img_files) { kos_FreeMemory((Byte*)img_files); img_files=NULL;} |
|
/* Âûäåëèì ïàìÿòü ïîä ôàéë */ |
cur_files = kos_GetMemory(65536); |
fi.rwMode = 1; |
fi.OffsetLow = 0; |
fi.OffsetHigh = 0; |
fi.dataCount = 65536; |
fi.bufferPtr = cur_files; |
int state = kos_FileSystemAccess(&fi); |
if (state!=0 && state!=6) {kos_FreeMemory(cur_files); cur_files=NULL; return;} |
|
Dword file_count=*(cur_files+8); |
img_files = (Word*)kos_GetMemory(4*file_count); |
|
char* image_name; |
cnt_imgfiles=0; |
cur_image=-1; |
|
lcase(imgfile); |
for(i=0;i<file_count;i++) |
{ |
image_name=(char*)cur_files+32+i*304+40; |
lcase(image_name); |
cPtr=strrchr(image_name,'.'); |
if (strcmp((char*)cPtr,".bmp") || strcmp((char*)cPtr,".pcx") || strcmp((char*)cPtr,".tga")) |
{ |
cPtr=strrchr(imgfile,'/'); |
if (strcmp(cPtr+1,image_name)) cur_image=cnt_imgfiles; |
((Word*)img_files)[cnt_imgfiles]=i; |
cnt_imgfiles++; |
} |
} |
cnt_imgfiles--; |
} |
|
void open_imgfile(char* imgfile) |
{ |
Word scr_left,scr_top,scr_right,scr_bot; |
Word win_width,win_height; |
Dword skin_height; |
kosFileInfo fi; |
Dword file_size; |
Byte* filebuff; |
Byte* infoBuf; |
|
|
/* Âû÷èñëèì ðàçìåð ôàéëà */ |
infoBuf = kos_GetMemory(40); /* Áóôåð äëÿ èíôî-ñòðóêòóðû */ |
fi.rwMode = 5; |
fi.OffsetLow = 0; |
fi.OffsetHigh = 0; |
fi.dataCount = 0; |
fi.bufferPtr = infoBuf; |
strcpy(fi.fileURL, imgfile); |
if (kos_FileSystemAccess(&fi)) { kos_FreeMemory(infoBuf); return;} |
file_size=*(Dword*)(infoBuf+32); |
kos_FreeMemory(infoBuf); |
|
/* Âûäåëèì ïàìÿòü ïîä ôàéë */ |
filebuff = kos_GetMemory(file_size); |
fi.rwMode = 0; |
fi.OffsetLow = 0; |
fi.OffsetHigh = 0; |
fi.dataCount = file_size; |
fi.bufferPtr = filebuff; |
strcpy(fi.fileURL, imgfile); |
if (kos_FileSystemAccess(&fi)) { kos_FreeMemory(filebuff); return;} |
|
/* Îïðåäåëÿåì òèï ôàéëà */ |
//lcase(imgfile); óæå â íèæíåì ðåãèñòðå: ýòî âûïîëíÿåòñÿ â load_folder |
char* cPtr; |
cPtr=strrchr(imgfile,'.'); |
if (strcmp((char*)cPtr,".bmp")) LoadBMP(filebuff,file_size); |
if (strcmp((char*)cPtr,".pcx")) LoadPCX(filebuff,file_size); |
if (strcmp((char*)cPtr,".tga")) LoadTGA(filebuff,file_size); |
cPtr=strrchr(imgfile,'/')+1; |
if (image_opened) |
{ |
sprintf(szStatus," ©« %S... [%U/%U]",cPtr,cur_image+1,cnt_imgfiles+1); |
|
__asm |
{ |
mov eax,48 |
mov ebx,5 |
int 40h |
mov scr_right,ax |
shr eax,16 |
mov scr_bot,bx |
shr ebx,16 |
mov scr_left,ax |
mov scr_top,bx |
mov eax,48 |
mov ebx,4 |
int 40h |
mov skin_height,eax |
} |
|
if (scr_right-scr_left+1>image_width) win_width=image_width+img_area_left+3+16+10; else win_width=scr_right-scr_left+1; |
if (scr_bot-scr_top+1>image_height) win_height=image_height+img_area_top+3+16+15+5+skin_height; else win_height=scr_bot-scr_top+1; |
|
if (win_width<150) win_width=150; |
if (win_height<160) win_height=160; |
|
img_cuted=kos_GetMemory(image_width*image_height*3); |
kos_ChangeWindow(scr_left,scr_top,win_width,win_height); |
|
if (img_area_width<image_width) set_hscroll_values(image_width-img_area_width,0); else set_hscroll_values(1,0); |
if (img_area_height<image_height) set_vscroll_values(image_height-img_area_height,0); else set_vscroll_values(1,0); |
} else { |
sprintf(szStatus," ©« %S ¥ § £à㦥. ®à¬ â ¥ ¯®¤¤¥à¦¨¢ ¥âáï.",cPtr); |
} |
draw_window(); |
kos_FreeMemory(filebuff); |
} |
|
void show_dlg() |
{ |
char* imgfile; |
imgfile=DialogOpenFile(&draw_window); |
if (!imgfile) return; |
load_folder(imgfile); |
//Åñëè ôàéë óæå áûë îòêðûò... |
if (image_opened) |
{ |
image_opened=0; |
kos_FreeMemory(image_buffer); image_buffer=NULL; |
kos_FreeMemory(img_cuted); img_cuted=NULL; |
} |
open_imgfile(imgfile); |
} |
|
void kos_Main() |
{ |
Dword btnID; |
Byte keyCode; |
Dword mButton; |
int mX,mXOld; |
int mY,mYOld; |
char label1[100]; |
|
/* Èíèöèàëèçàöèÿ êó÷è ïðîöåññà */ |
__asm |
{ |
mov eax,68 |
mov ebx,11 |
int 40h |
} |
|
vscrl_coord_min=vscrl_coord_y=33+15; |
hscrl_coord_min=hscrl_coord_x=2+15; |
strcpy(szStatus," ©« ¥ § £à㦥"); |
|
draw_window(); |
if (params[0]!='P') {load_folder(params); open_imgfile(params);} |
kos_SetMaskForEvents(0x27); |
for (;;) |
{ |
switch (kos_WaitForEvent(10)) |
{ |
case 1: |
draw_window(); |
break; |
|
case 2: |
kos_GetKey(keyCode); |
break; |
|
case 3: |
kos_GetButtonID(btnID); |
switch (btnID) |
{ |
case 1: |
//Îñâîáîäèì ïàìÿòü |
if (image_buffer) kos_FreeMemory(image_buffer); |
if (img_cuted) kos_FreeMemory(img_cuted); |
if (cur_files) kos_FreeMemory(cur_files); |
if (img_files) kos_FreeMemory((Byte*)img_files); |
kos_ExitApp(); |
break; |
|
case btn_open: |
show_dlg(); |
break; |
|
//Èñïîëüçóåì óæå íå íóæíûé íàì params |
case btn_prev: |
if (!cur_files) break; |
if (!cur_image) cur_image=cnt_imgfiles; else cur_image--; |
strcpy(params,cur_folder); |
strcpy(params+strlen(cur_folder),(char*)cur_files+32+((Word*)img_files)[cur_image]*304+40); |
open_imgfile(params); |
break; |
|
case btn_next: |
if (!cur_files) break; |
if (cur_image==cnt_imgfiles) cur_image=0; else cur_image++; |
strcpy(params,cur_folder); |
strcpy(params+strlen(cur_folder),(char*)cur_files+32+((Word*)img_files)[cur_image]*304+40); |
open_imgfile(params); |
break; |
|
/* |
case scrl_up: |
if (vscrl_max==1 || vscrl_coord_y<=vscrl_coord_min) break; |
set_vscroll_values(vscrl_max, ((vscrl_coord_y - 2 - vscrl_coord_min) * vscrl_max) / (vscrl_coord_max - vscrl_coord_min - 35)); |
break; |
|
case scrl_down: |
if (vscrl_max == 1 || vscrl_coord_y >= vscrl_coord_max) break; |
set_vscroll_values(vscrl_max, ((vscrl_coord_y + 2 - vscrl_coord_min) * vscrl_max) / (vscrl_coord_max - vscrl_coord_min - 35)); |
break; |
*/ |
|
case btn_fit: |
scale = scale ? 0 : 1; |
draw_window(); |
break; |
|
} |
break; |
|
case 6: |
default: |
kos_GetMouseState(mButton,mX,mY); |
//Âåðòèêàëüíàÿ ïðîêðóòêà |
if (mButton==1) |
{ |
if (vscrl_using) |
{ |
kos_DrawBar(vscrl_coord_x,vscrl_coord_y,15,35,0xDADADA); |
if (vscrl_coord_y+mY-mYOld<vscrl_coord_min) |
{ |
vscrl_value=0; |
vscrl_coord_y=vscrl_coord_min; |
} else if (vscrl_coord_y+35+mY-mYOld>vscrl_coord_max) { |
vscrl_value=vscrl_max; |
vscrl_coord_y=vscrl_coord_max-35; |
} else { |
vscrl_value=(((vscrl_coord_y-vscrl_coord_min)*vscrl_max)/(vscrl_coord_max-vscrl_coord_min-35)); |
vscrl_coord_y=vscrl_coord_y+mY-mYOld; |
mYOld=mY; |
} |
kos_PutImage(scroll_v,15,35,vscrl_coord_x,vscrl_coord_y); |
draw_image(); |
} else { |
if (mY>=vscrl_coord_y && mY<=vscrl_coord_y+35 && mX>=vscrl_coord_x && mX<=vscrl_coord_x+15) |
{ |
vscrl_using=1; |
mYOld=mY; |
} |
} |
} else if(mButton==0) { |
if (vscrl_using) {vscrl_using=0; draw_image();} |
} |
//Ãîðèçîíòàëüíàÿ ïðîêðóòêà |
if (mButton==1) |
{ |
if (hscrl_using) |
{ |
kos_DrawBar(hscrl_coord_x,hscrl_coord_y,35,15,0xDADADA); |
if (hscrl_coord_x+mX-mXOld<hscrl_coord_min) |
{ |
hscrl_value=0; |
hscrl_coord_x=hscrl_coord_min; |
} else if (hscrl_coord_x+35+mX-mXOld>hscrl_coord_max) { |
hscrl_value=hscrl_max; |
hscrl_coord_x=hscrl_coord_max-35; |
} else { |
hscrl_value=(((hscrl_coord_x-hscrl_coord_min)*hscrl_max)/(hscrl_coord_max-hscrl_coord_min-35)); |
hscrl_coord_x=hscrl_coord_x+mX-mXOld; |
mXOld=mX; |
} |
kos_PutImage(scroll_h,35,15,hscrl_coord_x,hscrl_coord_y); |
draw_image(); |
} else { |
if (mX>=hscrl_coord_x && mX<=hscrl_coord_x+35 && mY>=hscrl_coord_y && mY<=hscrl_coord_y+15) |
{ |
hscrl_using=1; |
mXOld=mX; |
} |
} |
} else if(mButton==0) { |
if (hscrl_using) {hscrl_using=0; draw_image();} |
} |
|
break; |
} |
} |
} |