summaryrefslogtreecommitdiffstats
path: root/generic/tkTextDisp.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkTextDisp.c')
-rw-r--r--generic/tkTextDisp.c462
1 files changed, 213 insertions, 249 deletions
diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c
index b96542e..64e1021 100644
--- a/generic/tkTextDisp.c
+++ b/generic/tkTextDisp.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkTextDisp.c,v 1.61 2007/01/11 15:35:39 dkf Exp $
+ * RCS: @(#) $Id: tkTextDisp.c,v 1.62 2007/02/22 13:56:33 dkf Exp $
*/
#include "tkPort.h"
@@ -74,44 +74,44 @@
/*
* TK_LAYOUT_WITH_BASE_CHUNKS:
*
- * With this macro set, collect all char chunks that have no holes between
- * them, that are on the same line and use the same font and font size.
- * Allocate the chars of all these chunks, the so-called "stretch", in a
- * DString in the first chunk, the so-called "base chunk". Use the base
- * chunk string for measuring and drawing, so that these actions are always
- * performed with maximum context.
+ * With this macro set, collect all char chunks that have no holes
+ * between them, that are on the same line and use the same font and font
+ * size. Allocate the chars of all these chunks, the so-called "stretch",
+ * in a DString in the first chunk, the so-called "base chunk". Use the
+ * base chunk string for measuring and drawing, so that these actions are
+ * always performed with maximum context.
*
- * This is necessary for text rendering engines that provide ligatures and
- * sub-pixel layout, like ATSU on Mac. If we don't do this, the measuring
- * will change all the time, leading to an ugly "tremble and shiver"
- * effect. This is because of the continuous splitting and re-merging of
- * chunks that goes on in a text widget, when the cursor or the selection
- * move.
+ * This is necessary for text rendering engines that provide ligatures
+ * and sub-pixel layout, like ATSU on Mac. If we don't do this, the
+ * measuring will change all the time, leading to an ugly "tremble and
+ * shiver" effect. This is because of the continuous splitting and
+ * re-merging of chunks that goes on in a text widget, when the cursor or
+ * the selection move.
*
* Side effects:
*
- * Memory management changes. Instead of attaching the character data to
- * the clientData structures of the char chunks, an additional DString is
- * used. The collection process will even lead to resizing this DString
- * for large stretches (> TCL_DSTRING_STATIC_SIZE == 200). We could reduce
- * the overall memory footprint by copying the result to a plain char array
- * after the line breaking process, but that would complicate the code and
- * make performance even worse speedwise. See also TODOs.
+ * Memory management changes. Instead of attaching the character data to
+ * the clientData structures of the char chunks, an additional DString is
+ * used. The collection process will even lead to resizing this DString
+ * for large stretches (> TCL_DSTRING_STATIC_SIZE == 200). We could
+ * reduce the overall memory footprint by copying the result to a plain
+ * char array after the line breaking process, but that would complicate
+ * the code and make performance even worse speedwise. See also TODOs.
*
* TODOs:
*
- * - Move the character collection process from the LayoutProc into
- * LayoutDLine(), so that the collection can be done before actual
- * layout. In this way measuring can look at the following text, too,
- * right from the beginning. Memory handling can also be improved with
- * this. Problem: We don't easily know which chunks are adjacent until
- * all the other chunks have calculated their width. Apparently marks
- * would return width==0. A separate char collection loop would have to
- * know these things.
- *
- * - Use a new context parameter to pass the context from LayoutDLine() to
- * the LayoutProc instead of using a global variable like now. Not
- * pressing until the previous point gets implemented.
+ * - Move the character collection process from the LayoutProc into
+ * LayoutDLine(), so that the collection can be done before actual
+ * layout. In this way measuring can look at the following text, too,
+ * right from the beginning. Memory handling can also be improved with
+ * this. Problem: We don't easily know which chunks are adjacent until
+ * all the other chunks have calculated their width. Apparently marks
+ * would return width==0. A separate char collection loop would have to
+ * know these things.
+ *
+ * - Use a new context parameter to pass the context from LayoutDLine() to
+ * the LayoutProc instead of using a global variable like now. Not
+ * pressing until the previous point gets implemented.
*/
/*
@@ -150,7 +150,7 @@ typedef struct StyleValues {
int tabStyle; /* One of TABULAR or WORDPROCESSOR. */
int underline; /* Non-zero means draw underline underneath
* text. */
- int elide; /* Zero means draw text, otherwise not */
+ int elide; /* Zero means draw text, otherwise not. */
TkWrapMode wrapMode; /* How to handle wrap-around for this tag.
* One of TEXT_WRAPMODE_CHAR,
* TEXT_WRAPMODE_NONE or TEXT_WRAPMODE_WORD.*/
@@ -429,10 +429,9 @@ typedef struct CharInfo {
* baseChars. */
int numBytes; /* Number of bytes that belong to this
* chunk. */
- const char *chars; /* UTF characters to display. Actually
- * points into the baseChars of the base
- * chunk. Only valid after
- * FinalizeBaseChunk(). */
+ const char *chars; /* UTF characters to display. Actually points
+ * into the baseChars of the base chunk. Only
+ * valid after FinalizeBaseChunk(). */
} CharInfo;
/*
@@ -444,7 +443,7 @@ typedef struct BaseCharInfo {
Tcl_DString baseChars; /* Actual characters for the stretch of text
* represented by this base chunk. */
int width; /* Width in pixels of the whole string, if
- * known, else -1. Valid during
+ * known, else -1. Valid during
* LayoutDLine(). */
} BaseCharInfo;
@@ -508,64 +507,51 @@ static void AdjustForTab(TkText *textPtr,
TkTextTabArray *tabArrayPtr, int index,
TkTextDispChunk *chunkPtr);
static void CharBboxProc(TkText *textPtr,
- TkTextDispChunk *chunkPtr,
- int index, int y, int lineHeight, int baseline,
- int *xPtr, int *yPtr, int *widthPtr,
- int *heightPtr);
-static int CharChunkMeasureChars(
- TkTextDispChunk *chunkPtr,
+ TkTextDispChunk *chunkPtr, int index, int y,
+ int lineHeight, int baseline, int *xPtr,
+ int *yPtr, int *widthPtr, int *heightPtr);
+static int CharChunkMeasureChars(TkTextDispChunk *chunkPtr,
const char *chars, int charsLen,
int start, int end, int startX, int maxX,
int flags, int *nextX);
static void CharDisplayProc(TkText *textPtr,
- TkTextDispChunk *chunkPtr,
- int x, int y, int height, int baseline,
- Display *display, Drawable dst, int screenY);
+ TkTextDispChunk *chunkPtr, int x, int y,
+ int height, int baseline, Display *display,
+ Drawable dst, int screenY);
static int CharMeasureProc(TkTextDispChunk *chunkPtr, int x);
static void CharUndisplayProc(TkText *textPtr,
TkTextDispChunk *chunkPtr);
-
-
#if TK_LAYOUT_WITH_BASE_CHUNKS
-
-static void FinalizeBaseChunk(
- TkTextDispChunk *additionalChunkPtr);
-static void FreeBaseChunk(
- TkTextDispChunk *baseChunkPtr);
-static int IsSameFGStyle(
- TextStyle *style1, TextStyle *style2);
-static void RemoveFromBaseChunk(
- TkTextDispChunk *chunkPtr);
-
+static void FinalizeBaseChunk(TkTextDispChunk *additionalChunkPtr);
+static void FreeBaseChunk(TkTextDispChunk *baseChunkPtr);
+static int IsSameFGStyle(TextStyle *style1, TextStyle *style2);
+static void RemoveFromBaseChunk(TkTextDispChunk *chunkPtr);
#endif
-
/*
* Definitions of elided procs. Compiler can't inline these since we use
- * pointers to these functions. ElideDisplayProc, ElideUndisplayProc
+ * pointers to these functions. ElideDisplayProc and ElideUndisplayProc are
* special-cased for speed, as potentially many elided DLine chunks if large,
* tag toggle-filled elided region.
*/
-
static void ElideBboxProc(TkText *textPtr,
- TkTextDispChunk *chunkPtr,
- int index, int y, int lineHeight, int baseline,
- int *xPtr, int *yPtr, int *widthPtr,
- int *heightPtr);
+ TkTextDispChunk *chunkPtr, int index, int y,
+ int lineHeight, int baseline, int *xPtr,
+ int *yPtr, int *widthPtr, int *heightPtr);
static int ElideMeasureProc(TkTextDispChunk *chunkPtr, int x);
-static void DisplayDLine(TkText *textPtr,
- DLine *dlPtr, DLine *prevPtr, Pixmap pixmap);
-static void DisplayLineBackground(TkText *textPtr,
- DLine *dlPtr, DLine *prevPtr, Pixmap pixmap);
+static void DisplayDLine(TkText *textPtr, DLine *dlPtr,
+ DLine *prevPtr, Pixmap pixmap);
+static void DisplayLineBackground(TkText *textPtr, DLine *dlPtr,
+ DLine *prevPtr, Pixmap pixmap);
static void DisplayText(ClientData clientData);
static DLine * FindDLine(DLine *dlPtr, CONST TkTextIndex *indexPtr);
static void FreeDLines(TkText *textPtr, DLine *firstPtr,
DLine *lastPtr, int action);
static void FreeStyle(TkText *textPtr, TextStyle *stylePtr);
static TextStyle * GetStyle(TkText *textPtr, CONST TkTextIndex *indexPtr);
-static void GetXView(Tcl_Interp *interp,
- TkText *textPtr, int report);
-static void GetYView(Tcl_Interp *interp,
- TkText *textPtr, int report);
+static void GetXView(Tcl_Interp *interp, TkText *textPtr,
+ int report);
+static void GetYView(Tcl_Interp *interp, TkText *textPtr,
+ int report);
static int GetYPixelCount(TkText *textPtr, DLine *dlPtr);
static DLine * LayoutDLine(TkText *textPtr,
CONST TkTextIndex *indexPtr);
@@ -768,12 +754,10 @@ GetStyle(
int numTags, isNew, i;
XGCValues gcValues;
unsigned long mask;
-
/*
* The variables below keep track of the highest-priority specification
* that has occurred for each of the various fields of the StyleValues.
*/
-
int borderPrio, borderWidthPrio, reliefPrio, bgStipplePrio;
int fgPrio, fontPrio, fgStipplePrio;
int underlinePrio, elidePrio, justifyPrio, offsetPrio;
@@ -794,7 +778,7 @@ GetStyle(
lMargin1Prio = lMargin2Prio = rMarginPrio = -1;
spacing1Prio = spacing2Prio = spacing3Prio = -1;
overstrikePrio = tabPrio = tabStylePrio = wrapPrio = -1;
- memset((VOID *) &styleValues, 0, sizeof(StyleValues));
+ memset(&styleValues, 0, sizeof(StyleValues));
styleValues.relief = TK_RELIEF_FLAT;
styleValues.fgColor = textPtr->fgColor;
styleValues.tkfont = textPtr->tkfont;
@@ -815,8 +799,8 @@ GetStyle(
/*
* If this is the selection tag, and inactiveSelBorder is NULL (the
- * default on Windows), then we need to skip it if we don't
- * have focus.
+ * default on Windows), then we need to skip it if we don't have the
+ * focus.
*/
if ((tagPtr == textPtr->selTagPtr) && !(textPtr->flags & GOT_FOCUS)) {
@@ -1116,7 +1100,7 @@ LayoutDLine(
* from the end of the line. */
int byteOffset, ascent, descent, code, elide, elidesize;
StyleValues *sValuePtr;
- TkTextElideInfo info; /* Keep track of elide state */
+ TkTextElideInfo info; /* Keep track of elide state. */
/*
* Create and initialize a new DLine structure.
@@ -1126,7 +1110,7 @@ LayoutDLine(
dlPtr->index = *indexPtr;
dlPtr->byteCount = 0;
dlPtr->y = 0;
- dlPtr->oldY = 0; /* Only set to avoid compiler warnings */
+ dlPtr->oldY = 0; /* Only set to avoid compiler warnings. */
dlPtr->height = 0;
dlPtr->baseline = 0;
dlPtr->chunkPtr = NULL;
@@ -1143,7 +1127,7 @@ LayoutDLine(
paragraphStart = (indexPtr->byteIndex == 0);
/*
- * Special case entirely elide line as there may be 1000s or more
+ * Special case entirely elide line as there may be 1000s or more.
*/
elide = TkTextIsElided(textPtr, indexPtr, &info);
@@ -1442,7 +1426,7 @@ LayoutDLine(
#if TK_LAYOUT_WITH_BASE_CHUNKS
if (baseCharChunkPtr != NULL) {
int expectedX =
- ((BaseCharInfo*) baseCharChunkPtr->clientData)->width
+ ((BaseCharInfo *) baseCharChunkPtr->clientData)->width
+ baseCharChunkPtr->x;
if ((expectedX != x) || !IsSameFGStyle(
@@ -1643,7 +1627,6 @@ LayoutDLine(
wholeLine = 0;
}
-
/*
* Make tab adjustments for the last tab stop, if there is one.
*/
@@ -2021,7 +2004,7 @@ UpdateDisplayInfo(
*/
lineNum = -1;
- bytesToCount = 0; /* Stop compiler warning */
+ bytesToCount = 0; /* Stop compiler warning. */
} else {
lineNum = TkBTreeLinesTo(textPtr,
dInfoPtr->dLinePtr->index.linePtr);
@@ -2423,8 +2406,8 @@ DisplayDLine(
}
/*
- * Don't call if elide. This tax ok since not very many visible
- * DLine's in an area, but potentially many elide ones
+ * Don't call if elide. This tax OK since not very many visible DLines
+ * in an area, but potentially many elide ones.
*/
if (chunkPtr->displayProc != NULL) {
@@ -2973,8 +2956,8 @@ AsyncUpdateLineMetrics(
int
TkTextUpdateLineMetrics(
TkText *textPtr, /* Information about widget. */
- int lineNum, /* Start at this line */
- int endLine, /* Go no further than this line */
+ int lineNum, /* Start at this line. */
+ int endLine, /* Go no further than this line. */
int doThisMuch) /* How many lines to check, or how many 10s of
* lines to recalculate. If '-1' then do
* everything in the range (which may take a
@@ -2985,7 +2968,10 @@ TkTextUpdateLineMetrics(
int totalLines = TkBTreeNumLines(textPtr->sharedTextPtr->tree, textPtr);
if (totalLines == 0) {
- /* Empty peer widget */
+ /*
+ * Empty peer widget.
+ */
+
return endLine;
}
@@ -3312,7 +3298,7 @@ TextInvalidateLineMetrics(
}
/*
- * Now re-set the current update calculations
+ * Now re-set the current update calculations.
*/
if (dInfoPtr->lineUpdateTimer == NULL) {
@@ -3746,6 +3732,7 @@ TkTextUpdateOneLine(
*/
TkTextIndex idx;
+
TkTextIndexBackChars(textPtr, indexPtr, 1, &idx, COUNT_INDICES);
if (!TkTextIsElided(textPtr, &idx, NULL)) {
/*
@@ -4071,10 +4058,9 @@ DisplayText(
*/
damageRgn = TkCreateRegion();
- if (TkScrollWindow(textPtr->tkwin, dInfoPtr->scrollGC,
- dInfoPtr->x, oldY,
- (dInfoPtr->maxX - dInfoPtr->x), height,
- 0, y - oldY, damageRgn)) {
+ if (TkScrollWindow(textPtr->tkwin, dInfoPtr->scrollGC, dInfoPtr->x,
+ oldY, dInfoPtr->maxX-dInfoPtr->x, height, 0, y-oldY,
+ damageRgn)) {
TextInvalidateRegion(textPtr, damageRgn);
}
numCopies++;
@@ -4194,7 +4180,9 @@ DisplayText(
for (prevPtr = NULL, dlPtr = textPtr->dInfoPtr->dLinePtr;
(dlPtr != NULL) && (dlPtr->y < dInfoPtr->maxY);
prevPtr = dlPtr, dlPtr = dlPtr->nextPtr) {
- if (dlPtr->chunkPtr == NULL) continue;
+ if (dlPtr->chunkPtr == NULL) {
+ continue;
+ }
if ((dlPtr->flags & OLD_Y_INVALID) || dlPtr->oldY != dlPtr->y) {
if (tkTextDebug) {
char string[TK_POS_CHARS];
@@ -4252,9 +4240,8 @@ DisplayText(
TkTextEmbWinDisplayProc(textPtr, chunkPtr, x,
dlPtr->spaceAbove,
dlPtr->height-dlPtr->spaceAbove-dlPtr->spaceBelow,
- dlPtr->baseline - dlPtr->spaceAbove,
- NULL, (Drawable) None,
- dlPtr->y + dlPtr->spaceAbove);
+ dlPtr->baseline - dlPtr->spaceAbove, NULL,
+ (Drawable) None, dlPtr->y + dlPtr->spaceAbove);
}
}
@@ -4292,14 +4279,13 @@ DisplayText(
}
dInfoPtr->topOfEof = bottomY;
- doScrollbars:
-
/*
* Update the vertical scrollbar, if there is one. Note: it's important to
* clear REDRAW_PENDING here, just in case the scroll function does
* something that requires redisplay.
*/
+ doScrollbars:
if (textPtr->flags & UPDATE_SCROLLBARS) {
textPtr->flags &= ~UPDATE_SCROLLBARS;
if (textPtr->yScrollCmd != NULL) {
@@ -4344,7 +4330,6 @@ DisplayText(
*----------------------------------------------------------------------
*/
- /* ARGSUSED */
void
TkTextEventuallyRepick(
TkText *textPtr) /* Widget record for text widget. */
@@ -4376,7 +4361,6 @@ TkTextEventuallyRepick(
*----------------------------------------------------------------------
*/
- /* ARGSUSED */
void
TkTextRedrawRegion(
TkText *textPtr, /* Widget record for text widget. */
@@ -4491,7 +4475,7 @@ TextInvalidateRegion(
void
TkTextChanged(
- TkSharedText *sharedTextPtr,/* Shared widget section, or NULL */
+ TkSharedText *sharedTextPtr,/* Shared widget section, or NULL. */
TkText *textPtr, /* Widget record for text widget, or NULL. */
CONST TkTextIndex*index1Ptr,/* Index of first character to redisplay. */
CONST TkTextIndex*index2Ptr)/* Index of character just after last one to
@@ -4590,7 +4574,7 @@ TextChanged(
void
TkTextRedrawTag(
- TkSharedText *sharedTextPtr,/* Shared widget section, or NULL */
+ TkSharedText *sharedTextPtr,/* Shared widget section, or NULL. */
TkText *textPtr, /* Widget record for text widget. */
TkTextIndex *index1Ptr, /* First character in range to consider for
* redisplay. NULL means start at beginning of
@@ -4811,7 +4795,7 @@ void
TkTextRelayoutWindow(
TkText *textPtr, /* Widget record for text widget. */
int mask) /* OR'd collection of bits showing what has
- * changed */
+ * changed. */
{
TextDInfo *dInfoPtr = textPtr->dInfoPtr;
GC newGC;
@@ -4979,7 +4963,7 @@ TkTextSetYView(
if (pickPlace == TK_TEXT_NOPIXELADJUST) {
if (textPtr->topIndex.linePtr == indexPtr->linePtr
- && textPtr->topIndex.byteIndex == indexPtr->byteIndex) {
+ && textPtr->topIndex.byteIndex == indexPtr->byteIndex) {
pickPlace = dInfoPtr->topPixelOffset;
} else {
pickPlace = 0;
@@ -5022,8 +5006,7 @@ TkTextSetYView(
dlPtr = NULL;
} else if ((dlPtr->index.linePtr == indexPtr->linePtr)
&& (dlPtr->index.byteIndex <= indexPtr->byteIndex)) {
- if (dInfoPtr->dLinePtr == dlPtr
- && dInfoPtr->topPixelOffset != 0) {
+ if (dInfoPtr->dLinePtr == dlPtr && dInfoPtr->topPixelOffset != 0) {
/*
* It is on the top line, but that line is hanging off the top
* of the screen. Change the top overlap to zero and update.
@@ -5355,7 +5338,7 @@ TkTextSeeCmd(
byteCount = index.byteIndex - dlPtr->index.byteIndex;
for (chunkPtr = dlPtr->chunkPtr; chunkPtr != NULL ;
- chunkPtr = chunkPtr->nextPtr) {
+ chunkPtr = chunkPtr->nextPtr) {
if (byteCount < chunkPtr->numBytes) {
break;
}
@@ -5652,8 +5635,8 @@ YScrollByLines(
* top window border.
*/
- TkTextMakeByteIndex(textPtr->sharedTextPtr->tree, textPtr,
- 0, 0, &textPtr->topIndex);
+ TkTextMakeByteIndex(textPtr->sharedTextPtr->tree, textPtr, 0, 0,
+ &textPtr->topIndex);
dInfoPtr->newTopPixelOffset = 0;
} else {
/*
@@ -6028,7 +6011,7 @@ GetXView(
last = 1.0;
}
if (!report) {
- listObj = Tcl_NewListObj(0,NULL);
+ listObj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(interp, listObj, Tcl_NewDoubleObj(first));
Tcl_ListObjAppendElement(interp, listObj, Tcl_NewDoubleObj(last));
Tcl_SetObjResult(interp, listObj);
@@ -6093,9 +6076,10 @@ static int
GetYPixelCount(
TkText *textPtr, /* Information about text widget. */
DLine *dlPtr) /* Information about the layout of a given
- * index */
+ * index. */
{
TkTextLine *linePtr = dlPtr->index.linePtr;
+ int count;
/*
* Get the pixel count to the top of dlPtr's logical line. The rest of the
@@ -6103,7 +6087,7 @@ GetYPixelCount(
* between the top of the logical line and the display line.
*/
- int count = TkBTreePixelsTo(textPtr, linePtr);
+ count = TkBTreePixelsTo(textPtr, linePtr);
/*
* For the common case where this dlPtr is also the start of the logical
@@ -6137,10 +6121,10 @@ GetYPixelCount(
if (dlPtr->nextPtr == NULL) {
/*
* We've run out of pre-calculated display lines, so we have to
- * lay them out ourselves until the end of the logical line.
- * Here's where we could be clever and ask: what's faster, to
- * layout all lines from here to line-end, or all lines from the
- * original dlPtr to the line-start? We just assume the former.
+ * lay them out ourselves until the end of the logical line. Here
+ * is where we could be clever and ask: what's faster, to layout
+ * all lines from here to line-end, or all lines from the original
+ * dlPtr to the line-start? We just assume the former.
*/
TkTextIndex index;
@@ -6250,8 +6234,8 @@ GetYView(
while (1) {
int extra;
- count += dlPtr->height;
+ count += dlPtr->height;
extra = dlPtr->y + dlPtr->height - dInfoPtr->maxY;
if (extra > 0) {
/*
@@ -6528,9 +6512,11 @@ TkTextPixelIndex(
return;
} else {
for (dlPtr = validDlPtr = dInfoPtr->dLinePtr;
- y >= (dlPtr->y + dlPtr->height);
- dlPtr = dlPtr->nextPtr) {
- if (dlPtr->chunkPtr !=NULL) validDlPtr = dlPtr;
+ y >= (dlPtr->y + dlPtr->height);
+ dlPtr = dlPtr->nextPtr) {
+ if (dlPtr->chunkPtr != NULL) {
+ validDlPtr = dlPtr;
+ }
if (dlPtr->nextPtr == NULL) {
/*
* Y-coordinate is off the bottom of the displayed text. Use
@@ -6663,7 +6649,7 @@ void
TkTextIndexOfX(
TkText *textPtr, /* Widget record for text widget. */
int x, /* The x coordinate for which we want the
- * index */
+ * index. */
TkTextIndex *indexPtr) /* Index of display line start, which will be
* adjusted to the index under the given x
* coordinate. */
@@ -6709,7 +6695,9 @@ DlineXOfIndex(
register TkTextDispChunk *chunkPtr = dlPtr->chunkPtr;
int x;
- if (byteIndex == 0 || chunkPtr == NULL) return 0;
+ if (byteIndex == 0 || chunkPtr == NULL) {
+ return 0;
+ }
/*
* Scan through the line's chunks to find the one that contains the
@@ -6749,9 +6737,9 @@ DlineXOfIndex(
* the entity (character, window, image) at that index.
*
* Results:
- * Zero is returned if the index is on the screen. -1 means the index
- * isn't on the screen. If the return value is 0, then the bounding box
- * of the part of the index that's visible on the screen is returned to
+ * Zero is returned if the index is on the screen. -1 means the index is
+ * not on the screen. If the return value is 0, then the bounding box of
+ * the part of the index that's visible on the screen is returned to
* *xPtr, *yPtr, *widthPtr, and *heightPtr.
*
* Side effects:
@@ -6937,7 +6925,7 @@ TkTextDLineInfo(
}
/*
- * Get bounding-box information about an elided chunk
+ * Get bounding-box information about an elided chunk.
*/
static void
@@ -6965,7 +6953,7 @@ ElideBboxProc(
}
/*
- * Measure an elided chunk
+ * Measure an elided chunk.
*/
static int
@@ -7050,17 +7038,16 @@ TkTextCharLayoutProc(
#if TK_LAYOUT_WITH_BASE_CHUNKS
if (baseCharChunkPtr == NULL) {
-
baseCharChunkPtr = chunkPtr;
- bciPtr = (BaseCharInfo*) ckalloc(sizeof(BaseCharInfo));
+ bciPtr = (BaseCharInfo *) ckalloc(sizeof(BaseCharInfo));
baseString = &bciPtr->baseChars;
Tcl_DStringInit(baseString);
bciPtr->width = 0;
ciPtr = &bciPtr->ci;
} else {
- bciPtr = (BaseCharInfo*) baseCharChunkPtr->clientData;
- ciPtr = (CharInfo*) ckalloc(sizeof(CharInfo));
+ bciPtr = (BaseCharInfo *) baseCharChunkPtr->clientData;
+ ciPtr = (CharInfo *) ckalloc(sizeof(CharInfo));
baseString = &bciPtr->baseChars;
}
@@ -7076,7 +7063,7 @@ TkTextCharLayoutProc(
bytesThatFit = CharChunkMeasureChars(chunkPtr, line,
lineOffset + maxBytes, lineOffset, -1, chunkPtr->x, maxX,
TK_ISOLATE_END, &nextX);
-#else /* !TK_LAYOUT_WITH_BASE_CHUNKS */
+#else /* !TK_LAYOUT_WITH_BASE_CHUNKS */
bytesThatFit = CharChunkMeasureChars(chunkPtr, p, maxBytes, 0, -1,
chunkPtr->x, maxX, TK_ISOLATE_END, &nextX);
#endif /* TK_LAYOUT_WITH_BASE_CHUNKS */
@@ -7087,13 +7074,12 @@ TkTextCharLayoutProc(
int chLen = Tcl_UtfToUniChar(p, &ch);
#if TK_LAYOUT_WITH_BASE_CHUNKS
- bytesThatFit = CharChunkMeasureChars(
- chunkPtr, line, lineOffset + chLen, lineOffset, -1,
- chunkPtr->x, -1, 0, &nextX);
-#else /* !TK_LAYOUT_WITH_BASE_CHUNKS */
- bytesThatFit = CharChunkMeasureChars(
- chunkPtr, p, chLen, 0, -1,
- chunkPtr->x, -1, 0, &nextX);
+ bytesThatFit = CharChunkMeasureChars(chunkPtr, line,
+ lineOffset+chLen, lineOffset, -1, chunkPtr->x, -1, 0,
+ &nextX);
+#else /* !TK_LAYOUT_WITH_BASE_CHUNKS */
+ bytesThatFit = CharChunkMeasureChars(chunkPtr, p, chLen, 0, -1,
+ chunkPtr->x, -1, 0, &nextX);
#endif /* TK_LAYOUT_WITH_BASE_CHUNKS */
}
if ((nextX < maxX) && ((p[bytesThatFit] == ' ')
@@ -7124,7 +7110,7 @@ TkTextCharLayoutProc(
} else {
Tcl_DStringSetLength(baseString,lineOffset);
}
- ckfree((char*)ciPtr);
+ ckfree((char *) ciPtr);
#endif /* TK_LAYOUT_WITH_BASE_CHUNKS */
return 0;
}
@@ -7162,7 +7148,6 @@ TkTextCharLayoutProc(
}
#if TK_LAYOUT_WITH_BASE_CHUNKS
-
/*
* Final update for the current base chunk data.
*/
@@ -7178,7 +7163,6 @@ TkTextCharLayoutProc(
if (ciPtr->numBytes > 0 && p[ciPtr->numBytes - 1] == '\t') {
FinalizeBaseChunk(chunkPtr);
}
-
#endif /* TK_LAYOUT_WITH_BASE_CHUNKS */
/*
@@ -7215,21 +7199,21 @@ TkTextCharLayoutProc(
/*
*---------------------------------------------------------------------------
*
- * CharChunkMeasureChars --
+ * CharChunkMeasureChars --
*
* Determine the number of characters from a char chunk that will fit in
* the given horizontal span.
*
* This is the same as MeasureChars (which see), but in the context of a
- * char chunk, i.e. on a higher level of abstraction. Use this function
+ * char chunk, i.e. on a higher level of abstraction. Use this function
* whereever possible instead of plain MeasureChars, so that the right
* context is used automatically.
*
* Results:
- * The return value is the number of bytes from the range of start to
- * end in source that fit in the span given by startX and maxX.
- * *nextXPtr is filled in with the x-coordinate at which the first
- * character that didn't fit would be drawn, if it were to be drawn.
+ * The return value is the number of bytes from the range of start to end
+ * in source that fit in the span given by startX and maxX. *nextXPtr is
+ * filled in with the x-coordinate at which the first character that
+ * didn't fit would be drawn, if it were to be drawn.
*
* Side effects:
* None.
@@ -7241,15 +7225,15 @@ CharChunkMeasureChars(
TkTextDispChunk *chunkPtr, /* Chunk from which to measure. */
const char *chars, /* Chars to use, instead of the chunk's own.
* Used by the layoutproc during chunk setup.
- * All other callers use NULL. Not
+ * All other callers use NULL. Not
* NUL-terminated. */
int charsLen, /* Length of the "chars" parameter. */
int start, int end, /* The range of chars to measure inside the
* chunk (or inside the additional chars). */
int startX, /* Starting x coordinate where the measured
* span will begin. */
- int maxX, /* Maximum pixel width of the span. May be
- * -1 for unlimited. */
+ int maxX, /* Maximum pixel width of the span. May be -1
+ * for unlimited. */
int flags, /* Flags to pass to MeasureChars. */
int *nextXPtr) /* The function puts the newly calculated
* right border x-position of the span
@@ -7275,8 +7259,9 @@ CharChunkMeasureChars(
int fit, bstart = start, bend = end;
if (chars == NULL) {
- Tcl_DString *baseChars =
- &((BaseCharInfo *)ciPtr->baseChunkPtr->clientData)->baseChars;
+ Tcl_DString *baseChars = &((BaseCharInfo *)
+ ciPtr->baseChunkPtr->clientData)->baseChars;
+
chars = Tcl_DStringValue(baseChars);
charsLen = Tcl_DStringLength(baseChars);
bstart += ciPtr->baseOffset;
@@ -7285,16 +7270,15 @@ CharChunkMeasureChars(
} else {
bend += ciPtr->baseOffset;
}
- } else {
- if (bend == -1) {
- bend = charsLen;
- }
+ } else if (bend == -1) {
+ bend = charsLen;
}
if (bstart == ciPtr->baseOffset) {
xDisplacement = startX - chunkPtr->x;
} else {
int widthUntilStart = 0;
+
MeasureChars(tkfont, chars, charsLen, 0, bstart,
0, -1, 0, &widthUntilStart);
xDisplacement = startX - widthUntilStart - chunkPtr->x;
@@ -7352,7 +7336,7 @@ CharDisplayProc(
int numBytes, offsetBytes, offsetX;
#if TK_DRAW_IN_CONTEXT
BaseCharInfo *bciPtr;
-#endif
+#endif /* TK_DRAW_IN_CONTEXT */
if ((x + chunkPtr->width) <= 0) {
/*
@@ -7363,13 +7347,11 @@ CharDisplayProc(
}
#if TK_DRAW_IN_CONTEXT
-
- bciPtr = (BaseCharInfo*) ciPtr->baseChunkPtr->clientData;
+ bciPtr = (BaseCharInfo *) ciPtr->baseChunkPtr->clientData;
numBytes = Tcl_DStringLength(&bciPtr->baseChars);
string = Tcl_DStringValue(&bciPtr->baseChars);
#elif TK_LAYOUT_WITH_BASE_CHUNKS
-
if (ciPtr->baseChunkPtr != chunkPtr) {
/*
* Without context drawing only base chunks display their foreground.
@@ -7378,14 +7360,12 @@ CharDisplayProc(
return;
}
- numBytes = Tcl_DStringLength(&((BaseCharInfo*) ciPtr)->baseChars);
+ numBytes = Tcl_DStringLength(&((BaseCharInfo *) ciPtr)->baseChars);
string = ciPtr->chars;
#else /* !TK_LAYOUT_WITH_BASE_CHUNKS */
-
numBytes = ciPtr->numBytes;
string = ciPtr->chars;
-
#endif /* TK_LAYOUT_WITH_BASE_CHUNKS */
stylePtr = chunkPtr->stylePtr;
@@ -7410,8 +7390,8 @@ CharDisplayProc(
* Draw the text, underline, and overstrike for this chunk.
*/
- if (!sValuePtr->elide && (numBytes > offsetBytes)
- && (stylePtr->fgGC != None)) {
+ if (!sValuePtr->elide && (numBytes > offsetBytes)
+ && (stylePtr->fgGC != None)) {
#if TK_DRAW_IN_CONTEXT
int start = ciPtr->baseOffset + offsetBytes;
int len = ciPtr->numBytes - offsetBytes;
@@ -7438,7 +7418,7 @@ CharDisplayProc(
}
if (sValuePtr->overstrike) {
Tk_FontMetrics fm;
-
+
Tk_GetFontMetrics(sValuePtr->tkfont, &fm);
TkUnderlineCharsInContext(display, dst, stylePtr->fgGC,
sValuePtr->tkfont, string, numBytes,
@@ -7447,7 +7427,7 @@ CharDisplayProc(
- fm.descent - (fm.ascent * 3) / 10,
start, start+len);
}
-#else
+#else /* !TK_DRAW_IN_CONTEXT */
string += offsetBytes;
numBytes -= offsetBytes;
@@ -7473,7 +7453,7 @@ CharDisplayProc(
- fm.descent - (fm.ascent * 3) / 10,
0, numBytes);
}
-#endif
+#endif /* TK_DRAW_IN_CONTEXT */
}
}
@@ -7504,7 +7484,6 @@ CharUndisplayProc(
#if TK_LAYOUT_WITH_BASE_CHUNKS
if (chunkPtr == ciPtr->baseChunkPtr) {
-
/*
* Basechunks are undisplayed first, when DLines are freed or
* partially freed, so this makes sure we don't access their data any
@@ -7512,13 +7491,11 @@ CharUndisplayProc(
*/
FreeBaseChunk(chunkPtr);
-
} else if (ciPtr->baseChunkPtr != NULL) {
-
/*
* When other char chunks are undisplayed, drop their characters from
- * the base chunk. This usually happens, when they are last in a
- * line and need to be re-layed out.
+ * the base chunk. This usually happens, when they are last in a line
+ * and need to be re-layed out.
*/
RemoveFromBaseChunk(chunkPtr);
@@ -7559,9 +7536,8 @@ CharMeasureProc(
{
int endX;
- return CharChunkMeasureChars(
- chunkPtr, NULL, 0, 0, chunkPtr->numBytes - 1, chunkPtr->x, x, 0,
- &endX); /* CHAR OFFSET */
+ return CharChunkMeasureChars(chunkPtr, NULL, 0, 0, chunkPtr->numBytes-1,
+ chunkPtr->x, x, 0, &endX); /* CHAR OFFSET */
}
/*
@@ -7881,7 +7857,7 @@ SizeOfTab(
tabWidth = 1;
}
} else {
- tabWidth = 0; /* Avoid compiler error */
+ tabWidth = 0; /* Avoid compiler error. */
}
do {
@@ -8029,10 +8005,10 @@ NextTabStop(
* that point.
*
* Results:
- * The return value is the number of bytes from the range of start to
- * end in source that fit in the span given by startX and maxX.
- * *nextXPtr is filled in with the x-coordinate at which the first
- * character that didn't fit would be drawn, if it were to be drawn.
+ * The return value is the number of bytes from the range of start to end
+ * in source that fit in the span given by startX and maxX. *nextXPtr is
+ * filled in with the x-coordinate at which the first character that
+ * didn't fit would be drawn, if it were to be drawn.
*
* Side effects:
* None.
@@ -8095,7 +8071,7 @@ MeasureChars(
(void) maxBytes;
start += Tk_MeasureChars(tkfont, start, special - start,
maxX >= 0 ? maxX - curX : -1, flags, &width);
-#endif
+#endif /* TK_DRAW_IN_CONTEXT */
curX += width;
if (start < special) {
/*
@@ -8224,8 +8200,8 @@ TextGetScrollInfoObj(
* FinalizeBaseChunk --
*
* This procedure makes sure that all the chunks of the stretch are
- * up-to-date. It is invoked when the LayoutProc has been called for
- * all chunks and the base chunk is stable.
+ * up-to-date. It is invoked when the LayoutProc has been called for all
+ * chunks and the base chunk is stable.
*
* Results:
* None.
@@ -8239,33 +8215,32 @@ TextGetScrollInfoObj(
static void
FinalizeBaseChunk(
- TkTextDispChunk *addChunkPtr) /* An additional chunk to add to the
- * stretch, even though it may not be
- * in the linked list yet. Used by
- * the LayoutProc, otherwise NULL. */
+ TkTextDispChunk *addChunkPtr)
+ /* An additional chunk to add to the stretch,
+ * even though it may not be in the linked
+ * list yet. Used by the LayoutProc, otherwise
+ * NULL. */
{
const char *baseChars;
TkTextDispChunk *chunkPtr;
- CharInfo * ciPtr;
+ CharInfo *ciPtr;
#if TK_DRAW_IN_CONTEXT
int widthAdjust = 0;
int newwidth;
-#endif
+#endif /* TK_DRAW_IN_CONTEXT */
if (baseCharChunkPtr == NULL) {
return;
}
baseChars = Tcl_DStringValue(
- &((BaseCharInfo*) baseCharChunkPtr->clientData)->baseChars);
-
- for (chunkPtr = baseCharChunkPtr;
- chunkPtr != NULL;
- chunkPtr = chunkPtr->nextPtr) {
+ &((BaseCharInfo *) baseCharChunkPtr->clientData)->baseChars);
+ for (chunkPtr = baseCharChunkPtr; chunkPtr != NULL;
+ chunkPtr = chunkPtr->nextPtr) {
#if TK_DRAW_IN_CONTEXT
chunkPtr->x += widthAdjust;
-#endif
+#endif /* TK_DRAW_IN_CONTEXT */
if (chunkPtr->displayProc != CharDisplayProc) {
continue;
@@ -8278,27 +8253,23 @@ FinalizeBaseChunk(
#if TK_DRAW_IN_CONTEXT
newwidth = 0;
- CharChunkMeasureChars(
- chunkPtr, NULL, 0, 0, -1, 0, -1, 0, &newwidth);
+ CharChunkMeasureChars(chunkPtr, NULL, 0, 0, -1, 0, -1, 0, &newwidth);
if (newwidth != chunkPtr->width) {
widthAdjust += newwidth - chunkPtr->width;
chunkPtr->width = newwidth;
}
-#endif
-
+#endif /* TK_DRAW_IN_CONTEXT */
}
if (addChunkPtr != NULL) {
-
ciPtr = (CharInfo *)addChunkPtr->clientData;
ciPtr->chars = baseChars + ciPtr->baseOffset;
#if TK_DRAW_IN_CONTEXT
addChunkPtr->x += widthAdjust;
- CharChunkMeasureChars(
- addChunkPtr, NULL, 0, 0, -1, 0, -1, 0, &addChunkPtr->width);
-#endif
-
+ CharChunkMeasureChars(addChunkPtr, NULL, 0, 0, -1, 0, -1, 0,
+ &addChunkPtr->width);
+#endif /* TK_DRAW_IN_CONTEXT */
}
baseCharChunkPtr = NULL;
@@ -8311,7 +8282,7 @@ FinalizeBaseChunk(
*
* This procedure makes sure that all the chunks of the stretch are
* disconnected from the base chunk and the base chunk specific data is
- * freed. It is invoked from the UndisplayProc. The procedure doesn't
+ * freed. It is invoked from the UndisplayProc. The procedure doesn't
* ckfree the base chunk clientData itself, that's up to the main
* UndisplayProc.
*
@@ -8319,7 +8290,7 @@ FinalizeBaseChunk(
* None.
*
* Side effects:
- * The CharInfo.chars of all dependent chunks are set to NULL. Memory
+ * The CharInfo.chars of all dependent chunks are set to NULL. Memory
* that belongs specifically to the base chunk is freed.
*
*----------------------------------------------------------------------
@@ -8327,8 +8298,9 @@ FinalizeBaseChunk(
static void
FreeBaseChunk(
- TkTextDispChunk * baseChunkPtr) /* The base chunk of the stretch and
- * head of the linked list. */
+ TkTextDispChunk *baseChunkPtr)
+ /* The base chunk of the stretch and head of
+ * the linked list. */
{
TkTextDispChunk *chunkPtr;
CharInfo *ciPtr;
@@ -8337,10 +8309,7 @@ FreeBaseChunk(
baseCharChunkPtr = NULL;
}
- for (chunkPtr = baseChunkPtr;
- chunkPtr != NULL;
- chunkPtr = chunkPtr->nextPtr) {
-
+ for (chunkPtr=baseChunkPtr; chunkPtr!=NULL; chunkPtr=chunkPtr->nextPtr) {
if (chunkPtr->undisplayProc != CharUndisplayProc) {
continue;
}
@@ -8353,7 +8322,7 @@ FreeBaseChunk(
ciPtr->chars = NULL;
}
- Tcl_DStringFree(&((BaseCharInfo*)baseChunkPtr->clientData)->baseChars);
+ Tcl_DStringFree(&((BaseCharInfo *) baseChunkPtr->clientData)->baseChars);
}
/*
@@ -8361,9 +8330,9 @@ FreeBaseChunk(
*
* IsSameFGStyle --
*
- * Compare the foreground attributes of two styles. Specifically
- * consider: Foreground color, font, font style and font decorations,
- * elide, "offset" and foreground stipple. *Don't* consider: Background
+ * Compare the foreground attributes of two styles. Specifically must
+ * consider: foreground color, font, font style and font decorations,
+ * elide, "offset" and foreground stipple. Do *not* consider: background
* color, border, relief or background stipple.
*
* If we use TkpDrawCharsInContext(), we also don't need to check
@@ -8383,7 +8352,7 @@ FreeBaseChunk(
static int
IsSameFGStyle(
TextStyle *style1,
- TextStyle *style2)
+ TextStyle *style2)
{
StyleValues *sv1;
StyleValues *sv2;
@@ -8393,36 +8362,31 @@ IsSameFGStyle(
}
#if !TK_DRAW_IN_CONTEXT
-
if (
#ifdef MAC_OSX_TK
!TkMacOSXCompareColors(style1->fgGC->foreground,
- style2->fgGC->foreground)
+ style2->fgGC->foreground)
#else
style1->fgGC->foreground != style2->fgGC->foreground
#endif
) {
return 0;
}
-
-#endif
+#endif /* !TK_DRAW_IN_CONTEXT */
sv1 = style1->sValuePtr;
sv2 = style2->sValuePtr;
#if TK_DRAW_IN_CONTEXT
- return sv1->tkfont == sv2->tkfont
- && sv1->offset == sv2->offset
- ;
+ return sv1->tkfont == sv2->tkfont && sv1->offset == sv2->offset;
#else
- return sv1->tkfont == sv2->tkfont
- && sv1->underline == sv2->underline
- && sv1->overstrike == sv2->overstrike
- && sv1->elide == sv2->elide
- && sv1->offset == sv2->offset
- && sv1->fgStipple == sv1->fgStipple
- ;
-#endif
+ return sv1->tkfont == sv2->tkfont
+ && sv1->underline == sv2->underline
+ && sv1->overstrike == sv2->overstrike
+ && sv1->elide == sv2->elide
+ && sv1->offset == sv2->offset
+ && sv1->fgStipple == sv1->fgStipple;
+#endif /* TK_DRAW_IN_CONTEXT */
}
/*
@@ -8431,29 +8395,29 @@ IsSameFGStyle(
* RemoveFromBaseChunk --
*
* This procedure removes a chunk from the stretch as a result of
- * UndisplayProc. The chunk in question should be the last in a
- * stretch. This happens during re-layouting of the break position.
+ * UndisplayProc. The chunk in question should be the last in a stretch.
+ * This happens during re-layouting of the break position.
*
* Results:
* None.
*
* Side effects:
* The characters that belong to this chunk are removed from the base
- * chunk. It is assumed that LayoutProc and FinalizeBaseChunk are
- * called next to repair any damage that this causes to the integrity of
- * the stretch and the other chunks. For that reason the base chunk is
- * also put into baseCharChunkPtr automatically, so that LayoutProc can
- * resume correctly.
+ * chunk. It is assumed that LayoutProc and FinalizeBaseChunk are called
+ * next to repair any damage that this causes to the integrity of the
+ * stretch and the other chunks. For that reason the base chunk is also
+ * put into baseCharChunkPtr automatically, so that LayoutProc can resume
+ * correctly.
*
*----------------------------------------------------------------------
*/
static void
RemoveFromBaseChunk(
- TkTextDispChunk *chunkPtr) /* The chunk to remove from the end
- * of the stretch. */
+ TkTextDispChunk *chunkPtr) /* The chunk to remove from the end of the
+ * stretch. */
{
- CharInfo *ciPtr;
+ CharInfo *ciPtr;
BaseCharInfo *bciPtr;
if (chunkPtr->displayProc != CharDisplayProc) {
@@ -8465,14 +8429,14 @@ RemoveFromBaseChunk(
* Reinstitute this base chunk for re-layout.
*/
- ciPtr = (CharInfo*) chunkPtr->clientData;
+ ciPtr = (CharInfo *) chunkPtr->clientData;
baseCharChunkPtr = ciPtr->baseChunkPtr;
/*
* Remove the chunk data from the base chunk data.
*/
- bciPtr = (BaseCharInfo*) baseCharChunkPtr->clientData;
+ bciPtr = (BaseCharInfo *) baseCharChunkPtr->clientData;
if ((ciPtr->baseOffset + ciPtr->numBytes)
!= Tcl_DStringLength(&bciPtr->baseChars)) {