summaryrefslogtreecommitdiffstats
path: root/generic/tkCanvas.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkCanvas.c')
-rw-r--r--generic/tkCanvas.c772
1 files changed, 419 insertions, 353 deletions
diff --git a/generic/tkCanvas.c b/generic/tkCanvas.c
index 6796ddd..3cb66fe 100644
--- a/generic/tkCanvas.c
+++ b/generic/tkCanvas.c
@@ -101,7 +101,7 @@ static const Tk_ConfigSpec configSpecs[] = {
{TK_CONFIG_SYNONYM, "-bd", "borderWidth", NULL, NULL, 0, 0, NULL},
{TK_CONFIG_SYNONYM, "-bg", "background", NULL, NULL, 0, 0, NULL},
{TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
- DEF_CANVAS_BORDER_WIDTH, offsetof(TkCanvas, borderWidth), 0, NULL},
+ DEF_CANVAS_BORDER_WIDTH, offsetof(TkCanvas, borderWidthObj), TK_CONFIG_OBJS, NULL},
{TK_CONFIG_DOUBLE, "-closeenough", "closeEnough", "CloseEnough",
DEF_CANVAS_CLOSE_ENOUGH, offsetof(TkCanvas, closeEnough), 0, NULL},
{TK_CONFIG_BOOLEAN, "-confine", "confine", "Confine",
@@ -109,7 +109,7 @@ static const Tk_ConfigSpec configSpecs[] = {
{TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
DEF_CANVAS_CURSOR, offsetof(TkCanvas, cursor), TK_CONFIG_NULL_OK, NULL},
{TK_CONFIG_PIXELS, "-height", "height", "Height",
- DEF_CANVAS_HEIGHT, offsetof(TkCanvas, height), 0, NULL},
+ DEF_CANVAS_HEIGHT, offsetof(TkCanvas, heightObj), TK_CONFIG_OBJS, NULL},
{TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground",
"HighlightBackground", DEF_CANVAS_HIGHLIGHT_BG,
offsetof(TkCanvas, highlightBgColorPtr), 0, NULL},
@@ -117,29 +117,29 @@ static const Tk_ConfigSpec configSpecs[] = {
DEF_CANVAS_HIGHLIGHT, offsetof(TkCanvas, highlightColorPtr), 0, NULL},
{TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness",
"HighlightThickness",
- DEF_CANVAS_HIGHLIGHT_WIDTH, offsetof(TkCanvas, highlightWidth), 0, NULL},
+ DEF_CANVAS_HIGHLIGHT_WIDTH, offsetof(TkCanvas, highlightWidthObj), TK_CONFIG_OBJS, NULL},
{TK_CONFIG_BORDER, "-insertbackground", "insertBackground", "Foreground",
DEF_CANVAS_INSERT_BG, offsetof(TkCanvas, textInfo.insertBorder), 0, NULL},
{TK_CONFIG_PIXELS, "-insertborderwidth", "insertBorderWidth", "BorderWidth",
- DEF_CANVAS_INSERT_BD_COLOR,
- offsetof(TkCanvas, textInfo.insertBorderWidth), TK_CONFIG_COLOR_ONLY, NULL},
+ DEF_CANVAS_INSERT_BD_COLOR, offsetof(TkCanvas, textInfo.reserved1),
+ TK_CONFIG_OBJS|TK_CONFIG_COLOR_ONLY, NULL},
{TK_CONFIG_PIXELS, "-insertborderwidth", "insertBorderWidth", "BorderWidth",
- DEF_CANVAS_INSERT_BD_MONO,
- offsetof(TkCanvas, textInfo.insertBorderWidth), TK_CONFIG_MONO_ONLY, NULL},
+ DEF_CANVAS_INSERT_BD_MONO, offsetof(TkCanvas, textInfo.reserved1),
+ TK_CONFIG_OBJS|TK_CONFIG_MONO_ONLY, NULL},
{TK_CONFIG_INT, "-insertofftime", "insertOffTime", "OffTime",
DEF_CANVAS_INSERT_OFF_TIME, offsetof(TkCanvas, insertOffTime), 0, NULL},
{TK_CONFIG_INT, "-insertontime", "insertOnTime", "OnTime",
DEF_CANVAS_INSERT_ON_TIME, offsetof(TkCanvas, insertOnTime), 0, NULL},
{TK_CONFIG_PIXELS, "-insertwidth", "insertWidth", "InsertWidth",
- DEF_CANVAS_INSERT_WIDTH, offsetof(TkCanvas, textInfo.insertWidth), 0, NULL},
+ DEF_CANVAS_INSERT_WIDTH, offsetof(TkCanvas, textInfo.reserved2), TK_CONFIG_OBJS, NULL},
{TK_CONFIG_CUSTOM, "-offset", "offset", "Offset", "0,0",
offsetof(TkCanvas, tsoffset),TK_CONFIG_DONT_SET_DEFAULT,
&offsetOption},
{TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
DEF_CANVAS_RELIEF, offsetof(TkCanvas, relief), 0, NULL},
{TK_CONFIG_STRING, "-scrollregion", "scrollRegion", "ScrollRegion",
- DEF_CANVAS_SCROLL_REGION, offsetof(TkCanvas, regionString),
- TK_CONFIG_NULL_OK, NULL},
+ DEF_CANVAS_SCROLL_REGION, offsetof(TkCanvas, regionObj),
+ TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL},
{TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
DEF_CANVAS_SELECT_COLOR, offsetof(TkCanvas, textInfo.selBorder),
TK_CONFIG_COLOR_ONLY, NULL},
@@ -147,11 +147,11 @@ static const Tk_ConfigSpec configSpecs[] = {
DEF_CANVAS_SELECT_MONO, offsetof(TkCanvas, textInfo.selBorder),
TK_CONFIG_MONO_ONLY, NULL},
{TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
- DEF_CANVAS_SELECT_BD_COLOR,
- offsetof(TkCanvas, textInfo.selBorderWidth), TK_CONFIG_COLOR_ONLY, NULL},
+ DEF_CANVAS_SELECT_BD_COLOR, offsetof(TkCanvas, textInfo.reserved3),
+ TK_CONFIG_OBJS|TK_CONFIG_COLOR_ONLY, NULL},
{TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
- DEF_CANVAS_SELECT_BD_MONO, offsetof(TkCanvas, textInfo.selBorderWidth),
- TK_CONFIG_MONO_ONLY, NULL},
+ DEF_CANVAS_SELECT_BD_MONO, offsetof(TkCanvas, textInfo.reserved3),
+ TK_CONFIG_OBJS|TK_CONFIG_MONO_ONLY, NULL},
{TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
DEF_CANVAS_SELECT_FG_COLOR, offsetof(TkCanvas, textInfo.selFgColorPtr),
TK_CONFIG_COLOR_ONLY|TK_CONFIG_NULL_OK, NULL},
@@ -162,24 +162,24 @@ static const Tk_ConfigSpec configSpecs[] = {
"normal", offsetof(TkCanvas, canvas_state), TK_CONFIG_DONT_SET_DEFAULT,
&stateOption},
{TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus",
- DEF_CANVAS_TAKE_FOCUS, offsetof(TkCanvas, takeFocus),
- TK_CONFIG_NULL_OK, NULL},
+ DEF_CANVAS_TAKE_FOCUS, offsetof(TkCanvas, takeFocusObj),
+ TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL},
{TK_CONFIG_PIXELS, "-width", "width", "Width",
- DEF_CANVAS_WIDTH, offsetof(TkCanvas, width), 0, NULL},
+ DEF_CANVAS_WIDTH, offsetof(TkCanvas, widthObj), TK_CONFIG_OBJS, NULL},
{TK_CONFIG_STRING, "-xscrollcommand", "xScrollCommand", "ScrollCommand",
- DEF_CANVAS_X_SCROLL_CMD, offsetof(TkCanvas, xScrollCmd),
- TK_CONFIG_NULL_OK, NULL},
+ DEF_CANVAS_X_SCROLL_CMD, offsetof(TkCanvas, xScrollCmdObj),
+ TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL},
{TK_CONFIG_PIXELS, "-xscrollincrement", "xScrollIncrement",
"ScrollIncrement",
- DEF_CANVAS_X_SCROLL_INCREMENT, offsetof(TkCanvas, xScrollIncrement),
- 0, NULL},
+ DEF_CANVAS_X_SCROLL_INCREMENT, offsetof(TkCanvas, xScrollIncrementObj),
+ TK_CONFIG_OBJS, NULL},
{TK_CONFIG_STRING, "-yscrollcommand", "yScrollCommand", "ScrollCommand",
- DEF_CANVAS_Y_SCROLL_CMD, offsetof(TkCanvas, yScrollCmd),
- TK_CONFIG_NULL_OK, NULL},
+ DEF_CANVAS_Y_SCROLL_CMD, offsetof(TkCanvas, yScrollCmdObj),
+ TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL},
{TK_CONFIG_PIXELS, "-yscrollincrement", "yScrollIncrement",
"ScrollIncrement",
- DEF_CANVAS_Y_SCROLL_INCREMENT, offsetof(TkCanvas, yScrollIncrement),
- 0, NULL},
+ DEF_CANVAS_Y_SCROLL_INCREMENT, offsetof(TkCanvas, yScrollIncrementObj),
+ TK_CONFIG_OBJS, NULL},
{TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}
};
@@ -266,7 +266,7 @@ static Tcl_Obj * ScrollFractions(int screen1,
int screen2, int object1, int object2);
static int RelinkItems(TkCanvas *canvasPtr, Tcl_Obj *tag,
Tk_Item *prevPtr, TagSearch **searchPtrPtr);
-static void TagSearchExprInit(TagSearchExpr **exprPtrPtr);
+static void TagSearchExprInit(TagSearchExpr **exprPtrPtr);
static void TagSearchExprDestroy(TagSearchExpr *expr);
static void TagSearchDestroy(TagSearch *searchPtr);
static int TagSearchScan(TkCanvas *canvasPtr,
@@ -678,19 +678,20 @@ Tk_CanvasObjCmd(
CanvasCmdDeletedProc);
canvasPtr->firstItemPtr = NULL;
canvasPtr->lastItemPtr = NULL;
- canvasPtr->borderWidth = 0;
+ canvasPtr->borderWidthObj = NULL;
canvasPtr->bgBorder = NULL;
canvasPtr->relief = TK_RELIEF_FLAT;
- canvasPtr->highlightWidth = 0;
+ canvasPtr->highlightWidthObj = NULL;
canvasPtr->highlightBgColorPtr = NULL;
canvasPtr->highlightColorPtr = NULL;
canvasPtr->inset = 0;
canvasPtr->pixmapGC = NULL;
- canvasPtr->width = None;
- canvasPtr->height = None;
+ canvasPtr->widthObj = NULL;
+ canvasPtr->heightObj = NULL;
canvasPtr->confine = 0;
canvasPtr->textInfo.selBorder = NULL;
canvasPtr->textInfo.selBorderWidth = 0;
+ canvasPtr->textInfo.reserved3 = NULL;
canvasPtr->textInfo.selFgColorPtr = NULL;
canvasPtr->textInfo.selItemPtr = NULL;
canvasPtr->textInfo.selectFirst = TCL_INDEX_NONE;
@@ -699,7 +700,9 @@ Tk_CanvasObjCmd(
canvasPtr->textInfo.selectAnchor = 0;
canvasPtr->textInfo.insertBorder = NULL;
canvasPtr->textInfo.insertWidth = 0;
+ canvasPtr->textInfo.reserved2 = NULL;
canvasPtr->textInfo.insertBorderWidth = 0;
+ canvasPtr->textInfo.reserved1 = NULL;
canvasPtr->textInfo.focusItemPtr = NULL;
canvasPtr->textInfo.gotFocus = 0;
canvasPtr->textInfo.cursorOn = 0;
@@ -716,15 +719,15 @@ Tk_CanvasObjCmd(
canvasPtr->pickEvent.xcrossing.x = 0;
canvasPtr->pickEvent.xcrossing.y = 0;
canvasPtr->state = 0;
- canvasPtr->xScrollCmd = NULL;
- canvasPtr->yScrollCmd = NULL;
+ canvasPtr->xScrollCmdObj = NULL;
+ canvasPtr->yScrollCmdObj = NULL;
canvasPtr->scrollX1 = 0;
canvasPtr->scrollY1 = 0;
canvasPtr->scrollX2 = 0;
canvasPtr->scrollY2 = 0;
- canvasPtr->regionString = NULL;
- canvasPtr->xScrollIncrement = 0;
- canvasPtr->yScrollIncrement = 0;
+ canvasPtr->regionObj = NULL;
+ canvasPtr->xScrollIncrementObj = NULL;
+ canvasPtr->yScrollIncrementObj = NULL;
canvasPtr->scanX = 0;
canvasPtr->scanXOrigin = 0;
canvasPtr->scanY = 0;
@@ -732,7 +735,7 @@ Tk_CanvasObjCmd(
canvasPtr->hotPtr = NULL;
canvasPtr->hotPrevPtr = NULL;
canvasPtr->cursor = NULL;
- canvasPtr->takeFocus = NULL;
+ canvasPtr->takeFocusObj = NULL;
canvasPtr->pixelsPerMM = WidthOfScreen(Tk_Screen(newWin));
canvasPtr->pixelsPerMM /= WidthMMOfScreen(Tk_Screen(newWin));
canvasPtr->flags = 0;
@@ -806,7 +809,7 @@ CanvasWidgetCmd(
"canvasy", "cget", "configure", "coords",
"create", "dchars", "delete", "dtag",
"find", "focus", "gettags", "icursor",
- "image", "imove", "index", "insert",
+ "image", "imove", "index", "insert",
"itemcget", "itemconfigure",
"lower", "move", "moveto", "postscript",
"raise", "rchars", "rotate", "scale",
@@ -818,7 +821,7 @@ CanvasWidgetCmd(
CANV_CANVASY, CANV_CGET, CANV_CONFIGURE, CANV_COORDS,
CANV_CREATE, CANV_DCHARS, CANV_DELETE, CANV_DTAG,
CANV_FIND, CANV_FOCUS, CANV_GETTAGS, CANV_ICURSOR,
- CANV_IMAGE, CANV_IMOVE, CANV_INDEX, CANV_INSERT,
+ CANV_IMAGE, CANV_IMOVE, CANV_INDEX, CANV_INSERT,
CANV_ITEMCGET, CANV_ITEMCONFIGURE,
CANV_LOWER, CANV_MOVE, CANV_MOVETO, CANV_POSTSCRIPT,
CANV_RAISE, CANV_RCHARS, CANV_ROTATE, CANV_SCALE,
@@ -963,7 +966,7 @@ CanvasWidgetCmd(
* If new tag expression, then insert in linked list.
*/
- TagSearchExpr *expr, **lastPtr;
+ TagSearchExpr *expr, **lastPtr;
lastPtr = &(canvasPtr->bindTagExprs);
while ((expr = *lastPtr) != NULL) {
@@ -1420,21 +1423,21 @@ CanvasWidgetCmd(
for (i = itemPtr->numTags-1; i != TCL_INDEX_NONE; i--) {
if (itemPtr->tagPtr[i] == tag) {
- /*
- * Don't shuffle the tags sequence: memmove the tags.
- */
+ /*
+ * Don't shuffle the tags sequence: memmove the tags.
+ */
- memmove((void *)(itemPtr->tagPtr + i),
- itemPtr->tagPtr + i + 1,
- (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid));
+ memmove((void *)(itemPtr->tagPtr + i),
+ itemPtr->tagPtr + i + 1,
+ (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid));
itemPtr->numTags--;
- /*
- * There must be no break here: all tags with the same name must
- * be deleted.
- */
+ /*
+ * There must be no break here: all tags with the same name must
+ * be deleted.
+ */
- }
+ }
}
}
break;
@@ -1798,15 +1801,15 @@ CanvasWidgetCmd(
x1 = itemPtr->x1; y1 = itemPtr->y1;
x2 = itemPtr->x2; y2 = itemPtr->y2;
- itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW;
+ itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW;
ItemDelChars(canvasPtr, itemPtr, first, last);
dontRedraw1 = itemPtr->redraw_flags & TK_ITEM_DONT_REDRAW;
- itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW;
+ itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW;
ItemInsert(canvasPtr, itemPtr, first, objv[5]);
dontRedraw2 = itemPtr->redraw_flags & TK_ITEM_DONT_REDRAW;
- if (!(dontRedraw1 && dontRedraw2)) {
+ if (!(dontRedraw1 && dontRedraw2)) {
Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr,
x1, y1, x2, y2);
EventuallyRedrawItem(canvasPtr, itemPtr);
@@ -2054,16 +2057,19 @@ CanvasWidgetCmd(
break;
case TK_SCROLL_PAGES:
newX = (int) (canvasPtr->xOrigin + count * .9
- * (Tk_Width(canvasPtr->tkwin) - 2*canvasPtr->inset));
+ * (Tk_Width(canvasPtr->tkwin) - 2 * canvasPtr->inset));
break;
- case TK_SCROLL_UNITS:
- if (canvasPtr->xScrollIncrement > 0) {
- newX = canvasPtr->xOrigin + count*canvasPtr->xScrollIncrement;
+ case TK_SCROLL_UNITS: {
+ int xScrollIncrement;
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->xScrollIncrementObj, &xScrollIncrement);
+ if (xScrollIncrement > 0) {
+ newX = canvasPtr->xOrigin + count * xScrollIncrement;
} else {
newX = (int) (canvasPtr->xOrigin + count * .1
- * (Tk_Width(canvasPtr->tkwin) - 2*canvasPtr->inset));
+ * (Tk_Width(canvasPtr->tkwin) - 2 * canvasPtr->inset));
}
break;
+ }
default:
result = TCL_ERROR;
goto done;
@@ -2094,16 +2100,19 @@ CanvasWidgetCmd(
break;
case TK_SCROLL_PAGES:
newY = (int) (canvasPtr->yOrigin + count * .9
- * (Tk_Height(canvasPtr->tkwin) - 2*canvasPtr->inset));
+ * (Tk_Height(canvasPtr->tkwin) - 2 * canvasPtr->inset));
break;
- case TK_SCROLL_UNITS:
- if (canvasPtr->yScrollIncrement > 0) {
- newY = canvasPtr->yOrigin + count*canvasPtr->yScrollIncrement;
+ case TK_SCROLL_UNITS: {
+ int yScrollIncrement;
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->yScrollIncrementObj, &yScrollIncrement);
+ if (yScrollIncrement > 0) {
+ newY = canvasPtr->yOrigin + count * yScrollIncrement;
} else {
newY = (int) (canvasPtr->yOrigin + count * .1
- * (Tk_Height(canvasPtr->tkwin) - 2*canvasPtr->inset));
+ * (Tk_Height(canvasPtr->tkwin) - 2 * canvasPtr->inset));
}
break;
+ }
default:
result = TCL_ERROR;
goto done;
@@ -2112,44 +2121,44 @@ CanvasWidgetCmd(
break;
}
case CANV_IMAGE: {
- Tk_PhotoHandle photohandle;
- int subsample = 1, zoom = 1;
+ Tk_PhotoHandle photohandle;
+ int subsample = 1, zoom = 1;
- if (objc < 3 || objc > 5) {
- Tcl_WrongNumArgs(interp, 2, objv, "imagename ?subsample? ?zoom?");
- result = TCL_ERROR;
- goto done;
- }
+ if (objc < 3 || objc > 5) {
+ Tcl_WrongNumArgs(interp, 2, objv, "imagename ?subsample? ?zoom?");
+ result = TCL_ERROR;
+ goto done;
+ }
- if ((photohandle = Tk_FindPhoto(interp, Tcl_GetString(objv[2]) )) == 0) {
- result = TCL_ERROR;
- goto done;
- }
+ if ((photohandle = Tk_FindPhoto(interp, Tcl_GetString(objv[2]) )) == 0) {
+ result = TCL_ERROR;
+ goto done;
+ }
- /*
- * If we are given a subsample or a zoom then grab them.
- */
+ /*
+ * If we are given a subsample or a zoom then grab them.
+ */
- if (objc >= 4 && Tcl_GetIntFromObj(interp, objv[3], &subsample) != TCL_OK) {
- result = TCL_ERROR;
- goto done;
- }
- if (objc >= 5 && Tcl_GetIntFromObj(interp, objv[4], &zoom) != TCL_OK) {
- result = TCL_ERROR;
- goto done;
- }
+ if (objc >= 4 && Tcl_GetIntFromObj(interp, objv[3], &subsample) != TCL_OK) {
+ result = TCL_ERROR;
+ goto done;
+ }
+ if (objc >= 5 && Tcl_GetIntFromObj(interp, objv[4], &zoom) != TCL_OK) {
+ result = TCL_ERROR;
+ goto done;
+ }
- /*
- * Set the image size to zero, which allows the DrawCanvas() function
- * to expand the image automatically when it copies the pixmap into it.
- */
+ /*
+ * Set the image size to zero, which allows the DrawCanvas() function
+ * to expand the image automatically when it copies the pixmap into it.
+ */
- if (Tk_PhotoSetSize(interp, photohandle, 0, 0) != TCL_OK) {
- result = TCL_ERROR;
- goto done;
- }
+ if (Tk_PhotoSetSize(interp, photohandle, 0, 0) != TCL_OK) {
+ result = TCL_ERROR;
+ goto done;
+ }
- result = DrawCanvas(interp, clientData, photohandle, subsample, zoom);
+ result = DrawCanvas(interp, clientData, photohandle, subsample, zoom);
}
}
@@ -2259,6 +2268,8 @@ ConfigureCanvas(
XGCValues gcValues;
GC newGC;
Tk_State old_canvas_state=canvasPtr->canvas_state;
+ int width, height, borderWidth, highlightWidth;
+ int xScrollIncrement, yScrollIncrement;
if (Tk_ConfigureWidget(interp, canvasPtr->tkwin, configSpecs,
objc, objv, canvasPtr,
@@ -2273,10 +2284,70 @@ ConfigureCanvas(
Tk_SetBackgroundFromBorder(canvasPtr->tkwin, canvasPtr->bgBorder);
- if (canvasPtr->highlightWidth < 0) {
- canvasPtr->highlightWidth = 0;
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->borderWidthObj, &borderWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->heightObj, &height);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->highlightWidthObj, &highlightWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved1, &canvasPtr->textInfo.insertBorderWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved2, &canvasPtr->textInfo.insertWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved3, &canvasPtr->textInfo.selBorderWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->widthObj, &width);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->xScrollIncrementObj, &xScrollIncrement);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->yScrollIncrementObj, &yScrollIncrement);
+ if (borderWidth < 0) {
+ borderWidth = 0;
+ Tcl_DecrRefCount(canvasPtr->borderWidthObj);
+ canvasPtr->borderWidthObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(canvasPtr->borderWidthObj);
+ }
+ if (height < 0) {
+ height = 0;
+ Tcl_DecrRefCount(canvasPtr->heightObj);
+ canvasPtr->heightObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(canvasPtr->heightObj);
+ }
+ if (highlightWidth < 0) {
+ highlightWidth = 0;
+ Tcl_DecrRefCount(canvasPtr->highlightWidthObj);
+ canvasPtr->highlightWidthObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(canvasPtr->highlightWidthObj);
+ }
+ if (width < 0) {
+ width = 0;
+ Tcl_DecrRefCount(canvasPtr->widthObj);
+ canvasPtr->widthObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(canvasPtr->widthObj);
+ }
+ if (xScrollIncrement < 0) {
+ xScrollIncrement = 0;
+ Tcl_DecrRefCount(canvasPtr->xScrollIncrementObj);
+ canvasPtr->xScrollIncrementObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(canvasPtr->xScrollIncrementObj);
+ }
+ if (yScrollIncrement < 0) {
+ yScrollIncrement = 0;
+ Tcl_DecrRefCount(canvasPtr->yScrollIncrementObj);
+ canvasPtr->yScrollIncrementObj = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount(canvasPtr->yScrollIncrementObj);
+ }
+ canvasPtr->inset = borderWidth + highlightWidth;
+ if (canvasPtr->textInfo.insertBorderWidth < 0) {
+ canvasPtr->textInfo.insertBorderWidth = 0;
+ Tcl_DecrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved1);
+ canvasPtr->textInfo.reserved1 = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved1);
+ }
+ if (canvasPtr->textInfo.insertWidth < 0) {
+ canvasPtr->textInfo.insertWidth = 0;
+ Tcl_DecrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved2);
+ canvasPtr->textInfo.reserved2 = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved2);
+ }
+ if (canvasPtr->textInfo.selBorderWidth < 0) {
+ canvasPtr->textInfo.selBorderWidth = 0;
+ Tcl_DecrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved3);
+ canvasPtr->textInfo.reserved3 = Tcl_NewIntObj(0);
+ Tcl_IncrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved3);
}
- canvasPtr->inset = canvasPtr->borderWidth + canvasPtr->highlightWidth;
gcValues.function = GXcopy;
gcValues.graphics_exposures = False;
@@ -2297,7 +2368,7 @@ ConfigureCanvas(
int result;
for ( itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
- itemPtr = itemPtr->nextPtr) {
+ itemPtr = itemPtr->nextPtr) {
if ( itemPtr->state == TK_STATE_NULL ) {
result = (*itemPtr->typePtr->configProc)(canvasPtr->interp,
(Tk_Canvas) canvasPtr, itemPtr, 0, NULL,
@@ -2313,8 +2384,8 @@ ConfigureCanvas(
* Reset the desired dimensions for the window.
*/
- Tk_GeometryRequest(canvasPtr->tkwin, canvasPtr->width + 2*canvasPtr->inset,
- canvasPtr->height + 2*canvasPtr->inset);
+ Tk_GeometryRequest(canvasPtr->tkwin, width + 2 * canvasPtr->inset,
+ height + 2 * canvasPtr->inset);
/*
* Restart the cursor timing sequence in case the on-time or off-time just
@@ -2333,22 +2404,22 @@ ConfigureCanvas(
canvasPtr->scrollY1 = 0;
canvasPtr->scrollX2 = 0;
canvasPtr->scrollY2 = 0;
- if (canvasPtr->regionString != NULL) {
+ if (canvasPtr->regionObj != NULL) {
Tcl_Size argc2;
const char **argv2;
- if (Tcl_SplitList(canvasPtr->interp, canvasPtr->regionString,
+ if (Tcl_SplitList(canvasPtr->interp, Tcl_GetString(canvasPtr->regionObj),
&argc2, &argv2) != TCL_OK) {
return TCL_ERROR;
}
if (argc2 != 4) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "bad scrollRegion \"%s\"", canvasPtr->regionString));
+ "bad scrollRegion \"%s\"", Tcl_GetString(canvasPtr->regionObj)));
Tcl_SetErrorCode(interp, "TK", "CANVAS", "SCROLL_REGION", (char *)NULL);
badRegion:
- ckfree(canvasPtr->regionString);
+ Tcl_DecrRefCount(canvasPtr->regionObj);
ckfree(argv2);
- canvasPtr->regionString = NULL;
+ canvasPtr->regionObj = NULL;
return TCL_ERROR;
}
if ((Tk_GetPixels(canvasPtr->interp, canvasPtr->tkwin,
@@ -2368,16 +2439,16 @@ ConfigureCanvas(
if (flags & TK_OFFSET_LEFT) {
canvasPtr->tsoffset.xoffset = 0;
} else if (flags & TK_OFFSET_CENTER) {
- canvasPtr->tsoffset.xoffset = canvasPtr->width/2;
+ canvasPtr->tsoffset.xoffset = width / 2;
} else if (flags & TK_OFFSET_RIGHT) {
- canvasPtr->tsoffset.xoffset = canvasPtr->width;
+ canvasPtr->tsoffset.xoffset = width;
}
if (flags & TK_OFFSET_TOP) {
canvasPtr->tsoffset.yoffset = 0;
} else if (flags & TK_OFFSET_MIDDLE) {
- canvasPtr->tsoffset.yoffset = canvasPtr->height/2;
+ canvasPtr->tsoffset.yoffset = height / 2;
} else if (flags & TK_OFFSET_BOTTOM) {
- canvasPtr->tsoffset.yoffset = canvasPtr->height;
+ canvasPtr->tsoffset.yoffset = height;
}
/*
@@ -2421,6 +2492,10 @@ CanvasWorldChanged(
TkCanvas *canvasPtr = (TkCanvas *)instanceData;
Tk_Item *itemPtr;
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved1, &canvasPtr->textInfo.insertBorderWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved2, &canvasPtr->textInfo.insertWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved3, &canvasPtr->textInfo.selBorderWidth);
+
itemPtr = canvasPtr->firstItemPtr;
for ( ; itemPtr != NULL; itemPtr = itemPtr->nextPtr) {
if (ItemConfigure(canvasPtr, itemPtr, 0, NULL) != TCL_OK) {
@@ -2466,31 +2541,31 @@ DecomposeMaskToShiftAndBits(
*/
for (i = 0; i < 32; ++i) {
- if (mask & 1 << i)
- break;
+ if (mask & 1 << i)
+ break;
}
if (i < 32) {
- *shift = i;
+ *shift = i;
- /*
- * Now find the next '0' bit and the width of the mask.
- */
+ /*
+ * Now find the next '0' bit and the width of the mask.
+ */
- for ( ; i < 32; ++i) {
- if ((mask & 1 << i) == 0)
- break;
- else
- ++*bits;
- }
+ for ( ; i < 32; ++i) {
+ if ((mask & 1 << i) == 0)
+ break;
+ else
+ ++*bits;
+ }
- /*
- * Limit to the top 8 bits if the mask was wider than 8.
- */
+ /*
+ * Limit to the top 8 bits if the mask was wider than 8.
+ */
- if (*bits > 8) {
- *shift += *bits - 8;
- *bits = 8;
- }
+ if (*bits > 8) {
+ *shift += *bits - 8;
+ *bits = 8;
+ }
}
}
@@ -2515,7 +2590,7 @@ DecomposeMaskToShiftAndBits(
*/
#define OVERDRAW_PIXELS 32 /* How much larger we make the pixmap
- * that the canvas objects are drawn into */
+ * that the canvas objects are drawn into */
#ifdef WORDS_BIGENDIAN
#define IS_BIG_ENDIAN 1
@@ -2546,18 +2621,18 @@ DrawCanvas(
GC xgc = 0;
XGCValues xgcValues;
int canvasX1, canvasY1, canvasX2, canvasY2, cWidth, cHeight,
- pixmapX1, pixmapY1, pixmapX2, pixmapY2, pmWidth, pmHeight,
- bitsPerPixel, bytesPerPixel, x, y, result = TCL_OK,
- rshift, gshift, bshift, rbits, gbits, bbits;
+ pixmapX1, pixmapY1, pixmapX2, pixmapY2, pmWidth, pmHeight,
+ bitsPerPixel, bytesPerPixel, x, y, result = TCL_OK,
+ rshift, gshift, bshift, rbits, gbits, bbits;
#ifdef DEBUG_DRAWCANVAS
char buffer[128];
#endif
if ((tkwin = canvasPtr->tkwin) == NULL) {
- Tcl_AppendResult(interp, "canvas tkwin is NULL!", (char *)NULL);
- result = TCL_ERROR;
- goto done;
+ Tcl_AppendResult(interp, "canvas tkwin is NULL!", (char *)NULL);
+ result = TCL_ERROR;
+ goto done;
}
/*
@@ -2568,21 +2643,21 @@ DrawCanvas(
do {
- if ((displayPtr = Tk_Display(tkwin)) == NULL) {
- Tcl_AppendResult(interp, "canvas (or parent) display is NULL!", (char *)NULL);
- result = TCL_ERROR;
- goto done;
- }
+ if ((displayPtr = Tk_Display(tkwin)) == NULL) {
+ Tcl_AppendResult(interp, "canvas (or parent) display is NULL!", (char *)NULL);
+ result = TCL_ERROR;
+ goto done;
+ }
- if ((wid = Tk_WindowId(tkwin)) != 0) {
- continue;
- }
+ if ((wid = Tk_WindowId(tkwin)) != 0) {
+ continue;
+ }
- if ((tkwin = Tk_Parent(tkwin)) == NULL) {
- Tcl_AppendResult(interp, "canvas has no parent with a valid window id! Is the toplevel window mapped?", (char *)NULL);
- result = TCL_ERROR;
- goto done;
- }
+ if ((tkwin = Tk_Parent(tkwin)) == NULL) {
+ Tcl_AppendResult(interp, "canvas has no parent with a valid window id! Is the toplevel window mapped?", (char *)NULL);
+ result = TCL_ERROR;
+ goto done;
+ }
} while (wid == 0);
@@ -2590,9 +2665,9 @@ DrawCanvas(
visualPtr = Tk_Visual(tkwin);
if (subsample == 0) {
- Tcl_AppendResult(interp, "subsample cannot be zero", (char *)NULL);
- result = TCL_ERROR;
- goto done;
+ Tcl_AppendResult(interp, "subsample cannot be zero", (char *)NULL);
+ result = TCL_ERROR;
+ goto done;
}
/*
@@ -2602,12 +2677,12 @@ DrawCanvas(
*/
for (itemPtr = canvasPtr -> firstItemPtr; itemPtr != NULL;
- itemPtr = itemPtr -> nextPtr) {
- if (itemPtr -> redraw_flags & FORCE_REDRAW) {
- itemPtr -> redraw_flags &= ~FORCE_REDRAW;
- EventuallyRedrawItem(canvasPtr, itemPtr);
- itemPtr -> redraw_flags &= ~FORCE_REDRAW;
- }
+ itemPtr = itemPtr -> nextPtr) {
+ if (itemPtr -> redraw_flags & FORCE_REDRAW) {
+ itemPtr -> redraw_flags &= ~FORCE_REDRAW;
+ EventuallyRedrawItem(canvasPtr, itemPtr);
+ itemPtr -> redraw_flags &= ~FORCE_REDRAW;
+ }
}
/*
@@ -2618,23 +2693,23 @@ DrawCanvas(
* of 0,0.
*/
if (canvasPtr->scrollX1 != 0 || canvasPtr->scrollY1 != 0 ||
- canvasPtr->scrollX2 != 0 || canvasPtr->scrollY2 != 0) {
+ canvasPtr->scrollX2 != 0 || canvasPtr->scrollY2 != 0) {
- canvasX1 = canvasPtr->scrollX1;
- canvasY1 = canvasPtr->scrollY1;
- canvasX2 = canvasPtr->scrollX2;
- canvasY2 = canvasPtr->scrollY2;
- cWidth = canvasX2 - canvasX1 + 1;
- cHeight = canvasY2 - canvasY1 + 1;
+ canvasX1 = canvasPtr->scrollX1;
+ canvasY1 = canvasPtr->scrollY1;
+ canvasX2 = canvasPtr->scrollX2;
+ canvasY2 = canvasPtr->scrollY2;
+ cWidth = canvasX2 - canvasX1 + 1;
+ cHeight = canvasY2 - canvasY1 + 1;
} else {
- cWidth = Tk_Width(tkwin);
- cHeight = Tk_Height(tkwin);
- canvasX1 = 0;
- canvasY1 = 0;
- canvasX2 = canvasX1 + cWidth - 1;
- canvasY2 = canvasY1 + cHeight - 1;
+ cWidth = Tk_Width(tkwin);
+ cHeight = Tk_Height(tkwin);
+ canvasX1 = 0;
+ canvasY1 = 0;
+ canvasX2 = canvasX1 + cWidth - 1;
+ canvasY2 = canvasY1 + cHeight - 1;
}
/*
@@ -2650,10 +2725,10 @@ DrawCanvas(
pmWidth = pixmapX2 - pixmapX1 + 1;
pmHeight = pixmapY2 - pixmapY1 + 1;
if ((pixmap = Tk_GetPixmap(displayPtr, Tk_WindowId(tkwin), pmWidth, pmHeight,
- bitsPerPixel)) == 0) {
- Tcl_AppendResult(interp, "failed to create drawing Pixmap", (char *)NULL);
- result = TCL_ERROR;
- goto done;
+ bitsPerPixel)) == 0) {
+ Tcl_AppendResult(interp, "failed to create drawing Pixmap", (char *)NULL);
+ result = TCL_ERROR;
+ goto done;
}
/*
@@ -2673,20 +2748,20 @@ DrawCanvas(
canvasPtr->drawableXOrigin = pixmapX1;
canvasPtr->drawableYOrigin = pixmapY1;
for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
- itemPtr = itemPtr->nextPtr) {
- if ((itemPtr->x1 >= pixmapX2) || (itemPtr->y1 >= pixmapY2) ||
- (itemPtr->x2 < pixmapX1) || (itemPtr->y2 < pixmapY1)) {
- if (!AlwaysRedraw(itemPtr)) {
- continue;
- }
- }
- if (itemPtr->state == TK_STATE_HIDDEN ||
- (itemPtr->state == TK_STATE_NULL && canvasPtr->canvas_state
- == TK_STATE_HIDDEN)) {
- continue;
- }
- ItemDisplay(canvasPtr, itemPtr, pixmap, pixmapX1, pixmapY1, pmWidth,
- pmHeight);
+ itemPtr = itemPtr->nextPtr) {
+ if ((itemPtr->x1 >= pixmapX2) || (itemPtr->y1 >= pixmapY2) ||
+ (itemPtr->x2 < pixmapX1) || (itemPtr->y2 < pixmapY1)) {
+ if (!AlwaysRedraw(itemPtr)) {
+ continue;
+ }
+ }
+ if (itemPtr->state == TK_STATE_HIDDEN ||
+ (itemPtr->state == TK_STATE_NULL && canvasPtr->canvas_state
+ == TK_STATE_HIDDEN)) {
+ continue;
+ }
+ ItemDisplay(canvasPtr, itemPtr, pixmap, pixmapX1, pixmapY1, pmWidth,
+ pmHeight);
}
/*
@@ -2697,10 +2772,10 @@ DrawCanvas(
*/
if ((ximagePtr = XGetImage(displayPtr, pixmap, -pixmapX1, -pixmapY1, cWidth,
- cHeight, AllPlanes, ZPixmap)) == NULL) {
- Tcl_AppendResult(interp, "failed to copy Pixmap to XImage", (char *)NULL);
- result = TCL_ERROR;
- goto done;
+ cHeight, AllPlanes, ZPixmap)) == NULL) {
+ Tcl_AppendResult(interp, "failed to copy Pixmap to XImage", (char *)NULL);
+ result = TCL_ERROR;
+ goto done;
}
#ifdef DEBUG_DRAWCANVAS
@@ -2713,18 +2788,18 @@ DrawCanvas(
if (ximagePtr->data != NULL) {
int ix, iy;
- Tcl_AppendResult(interp, " {", (char *)NULL);
+ Tcl_AppendResult(interp, " {", (char *)NULL);
for (iy = 0; iy < ximagePtr->height; ++ iy) {
Tcl_AppendResult(interp, " {", (char *)NULL);
for (ix = 0; ix < ximagePtr->bytes_per_line; ++ ix) {
- if (ix > 0) {
- if (ix % 4 == 0)
- Tcl_AppendResult(interp, "-", (char *)NULL);
- else
- Tcl_AppendResult(interp, " ", (char *)NULL);
- }
- snprintf(buffer,sizeof(buffer),"%2.2x",ximagePtr->data[ximagePtr->bytes_per_line * iy + ix]&0xFF);
- Tcl_AppendResult(interp, buffer, (char *)NULL);
+ if (ix > 0) {
+ if (ix % 4 == 0)
+ Tcl_AppendResult(interp, "-", (char *)NULL);
+ else
+ Tcl_AppendResult(interp, " ", (char *)NULL);
+ }
+ snprintf(buffer,sizeof(buffer),"%2.2x",ximagePtr->data[ximagePtr->bytes_per_line * iy + ix]&0xFF);
+ Tcl_AppendResult(interp, buffer, (char *)NULL);
}
Tcl_AppendResult(interp, " }", (char *)NULL);
}
@@ -2806,62 +2881,62 @@ DrawCanvas(
for (y = 0; y < blockPtr.height; ++y) {
#ifdef DEBUG_DRAWCANVAS
- Tcl_AppendResult(interp, " {", (char *)NULL);
+ Tcl_AppendResult(interp, " {", (char *)NULL);
#endif
- for(x = 0; x < blockPtr.width; ++x) {
- unsigned int pixel = 0;
+ for(x = 0; x < blockPtr.width; ++x) {
+ unsigned int pixel = 0;
int pixel_offset = blockPtr.pitch * y + blockPtr.pixelSize * x;
- switch (ximagePtr->bits_per_pixel) {
-
- /*
- * Get an 8 bit pixel from the XImage.
- */
-
- case 8 :
- pixel = *((unsigned char *)(ximagePtr->data + bytesPerPixel * x
- + ximagePtr->bytes_per_line * y));
- break;
-
- /*
- * Get a 16 bit pixel from the XImage, and correct the
- * byte order as necessary.
- */
-
- case 16 :
- pixel = *((unsigned short *)(ximagePtr->data + bytesPerPixel * x
- + ximagePtr->bytes_per_line * y));
- if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst)
- || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst))
- pixel = BYTE_SWAP16(pixel);
- break;
-
- /*
- * Grab a 32 bit pixel from the XImage, and correct the
- * byte order as necessary.
- */
-
- case 32 :
- pixel = *((unsigned int *)(ximagePtr->data + bytesPerPixel * x
- + ximagePtr->bytes_per_line * y));
- if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst)
- || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst))
- pixel = BYTE_SWAP32(pixel);
- break;
- }
-
- /*
- * We have a pixel with the correct byte order, so pull out the
- * colours and place them in the photo block. Perhaps we could
- * just not bother with the alpha byte because we are using
- * TK_PHOTO_COMPOSITE_SET later?
- * ***Windows: We have to swap the red and blue values. The
- * XImage storage is B - G - R - A which becomes a 32bit ARGB
- * quad. However the visual mask is a 32bit ABGR quad. And
- * Tk_PhotoPutBlock() wants R-G-B-A which is a 32bit ABGR quad.
- * If the visual mask was correct there would be no need to
- * swap anything here.
- */
+ switch (ximagePtr->bits_per_pixel) {
+
+ /*
+ * Get an 8 bit pixel from the XImage.
+ */
+
+ case 8 :
+ pixel = *((unsigned char *)(ximagePtr->data + bytesPerPixel * x
+ + ximagePtr->bytes_per_line * y));
+ break;
+
+ /*
+ * Get a 16 bit pixel from the XImage, and correct the
+ * byte order as necessary.
+ */
+
+ case 16 :
+ pixel = *((unsigned short *)(ximagePtr->data + bytesPerPixel * x
+ + ximagePtr->bytes_per_line * y));
+ if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst)
+ || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst))
+ pixel = BYTE_SWAP16(pixel);
+ break;
+
+ /*
+ * Grab a 32 bit pixel from the XImage, and correct the
+ * byte order as necessary.
+ */
+
+ case 32 :
+ pixel = *((unsigned int *)(ximagePtr->data + bytesPerPixel * x
+ + ximagePtr->bytes_per_line * y));
+ if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst)
+ || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst))
+ pixel = BYTE_SWAP32(pixel);
+ break;
+ }
+
+ /*
+ * We have a pixel with the correct byte order, so pull out the
+ * colours and place them in the photo block. Perhaps we could
+ * just not bother with the alpha byte because we are using
+ * TK_PHOTO_COMPOSITE_SET later?
+ * ***Windows: We have to swap the red and blue values. The
+ * XImage storage is B - G - R - A which becomes a 32bit ARGB
+ * quad. However the visual mask is a 32bit ABGR quad. And
+ * Tk_PhotoPutBlock() wants R-G-B-A which is a 32bit ABGR quad.
+ * If the visual mask was correct there would be no need to
+ * swap anything here.
+ */
#ifdef _WIN32
#define R_OFFSET blockPtr.offset[2]
@@ -2888,11 +2963,11 @@ DrawCanvas(
*((unsigned int *) (blockPtr.pixelPtr + pixel_offset)) = pixel;
} else {
blockPtr.pixelPtr[pixel_offset + R_OFFSET] =
- (unsigned char)((pixel & visualPtr->red_mask) >> rshift);
+ (unsigned char)((pixel & visualPtr->red_mask) >> rshift);
blockPtr.pixelPtr[pixel_offset + G_OFFSET] =
- (unsigned char)((pixel & visualPtr->green_mask) >> gshift);
+ (unsigned char)((pixel & visualPtr->green_mask) >> gshift);
blockPtr.pixelPtr[pixel_offset + B_OFFSET] =
- (unsigned char)((pixel & visualPtr->blue_mask) >> bshift);
+ (unsigned char)((pixel & visualPtr->blue_mask) >> bshift);
blockPtr.pixelPtr[pixel_offset + A_OFFSET] = 0xFF;
}
@@ -2903,25 +2978,25 @@ DrawCanvas(
blockPtr.pixelPtr[pixel_offset + 1],
blockPtr.pixelPtr[pixel_offset + 2],
blockPtr.pixelPtr[pixel_offset + 3]);
- {
+ {
int ix;
- if (x > 0)
- Tcl_AppendResult(interp, "-", (char *)NULL);
- for (ix = 0; ix < 4; ++ix) {
- if (ix > 0)
- Tcl_AppendResult(interp, " ", (char *)NULL);
+ if (x > 0)
+ Tcl_AppendResult(interp, "-", (char *)NULL);
+ for (ix = 0; ix < 4; ++ix) {
+ if (ix > 0)
+ Tcl_AppendResult(interp, " ", (char *)NULL);
snprintf(buffer,sizeof(buffer),"%2.2x",
- blockPtr.pixelPtr[blockPtr.pitch * y
- + blockPtr.pixelSize * x + ix]&0xFF);
- Tcl_AppendResult(interp, buffer, (char *)NULL);
- }
- }
+ blockPtr.pixelPtr[blockPtr.pitch * y
+ + blockPtr.pixelSize * x + ix]&0xFF);
+ Tcl_AppendResult(interp, buffer, (char *)NULL);
+ }
+ }
#endif
- }
+ }
#ifdef DEBUG_DRAWCANVAS
- Tcl_AppendResult(interp, " }", (char *)NULL);
+ Tcl_AppendResult(interp, " }", (char *)NULL);
#endif
}
@@ -2936,17 +3011,17 @@ DrawCanvas(
*/
if (subsample != 1 || zoom != 1) {
- if ((result = Tk_PhotoPutZoomedBlock(interp, photohandle, &blockPtr,
- 0, 0, cWidth * zoom / subsample, cHeight * zoom / subsample,
- zoom, zoom, subsample, subsample, TK_PHOTO_COMPOSITE_SET))
- != TCL_OK) {
- goto done;
- }
+ if ((result = Tk_PhotoPutZoomedBlock(interp, photohandle, &blockPtr,
+ 0, 0, cWidth * zoom / subsample, cHeight * zoom / subsample,
+ zoom, zoom, subsample, subsample, TK_PHOTO_COMPOSITE_SET))
+ != TCL_OK) {
+ goto done;
+ }
} else {
- if ((result = Tk_PhotoPutBlock(interp, photohandle, &blockPtr, 0, 0,
- cWidth, cHeight, TK_PHOTO_COMPOSITE_SET)) != TCL_OK) {
- goto done;
- }
+ if ((result = Tk_PhotoPutBlock(interp, photohandle, &blockPtr, 0, 0,
+ cWidth, cHeight, TK_PHOTO_COMPOSITE_SET)) != TCL_OK) {
+ goto done;
+ }
}
/*
@@ -2955,13 +3030,13 @@ DrawCanvas(
done:
if (blockPtr.pixelPtr)
- ckfree(blockPtr.pixelPtr);
+ ckfree(blockPtr.pixelPtr);
if (pixmap)
- Tk_FreePixmap(Tk_Display(tkwin), pixmap);
+ Tk_FreePixmap(Tk_Display(tkwin), pixmap);
if (ximagePtr)
- XDestroyImage(ximagePtr);
+ XDestroyImage(ximagePtr);
if (xgc)
- XFreeGC(displayPtr,xgc);
+ XFreeGC(displayPtr,xgc);
return result;
}
@@ -2992,10 +3067,7 @@ DisplayCanvas(
Tk_Item *itemPtr;
Pixmap pixmap;
int screenX1, screenX2, screenY1, screenY2, width, height;
-#ifdef MAC_OSX_TK
- TkWindow *winPtr;
- MacDrawable *macWin;
-#endif
+ int borderWidth, highlightWidth;
if (canvasPtr->tkwin == NULL) {
return;
@@ -3005,19 +3077,6 @@ DisplayCanvas(
goto done;
}
-#ifdef MAC_OSX_TK
- /*
- * If drawing is disabled, all we need to do is
- * clear the REDRAW_PENDING flag.
- */
- winPtr = (TkWindow *)(canvasPtr->tkwin);
- macWin = winPtr->privatePtr;
- if (macWin && (macWin->flags & TK_DO_NOT_DRAW)){
- canvasPtr->flags &= ~REDRAW_PENDING;
- return;
- }
-#endif
-
/*
* Choose a new current item if that is needed (this could cause event
* handlers to be invoked).
@@ -3186,17 +3245,18 @@ DisplayCanvas(
*/
borders:
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->borderWidthObj, &borderWidth);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->highlightWidthObj, &highlightWidth);
if (canvasPtr->flags & REDRAW_BORDERS) {
canvasPtr->flags &= ~REDRAW_BORDERS;
- if (canvasPtr->borderWidth > 0) {
+ if (borderWidth > 0) {
Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin),
- canvasPtr->bgBorder, canvasPtr->highlightWidth,
- canvasPtr->highlightWidth,
- Tk_Width(tkwin) - 2*canvasPtr->highlightWidth,
- Tk_Height(tkwin) - 2*canvasPtr->highlightWidth,
- canvasPtr->borderWidth, canvasPtr->relief);
+ canvasPtr->bgBorder, highlightWidth, highlightWidth,
+ Tk_Width(tkwin) - 2 * highlightWidth,
+ Tk_Height(tkwin) - 2 * highlightWidth,
+ borderWidth, canvasPtr->relief);
}
- if (canvasPtr->highlightWidth > 0) {
+ if (highlightWidth > 0) {
GC fgGC, bgGC;
bgGC = Tk_GCForColor(canvasPtr->highlightBgColorPtr,
@@ -3204,11 +3264,11 @@ DisplayCanvas(
if (canvasPtr->textInfo.gotFocus) {
fgGC = Tk_GCForColor(canvasPtr->highlightColorPtr,
Tk_WindowId(tkwin));
- Tk_DrawHighlightBorder(tkwin, fgGC, bgGC,
- canvasPtr->highlightWidth, Tk_WindowId(tkwin));
+ Tk_DrawHighlightBorder(tkwin, fgGC, bgGC,
+ highlightWidth, Tk_WindowId(tkwin));
} else {
- Tk_DrawHighlightBorder(tkwin, bgGC, bgGC,
- canvasPtr->highlightWidth, Tk_WindowId(tkwin));
+ Tk_DrawHighlightBorder(tkwin, bgGC, bgGC,
+ highlightWidth, Tk_WindowId(tkwin));
}
}
}
@@ -3388,7 +3448,7 @@ Tk_CanvasEventuallyRedraw(
}
if ((x1 >= x2) || (y1 >= y2) ||
- (x2 < canvasPtr->xOrigin) || (y2 < canvasPtr->yOrigin) ||
+ (x2 < canvasPtr->xOrigin) || (y2 < canvasPtr->yOrigin) ||
(x1 >= canvasPtr->xOrigin + Tk_Width(canvasPtr->tkwin)) ||
(y1 >= canvasPtr->yOrigin + Tk_Height(canvasPtr->tkwin))) {
return;
@@ -3446,7 +3506,7 @@ EventuallyRedrawItem(
return;
}
if ((itemPtr->x1 >= itemPtr->x2) || (itemPtr->y1 >= itemPtr->y2) ||
- (itemPtr->x2 < canvasPtr->xOrigin) ||
+ (itemPtr->x2 < canvasPtr->xOrigin) ||
(itemPtr->y2 < canvasPtr->yOrigin) ||
(itemPtr->x1 >= canvasPtr->xOrigin+Tk_Width(canvasPtr->tkwin)) ||
(itemPtr->y1 >= canvasPtr->yOrigin+Tk_Height(canvasPtr->tkwin))) {
@@ -3694,7 +3754,7 @@ TagSearchExprDestroy(
TagSearchExpr *expr)
{
if (expr != NULL) {
- if (expr->uids) {
+ if (expr->uids) {
ckfree(expr->uids);
}
ckfree(expr);
@@ -5302,9 +5362,9 @@ PickCurrentItem(
for (i = itemPtr->numTags-1; i != TCL_INDEX_NONE; i--) {
if (itemPtr->tagPtr[i] == searchUids->currentUid)
/* then */ {
- memmove((void *)(itemPtr->tagPtr + i),
- itemPtr->tagPtr + i + 1,
- (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid));
+ memmove((void *)(itemPtr->tagPtr + i),
+ itemPtr->tagPtr + i + 1,
+ (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid));
itemPtr->numTags--;
break;
}
@@ -5473,7 +5533,7 @@ CanvasDoEvent(
expr = canvasPtr->bindTagExprs;
while (expr) {
expr->index = 0;
- expr->match = TagSearchEvalExpr(expr, itemPtr);
+ expr->match = TagSearchEvalExpr(expr, itemPtr);
if (expr->match) {
numExprs++;
}
@@ -5499,7 +5559,7 @@ CanvasDoEvent(
i = itemPtr->numTags+2;
expr = canvasPtr->bindTagExprs;
while (expr) {
- if (expr->match) {
+ if (expr->match) {
objectPtr[i++] = (int *) expr->uid;
}
expr = expr->next;
@@ -5582,6 +5642,8 @@ CanvasFocusProc(
int gotFocus) /* 1 means window is getting focus, 0 means
* it's losing it. */
{
+ int highlightWidth;
+
Tcl_DeleteTimerHandler(canvasPtr->insertBlinkHandler);
if (gotFocus) {
canvasPtr->textInfo.gotFocus = 1;
@@ -5596,7 +5658,8 @@ CanvasFocusProc(
canvasPtr->insertBlinkHandler = NULL;
}
EventuallyRedrawItem(canvasPtr, canvasPtr->textInfo.focusItemPtr);
- if (canvasPtr->highlightWidth > 0) {
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->highlightWidthObj, &highlightWidth);
+ if (highlightWidth > 0) {
canvasPtr->flags |= REDRAW_BORDERS;
if (!(canvasPtr->flags & REDRAW_PENDING)) {
Tcl_DoWhenIdle(DisplayCanvas, canvasPtr);
@@ -5843,7 +5906,7 @@ CanvasUpdateScrollbars(
Tcl_Interp *interp;
int xOrigin, yOrigin, inset, width, height;
int scrollX1, scrollX2, scrollY1, scrollY2;
- char *xScrollCmd, *yScrollCmd;
+ Tcl_Obj *xScrollCmdObj, *yScrollCmdObj;
Tcl_DString buf;
/*
@@ -5853,13 +5916,13 @@ CanvasUpdateScrollbars(
interp = canvasPtr->interp;
Tcl_Preserve(interp);
- xScrollCmd = canvasPtr->xScrollCmd;
- if (xScrollCmd != NULL) {
- Tcl_Preserve(xScrollCmd);
+ xScrollCmdObj = canvasPtr->xScrollCmdObj;
+ if (xScrollCmdObj != NULL) {
+ Tcl_IncrRefCount(xScrollCmdObj);
}
- yScrollCmd = canvasPtr->yScrollCmd;
- if (yScrollCmd != NULL) {
- Tcl_Preserve(yScrollCmd);
+ yScrollCmdObj = canvasPtr->yScrollCmdObj;
+ if (yScrollCmdObj != NULL) {
+ Tcl_IncrRefCount(yScrollCmdObj);
}
xOrigin = canvasPtr->xOrigin;
yOrigin = canvasPtr->yOrigin;
@@ -5871,12 +5934,12 @@ CanvasUpdateScrollbars(
scrollY1 = canvasPtr->scrollY1;
scrollY2 = canvasPtr->scrollY2;
canvasPtr->flags &= ~UPDATE_SCROLLBARS;
- if (canvasPtr->xScrollCmd != NULL) {
+ if (canvasPtr->xScrollCmdObj != NULL) {
Tcl_Obj *fractions = ScrollFractions(xOrigin + inset,
xOrigin + width - inset, scrollX1, scrollX2);
Tcl_DStringInit(&buf);
- Tcl_DStringAppend(&buf, xScrollCmd, TCL_INDEX_NONE);
+ Tcl_DStringAppend(&buf, Tcl_GetString(xScrollCmdObj), TCL_INDEX_NONE);
Tcl_DStringAppend(&buf, " ", TCL_INDEX_NONE);
Tcl_DStringAppend(&buf, Tcl_GetString(fractions), TCL_INDEX_NONE);
result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), TCL_INDEX_NONE, TCL_EVAL_GLOBAL);
@@ -5886,15 +5949,15 @@ CanvasUpdateScrollbars(
Tcl_BackgroundException(interp, result);
}
Tcl_ResetResult(interp);
- Tcl_Release(xScrollCmd);
+ Tcl_DecrRefCount(xScrollCmdObj);
}
- if (yScrollCmd != NULL) {
+ if (yScrollCmdObj != NULL) {
Tcl_Obj *fractions = ScrollFractions(yOrigin + inset,
yOrigin + height - inset, scrollY1, scrollY2);
Tcl_DStringInit(&buf);
- Tcl_DStringAppend(&buf, yScrollCmd, TCL_INDEX_NONE);
+ Tcl_DStringAppend(&buf, Tcl_GetString(yScrollCmdObj), TCL_INDEX_NONE);
Tcl_DStringAppend(&buf, " ", TCL_INDEX_NONE);
Tcl_DStringAppend(&buf, Tcl_GetString(fractions), TCL_INDEX_NONE);
result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), TCL_INDEX_NONE, TCL_EVAL_GLOBAL);
@@ -5904,7 +5967,7 @@ CanvasUpdateScrollbars(
Tcl_BackgroundException(interp, result);
}
Tcl_ResetResult(interp);
- Tcl_Release(yScrollCmd);
+ Tcl_DecrRefCount(yScrollCmdObj);
}
Tcl_Release(interp);
}
@@ -5938,6 +6001,7 @@ CanvasSetOrigin(
* window). */
{
int left, right, top, bottom, delta;
+ int xScrollIncrement, yScrollIncrement;
/*
* If scroll increments have been set, round the window origin to the
@@ -5945,26 +6009,28 @@ CanvasSetOrigin(
* just inside the borders, not the upper left corner.
*/
- if (canvasPtr->xScrollIncrement > 0) {
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->xScrollIncrementObj, &xScrollIncrement);
+ Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->yScrollIncrementObj, &yScrollIncrement);
+ if (xScrollIncrement > 0) {
if (xOrigin >= 0) {
- xOrigin += canvasPtr->xScrollIncrement/2;
+ xOrigin += xScrollIncrement/2;
xOrigin -= (xOrigin + canvasPtr->inset)
- % canvasPtr->xScrollIncrement;
+ % xScrollIncrement;
} else {
- xOrigin = (-xOrigin) + canvasPtr->xScrollIncrement/2;
+ xOrigin = (-xOrigin) + xScrollIncrement/2;
xOrigin = -(xOrigin - (xOrigin - canvasPtr->inset)
- % canvasPtr->xScrollIncrement);
+ % xScrollIncrement);
}
}
- if (canvasPtr->yScrollIncrement > 0) {
+ if (yScrollIncrement > 0) {
if (yOrigin >= 0) {
- yOrigin += canvasPtr->yScrollIncrement/2;
+ yOrigin += yScrollIncrement/2;
yOrigin -= (yOrigin + canvasPtr->inset)
- % canvasPtr->yScrollIncrement;
+ % yScrollIncrement;
} else {
- yOrigin = (-yOrigin) + canvasPtr->yScrollIncrement/2;
+ yOrigin = (-yOrigin) + yScrollIncrement/2;
yOrigin = -(yOrigin - (yOrigin - canvasPtr->inset)
- % canvasPtr->yScrollIncrement);
+ % yScrollIncrement);
}
}
@@ -5979,7 +6045,7 @@ CanvasSetOrigin(
* full increments.
*/
- if ((canvasPtr->confine) && (canvasPtr->regionString != NULL)) {
+ if ((canvasPtr->confine) && (canvasPtr->regionObj != NULL)) {
left = xOrigin + canvasPtr->inset - canvasPtr->scrollX1;
right = canvasPtr->scrollX2
- (xOrigin + Tk_Width(canvasPtr->tkwin) - canvasPtr->inset);
@@ -5988,27 +6054,27 @@ CanvasSetOrigin(
- (yOrigin + Tk_Height(canvasPtr->tkwin) - canvasPtr->inset);
if ((left < 0) && (right > 0)) {
delta = (right > -left) ? -left : right;
- if (canvasPtr->xScrollIncrement > 0) {
- delta -= delta % canvasPtr->xScrollIncrement;
+ if (xScrollIncrement > 0) {
+ delta -= delta % xScrollIncrement;
}
xOrigin += delta;
} else if ((right < 0) && (left > 0)) {
delta = (left > -right) ? -right : left;
- if (canvasPtr->xScrollIncrement > 0) {
- delta -= delta % canvasPtr->xScrollIncrement;
+ if (xScrollIncrement > 0) {
+ delta -= delta % xScrollIncrement;
}
xOrigin -= delta;
}
if ((top < 0) && (bottom > 0)) {
delta = (bottom > -top) ? -top : bottom;
- if (canvasPtr->yScrollIncrement > 0) {
- delta -= delta % canvasPtr->yScrollIncrement;
+ if (yScrollIncrement > 0) {
+ delta -= delta % yScrollIncrement;
}
yOrigin += delta;
} else if ((bottom < 0) && (top > 0)) {
delta = (top > -bottom) ? -bottom : top;
- if (canvasPtr->yScrollIncrement > 0) {
- delta -= delta % canvasPtr->yScrollIncrement;
+ if (yScrollIncrement > 0) {
+ delta -= delta % yScrollIncrement;
}
yOrigin -= delta;
}