[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[mgp-users-jp 00806] Re: キャッシュした 背景画像が文字 の裏側に出てきちゃうよ問題
- To: mgp-users-jp@mew.org
- Subject: [mgp-users-jp 00806] Re: キャッシュした 背景画像が文字 の裏側に出てきちゃうよ問題
- From: Yoshifumi Nishida <nishida@csl.sony.co.jp>
- Date: Wed, 7 Mar 2001 10:34:59 +0900
- In-reply-to: <>
- Posted: Wed, 07 Mar 2001 10:40:05 +0900
- References: <>
- Reply-to: mgp-users-jp@mew.org
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;
}