annotate src/scroll.c @ 28285:c54d62415e91

Changed the type of parameter passed to the function defined by `quickurl-format-function'. Before only the text of the URL was passed. Now the whole URL structure is passed and the function is responsible for extracting the parts it requires. Changed the default of `quickurl-format-function' accordingly. (quickurl-insert): Changed the `funcall' of `quickurl-format-function' to match the above change. (quickurl-list-insert): Changed the `url' case so that it makes use of `quickurl-format-function', previous to this the format was hard wired.
author Gerd Moellmann <gerd@gnu.org>
date Thu, 23 Mar 2000 13:53:14 +0000
parents bfd115279703
children f15029804aba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Calculate what line insertion or deletion to do, and do it,
7307
cd81dba38a49 Update copyright.
Karl Heuer <kwzh@gnu.org>
parents: 6888
diff changeset
2 Copyright (C) 1985, 1986, 1990, 1993, 1994 Free Software Foundation, Inc.
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 529
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 any later version.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU General Public License for more details.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 13415
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 13415
diff changeset
19 Boston, MA 02111-1307, USA. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 3356
diff changeset
22 #include <config.h>
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
23 #include <stdio.h>
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
24 #include <string.h>
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 #include "termchar.h"
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 #include "lisp.h"
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 #include "dispextern.h"
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
28 #include "frame.h"
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
29 #include "window.h"
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 #define max(a, b) ((a) > (b) ? (a) : (b))
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 #define min(a, b) ((a) < (b) ? (a) : (b))
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 /* All costs measured in characters.
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
35 So no cost can exceed the area of a frame, measured in characters.
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
36 Let's hope this is never more than 1000000 characters. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
38 #define INFINITY 1000000
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 struct matrix_elt
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 /* Cost of outputting through this line
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 if no insert/delete is done just above it. */
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
44 int writecost;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 /* Cost of outputting through this line
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 if an insert is done just above it. */
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
47 int insertcost;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 /* Cost of outputting through this line
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 if a delete is done just above it. */
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
50 int deletecost;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 /* Number of inserts so far in this run of inserts,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 for the cost in insertcost. */
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
53 unsigned char insertcount;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 /* Number of deletes so far in this run of deletes,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 for the cost in deletecost. */
6773
ed16e189b9a5 (struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents: 6647
diff changeset
56 unsigned char deletecount;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
57 /* Number of writes so far since the last insert
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
58 or delete for the cost in writecost. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
59 unsigned char writecount;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 };
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
62 static void do_direct_scrolling P_ ((struct glyph_matrix *,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
63 struct matrix_elt *,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
64 int, int));
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
65 static void do_scrolling P_ ((struct glyph_matrix *,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
66 struct matrix_elt *,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
67 int, int));
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
68
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
70 /* Determine, in matrix[i,j], the cost of updating the first j old
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
71 lines into the first i new lines using the general scrolling method.
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 This involves using insert or delete somewhere if i != j.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 For each matrix elements, three kinds of costs are recorded:
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 the smallest cost that ends with an insert, the smallest
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 cost that ends with a delete, and the smallest cost that
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 ends with neither one. These are kept separate because
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 on some terminals the cost of doing an insert varies
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 depending on whether one was just done, etc. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 /* draw_cost[VPOS] is the cost of outputting new line at VPOS.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 old_hash[VPOS] is the hash code of the old line at VPOS.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 new_hash[VPOS] is the hash code of the new line at VPOS.
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
83 Note that these are not true frame vpos's, but relative
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 to the place at which the first mismatch between old and
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 new contents appears. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 static void
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
88 calculate_scrolling (frame, matrix, window_size, lines_below,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 draw_cost, old_hash, new_hash,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 free_at_end)
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
91 FRAME_PTR frame;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 /* matrix is of size window_size + 1 on each side. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 struct matrix_elt *matrix;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 int window_size;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 int *draw_cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 int *old_hash;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 int *new_hash;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98 int free_at_end;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 register int i, j;
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
101 int frame_height = FRAME_HEIGHT (frame);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 register struct matrix_elt *p, *p1;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 register int cost, cost1;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 int lines_moved = window_size + (scroll_region_ok ? 0 : lines_below);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 /* first_insert_cost[I] is the cost of doing the first insert-line
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
107 at the i'th line of the lines we are considering,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 where I is origin 1 (as it is below). */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 int *first_insert_cost
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
110 = &FRAME_INSERT_COST (frame)[frame_height - 1 - lines_moved];
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 int *first_delete_cost
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
112 = &FRAME_DELETE_COST (frame)[frame_height - 1 - lines_moved];
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 int *next_insert_cost
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
114 = &FRAME_INSERTN_COST (frame)[frame_height - 1 - lines_moved];
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 int *next_delete_cost
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
116 = &FRAME_DELETEN_COST (frame)[frame_height - 1 - lines_moved];
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 /* Discourage long scrolls on fast lines.
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
119 Don't scroll nearly a full frame height unless it saves
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 at least 1/4 second. */
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
121 int extra_cost = baud_rate / (10 * 4 * FRAME_HEIGHT (frame));
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122
3356
09759a9653c5 (calculate_scrolling): Defend against negative baud_rate.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
123 if (baud_rate <= 0)
09759a9653c5 (calculate_scrolling): Defend against negative baud_rate.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
124 extra_cost = 1;
09759a9653c5 (calculate_scrolling): Defend against negative baud_rate.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
125
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 /* initialize the top left corner of the matrix */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 matrix->writecost = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 matrix->insertcost = INFINITY;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 matrix->deletecost = INFINITY;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 matrix->insertcount = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 matrix->deletecount = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 /* initialize the left edge of the matrix */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 cost = first_insert_cost[1] - next_insert_cost[1];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 for (i = 1; i <= window_size; i++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 p = matrix + i * (window_size + 1);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 cost += draw_cost[i] + next_insert_cost[i] + extra_cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 p->insertcost = cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 p->writecost = INFINITY;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 p->deletecost = INFINITY;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 p->insertcount = i;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 p->deletecount = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 /* initialize the top edge of the matrix */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 cost = first_delete_cost[1] - next_delete_cost[1];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 for (j = 1; j <= window_size; j++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 cost += next_delete_cost[j];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151 matrix[j].deletecost = cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152 matrix[j].writecost = INFINITY;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153 matrix[j].insertcost = INFINITY;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154 matrix[j].deletecount = j;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 matrix[j].insertcount = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
158 /* `i' represents the vpos among new frame contents.
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
159 `j' represents the vpos among the old frame contents. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 p = matrix + window_size + 2; /* matrix [1, 1] */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 for (i = 1; i <= window_size; i++, p++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 for (j = 1; j <= window_size; j++, p++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 /* p contains the address of matrix [i, j] */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 /* First calculate the cost assuming we do
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 not insert or delete above this line.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 That is, if we update through line i-1
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 based on old lines through j-1,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 and then just change old line j to new line i. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 p1 = p - window_size - 2; /* matrix [i-1, j-1] */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 cost = p1->writecost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 if (cost > p1->insertcost)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 cost = p1->insertcost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 if (cost > p1->deletecost)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 cost = p1->deletecost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 if (old_hash[j] != new_hash[i])
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 cost += draw_cost[i];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 p->writecost = cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 /* Calculate the cost if we do an insert-line
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182 before outputting this line.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 That is, we update through line i-1
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 based on old lines through j,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 do an insert-line on line i,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186 and then output line i from scratch,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 leaving old lines starting from j for reuse below. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 p1 = p - window_size - 1; /* matrix [i-1, j] */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 /* No need to think about doing a delete followed
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 immediately by an insert. It cannot be as good
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 as not doing either of them. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 if (free_at_end == i)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 cost = p1->writecost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 cost1 = p1->insertcost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197 else
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 cost = p1->writecost + first_insert_cost[i];
6888
a39caeb88721 (calculate_scrolling): Add explicit casts, to avoid compiler warnings.
Karl Heuer <kwzh@gnu.org>
parents: 6773
diff changeset
200 if ((int) p1->insertcount > i)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 abort ();
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 cost1 = p1->insertcost + next_insert_cost[i - p1->insertcount];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 p->insertcost = min (cost, cost1) + draw_cost[i] + extra_cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 p->insertcount = (cost < cost1) ? 1 : p1->insertcount + 1;
6888
a39caeb88721 (calculate_scrolling): Add explicit casts, to avoid compiler warnings.
Karl Heuer <kwzh@gnu.org>
parents: 6773
diff changeset
206 if ((int) p->insertcount > i)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 abort ();
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 /* Calculate the cost if we do a delete line after
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 outputting this line.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 That is, we update through line i
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 based on old lines through j-1,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 and throw away old line j. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214 p1 = p - 1; /* matrix [i, j-1] */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 /* No need to think about doing an insert followed
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 immediately by a delete. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 if (free_at_end == i)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219 cost = p1->writecost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 cost1 = p1->deletecost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 else
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 cost = p1->writecost + first_delete_cost[i];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 cost1 = p1->deletecost + next_delete_cost[i];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 p->deletecost = min (cost, cost1);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 p->deletecount = (cost < cost1) ? 1 : p1->deletecount + 1;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
231
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
232
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
234 /* Perform insert-lines and delete-lines operations on CURRENT_MATRIX
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
235 according to the costs in MATRIX, using the general scrolling
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
236 method that is used if the terminal does not support the setting of
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
237 scroll windows (scroll_region_ok == 0).
6647
e6611521fb67 (do_scrolling): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
238
e6611521fb67 (do_scrolling): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
239 WINDOW_SIZE is the number of lines being considered for scrolling
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
240 and UNCHANGED_AT_TOP is the vpos of the first line being
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
241 considered. These two arguments can specify any contiguous range
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
242 of lines. */
6647
e6611521fb67 (do_scrolling): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
243
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244 static void
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
245 do_scrolling (current_matrix, matrix, window_size, unchanged_at_top)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
246 struct glyph_matrix *current_matrix;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247 struct matrix_elt *matrix;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 int window_size;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 int unchanged_at_top;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
251 struct matrix_elt *p;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
252 int i, j, k;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
253
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
254 /* Set to 1 if we have set a terminal window with
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
255 set_terminal_window. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
256 int terminal_window_p = 0;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
258 /* A queue for line insertions to be done. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
259 struct queue { int count, pos; };
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
260 struct queue *queue_start
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
261 = (struct queue *) alloca (current_matrix->nrows * sizeof (struct queue));
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
262 struct queue *queue = queue_start;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
263
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
264 char *retained_p = (char *) alloca (window_size * sizeof (char));
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
265 int *copy_from = (int *) alloca (window_size * sizeof (int));
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
267 /* Zero means line is empty. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
268 bzero (retained_p, window_size * sizeof (char));
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
269 for (k = 0; k < window_size; ++k)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
270 copy_from[k] = -1;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
272 #define CHECK \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
273 do \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
274 { \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
275 int k; \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
276 for (k = 0; k < window_size; ++k) \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
277 xassert (copy_from[k] == -1 \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
278 || (copy_from[k] >= 0 && copy_from[k] < window_size)); \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
279 } \
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
280 while (0);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
282 /* When j is advanced, this corresponds to deleted lines.
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
283 When i is advanced, this corresponds to inserted lines. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 i = j = window_size;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 while (i > 0 || j > 0)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 p = matrix + i * (window_size + 1) + j;
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
288
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
289 if (p->insertcost < p->writecost && p->insertcost < p->deletecost)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
291 /* Insert should be done at vpos i-1, plus maybe some before.
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
292 Queue the screen operation to be performed. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
293 queue->count = p->insertcount;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
294 queue->pos = i + unchanged_at_top - p->insertcount;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
295 ++queue;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
296
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
297 /* By incrementing I, we leave room in the result rows
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
298 for the empty rows opened up. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 i -= p->insertcount;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 else if (p->deletecost < p->writecost)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
303 /* Old line at vpos j-1, and maybe some before it, should be
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
304 deleted. By decrementing J, we skip some lines in the
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
305 temp_rows which is equivalent to omitting these lines in
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
306 the result rows, thus deleting them. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 j -= p->deletecount;
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
308
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
309 /* Set the terminal window, if not done already. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
310 if (! terminal_window_p)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 set_terminal_window (window_size + unchanged_at_top);
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
313 terminal_window_p = 1;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
315
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
316 /* Delete lines on the terminal. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 ins_del_lines (j + unchanged_at_top, - p->deletecount);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 else
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
321 /* Best thing done here is no insert or delete, i.e. a write. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
322 --i, --j;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
323 xassert (i >= 0 && i < window_size);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
324 xassert (j >= 0 && j < window_size);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
325 copy_from[i] = j;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
326 retained_p[j] = 1;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
328 #if GLYPH_DEBUG
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
329 CHECK;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
330 #endif
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
334 /* Now do all insertions queued above. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
335 if (queue > queue_start)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
337 int next = -1;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
338
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
339 /* Set the terminal window if not yet done. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
340 if (!terminal_window_p)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
341 {
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
342 set_terminal_window (window_size + unchanged_at_top);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
343 terminal_window_p = 1;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
344 }
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
345
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
346 do
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
347 {
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
348 --queue;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
349
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
350 /* Do the deletion on the terminal. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
351 ins_del_lines (queue->pos, queue->count);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
352
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
353 /* All lines in the range deleted become empty in the glyph
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
354 matrix. Assign to them glyph rows that are not retained.
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
355 K is the starting position of the deleted range relative
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
356 to the window we are working in. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
357 k = queue->pos - unchanged_at_top;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
358 for (j = 0; j < queue->count; ++j)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
359 {
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
360 /* Find the next row not retained. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
361 while (retained_p[++next])
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
362 ;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
363
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
364 /* Record that this row is to be used for the empty
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
365 glyph row j. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
366 copy_from[k + j] = next;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
367 }
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
368 }
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
369 while (queue > queue_start);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
370
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
373 for (k = 0; k < window_size; ++k)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
374 xassert (copy_from[k] >= 0 && copy_from[k] < window_size);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
376 /* Perform the row swizzling. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
377 mirrored_line_dance (current_matrix, unchanged_at_top, window_size,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
378 copy_from, retained_p);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
380 /* Some sanity checks if GLYPH_DEBUG != 0. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
381 CHECK_MATRIX (current_matrix);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
382
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
383 if (terminal_window_p)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
384 set_terminal_window (0);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
385 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
386
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
387
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
388 /* Determine, in matrix[i,j], the cost of updating the first j
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
389 old lines into the first i new lines using the direct
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
390 scrolling method. When the old line and the new line have
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
391 different hash codes, the calculated cost of updating old
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
392 line j into new line i includes the cost of outputting new
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
393 line i, and if i != j, the cost of outputting the old line j
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
394 is also included, as a penalty for moving the line and then
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
395 erasing it. In addition, the cost of updating a sequence of
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
396 lines with constant i - j includes the cost of scrolling the
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
397 old lines into their new positions, unless i == j. Scrolling
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
398 is achieved by setting the screen window to avoid affecting
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
399 other lines below, and inserting or deleting lines at the top
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
400 of the scrolled region. The cost of scrolling a sequence of
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
401 lines includes the fixed cost of specifying a scroll region,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
402 plus a variable cost which can depend upon the number of lines
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
403 involved and the distance by which they are scrolled, and an
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
404 extra cost to discourage long scrolls.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
405
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
406 As reflected in the matrix, an insert or delete does not
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
407 correspond directly to the insertion or deletion which is
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
408 used in scrolling lines. An insert means that the value of i
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
409 has increased without a corresponding increase in the value
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
410 of j. A delete means that the value of j has increased
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
411 without a corresponding increase in the value of i. A write
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
412 means that i and j are both increased by the same amount, and
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
413 that the old lines will be moved to their new positions.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
414
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
415 An insert following a delete is allowed only if i > j.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
416 A delete following an insert is allowed only if i < j.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
417 These restrictions ensure that the new lines in an insert
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
418 will always be blank as an effect of the neighboring writes.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
419 Thus the calculated cost of an insert is simply the cost of
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
420 outputting the new line contents. The direct cost of a
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
421 delete is zero. Inserts and deletes indirectly affect the
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
422 total cost through their influence on subsequent writes. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
423
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
424 /* The vectors draw_cost, old_hash, and new_hash have the same
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
425 meanings here as in calculate_scrolling, and old_draw_cost
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
426 is the equivalent of draw_cost for the old line contents */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
427
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
428 static void
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
429 calculate_direct_scrolling (frame, matrix, window_size, lines_below,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
430 draw_cost, old_draw_cost, old_hash, new_hash,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
431 free_at_end)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
432 FRAME_PTR frame;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
433 /* matrix is of size window_size + 1 on each side. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
434 struct matrix_elt *matrix;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
435 int window_size;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
436 int *draw_cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
437 int *old_draw_cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
438 int *old_hash;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
439 int *new_hash;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
440 int free_at_end;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
441 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
442 register int i, j;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
443 int frame_height = FRAME_HEIGHT (frame);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
444 register struct matrix_elt *p, *p1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
445 register int cost, cost1, delta;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
446
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
447 /* first_insert_cost[-I] is the cost of doing the first insert-line
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
448 at a position I lines above the bottom line in the scroll window. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
449 int *first_insert_cost
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
450 = &FRAME_INSERT_COST (frame)[frame_height - 1];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
451 int *first_delete_cost
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
452 = &FRAME_DELETE_COST (frame)[frame_height - 1];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
453 int *next_insert_cost
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
454 = &FRAME_INSERTN_COST (frame)[frame_height - 1];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
455 int *next_delete_cost
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
456 = &FRAME_DELETEN_COST (frame)[frame_height - 1];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
457
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
458 int scroll_overhead;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
459
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
460 /* Discourage long scrolls on fast lines.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
461 Don't scroll nearly a full frame height unless it saves
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
462 at least 1/4 second. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
463 int extra_cost = baud_rate / (10 * 4 * FRAME_HEIGHT (frame));
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
464
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
465 if (baud_rate <= 0)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
466 extra_cost = 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
467
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
468 /* Overhead of setting the scroll window, plus the extra cost
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
469 cost of scrolling by a distance of one. The extra cost is
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
470 added once for consistency with the cost vectors */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
471 scroll_overhead = scroll_region_cost + extra_cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
472
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
473 /* initialize the top left corner of the matrix */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
474 matrix->writecost = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
475 matrix->insertcost = INFINITY;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
476 matrix->deletecost = INFINITY;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
477 matrix->writecount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
478 matrix->insertcount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
479 matrix->deletecount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
480
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
481 /* initialize the left edge of the matrix */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
482 cost = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
483 for (i = 1; i <= window_size; i++)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
484 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
485 p = matrix + i * (window_size + 1);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
486 cost += draw_cost[i];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
487 p->insertcost = cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
488 p->writecost = INFINITY;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
489 p->deletecost = INFINITY;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
490 p->insertcount = i;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
491 p->writecount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
492 p->deletecount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
493 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
494
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
495 /* initialize the top edge of the matrix */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
496 for (j = 1; j <= window_size; j++)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
497 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
498 matrix[j].deletecost = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
499 matrix[j].writecost = INFINITY;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
500 matrix[j].insertcost = INFINITY;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
501 matrix[j].deletecount = j;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
502 matrix[j].writecount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
503 matrix[j].insertcount = 0;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
504 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
505
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
506 /* `i' represents the vpos among new frame contents.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
507 `j' represents the vpos among the old frame contents. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
508 p = matrix + window_size + 2; /* matrix [1, 1] */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
509
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
510 for (i = 1; i <= window_size; i++, p++)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
511 for (j = 1; j <= window_size; j++, p++)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
512 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
513 /* p contains the address of matrix [i, j] */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
514
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
515 /* First calculate the cost assuming we do
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
516 not insert or delete above this line.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
517 That is, if we update through line i-1
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
518 based on old lines through j-1,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
519 and then just change old line j to new line i.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
520
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
521 Depending on which choice gives the lower cost,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
522 this usually involves either scrolling a single line
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
523 or extending a sequence of scrolled lines, but
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
524 when i == j, no scrolling is required. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
525 p1 = p - window_size - 2; /* matrix [i-1, j-1] */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
526 cost = p1->insertcost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
527 if (cost > p1->deletecost)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
528 cost = p1->deletecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
529 cost1 = p1->writecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
530 if (i == j)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
531 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
532 if (cost > cost1)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
533 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
534 cost = cost1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
535 p->writecount = p1->writecount + 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
536 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
537 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
538 p->writecount = 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
539 if (old_hash[j] != new_hash[i])
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
540 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
541 cost += draw_cost[i];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
542 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
543 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
544 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
545 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
546 if (i > j)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
547 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
548 delta = i - j;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
549
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
550 /* The cost added here for scrolling the first line by
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
551 a distance N includes the overhead of setting the
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
552 scroll window, the cost of inserting N lines at a
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
553 position N lines above the bottom line of the window,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
554 and an extra cost which is proportional to N. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
555 cost += scroll_overhead + first_insert_cost[-delta] +
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
556 (delta-1) * (next_insert_cost[-delta] + extra_cost);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
557
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
558 /* In the most general case, the insertion overhead and
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
559 the multiply factor can grow linearly as the distance
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
560 from the bottom of the window increases. The incremental
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
561 cost of scrolling an additional line depends upon the
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
562 rate of change of these two parameters. Each of these
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
563 growth rates can be determined by a simple difference.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
564 To reduce the cumulative effects of rounding error, we
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
565 vary the position at which the difference is computed. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
566 cost1 += first_insert_cost[-j] - first_insert_cost[1-j] +
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
567 (delta-1) * (next_insert_cost[-j] - next_insert_cost[1-j]);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
568 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
569 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
570 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
571 delta = j - i;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
572 cost += scroll_overhead + first_delete_cost[-delta] +
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
573 (delta-1) * (next_delete_cost[-delta] + extra_cost);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
574 cost1 += first_delete_cost[-i] - first_delete_cost[1-i] +
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
575 (delta-1) * ( next_delete_cost[-i] - next_delete_cost[1-i]);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
576 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
577 if (cost1 < cost)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
578 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
579 cost = cost1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
580 p->writecount = p1->writecount + 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
581 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
582 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
583 p->writecount = 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
584 if (old_hash[j] != new_hash[i])
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
585 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
586 cost += draw_cost[i] + old_draw_cost[j];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
587 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
588 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
589 p->writecost = cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
590
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
591 /* Calculate the cost if we do an insert-line
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
592 before outputting this line.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
593 That is, we update through line i-1
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
594 based on old lines through j,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
595 do an insert-line on line i,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
596 and then output line i from scratch,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
597 leaving old lines starting from j for reuse below. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
598 p1 = p - window_size - 1; /* matrix [i-1, j] */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
599 cost = p1->writecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
600 /* If i > j, an insert is allowed after a delete. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
601 if (i > j && p1->deletecost < cost)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
602 cost = p1->deletecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
603 if (p1->insertcost <= cost)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
604 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
605 cost = p1->insertcost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
606 p->insertcount = p1->insertcount + 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
607 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
608 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
609 p->insertcount = 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
610 cost += draw_cost[i];
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
611 p->insertcost = cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
612
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
613 /* Calculate the cost if we do a delete line after
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
614 outputting this line.
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
615 That is, we update through line i
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
616 based on old lines through j-1,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
617 and throw away old line j. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
618 p1 = p - 1; /* matrix [i, j-1] */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
619 cost = p1->writecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
620 /* If i < j, a delete is allowed after an insert. */
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
621 if (i < j && p1->insertcost < cost)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
622 cost = p1->insertcost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
623 cost1 = p1->deletecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
624 if (p1->deletecost <= cost)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
625 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
626 cost = p1->deletecost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
627 p->deletecount = p1->deletecount + 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
628 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
629 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
630 p->deletecount = 1;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
631 p->deletecost = cost;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
632 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
633 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
634
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
635
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
636
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
637 /* Perform insert-lines and delete-lines operations on CURRENT_MATRIX
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
638 according to the costs in MATRIX, using the direct scrolling method
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
639 which is used when the terminal supports setting a scroll window
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
640 (scroll_region_ok).
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
641
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
642 WINDOW_SIZE is the number of lines being considered for scrolling
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
643 and UNCHANGED_AT_TOP is the vpos of the first line being
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
644 considered. These two arguments can specify any contiguous range
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
645 of lines.
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
646
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
647 In the direct scrolling method, a new scroll window is selected
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
648 before each insertion or deletion, so that groups of lines can be
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
649 scrolled directly to their final vertical positions. This method
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
650 is described in more detail in calculate_direct_scrolling, where
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
651 the cost matrix for this approach is constructed. */
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
652
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
653 static void
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
654 do_direct_scrolling (current_matrix, cost_matrix, window_size,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
655 unchanged_at_top)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
656 struct glyph_matrix *current_matrix;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
657 struct matrix_elt *cost_matrix;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
658 int window_size;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
659 int unchanged_at_top;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
660 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
661 struct matrix_elt *p;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
662 int i, j;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
663
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
664 /* A queue of deletions and insertions to be performed. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
665 struct alt_queue { int count, pos, window; };
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
666 struct alt_queue *queue_start = (struct alt_queue *)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
667 alloca (window_size * sizeof *queue_start);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
668 struct alt_queue *queue = queue_start;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
669
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
670 /* Set to 1 if a terminal window has been set with
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
671 set_terminal_window: */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
672 int terminal_window_p = 0;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
673
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
674 /* A nonzero value of write_follows indicates that a write has been
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
675 selected, allowing either an insert or a delete to be selected
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
676 next. When write_follows is zero, a delete cannot be selected
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
677 unless j < i, and an insert cannot be selected unless i < j.
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
678 This corresponds to a similar restriction (with the ordering
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
679 reversed) in calculate_direct_scrolling, which is intended to
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
680 ensure that lines marked as inserted will be blank. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
681 int write_follows_p = 1;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
682
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
683 /* For each row in the new matrix what row of the old matrix it is. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
684 int *copy_from = (int *) alloca (window_size * sizeof (int));
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
685
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
686 /* Non-zero for each row in the new matrix that is retained from the
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
687 old matrix. Lines not retained are empty. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
688 char *retained_p = (char *) alloca (window_size * sizeof (char));
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
689
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
690 bzero (retained_p, window_size * sizeof (char));
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
691
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
692 /* Perform some sanity checks when GLYPH_DEBUG is on. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
693 CHECK_MATRIX (current_matrix);
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
694
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
695 /* We are working on the line range UNCHANGED_AT_TOP ...
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
696 UNCHANGED_AT_TOP + WINDOW_SIZE (not including) in CURRENT_MATRIX.
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
697 We step through lines in this range from the end to the start. I
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
698 is an index into new lines, j an index into old lines. The cost
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
699 matrix determines what to do for ranges of indices.
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
700
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
701 If i is decremented without also decrementing j, this corresponds
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
702 to inserting empty lines in the result. If j is decremented
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
703 without also decrementing i, this corresponds to omitting these
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
704 lines in the new rows, i.e. rows are deleted. */
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
705 i = j = window_size;
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
706
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
707 while (i > 0 || j > 0)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
708 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
709 p = cost_matrix + i * (window_size + 1) + j;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
710
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
711 if (p->insertcost < p->writecost
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
712 && p->insertcost < p->deletecost
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
713 && (write_follows_p || i < j))
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
714 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
715 /* Insert is cheaper than deleting or writing lines. Leave
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
716 a hole in the result display that will be filled with
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
717 empty lines when the queue is emptied. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
718 queue->count = 0;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
719 queue->window = i;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
720 queue->pos = i - p->insertcount;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
721 ++queue;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
722
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
723 i -= p->insertcount;
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
724 write_follows_p = 0;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
725 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
726 else if (p->deletecost < p->writecost
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
727 && (write_follows_p || i > j))
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
728 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
729 /* Deleting lines is cheaper. By decrementing J, omit
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
730 deletecount lines from the original. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
731 write_follows_p = 0;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
732 j -= p->deletecount;
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
733 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
734 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
735 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
736 /* One or more lines should be written. In the direct
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
737 scrolling method we do this by scrolling the lines to the
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
738 place they belong. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
739 int n_to_write = p->writecount;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
740 write_follows_p = 1;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
741 xassert (n_to_write > 0);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
742
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
743 if (i > j)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
744 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
745 /* Immediately insert lines */
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
746 set_terminal_window (i + unchanged_at_top);
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
747 terminal_window_p = 1;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
748 ins_del_lines (j - n_to_write + unchanged_at_top, i - j);
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
749 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
750 else if (i < j)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
751 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
752 /* Queue the deletion of a group of lines */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
753 queue->pos = i - n_to_write + unchanged_at_top;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
754 queue->window = j + unchanged_at_top;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
755 queue->count = i - j;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
756 ++queue;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
757 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
758
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
759 while (n_to_write > 0)
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
760 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
761 --i, --j, --n_to_write;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
762 copy_from[i] = j;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
763 retained_p[j] = 1;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
764 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
765 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
766 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
767
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
768 /* Do queued operations. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
769 if (queue > queue_start)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
770 {
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
771 int next = -1;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
772
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
773 do
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
774 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
775 --queue;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
776 if (queue->count)
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
777 {
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
778 set_terminal_window (queue->window);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
779 terminal_window_p = 1;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
780 ins_del_lines (queue->pos, queue->count);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
781 }
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
782 else
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
783 {
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
784 for (j = queue->window - 1; j >= queue->pos; --j)
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
785 {
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
786 while (retained_p[++next])
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
787 ;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
788 copy_from[j] = next;
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
789 }
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
790 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
791 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
792 while (queue > queue_start);
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
793 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
794
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
795 /* Now, for each row I in the range of rows we are working on,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
796 copy_from[i] gives the original line to copy to I, and
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
797 retained_p[copy_from[i]] is zero if line I in the new display is
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
798 empty. */
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
799 mirrored_line_dance (current_matrix, unchanged_at_top, window_size,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
800 copy_from, retained_p);
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
801
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
802 if (terminal_window_p)
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
803 set_terminal_window (0);
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
804 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
805
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
806
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
807
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
808 void
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
809 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom,
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
810 draw_cost, old_draw_cost, old_hash, new_hash, free_at_end)
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
811 FRAME_PTR frame;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
812 int window_size, unchanged_at_top, unchanged_at_bottom;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
813 int *draw_cost;
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
814 int *old_draw_cost;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
815 int *old_hash;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
816 int *new_hash;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
817 int free_at_end;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
818 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
819 struct matrix_elt *matrix;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
820 matrix = ((struct matrix_elt *)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
821 alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix));
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
822
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
823 if (scroll_region_ok)
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
824 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
825 calculate_direct_scrolling (frame, matrix, window_size,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
826 unchanged_at_bottom,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
827 draw_cost, old_draw_cost,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
828 old_hash, new_hash, free_at_end);
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
829 do_direct_scrolling (frame->current_matrix,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
830 matrix, window_size, unchanged_at_top);
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
831 }
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
832 else
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
833 {
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
834 calculate_scrolling (frame, matrix, window_size, unchanged_at_bottom,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
835 draw_cost, old_hash, new_hash,
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
836 free_at_end);
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
837 do_scrolling (frame->current_matrix, matrix, window_size,
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
838 unchanged_at_top);
10262
4face60ac721 (scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents: 10109
diff changeset
839 }
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
840 }
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
841
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
842
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
843
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
844 /* Return number of lines in common between current and desired frame
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
845 contents described to us only as vectors of hash codes OLDHASH and
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
846 NEWHASH. Consider only vpos range START to END (not including
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
847 END). Ignore short lines on the assumption that avoiding redrawing
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
848 such a line will have little weight. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
849
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
850 int
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
851 scrolling_max_lines_saved (start, end, oldhash, newhash, cost)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852 int start, end;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
853 int *oldhash, *newhash, *cost;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
854 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
855 struct { int hash; int count; } lines[01000];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
856 register int i, h;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
857 register int matchcount = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
858 int avg_length = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
859 int threshold;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
860
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
861 /* Compute a threshold which is 1/4 of average length of these lines. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
862
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
863 for (i = start; i < end; i++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
864 avg_length += cost[i];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
865
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 avg_length /= end - start;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
867 threshold = avg_length / 4;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
868
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
869 bzero (lines, sizeof lines);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
870
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
871 /* Put new lines' hash codes in hash table. Ignore lines shorter
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
872 than the threshold. Thus, if the lines that are in common are
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
873 mainly the ones that are short, they won't count. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
874 for (i = start; i < end; i++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
875 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
876 if (cost[i] > threshold)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
877 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
878 h = newhash[i] & 0777;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
879 lines[h].hash = newhash[i];
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
880 lines[h].count++;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
881 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
882 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
883
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
884 /* Look up old line hash codes in the hash table. Count number of
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
885 matches between old lines and new. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
886 for (i = start; i < end; i++)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
887 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
888 h = oldhash[i] & 0777;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
889 if (oldhash[i] == lines[h].hash)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
890 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
891 matchcount++;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
892 if (--lines[h].count == 0)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
893 lines[h].hash = 0;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
894 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
895 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
896
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
897 return matchcount;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
898 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
899
25004
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
900 /* Return a measure of the cost of moving the lines starting with vpos
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
901 FROM, up to but not including vpos TO, down by AMOUNT lines (AMOUNT
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
902 may be negative). These are the same arguments that might be given
bfd115279703 Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 21514
diff changeset
903 to scroll_frame_lines to perform this scrolling. */
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
904
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 14186
diff changeset
905 int
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
906 scroll_cost (frame, from, to, amount)
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
907 FRAME_PTR frame;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
908 int from, to, amount;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
909 {
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
910 /* Compute how many lines, at bottom of frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
911 will not be involved in actual motion. */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
912 int limit = to;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
913 int offset;
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
914 int height = FRAME_HEIGHT (frame);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
915
421
1cc29824b3f1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 320
diff changeset
916 if (amount == 0)
1cc29824b3f1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 320
diff changeset
917 return 0;
1cc29824b3f1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 320
diff changeset
918
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
919 if (! scroll_region_ok)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
920 limit = height;
421
1cc29824b3f1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 320
diff changeset
921 else if (amount > 0)
1cc29824b3f1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 320
diff changeset
922 limit += amount;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
923
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
924 if (amount < 0)
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
925 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
926 int temp = to;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
927 to = from + amount;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
928 from = temp + amount;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
929 amount = - amount;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
930 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
931
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
932 offset = height - limit;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
933
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
934 return
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
935 (FRAME_INSERT_COST (frame)[offset + from]
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
936 + (amount - 1) * FRAME_INSERTN_COST (frame)[offset + from]
10109
869e177ca872 (scroll_cost): FRAME_DELETE_COST and FRAME_DELETEN_COSTS were confused. Fixed.
Richard M. Stallman <rms@gnu.org>
parents: 9576
diff changeset
937 + FRAME_DELETE_COST (frame)[offset + to]
869e177ca872 (scroll_cost): FRAME_DELETE_COST and FRAME_DELETEN_COSTS were confused. Fixed.
Richard M. Stallman <rms@gnu.org>
parents: 9576
diff changeset
938 + (amount - 1) * FRAME_DELETEN_COST (frame)[offset + to]);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
939 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
940
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
941 /* Calculate the line insertion/deletion
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
942 overhead and multiply factor values */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
943
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
944 static void
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
945 line_ins_del (frame, ov1, pf1, ovn, pfn, ov, mf)
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
946 FRAME_PTR frame;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
947 int ov1, ovn;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
948 int pf1, pfn;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
949 register int *ov, *mf;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
950 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
951 register int i;
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
952 register int frame_height = FRAME_HEIGHT (frame);
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
953 register int insert_overhead = ov1 * 10;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
954 register int next_insert_cost = ovn * 10;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
955
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
956 for (i = frame_height-1; i >= 0; i--)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
957 {
529
413127b220ef *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 421
diff changeset
958 mf[i] = next_insert_cost / 10;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
959 next_insert_cost += pfn;
529
413127b220ef *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 421
diff changeset
960 ov[i] = (insert_overhead + next_insert_cost) / 10;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
961 insert_overhead += pf1;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
962 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
963 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
964
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
965 static void
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
966 ins_del_costs (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
967 one_line_string, multi_string,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
968 setup_string, cleanup_string,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
969 costvec, ncostvec, coefficient)
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
970 FRAME_PTR frame;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
971 char *one_line_string, *multi_string;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
972 char *setup_string, *cleanup_string;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
973 int *costvec, *ncostvec;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
974 int coefficient;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
975 {
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
976 if (multi_string)
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
977 line_ins_del (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
978 string_cost (multi_string) * coefficient,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
979 per_line_cost (multi_string) * coefficient,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980 0, 0, costvec, ncostvec);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
981 else if (one_line_string)
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
982 line_ins_del (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 string_cost (setup_string) + string_cost (cleanup_string), 0,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 string_cost (one_line_string),
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 per_line_cost (one_line_string),
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 costvec, ncostvec);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 else
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
988 line_ins_del (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989 9999, 0, 9999, 0,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
990 costvec, ncostvec);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 /* Calculate the insert and delete line costs.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 Note that this is done even when running with a window system
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 because we want to know how long scrolling takes (and avoid it).
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
996 This must be redone whenever the frame height changes.
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
998 We keep the ID costs in a precomputed array based on the position
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
999 at which the I or D is performed. Also, there are two kinds of ID
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1000 costs: the "once-only" and the "repeated". This is to handle both
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1001 those terminals that are able to insert N lines at a time (once-
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1002 only) and those that must repeatedly insert one line.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1003
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1004 The cost to insert N lines at line L is
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1005 [tt.t_ILov + (frame_height + 1 - L) * tt.t_ILpf] +
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1006 N * [tt.t_ILnov + (frame_height + 1 - L) * tt.t_ILnpf]
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008 ILov represents the basic insert line overhead. ILpf is the padding
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009 required to allow the terminal time to move a line: insertion at line
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1010 L changes (frame_height + 1 - L) lines.
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1011
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1012 The first bracketed expression above is the overhead; the second is
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1013 the multiply factor. Both are dependent only on the position at
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1014 which the insert is performed. We store the overhead in
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1015 FRAME_INSERT_COST (frame) and the multiply factor in
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1016 FRAME_INSERTN_COST (frame). Note however that any insertion
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1017 must include at least one multiply factor. Rather than compute this
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1018 as FRAME_INSERT_COST (frame)[line]+FRAME_INSERTN_COST (frame)[line],
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1019 we add FRAME_INSERTN_COST (frame) into FRAME_INSERT_COST (frame).
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1020 This is reasonable because of the particular algorithm used in calcM.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 Deletion is essentially the same as insertion.
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 */
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1024
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 14186
diff changeset
1025 void
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1026 do_line_insertion_deletion_costs (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1027 ins_line_string, multi_ins_string,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1028 del_line_string, multi_del_string,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1029 setup_string, cleanup_string, coefficient)
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1030 FRAME_PTR frame;
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1031 char *ins_line_string, *multi_ins_string;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 char *del_line_string, *multi_del_string;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033 char *setup_string, *cleanup_string;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034 int coefficient;
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035 {
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1036 if (FRAME_INSERT_COST (frame) != 0)
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 {
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1038 FRAME_INSERT_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1039 (int *) xrealloc (FRAME_INSERT_COST (frame),
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1040 FRAME_HEIGHT (frame) * sizeof (int));
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1041 FRAME_DELETEN_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1042 (int *) xrealloc (FRAME_DELETEN_COST (frame),
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1043 FRAME_HEIGHT (frame) * sizeof (int));
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1044 FRAME_INSERTN_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1045 (int *) xrealloc (FRAME_INSERTN_COST (frame),
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1046 FRAME_HEIGHT (frame) * sizeof (int));
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1047 FRAME_DELETE_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1048 (int *) xrealloc (FRAME_DELETE_COST (frame),
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1049 FRAME_HEIGHT (frame) * sizeof (int));
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1050 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1051 else
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1052 {
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1053 FRAME_INSERT_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1054 (int *) xmalloc (FRAME_HEIGHT (frame) * sizeof (int));
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1055 FRAME_DELETEN_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1056 (int *) xmalloc (FRAME_HEIGHT (frame) * sizeof (int));
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1057 FRAME_INSERTN_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1058 (int *) xmalloc (FRAME_HEIGHT (frame) * sizeof (int));
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1059 FRAME_DELETE_COST (frame) =
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1060 (int *) xmalloc (FRAME_HEIGHT (frame) * sizeof (int));
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1061 }
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1062
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1063 ins_del_costs (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1064 ins_line_string, multi_ins_string,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1065 setup_string, cleanup_string,
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1066 FRAME_INSERT_COST (frame), FRAME_INSERTN_COST (frame),
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1067 coefficient);
766
b9e81bfc7ad9 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1068 ins_del_costs (frame,
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1069 del_line_string, multi_del_string,
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 setup_string, cleanup_string,
9576
14cd96eda0e3 (do_line_insertion_deletion_costs): Fix argument order.
Karl Heuer <kwzh@gnu.org>
parents: 7307
diff changeset
1071 FRAME_DELETE_COST (frame), FRAME_DELETEN_COST (frame),
154
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072 coefficient);
48df093640da Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1073 }