[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mgp-users-jp 00806] Re: キャッシュした 背景画像が文字 の裏側に出てきちゃうよ問題



From: Shigetomo SHIKI <shikisg@cc.nao.ac.jp>
Subject: [mgp-users-jp 00803] キャッシュした背景画像が文字の裏側に出てきちゃうよ問題
Date: Wed, 28 Feb 2001 08:51:10 +0900
Message-ID: <>

shikisg> 先読み機能を on にして(mgp -F1 hoge.mgp)、%pause を使うと、文字の裏に
shikisg> 次ページの背景画像が紛れ込みます。私のデスクトップでは1.07a と最新の 
shikisg> snapshot の両方で起こりました。同じ現象が他のハードでも起こります。

WIDEの合宿中にあちこち手直ししてみました。
以下のパッチで直っていると思います。
鵜飼さんからいただいたパッチも取り込んでいます。

--
ソニーコンピュータサイエンス研究所
西田佳史 nishida@csl.sony.co.jp

*** draw.c.orig	Thu Feb  8 17:54:13 2001
--- draw.c	Wed Mar  7 10:28:11 2001
***************
*** 26,32 ****
   * SUCH DAMAGE.
   */
  /*
!  * $Id: draw.c,v 1.181 2001/02/08 08:54:13 nishida Exp $
   */
  
  #include "mgp.h"
--- 26,32 ----
   * SUCH DAMAGE.
   */
  /*
!  * $Id: draw.c,v 1.184 2001/03/06 15:41:41 nishida Exp $
   */
  
  #include "mgp.h"
***************
*** 75,81 ****
  #endif
  
  static void draw_string __P((struct render_state *, char *));
! static void draw_fragment __P((struct render_state *, u_char *, u_int, char *, int));
  static int iskinsokuchar __P((u_int));
  static struct render_object *obj_alloc __P((struct render_state *state));
  static void obj_free __P((struct render_state *, struct render_object *));
--- 75,81 ----
  #endif
  
  static void draw_string __P((struct render_state *, char *));
! static char *draw_fragment __P((struct render_state *, u_char *, u_int, char *, int));
  static int iskinsokuchar __P((u_int));
  static struct render_object *obj_alloc __P((struct render_state *state));
  static void obj_free __P((struct render_state *, struct render_object *));
***************
*** 1114,1126 ****
  			}
  		}
  
! 		draw_fragment(state, p, q - p, registry, charset16);
  
  		p = q;
  	}
  }
  
! static void
  draw_fragment(state, p, len, registry, charset16)
  	struct render_state *state;
  	u_char *p;
--- 1114,1126 ----
  			}
  		}
  
! 		q = draw_fragment(state, p, q - p, registry, charset16);
  
  		p = q;
  	}
  }
  
! static char *
  draw_fragment(state, p, len, registry, charset16)
  	struct render_state *state;
  	u_char *p;
***************
*** 1285,1290 ****
--- 1285,1294 ----
  		len -= (charset16 ? 2 : 1);
  
  		state->linewidth += HORIZ_STEP(char_size[caching], char_len);
+ 		/* ukai */
+ 		if (state->linewidth + HORIZ_STEP(char_size[caching], char_len)
+ 		    > state->width)
+ 		    break;
  	}
  
  	if (state->width - state->leftfillpos / 2 < state->linewidth
***************
*** 1333,1338 ****
--- 1337,1343 ----
  			draw_line_itemsize(state, tail->ascent, tail->descent);
  		}
  	}
+ 	return p;
  }
  
  static int
***************
*** 3468,3474 ****
  {
  	/* invalidate the background image cache */
  
! 	bg_ctl_last = NULL;
  	x_registerseed(state, NULL, NULL);
  }
  
--- 3473,3479 ----
  {
  	/* invalidate the background image cache */
  
! 	bg_ctl_last = bg_ctl_cache = NULL;
  	x_registerseed(state, NULL, NULL);
  }
  
***************
*** 3655,3661 ****
  	fprintf(fp, "(%s) run\n", epsfile);
  	fprintf(fp, "showpage\n");
  	fprintf(fp, "quit\n");
! 	fsync(fd);
  	fclose(fp);
  	signal(SIGPIPE, sigpipe_handler);
  
--- 3660,3666 ----
  	fprintf(fp, "(%s) run\n", epsfile);
  	fprintf(fp, "showpage\n");
  	fprintf(fp, "quit\n");
! 	fflush(fp);
  	fclose(fp);
  	signal(SIGPIPE, sigpipe_handler);
  
***************
*** 3930,3935 ****
--- 3935,3943 ----
  	struct render_state *state;
  	int page;
  {
+ 	struct ctrl *tmp_bg_ctl;
+ 	int tmp_bgindex;
+ 
  	/* we don't need caching */
  	if (cached_page == page || page > maxpage || page <= 0)
  		return;
***************
*** 3943,3948 ****
--- 3951,3958 ----
  	state->height = window_height;
  	state->page = page;
  	caching = 1;
+ 	tmp_bg_ctl = bg_ctl;
+ 	tmp_bgindex = bgindex;
  	if (verbose){
  		printf("now caching %d page ...\n", page);
  		fflush(stdout);
***************
*** 3953,3958 ****
--- 3963,3970 ----
  	}
  	caching = 0;
  	cached_page = page;
+ 	bg_ctl = tmp_bg_ctl;
+ 	bgindex = tmp_bgindex;
  }
  
  static void
***************
*** 3975,3981 ****
  	XSetForeground(display, gcfore, fore_color[0]);
  	XSetBackground(display, gcfore, back_color[0]);
  	bg_ctl = bg_ctl_last = bg_ctl_cache;
! 	set_background_pixmap(bg_ctl);
  
  	switch(cache_effect){
  		case 1:
--- 3987,3999 ----
  	XSetForeground(display, gcfore, fore_color[0]);
  	XSetBackground(display, gcfore, back_color[0]);
  	bg_ctl = bg_ctl_last = bg_ctl_cache;
! 	if (bg_ctl){
! 		for (i = 0; i < MAXBGPIXMAP; i ++){
! 			if (bgpixmap[i].ctl && ctlcmp(bg_ctl, bgpixmap[i].ctl) == 0)
! 				bgindex = i;
! 		}
! 		set_background_pixmap(bg_ctl);
! 	}
  
  	switch(cache_effect){
  		case 1:
***************
*** 3998,4003 ****
--- 4016,4022 ----
  	int	i = 0;
  
  	bg_ctl_last = NULL;
+ 	bg_ctl_cache = NULL;
  
  	for (i = 0; i < MAXBGPIXMAP; i ++) {
  		if (bgpixmap[i].image){
***************
*** 4123,4129 ****
  		case CTL_BACK:
  			break;
  		default:
! 			fprintf(stderr, "fatal error in get_background_image()\n");
  			cleanup(-1);
  			break;
  		}
--- 4142,4148 ----
  		case CTL_BACK:
  			break;
  		default:
! 			fprintf(stderr, "fatal error in get_background_pixmap()\n");
  			cleanup(-1);
  			break;
  		}
***************
*** 4156,4161 ****
--- 4175,4181 ----
  			bgpixmap[j +1].image = bgpixmap[j].image;
  			bgpixmap[j +1].ximageinfo = bgpixmap[j].ximageinfo;
  		}
+ 		bg_ctl_last = NULL;
  		i = 0;
  	}
  
***************
*** 4182,4188 ****
  				break;	
  		}
  		if (i == MAXBGPIXMAP){
! 			fprintf(stderr, "fatal error in set_background_image()\n");
  			cleanup(-1);
  		}
  		XSetWindowBackgroundPixmap(display, window, bgpixmap[i].pixmap);
--- 4202,4208 ----
  				break;	
  		}
  		if (i == MAXBGPIXMAP){
! 			fprintf(stderr, "fatal error in set_background_pixmap()\n");
  			cleanup(-1);
  		}
  		XSetWindowBackgroundPixmap(display, window, bgpixmap[i].pixmap);
***************
*** 4191,4197 ****
  		XSetWindowBackground(display, window, ctl->ctl_value);
  		break;
  	default:
! 		fprintf(stderr, "fatal error in set_background_image() %d\n", 
  			ctl->ct_op);
  		cleanup(-1);
  		break;
--- 4211,4217 ----
  		XSetWindowBackground(display, window, ctl->ctl_value);
  		break;
  	default:
! 		fprintf(stderr, "fatal error in set_background_pixmap() op=%d\n", 
  			ctl->ct_op);
  		cleanup(-1);
  		break;
***************
*** 4218,4224 ****
  				break;	
  		}
  		if (i == MAXBGPIXMAP){
! 			fprintf(stderr, "fatal error in set_background_image()\n");
  			cleanup(-1);
  		}
  
--- 4238,4244 ----
  				break;	
  		}
  		if (i == MAXBGPIXMAP){
! 			fprintf(stderr, "fatal error in XClearPixmap()\n");
  			cleanup(-1);
  		}
  
***************
*** 4235,4241 ****
  			gc_cache, 0, 0, window_width, window_height);
  		break;
  	default:
! 		fprintf(stderr, "fatal error in set_background_image()\n");
  		cleanup(-1);
  		break;
  	}
--- 4255,4261 ----
  			gc_cache, 0, 0, window_width, window_height);
  		break;
  	default:
! 		fprintf(stderr, "fatal error in XClearPixmap()\n");
  		cleanup(-1);
  		break;
  	}