diff --git a/bin-linux/cli b/bin-linux/cli index 781a445..9032184 100755 Binary files a/bin-linux/cli and b/bin-linux/cli differ diff --git a/bin-linux/gui b/bin-linux/gui index 28ad487..082fa09 100755 Binary files a/bin-linux/gui and b/bin-linux/gui differ diff --git a/bin-linux/gui_sdl12 b/bin-linux/gui_sdl12 index 1ce88d9..6b81250 100755 Binary files a/bin-linux/gui_sdl12 and b/bin-linux/gui_sdl12 differ diff --git a/bin-linux/libSDL2.so b/bin-linux/libSDL2.so new file mode 100755 index 0000000..14873e8 Binary files /dev/null and b/bin-linux/libSDL2.so differ diff --git a/bin-win/gui.exe b/bin-win/gui.exe index c29addf..587075c 100755 Binary files a/bin-win/gui.exe and b/bin-win/gui.exe differ diff --git a/cli/src/knit.c b/cli/src/main.c similarity index 97% rename from cli/src/knit.c rename to cli/src/main.c index 76aad4e..905d841 100755 --- a/cli/src/knit.c +++ b/cli/src/main.c @@ -138,11 +138,15 @@ static void cmd_track() { // print image to screen static void image_print(uint8_t *p_img,uint16_t w,uint16_t h) { uint16_t x,y; + uint8_t sample,memo; for(y=0;y #include #include "loader.h" +#include // todo remove +#include // todo remove + +#define ABS(n) (((n)<0)?(-(n)):((n))) + +// byte order access fixes bug in FreeImage +#define RED(q) (q->rgbBlue) +#define GREEN(q) (q->rgbGreen) +#define BLUE(q) (q->rgbRed) static FIBITMAP *dib=NULL; static uint16_t w,h; +static RGBQUAD colors[16] = { + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, // 0 black + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x7F}, // 1 dark blue + {.rgbRed=0x00,.rgbGreen=0x7F,.rgbBlue=0x00}, // 2 dark green + {.rgbRed=0x7F,.rgbGreen=0x00,.rgbBlue=0x00}, // 3 dark red + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0x00,.rgbGreen=0x00,.rgbBlue=0x00}, + {.rgbRed=0xFF,.rgbGreen=0xFF,.rgbBlue=0xFF} // F white +}; bool image_loadpicture(const char* filename) { FREE_IMAGE_FORMAT fif=FIF_UNKNOWN; int flag=0; +/* + int n; + for(n=0;nrgbRed,p_quad->rgbGreen,p_quad->rgbBlue); + for(n=0;n<16;n++) { + diff = ABS((RED(p_quad)) -((int16_t)colors[n].rgbRed )) + + ABS((GREEN(p_quad))-((int16_t)colors[n].rgbGreen)) + + ABS((BLUE(p_quad)) -((int16_t)colors[n].rgbBlue )); + if(diff= 0 ? TERM( x, y ).tick << 4 : 240 ) + TERM( x, y ).cfont * 256; if( TERM( x, y ).bgc ) { - SDL_FillRect( screen, &dstrect, 0 ); + + switch(0xF-TERM( x, y ).bgc) { + case 0x0: SDL_color = SDL_MapRGB(screen->format,0x00,0x00,0x00); + break; + case 0x1: SDL_color = SDL_MapRGB(screen->format,0x00,0x00,0x7F); + break; + case 0x2: SDL_color = SDL_MapRGB(screen->format,0x00,0x7F,0x00); + break; + case 0x3: SDL_color = SDL_MapRGB(screen->format,0x7F,0x00,0x00); + break; + default : SDL_color = SDL_MapRGB(screen->format,0x7F,0x7F,0x7F); + } + + SDL_FillRect( screen, &dstrect, SDL_color ); } SDL_BlitSurface( font, &srcrect, screen, &dstrect ); } diff --git a/gui/ui.c b/gui/ui.c index b96dad8..1eb9a05 100755 --- a/gui/ui.c +++ b/gui/ui.c @@ -138,12 +138,6 @@ static bool grid_cset(uiobj_t *p_ui,int16_t x,int16_t y,char c,uint8_t bg) { } static void grid_focus(uiobj_t *p_ui) { -/* grid_t *p_grid=p_ui->obj; - view_t *p_view=p_ui->view; - if(p_grid->data) { - r_cins(p_ui->x+p_view->x-p_grid->l+p_grid->x*3+2,p_ui->y+p_view->y-p_grid->t+p_grid->y*3+2); - } -*/ grid_t *p_grid=p_ui->obj; view_t *p_view=p_ui->view; if(p_grid->data) { @@ -153,77 +147,6 @@ static void grid_focus(uiobj_t *p_ui) { } static void grid_draw(uiobj_t *p_ui) { -/* grid_t *p_grid=p_ui->obj; - view_t *p_view=p_ui->view; - uint16_t x,y; - uint8_t bg; - if(p_ui->state&9) { - r_white(p_ui->x+p_view->x-1,p_ui->y+p_view->y-1,p_ui->w+2,p_ui->h+2); - if(p_grid->data) { - for(y=1;y<3*p_grid->h+1;y++) { - grid_cset(p_ui,0,y,'h',0); - grid_cset(p_ui,p_grid->w*3+1,y,'g',0); - if(((y-1)%15)==0) { - grid_cset(p_ui,-1,y ,'0'+(((y-1)/300)%10),0); - grid_cset(p_ui,-1,y+1,'0'+(((y-1)/ 30)%10),0); - grid_cset(p_ui,-1,y+2,'0'+(((y-1)/ 3)%10),0); - grid_cset(p_ui,-2,y ,'0'+(((y-1)/300)%10),0); - grid_cset(p_ui,-2,y+1,'0'+(((y-1)/ 30)%10),0); - grid_cset(p_ui,-2,y+2,'0'+(((y-1)/ 3)%10),0); - } - } - for(x=1;x<3*p_grid->w+1;x++) { - grid_cset(p_ui,x,0,'b',0); - grid_cset(p_ui,x,p_grid->h*3+1,'y',0); - if(((x-1)%15)==0) { - grid_cset(p_ui,x ,-1,'0'+(((x-1)/300)%10),0); - grid_cset(p_ui,x+1,-1,'0'+(((x-1)/ 30)%10),0); - grid_cset(p_ui,x+2,-1,'0'+(((x-1)/ 3)%10),0); - grid_cset(p_ui,x ,-2,'0'+(((x-1)/300)%10),0); - grid_cset(p_ui,x+1,-2,'0'+(((x-1)/ 30)%10),0); - grid_cset(p_ui,x+2,-2,'0'+(((x-1)/ 3)%10),0); - } - } - grid_cset(p_ui,0,0,'m',0); - grid_cset(p_ui,p_grid->w*3+1,0,'c',0); - grid_cset(p_ui,0,p_grid->h*3+1,'r',0); - grid_cset(p_ui,p_grid->w*3+1,p_grid->h*3+1,'i',0); - for(y=0;yh;y++) { - for(x=0;xw;x++) { - bg=(p_grid->data[x+y*p_grid->w]<0x80)?1:0; - grid_cset(p_ui,x*3+1,y*3+1,'t',bg); - grid_cset(p_ui,x*3+2,y*3+1,'y',bg); - grid_cset(p_ui,x*3+3,y*3+1,'u',bg); - grid_cset(p_ui,x*3+1,y*3+2,'g',bg); - grid_cset(p_ui,x*3+2,y*3+2,'ñ',bg); - grid_cset(p_ui,x*3+3,y*3+2,'h',bg); - grid_cset(p_ui,x*3+1,y*3+3,'v',bg); - grid_cset(p_ui,x*3+2,y*3+3,'b',bg); - grid_cset(p_ui,x*3+3,y*3+3,'n',bg); - } - } - if(p_grid->l) for(y=0;yh-0;y++) { - r_char(p_ui->x+p_view->x,p_ui->y+p_view->y+y,'a',0,0); - } - if(p_grid->w*3+2-p_grid->l>p_ui->w) for(y=0;yh-0;y++) { - r_char(p_ui->x+p_view->x+p_ui->w-1,p_ui->y+p_view->y+y,'d',0,0); - } - if(p_grid->t) for(x=0;xw-0;x++) { - r_char(p_ui->x+p_view->x+x,p_ui->y+p_view->y,'w',0,0); - } - if(p_grid->h*3+2-p_grid->t>p_ui->h) for(x=0;xw-0;x++) { - r_char(p_ui->x+p_view->x+x,p_ui->y+p_view->y+p_ui->h-1,'s',0,0); - } - if(p_ui->state&8) { - r_done(p_ui->x+p_view->x-1,p_ui->y+p_view->y-1,p_ui->w+2,p_ui->h+2); - } - } - } - if(p_ui->state&4) { - grid_focus(p_ui); - } - p_ui->state=0; -*/ grid_t *p_grid=p_ui->obj; view_t *p_view=p_ui->view; uint16_t x,y; @@ -261,7 +184,7 @@ static void grid_draw(uiobj_t *p_ui) { grid_cset(p_ui,p_grid->w*2+1,p_grid->h*2+1,'i',0); for(y=0;yh;y++) { for(x=0;xw;x++) { - bg=(p_grid->data[x+y*p_grid->w]<0x80)?1:0; + bg=0xF-(p_grid->data[x+y*p_grid->w]&0xF); grid_cset(p_ui,x*2+1,y*2+1,'t',bg); grid_cset(p_ui,x*2+2,y*2+1,'u',bg); grid_cset(p_ui,x*2+1,y*2+2,'v',bg); @@ -292,60 +215,17 @@ static void grid_draw(uiobj_t *p_ui) { } static bool grid_key(uiobj_t *p_ui,SDL_Keycode sym) { -/* - grid_t *p_grid=p_ui->obj; - switch(sym) { - case SDLK_LEFT: - if(p_grid->x>0) { - p_grid->x--; - p_ui->state|=4; - } - break; - case SDLK_RIGHT: - if(p_grid->xw-1) { - p_grid->x++; - p_ui->state|=4; - } - break; - case SDLK_UP: - if(p_grid->y>0) { - p_grid->y--; - p_ui->state|=4; - } - break; - case SDLK_DOWN: - if(p_grid->yh-1) { - p_grid->y++; - p_ui->state|=4; - } - break; - case SDLK_SPACE: - p_grid->data[p_grid->x+p_grid->y*p_grid->w]=p_grid->data[p_grid->x+p_grid->y*p_grid->w]<0x80?0xFF:0x00; - p_ui->state|=8; - return true; - } - - if((p_grid->x*3+2)-2l) { - p_grid->l=(p_grid->x*3+2)-2; - p_ui->state|=8; - } else if( (p_grid->x*3+2)+3>p_grid->l+p_ui->w ) { - p_grid->l=(p_grid->x*3+2)+3-p_ui->w; - p_ui->state|=8; - } - - if((p_grid->y*3+2)-2t) { - p_grid->t=(p_grid->y*3+2)-2; - p_ui->state|=8; - } else if( (p_grid->y*3+2)+3>p_grid->t+p_ui->h ) { - p_grid->t=(p_grid->y*3+2)+3-p_ui->h; - p_ui->state|=8; - } - - - return false; -*/ grid_t *p_grid=p_ui->obj; - switch(sym) { + uint16_t x; + uint8_t sample=0; + if((sym>=SDLK_0&&sym<=SDLK_3)) { + for(x=0;xw;x++) { + if(p_grid->data[x+p_grid->y*p_grid->w]<0xF) { + p_grid->data[x+p_grid->y*p_grid->w]=sym-SDLK_0; + p_ui->state|=8; + } + } + } else switch(sym) { case SDLK_LEFT: if(p_grid->x>0) { p_grid->x--; @@ -371,7 +251,13 @@ static bool grid_key(uiobj_t *p_ui,SDL_Keycode sym) { } break; case SDLK_SPACE: - p_grid->data[p_grid->x+p_grid->y*p_grid->w]=p_grid->data[p_grid->x+p_grid->y*p_grid->w]<0x80?0xFF:0x00; + for(x=0;xw;x++) { + if(p_grid->data[x+p_grid->y*p_grid->w]<0xF) { + sample=p_grid->data[x+p_grid->y*p_grid->w]; + break; + } + } + p_grid->data[p_grid->x+p_grid->y*p_grid->w]=p_grid->data[p_grid->x+p_grid->y*p_grid->w]<0x0F?0xFF:sample; p_ui->state|=8; break; default: diff --git a/lib/include/image.h b/lib/include/image.h index c2354f6..b9db8fa 100755 --- a/lib/include/image.h +++ b/lib/include/image.h @@ -14,10 +14,10 @@ extern "C" { uint8_t *image_alloc(uint16_t width,uint16_t height); // get pixel from image -bool image_sample(uint8_t *p_image,uint16_t width,uint16_t x,uint16_t y); +uint8_t image_sample(uint8_t *p_image,uint16_t width,uint16_t x,uint16_t y); // set pixel in image -void image_pset(uint8_t *p_image,uint16_t width,uint16_t x,uint16_t y,bool pixel); +void image_pset(uint8_t *p_image,uint16_t width,uint16_t x,uint16_t y,uint8_t pixel); // read image file uint8_t *image_read(FILE *f,uint16_t *width,uint16_t *height); diff --git a/lib/src/image.c b/lib/src/image.c index 81529e9..c95764c 100755 --- a/lib/src/image.c +++ b/lib/src/image.c @@ -19,13 +19,13 @@ uint8_t *image_alloc(uint16_t w,uint16_t h) { } // get pixel from image -bool image_sample(uint8_t *p_image,uint16_t w,uint16_t x,uint16_t y) { - return p_image[y*w+x]<0x80; +uint8_t image_sample(uint8_t *p_image,uint16_t w,uint16_t x,uint16_t y) { + return p_image[y*w+x]; } // set pixel in image -void image_pset(uint8_t *p_image,uint16_t w,uint16_t x,uint16_t y,bool p) { - p_image[y*w+x]=p?0x00:0xFF; +void image_pset(uint8_t *p_image,uint16_t w,uint16_t x,uint16_t y,uint8_t p) { + p_image[y*w+x]=p; } // read image file diff --git a/lib/src/m_kh930.c b/lib/src/m_kh930.c index 4bf4eea..61acfad 100755 --- a/lib/src/m_kh930.c +++ b/lib/src/m_kh930.c @@ -50,21 +50,25 @@ static bool decode_header(ptndesc_t *p_desc,uint8_t index) { // decode a pattern from memory // caller must make sure p_image can hold image by using image_alloc static void decode_pattern(ptndesc_t *p_desc,uint8_t *p_image) { - uint32_t stride,memo,nptr; + uint32_t stride,memo,nptrd,nptrm; uint32_t x,y; - + uint8_t sample; + stride=(p_desc->width+3)>>2; // nof nibbles per row memo=(p_desc->height+1)&~1; // nof nibbles for memo - - // calculate nibble pointer - nptr = 0xFFF-(p_desc->pattern<<1)-(memo+stride*(p_desc->height-1)); - + + // calculate nibble pointers + nptrm = 0xFFF-(p_desc->pattern<<1); + nptrd = 0xFFF-(p_desc->pattern<<1)-(memo+stride*(p_desc->height-1)); + // decode pattern for(y=0;yheight;y++) { for(x=0;xwidth;x++) { - image_pset(p_image,p_desc->width,x,y,(nib_get(p_track,nptr-(x>>2))&(1<<(x&3)))); + sample=(nib_get(p_track,nptrd-(x>>2))&(1<<(x&3)))?nib_get(p_track,nptrm-y):0xFF; + if(sample>0x1&&sample<0xF) sample--; + image_pset(p_image,p_desc->width,x,y,sample); } - nptr+=stride; + nptrd+=stride; } } @@ -169,6 +173,7 @@ static uint16_t needed_memory(uint16_t w,uint16_t h) { // p_image must have width*height bytes static uint16_t add_pattern(uint8_t *p_image,uint16_t w,uint16_t h) { uint8_t n; + uint8_t sample; uint16_t ptn_id; uint32_t temp; uint16_t x,y; @@ -199,12 +204,19 @@ static uint16_t add_pattern(uint8_t *p_image,uint16_t w,uint16_t h) { // Check memory availability (should be 0x2AE, but leave some to be sure) if(0x7FF-(o_bottom+memo_bytes+data_bytes)>=0x2B0&&ptn_id<999) { - // make memo data p_memory=(uint8_t*)malloc(memo_bytes); memset(p_memory,0,memo_bytes); - // set memo data - memset(p_memory,0,memo_bytes); + for(y=0;y0) sample++; + nib_set(p_memory,(memo_bytes<<1)-(y+1),sample); + break; + } + } + } // insert into memory @ PATTERN_PTR1 memcpy(&p_track[0x800-int_get(p_track,0x700)-memo_bytes],p_memory,memo_bytes); // update PATTERN_PTR1 @@ -227,7 +239,7 @@ static uint16_t add_pattern(uint8_t *p_image,uint16_t w,uint16_t h) { // calculate index of the current bit bp_this=bp_line-x; // sample image - if(image_sample(p_image,w,x,y)) bit_set(p_memory,bp_this); + if(image_sample(p_image,w,x,y)!=0xFF) bit_set(p_memory,bp_this); } } // insert into memory @ PATTERN_PTR1 diff --git a/lib/src/m_kh940.c b/lib/src/m_kh940.c index 9b93c2c..9f4f842 100755 --- a/lib/src/m_kh940.c +++ b/lib/src/m_kh940.c @@ -36,6 +36,7 @@ static bool decode_header(ptndesc_t *p_desc,uint8_t index) { p_desc->width =LSN(p_hdr[3])*100; p_desc->width +=MSN(p_hdr[4])*10; p_desc->width +=LSN(p_hdr[4])*1; + if(MSN(p_hdr[5])!=0) return false; p_desc->id =LSN(p_hdr[5])*100; p_desc->id+=MSN(p_hdr[6])*10; @@ -49,21 +50,25 @@ static bool decode_header(ptndesc_t *p_desc,uint8_t index) { // decode a pattern from memory // caller must make sure p_image can hold image by using image_alloc static void decode_pattern(ptndesc_t *p_desc,uint8_t *p_image) { - uint32_t stride,memo,nptr; + uint32_t stride,memo,nptrd,nptrm; uint32_t x,y; + uint8_t sample; stride=(p_desc->width+3)>>2; // nof nibbles per row memo=(p_desc->height+1)&~1; // nof nibbles for memo - // calculate nibble pinter - nptr = 0xFFFF-(p_desc->pattern<<1)-(memo+stride*(p_desc->height-1)); + // calculate nibble pointers + nptrm = 0xFFFF-(p_desc->pattern<<1); + nptrd = 0xFFFF-(p_desc->pattern<<1)-(memo+stride*(p_desc->height-1)); // decode pattern for(y=0;yheight;y++) { for(x=0;xwidth;x++) { - image_pset(p_image,p_desc->width,x,y,(nib_get(p_track,nptr-(x>>2))&(1<<(x&3)))); + sample=(nib_get(p_track,nptrd-(x>>2))&(1<<(x&3)))?nib_get(p_track,nptrm-y):0xFF; + if(sample>0x1&&sample<0xF) sample--; + image_pset(p_image,p_desc->width,x,y,sample); } - nptr+=stride; + nptrd+=stride; } } @@ -121,6 +126,7 @@ static uint16_t needed_memory(uint16_t w,uint16_t h) { // p_image must have width*height bytes static uint16_t add_pattern(uint8_t *p_image,uint16_t w,uint16_t h) { uint8_t n; + uint8_t sample; uint16_t ptn_id; uint32_t temp; uint16_t x,y; @@ -151,12 +157,19 @@ static uint16_t add_pattern(uint8_t *p_image,uint16_t w,uint16_t h) { // Check memory availability (should be 0x2AE, but leave some to be sure) if(0x7FFF-(o_bottom+memo_bytes+data_bytes)>=0x02B0&&ptn_id<999) { - // make memo data p_memory=(uint8_t*)malloc(memo_bytes); memset(p_memory,0,memo_bytes); - // set memo data - memset(p_memory,0,memo_bytes); + for(y=0;y0) sample++; + nib_set(p_memory,(memo_bytes<<1)-(y+1),sample); + break; + } + } + } // insert into memory @ PATTERN_PTR1 memcpy(&p_track[0x8000-int_get(p_track,0x7F00)-memo_bytes],p_memory,memo_bytes); // update PATTERN_PTR1 @@ -179,7 +192,7 @@ static uint16_t add_pattern(uint8_t *p_image,uint16_t w,uint16_t h) { // calculate index of the current bit bp_this=bp_line-x; // sample image - if(image_sample(p_image,w,x,y)) bit_set(p_memory,bp_this); + if(image_sample(p_image,w,x,y)!=0xFF) bit_set(p_memory,bp_this); } } // insert into memory @ PATTERN_PTR1 diff --git a/linux-cli-make.sh b/linux-cli-make.sh index ad02ff0..cde1d73 100755 --- a/linux-cli-make.sh +++ b/linux-cli-make.sh @@ -1,4 +1,4 @@ #!/bin/sh echo [bin-linux/cli] building command-line-interface binary... set -e -gcc cli/src/knit.c lib/src/*.c -I lib/include/ -o bin-linux/cli +gcc cli/src/main.c lib/src/*.c -I lib/include/ -o bin-linux/cli diff --git a/ptn/dot.bmp b/ptn/dot.bmp index ff32b44..d51c1b5 100755 Binary files a/ptn/dot.bmp and b/ptn/dot.bmp differ diff --git a/ptn/inca.bmp b/ptn/inca.bmp index d324779..5e9854f 100755 Binary files a/ptn/inca.bmp and b/ptn/inca.bmp differ diff --git a/ptn/inca.raw b/ptn/inca.raw index a2fcbeb..12ec245 100755 Binary files a/ptn/inca.raw and b/ptn/inca.raw differ diff --git a/ptn/smile.bmp b/ptn/smile.bmp index 5f48a46..cc20785 100755 Binary files a/ptn/smile.bmp and b/ptn/smile.bmp differ diff --git a/ptn/text.bmp b/ptn/text.bmp index 6f3bed6..72b3ce0 100755 Binary files a/ptn/text.bmp and b/ptn/text.bmp differ diff --git a/win-cli-make.bat b/win-cli-make.bat index 15df75e..e7ea531 100755 --- a/win-cli-make.bat +++ b/win-cli-make.bat @@ -1,4 +1,4 @@ @echo off echo [bin-win\cli.exe] building command-line-interface executable... -gcc cli\src\knit.c lib\src\*.c -Ilib\include\ -lsetupapi -o bin-win\cli.exe +gcc cli\src\main.c lib\src\*.c -Ilib\include\ -lsetupapi -o bin-win\cli.exe strip bin-win\cli.exe \ No newline at end of file