From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: YAMAMOTO Mitsuharu Newsgroups: gmane.emacs.devel Subject: Re: Truncating scroll runs that copy to where we copied to Date: Tue, 22 Nov 2011 09:33:04 +0900 Organization: Faculty of Science, Chiba University Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII X-Trace: dough.gmane.org 1321922287 8199 80.91.229.12 (22 Nov 2011 00:38:07 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 22 Nov 2011 00:38:07 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Nov 22 01:38:03 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RSeN9-0000I7-3X for ged-emacs-devel@m.gmane.org; Tue, 22 Nov 2011 01:38:03 +0100 Original-Received: from localhost ([::1]:34281 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RSeN8-0003QE-Fx for ged-emacs-devel@m.gmane.org; Mon, 21 Nov 2011 19:38:02 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:56702) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RSeN2-0003G2-Rl for emacs-devel@gnu.org; Mon, 21 Nov 2011 19:38:00 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RSeIQ-0004Hr-Of for emacs-devel@gnu.org; Mon, 21 Nov 2011 19:33:14 -0500 Original-Received: from mathmail.math.s.chiba-u.ac.jp ([133.82.132.2]:59692) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RSeIQ-0004Hb-6J for emacs-devel@gnu.org; Mon, 21 Nov 2011 19:33:10 -0500 Original-Received: from church.math.s.chiba-u.ac.jp (church [133.82.132.36]) by mathmail.math.s.chiba-u.ac.jp (Postfix) with ESMTP id A95E7C055D for ; Tue, 22 Nov 2011 09:33:04 +0900 (JST) In-Reply-To: User-Agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (=?ISO-8859-4?Q?Shij=F2?=) APEL/10.6 Emacs/22.3 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI) X-detected-operating-system: by eggs.gnu.org: NetBSD 3.0 (DF) X-Received-From: 133.82.132.2 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:146123 Archived-At: >>>>> On Sun, 20 Nov 2011 16:13:59 +0900, YAMAMOTO Mitsuharu said: > I think that `scrolling_window' needs to truncate scroll runs that > copy to where we copied to; otherwise, `assign_row (to, from)' > assigns a previously disabled bogus row in the desired matrix when > we have an overlap in the copy destination. Such truncation can > also avoid unnecessary copy in the actual graphics operation. > Could someone double-check the code below? I found a few problems with the code myself: * The truncation should also be done when r->current_y == r->desired_y, because `assign_row (to, from)' is executed for this case. * The array `runs' should be kept sorted by copied pixel lines even after the truncation. * The condition for the invalidation if ((p->current_y >= r->desired_y && p->current_y < r->desired_y + r->height) || (p->current_y + p->height >= r->desired_y && (p->current_y + p->height < r->desired_y + r->height))) in the current code is slightly wrong (off-by-one in 2 places), and the corrected one can be simplified under the condition that `runs' is sorted (see the comment in the code below). Below is a revised patch. YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp === modified file 'src/dispnew.c' *** src/dispnew.c 2011-11-19 08:39:42 +0000 --- src/dispnew.c 2011-11-22 00:19:27 +0000 *************** *** 4551,4568 **** { rif->clear_window_mouse_face (w); rif->scroll_run_hook (w, r); ! /* Invalidate runs that copy from where we copied to. */ ! for (j = i + 1; j < nruns; ++j) { ! struct run *p = runs[j]; ! if ((p->current_y >= r->desired_y && p->current_y < r->desired_y + r->height) ! || (p->current_y + p->height >= r->desired_y && (p->current_y + p->height ! < r->desired_y + r->height))) ! p->nrows = 0; } } --- 4551,4619 ---- { rif->clear_window_mouse_face (w); rif->scroll_run_hook (w, r); + } + + /* Truncate runs that copy to where we copied to, and + invalidate runs that copy from where we copied to. */ + for (j = nruns - 1; j > i; --j) + { + struct run *p = runs[j]; + int truncated_p = 0; ! if (p->nrows > 0 ! && p->desired_y < r->desired_y + r->height ! && p->desired_y + p->height > r->desired_y) { ! if (p->desired_y < r->desired_y) ! { ! p->nrows = r->desired_vpos - p->desired_vpos; ! p->height = r->desired_y - p->desired_y; ! truncated_p = 1; ! } ! else ! { ! int nrows_copied = (r->desired_vpos + r->nrows ! - p->desired_vpos); ! ! if (p->nrows <= nrows_copied) ! p->nrows = 0; ! else ! { ! int height_copied = (r->desired_y + r->height ! - p->desired_y); ! ! p->current_vpos += nrows_copied; ! p->desired_vpos += nrows_copied; ! p->nrows -= nrows_copied; ! p->current_y += height_copied; ! p->desired_y += height_copied; ! p->height -= height_copied; ! truncated_p = 1; ! } ! } ! } ! if (r->current_y != r->desired_y ! /* The condition below is equivalent to ! ((p->current_y >= r->desired_y && p->current_y < r->desired_y + r->height) ! || (p->current_y + p->height > r->desired_y && (p->current_y + p->height ! <= r->desired_y + r->height))) ! because we have 0 < p->height <= r->height. */ ! && p->current_y < r->desired_y + r->height ! && p->current_y + p->height > r->desired_y) ! p->nrows = 0; ! ! /* Reorder runs by copied pixel lines if truncated. */ ! if (truncated_p && p->nrows > 0) ! { ! int k = nruns - 1; ! ! while (runs[k]->nrows == 0 || runs[k]->height < p->height) ! k--; ! memmove (runs + j, runs + j + 1, (k - j) * sizeof (*runs)); ! runs[k] = p; } }