int main (int argc, char **argv) { char *mname = ""; rb.buf = (char *) malloc ((unsigned) (rb.size = 0)); if (argc > 1) mname = argv[1]; if ((js = js_open (mname, 0)) == NULL) err (); if ((env = js_connect (js, "kana")) == NULL) err (); if ((fzk_file = js_file_read (env, FZK_FILE)) == -1) err (); if ((kihon_file = js_file_read (env, KIHON_DIC)) == -1) err (); if ((setto_file = js_file_read (env, SETTO_DIC)) == -1) err (); if (js_fuzokugo_set (env, fzk_file) == -1) err (); if ((kihon_dic_no = js_dic_add (env, kihon_file, -1, WNN_DIC_ADD_NOR, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) err (); if ((setto_dic_no = js_dic_add (env, setto_file, -1, WNN_DIC_ADD_NOR, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) err (); p_set (env); if ((rev_env = js_connect (js, "kanji")) == NULL) err (); if ((fzk_file = js_file_read (rev_env, FZK_FILE)) == -1) err (); if ((rev_file = js_file_read (rev_env, KIHON_DIC)) == -1) err (); if ((rev_setto_file = js_file_read (rev_env, SETTO_DIC)) == -1) err (); if (js_fuzokugo_set (rev_env, fzk_file) == -1) err (); if ((rev_dic_no = js_dic_add (rev_env, kihon_file, -1, WNN_DIC_ADD_REV, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) err (); if ((rev_setto_dic_no = js_dic_add (rev_env, setto_file, -1, WNN_DIC_ADD_REV, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) err (); p_set (rev_env); #ifdef DEBUG printf ("Now discard file push any key\n"); getchar (); js_file_discard (rev_env, rev_file); printf ("Now discard file\n"); #endif henkan (); js_close (js); }
/* Pair : row,column */ int lee_algo(Pair* source, Pair* target){ int i, j, v1, v2; Pair p, v, step[4] = {{1,0},{0,1},{-1,0},{0,-1}}; /* initialize all cells like unvisited */ for(i=0; i<sz.r; ++i){ for(j=0; j<sz.c; ++j){ W[i][j] = -1; } } q_clear(); p_set(W,source,0); q_push(source); while(!q_empty()){ p = q_pop(); for(i=0; i<4; ++i){ v = p_sum(step+i,&p); v1 = p_get(Z,&p); v2 = p_get(Z,&v); #ifdef DEBUG printf("try: %d,%d\n",v.r,v.c); #endif if(p_in(&v) && p_get(W,&v)==-1 && (v1-v2 <= 3) && (v1-v2 >= -1) && can_go(&v)){ #ifdef DEBUG printf("from: %d,%d go: %d,%d\n",p.r,p.c,v.r,v.c); #endif p_set(W,&v,p_get(W,&p)+1); q_push(&v); if(p_eq(&v,target)) break; } } if(p_eq(&v,target)) break; } #ifdef DEBUG printf("q: %d\n",q_empty()); #endif return p_get(W,target); }
int hadlock_algo(Pair* source, Pair* target){ int i, j, v1, v2, res; Pair p, v, step[4] = {{1,0},{0,1},{-1,0},{0,-1}}; /* initialize all cells like unvisited */ for(i=0; i<sz.r; ++i){ for(j=0; j<sz.c; ++j){ W[i][j] = -1; } } q_clear(); p_set(W,source,0); q_push(source); while(!q_empty()){ p = q_pop(); for(i=0; i<4; ++i){ v = p_sum(step+i,&p); v1 = p_get(Z,&p); v2 = p_get(Z,&v); if(p_in(&v) && (p_get(W,&v)==-1 || (p_get(W,&v)>p_get(W,&p))) && (v1-v2 <= 3) && (v1-v2 >= -1) && can_go(&v)){ if(p_mhtn_norm(&v,target) < p_mhtn_norm(&p,target)){ p_set(W,&v,p_get(W,&p)); q_push_back(&v); }else{ /* > */ /*if(!(p_get(W,&v)!=-1 || (p_get(W,&v)==p_get(W,&p)+1))){ */ p_set(W,&v,p_get(W,&p)+1); q_push_front(&v); } if(p_eq(&v,target)){ break; } } } if(p_eq(&v,target)) break; } res = p_get(W,target); if(res != -1) res = 2*res+p_mhtn_norm(source,target); return res; }
static void cpalette(void *data, struct taskinfo *task, int r1, int r2) { pixel8_t *src, *srcend; cppixel_t dest; struct filter *f = (struct filter *) data; struct palettedata *s = (struct palettedata *) f->data; int i; unsigned int *table = s->table; for (i = r1; i < r2; i++) { src = f->childimage->currlines[i]; srcend = src + f->image->width; dest = (cppixel_t) f->image->currlines[i]; while (src < srcend) { p_set(dest, table[*src]); src++; p_inc(dest, 1); } } }
static void do_edge (void *data, struct taskinfo *task, int r1, int r2) { struct filter *f = (struct filter *) data; int y; unsigned int *pixels = f->image->palette->pixels; register unsigned int black = f->image->palette->pixels[0]; register cpixel_t *output, *end; register spixel_t *up, *down, *input; for (y = r1; y < r2; y++) { output = p_add (((cpixel_t *) f->image->currlines[y]), 1); input = ((spixel_t *) f->childimage->currlines[y]) + 1; if (y != 0) up = ((spixel_t *) f->childimage->currlines[y - 1]) + 2; else up = ((spixel_t *) f->childimage->currlines[y]) + 2; if (y != f->image->height - 1) down = ((spixel_t *) f->childimage->currlines[y + 1]) + 2; else down = ((spixel_t *) f->childimage->currlines[y]) + 2; end = p_add (((cpixel_t *) f->image->currlines[y]), f->image->width - 1); p_setp (output, -1, 0); p_setp (output, f->image->width - 2, 0); while (output < end) { if (input[1] != input[0] || input[0] != up[0] || input[0] != down[0]) { if (output < end - 2) { p_set (output, pixels[input[0]]); p_setp (output, 1, pixels[input[1]]); p_setp (output, 2, pixels[input[2]]); p_inc (output, 3); input += 3; up += 3; down += 3; while (output < end - 1 && (input[0] != up[-1] || input[0] != down[-1])) { p_set (output, pixels[input[0]]); p_setp (output, 1, pixels[input[1]]); p_inc (output, 2); input += 2; up += 2; down += 2; } if (output < end && (input[-1] != input[0] || up[-2] != input[0] || down[-2] != input[0])) { p_set (output, pixels[input[0]]); p_inc (output, 1); input++; up++; down++; } } else p_set (output, pixels[*input]), p_inc (output, 1), input++, up++, down++; } else p_set (output, black), p_inc (output, 1), input++, up++, down++; } } }
static void tracecolor (int xstart, int ystart, int xend, int yend, register int x, register int y) { int dir = RIGHT, fill = 0; register unsigned char *calc; int peri = 0; cpixeldata_t c = (cpixeldata_t) calculatepixel (x, y, 0); cpixeldata_t w = (cpixeldata_t) 0; cpixeldata_t inset = (cpixeldata_t) cpalette.pixels[0]; putpixel (x, y, c); calc = calculated + x + y * CALCWIDTH; *calc = (unsigned char) 1; while (x > xstart && getpixel (x - 1, y) == c) x--, calc--; *calc = (unsigned char) 2; if (c == inset) peri = 1; do { if (!fill && !*calc) { *calc = (unsigned char) 1; putpixel (x, y, c); } switch (dir) { case RIGHT: if (y > ystart) { if (!*(calc - CALCWIDTH)) { w = (cpixeldata_t) calculatepixel (x, y - 1, peri); putpixel (x, y - 1, w); *(calc - CALCWIDTH) = (unsigned char) 1; } else w = getpixel (x, y - 1); if (w == c) { dir = UP; calc -= CALCWIDTH; y--; break; } } if (x < xend) { if (!*(calc + 1)) { w = (cpixeldata_t) calculatepixel (x + 1, y, peri); putpixel (x + 1, y, w); *(calc + 1) = (unsigned char) 1; } else w = getpixel (x + 1, y); if (w == c) { calc++; x++; break; } } if (y < yend) { if (!*(calc + CALCWIDTH)) { w = (cpixeldata_t) calculatepixel (x, y + 1, peri); putpixel (x, y + 1, w); *(calc + CALCWIDTH) = (unsigned char) 1; } else w = getpixel (x, y + 1); if (w == c) { dir = DOWN; calc += CALCWIDTH; y++; break; } } if (*calc == (unsigned char) 2) { *calc = (unsigned char) 1; return; } dir = LEFT; x--; calc--; break; case LEFT: if (y < yend) { if (!*(calc + CALCWIDTH)) { w = (cpixeldata_t) calculatepixel (x, y + 1, peri); putpixel (x, y + 1, w); *(calc + CALCWIDTH) = (unsigned char) 1; } else w = getpixel (x, y + 1); if (w == c) { dir = DOWN; calc += CALCWIDTH; y++; break; } } if (x > xstart) { if (!*(calc - 1)) { w = (cpixeldata_t) calculatepixel (x - 1, y, peri); putpixel (x - 1, y, w); *(calc - 1) = (unsigned char) 1; } else w = getpixel (x - 1, y); if (w == c) { calc--; x--; break; } } if (y > ystart) { if (!*(calc - CALCWIDTH)) { w = (cpixeldata_t) calculatepixel (x, y - 1, peri); putpixel (x, y - 1, w); *(calc - CALCWIDTH) = (unsigned char) 1; } else w = getpixel (x, y - 1); if (w == c) { dir = UP; calc -= CALCWIDTH; y--; break; } } dir = RIGHT; x++; calc++; break; case UP: if (fill) { unsigned char *calc1; cpixel_t *pixel1; calc1 = calc + 1; pixel1 = p_add ((cpixel_t *) cimage.currlines[y], x + 1); while (pixel1 <= p_add ((cpixel_t *) cimage.currlines[y], xend)) { if (!*calc1) *calc1 = (unsigned char) 1, p_set (pixel1, c); else if (p_get (pixel1) != c) break; p_inc (pixel1, 1); calc1++; } } if (x > xstart) { if (!*(calc - 1)) { w = (cpixeldata_t) calculatepixel (x - 1, y, peri); putpixel (x - 1, y, w); *(calc - 1) = (unsigned char) 1; } w = getpixel (x - 1, y); if (w == c) { dir = LEFT; calc--; x--; break; } } if (y > ystart) { if (!*(calc - CALCWIDTH)) { w = (cpixeldata_t) calculatepixel (x, y - 1, peri); putpixel (x, y - 1, w); *(calc - CALCWIDTH) = (unsigned char) 1; } w = getpixel (x, y - 1); if (w == c) { calc -= CALCWIDTH; y--; break; } } if (x < xend) { if (!*(calc + 1)) { w = (cpixeldata_t) calculatepixel (x + 1, y, peri); putpixel (x + 1, y, w); *(calc + 1) = (unsigned char) 1; } else w = getpixel (x + 1, y); if (w == c) { dir = RIGHT; calc++; x++; break; } } dir = DOWN; y++; calc += CALCWIDTH; break; case DOWN: if (x < xend) { if (!*(calc + 1)) { w = (cpixeldata_t) calculatepixel (x + 1, y, peri); putpixel (x + 1, y, w); *(calc + 1) = (unsigned char) 1; } else w = getpixel (x + 1, y); if (w == c) { dir = RIGHT; calc++; x++; break; } } if (y < yend) { if (!*(calc + CALCWIDTH)) { w = (cpixeldata_t) calculatepixel (x, y + 1, peri); putpixel (x, y + 1, w); *(calc + CALCWIDTH) = (unsigned char) 1; } else w = getpixel (x, y + 1); if (w == c) { dir = DOWN; calc += CALCWIDTH; y++; break; } } if (x > xstart) { if (!*(calc - 1)) { w = (cpixeldata_t) calculatepixel (x - 1, y, peri); putpixel (x - 1, y, w); *(calc - 1) = (unsigned char) 1; } else w = getpixel (x - 1, y); if (w == c) { dir = LEFT; calc--; x--; break; } } dir = UP; calc -= CALCWIDTH; y--; break; } if (*calc == (unsigned char) 2) { if (fill) { *calc = (unsigned char) 1; return; } fill = 1; dir = RIGHT; } } while (1); }