Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fixed up complaints from MSVC engendered by the last commit. In particular replaced round() which is a C99 function. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
9dc3d444b7bdf7dd4d993cdf165002f6 |
User & Date: | patthoyts 2008-11-22 20:05:32 |
Context
2008-11-22
| ||
20:16 | Added documentation on the -angle option for text items check-in: cbf51f96 user: dkf tags: trunk | |
20:05 | Fixed up complaints from MSVC engendered by the last commit. In particular replaced round() which is a C99 function. check-in: 9dc3d444 user: patthoyts tags: trunk | |
18:08 | TIP#119 implementation. [Patch 1611359] check-in: a2e77573 user: dkf tags: trunk | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 | 2008-11-22 Donal K. Fellows <[email protected]> TIP #119 IMPLEMENTATION * generic/tkCanvText.c: Added -angle configuration option to canvas * generic/tkFont.c: text items. This required reengineering the * library/prolog.ps: whole text rendering engine to be able to | > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 2008-11-22 Pat Thoyts <[email protected]> * generic/tkCanvText.c: Fixed up complaints from MSVC engendered * generic/tkFont.c: by the last commit. In particular replaced * win/tkWinDraw.c: round() which is a C99 function. * win/tkWinFont.c: 2008-11-22 Donal K. Fellows <[email protected]> TIP #119 IMPLEMENTATION * generic/tkCanvText.c: Added -angle configuration option to canvas * generic/tkFont.c: text items. This required reengineering the * library/prolog.ps: whole text rendering engine to be able to |
︙ | ︙ |
Changes to generic/tkCanvText.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tkCanvText.c -- * * This file implements text items for canvas widgets. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tkCanvText.c -- * * This file implements text items for canvas widgets. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tkCanvText.c,v 1.34 2008/11/22 20:05:32 patthoyts Exp $ */ #include <stdio.h> #include "tkInt.h" #include "tkCanvas.h" #include "default.h" |
︙ | ︙ | |||
876 877 878 879 880 881 882 | } else { width = textPtr->actualWidth - x; } dx1 = x - textInfoPtr->selBorderWidth; dy1 = y; dx2 = width + 2 * textInfoPtr->selBorderWidth; dy2 = height; | | | | | | | | | | 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 | } else { width = textPtr->actualWidth - x; } dx1 = x - textInfoPtr->selBorderWidth; dy1 = y; dx2 = width + 2 * textInfoPtr->selBorderWidth; dy2 = height; points[0].x = (short)(drawableX + dx1*c + dy1*s); points[0].y = (short)(drawableY + dy1*c - dx1*s); points[1].x = (short)(drawableX + (dx1+dx2)*c + dy1*s); points[1].y = (short)(drawableY + dy1*c - (dx1+dx2)*s); points[2].x = (short)(drawableX + (dx1+dx2)*c + (dy1+dy2)*s); points[2].y = (short)(drawableY + (dy1+dy2)*c - (dx1+dx2)*s); points[3].x = (short)(drawableX + dx1*c + (dy1+dy2)*s); points[3].y = (short)(drawableY + (dy1+dy2)*c - dx1*s); Tk_Fill3DPolygon(Tk_CanvasTkwin(canvas), drawable, textInfoPtr->selBorder, points, 4, textInfoPtr->selBorderWidth, TK_RELIEF_RAISED); x = 0; } } } |
︙ | ︙ | |||
912 913 914 915 916 917 918 | double s = textPtr->sine, c = textPtr->cosine; XPoint points[4]; dx1 = x - (textInfoPtr->insertWidth / 2); dy1 = y; dx2 = textInfoPtr->insertWidth; dy2 = height; | | | | | | | | | | 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 | double s = textPtr->sine, c = textPtr->cosine; XPoint points[4]; dx1 = x - (textInfoPtr->insertWidth / 2); dy1 = y; dx2 = textInfoPtr->insertWidth; dy2 = height; points[0].x = (short)(drawableX + dx1*c + dy1*s); points[0].y = (short)(drawableY + dy1*c - dx1*s); points[1].x = (short)(drawableX + (dx1+dx2)*c + dy1*s); points[1].y = (short)(drawableY + dy1*c - (dx1+dx2)*s); points[2].x = (short)(drawableX + (dx1+dx2)*c + (dy1+dy2)*s); points[2].y = (short)(drawableY + (dy1+dy2)*c - (dx1+dx2)*s); points[3].x = (short)(drawableX + dx1*c + (dy1+dy2)*s); points[3].y = (short)(drawableY + (dy1+dy2)*c - dx1*s); Tk_SetCaretPos(Tk_CanvasTkwin(canvas), points[0].x, points[0].y, height); if (textInfoPtr->cursorOn) { Tk_Fill3DPolygon(Tk_CanvasTkwin(canvas), drawable, textInfoPtr->insertBorder, points, 4, textInfoPtr->insertBorderWidth, TK_RELIEF_RAISED); |
︙ | ︙ | |||
1187 1188 1189 1190 1191 1192 1193 | if (state == TK_STATE_NULL) { state = Canvas(canvas)->canvas_state; } textPtr = (TextItem *) itemPtr; px = pointPtr[0] - textPtr->drawOrigin[0]; py = pointPtr[1] - textPtr->drawOrigin[1]; value = (double) Tk_DistanceToTextLayout(textPtr->textLayout, | | | | 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 | if (state == TK_STATE_NULL) { state = Canvas(canvas)->canvas_state; } textPtr = (TextItem *) itemPtr; px = pointPtr[0] - textPtr->drawOrigin[0]; py = pointPtr[1] - textPtr->drawOrigin[1]; value = (double) Tk_DistanceToTextLayout(textPtr->textLayout, (int)(px*textPtr->cosine - py*textPtr->sine), (int)(py*textPtr->cosine + px*textPtr->sine)); if ((state == TK_STATE_HIDDEN) || (textPtr->color == NULL) || (textPtr->text == NULL) || (*textPtr->text == 0)) { value = 1.0e36; } return value; } |
︙ | ︙ | |||
1233 1234 1235 1236 1237 1238 1239 | if (state == TK_STATE_NULL) { state = Canvas(canvas)->canvas_state; } textPtr = (TextItem *) itemPtr; return TkIntersectAngledTextLayout(textPtr->textLayout, | | | | 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 | if (state == TK_STATE_NULL) { state = Canvas(canvas)->canvas_state; } textPtr = (TextItem *) itemPtr; return TkIntersectAngledTextLayout(textPtr->textLayout, (int) ((rectPtr[0] + 0.5) - textPtr->drawOrigin[0]), (int) ((rectPtr[1] + 0.5) - textPtr->drawOrigin[1]), (int) (rectPtr[2] - rectPtr[0] + 0.5), (int) (rectPtr[3] - rectPtr[1] + 0.5), textPtr->angle); } /* *-------------------------------------------------------------- |
︙ | ︙ | |||
1381 1382 1383 1384 1385 1386 1387 | x = (int) ((tmp < 0) ? tmp - 0.5 : tmp + 0.5); p = end+1; tmp = strtod(p, &end); if ((end == p) || (*end != 0)) { goto badIndex; } y = (int) ((tmp < 0) ? tmp - 0.5 : tmp + 0.5); | | | | > | 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 | x = (int) ((tmp < 0) ? tmp - 0.5 : tmp + 0.5); p = end+1; tmp = strtod(p, &end); if ((end == p) || (*end != 0)) { goto badIndex; } y = (int) ((tmp < 0) ? tmp - 0.5 : tmp + 0.5); x += canvasPtr->scrollX1 - (int)textPtr->drawOrigin[0]; y += canvasPtr->scrollY1 - (int)textPtr->drawOrigin[1]; *indexPtr = Tk_PointToChar(textPtr->textLayout, (int)(x*c-y*s), (int)(y*c+x*s)); } else if (Tcl_GetIntFromObj(NULL, obj, indexPtr) == TCL_OK) { if (*indexPtr < 0) { *indexPtr = 0; } else if (*indexPtr > textPtr->numChars) { *indexPtr = textPtr->numChars; } } else { |
︙ | ︙ |
Changes to generic/tkFont.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tkFont.c -- * * This file maintains a database of fonts for the Tk toolkit. It also * provides several utility functions for measuring and displaying text. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /* * tkFont.c -- * * This file maintains a database of fonts for the Tk toolkit. It also * provides several utility functions for measuring and displaying text. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tkFont.c,v 1.50 2008/11/22 20:05:32 patthoyts Exp $ */ #include "tkInt.h" #include "tkFont.h" #define ROUND16(x) ((short)((x) + 0.5)) /* * The following structure is used to keep track of all the fonts that exist * in the current application. It must be stored in the TkMainInfo for the * application. */ |
︙ | ︙ | |||
2450 2451 2452 2453 2454 2455 2456 | XPoint points[5]; /* * Note that we're careful to only round a double value once, which * minimizes roundoff errors. */ | | | | | | | | | | 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 | XPoint points[5]; /* * Note that we're careful to only round a double value once, which * minimizes roundoff errors. */ points[0].x = x + ROUND16(xx*cosA + dy*sinA); points[0].y = y + ROUND16(dy*cosA - xx*sinA); points[1].x = x + ROUND16(xx*cosA + dy*sinA + width*cosA); points[1].y = y + ROUND16(dy*cosA - xx*sinA - width*sinA); if (fontPtr->underlineHeight == 1) { /* * Thin underlines look better when rotated when drawn as a line * rather than a rectangle; the rasterizer copes better. */ XDrawLines(display, drawable, gc, points, 2, CoordModeOrigin); } else { points[2].x = x + ROUND16(xx*cosA + dy*sinA + width*cosA - fontPtr->underlineHeight*sinA); points[2].y = y + ROUND16(dy*cosA - xx*sinA - width*sinA + fontPtr->underlineHeight*cosA); points[3].x = x + ROUND16(xx*cosA + dy*sinA - fontPtr->underlineHeight*sinA); points[3].y = y + ROUND16(dy*cosA - xx*sinA + fontPtr->underlineHeight*cosA); points[4].x = points[0].x; points[4].y = points[0].y; XFillPolygon(display, drawable, gc, points, 5, Complex, CoordModeOrigin); XDrawLines(display, drawable, gc, points, 5, CoordModeOrigin); } |
︙ | ︙ |
Changes to win/tkWinDraw.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tkWinDraw.c -- * * This file contains the Xlib emulation functions pertaining to actually * drawing objects on a window. * * Copyright (c) 1995 Sun Microsystems, Inc. * Copyright (c) 1994 Software Research Associates, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /* * tkWinDraw.c -- * * This file contains the Xlib emulation functions pertaining to actually * drawing objects on a window. * * Copyright (c) 1995 Sun Microsystems, Inc. * Copyright (c) 1994 Software Research Associates, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tkWinDraw.c,v 1.23 2008/11/22 20:05:32 patthoyts Exp $ */ #include "tkWinInt.h" /* * These macros convert between X's bizarre angle units to radians. */ #define XAngleToRadians(a) ((double)(a) / 64 * PI / 180); /* * Translation table between X gc functions and Win32 raster op modes. */ int tkpWinRopModes[] = { |
︙ | ︙ |
Changes to win/tkWinFont.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tkWinFont.c -- * * Contains the Windows implementation of the platform-independant font * package interface. * * Copyright (c) 1994 Software Research Associates, Inc. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tkWinFont.c -- * * Contains the Windows implementation of the platform-independant font * package interface. * * Copyright (c) 1994 Software Research Associates, Inc. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tkWinFont.c,v 1.45 2008/11/22 20:05:32 patthoyts Exp $ */ #include "tkWinInt.h" #include "tkFont.h" /* * The following structure represents a font family. It is assumed that all |
︙ | ︙ | |||
1294 1295 1296 1297 1298 1299 1300 | * colors. First we draw onto a black background and copy the white * bits. Then we draw onto a white background and copy the black bits. * Both the foreground and background bits of the font are ANDed with * the stipple pattern as they are copied. */ PatBlt(dcMem, 0, 0, size.cx, size.cy, BLACKNESS); | | | | | | | 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 | * colors. First we draw onto a black background and copy the white * bits. Then we draw onto a white background and copy the black bits. * Both the foreground and background bits of the font are ANDed with * the stipple pattern as they are copied. */ PatBlt(dcMem, 0, 0, size.cx, size.cy, BLACKNESS); MultiFontTextOut(dc, fontPtr, source, numBytes, (int)x, (int)y, angle); BitBlt(dc, (int)x, (int)y - tm.tmAscent, size.cx, size.cy, dcMem, 0, 0, 0xEA02E9); PatBlt(dcMem, 0, 0, size.cx, size.cy, WHITENESS); MultiFontTextOut(dc, fontPtr, source, numBytes, (int)x, (int)y, angle); BitBlt(dc, (int)x, (int)y - tm.tmAscent, size.cx, size.cy, dcMem, 0, 0, 0x8A0E06); /* * Destroy the temporary bitmap and restore the device context. */ SelectObject(dcMem, oldBitmap); DeleteObject(bitmap); DeleteDC(dcMem); SelectObject(dc, oldBrush); DeleteObject(stipple); } else if (gc->function == GXcopy) { SetTextAlign(dc, TA_LEFT | TA_BASELINE); SetTextColor(dc, gc->foreground); SetBkMode(dc, TRANSPARENT); MultiFontTextOut(dc, fontPtr, source, numBytes, (int)x, (int)y, angle); } else { HBITMAP oldBitmap, bitmap; HDC dcMem; TEXTMETRIC tm; SIZE size; dcMem = CreateCompatibleDC(dc); |
︙ | ︙ | |||
1341 1342 1343 1344 1345 1346 1347 | GetTextMetrics(dcMem, &tm); size.cx -= tm.tmOverhang; bitmap = CreateCompatibleBitmap(dc, size.cx, size.cy); oldBitmap = SelectObject(dcMem, bitmap); MultiFontTextOut(dcMem, fontPtr, source, numBytes, 0, tm.tmAscent, angle); | | | 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 | GetTextMetrics(dcMem, &tm); size.cx -= tm.tmOverhang; bitmap = CreateCompatibleBitmap(dc, size.cx, size.cy); oldBitmap = SelectObject(dcMem, bitmap); MultiFontTextOut(dcMem, fontPtr, source, numBytes, 0, tm.tmAscent, angle); BitBlt(dc, (int)x, (int)y - tm.tmAscent, size.cx, size.cy, dcMem, 0, 0, (DWORD) tkpWinBltModes[gc->function]); /* * Destroy the temporary bitmap and restore the device context. */ SelectObject(dcMem, oldBitmap); |
︙ | ︙ |