Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Imaging/Tk/booster.txt
diff options
context:
space:
mode:
Diffstat (limited to 'Imaging/Tk/booster.txt')
-rw-r--r--Imaging/Tk/booster.txt108
1 files changed, 108 insertions, 0 deletions
diff --git a/Imaging/Tk/booster.txt b/Imaging/Tk/booster.txt
new file mode 100644
index 0000000..2d78798
--- /dev/null
+++ b/Imaging/Tk/booster.txt
@@ -0,0 +1,108 @@
+====================================================================
+The Photoimage Booster Patch (for Windows 95/NT)
+====================================================================
+
+ This patch kit boosts performance for 16/24-bit displays. The
+first patch is required on Tk 4.2 (where it fixes the problems for
+16-bit displays) and later versions, with the exception for Tk 8.0b1
+where Sun added something similar themselves, only to remove it in
+8.0b2. By installing both patches, Tk's PhotoImage handling becomes
+much faster on both 16-bit and 24-bit displays. The patch has been
+tested with Tk 4.2 and 8.0.
+
+ Here's a benchmark, made with a sample program which loads two
+512x512 greyscale PGM's, and two 512x512 colour PPM's, and displays
+each of them in a separate toplevel windows. Tcl/Tk was compiled
+with Visual C 4.0, and run on a P100 under Win95. Image load times
+are not included in the timings:
+
+ 8-bit 16-bit 24-bit
+--------------------------------------------------------------------
+1. original 4.2 code 5.52 s 8.57 s 3.79 s
+2. booster patch 5.49 s 1.87 s 1.82 s
+
+ speedup None 4.6x 2.1x
+
+====================================================================
+
+Here's the patches:
+
+1. For portability and speed, the best thing under Windows is to
+treat 16-bit displays as if they were 24-bit. The Windows device
+drivers take care of the rest.
+
+ ----------------------------------------------------------------
+ If you have Tk 4.1 or Tk 8.0b1, you don't have to apply this
+ patch! It only applies to Tk 4.2, Tk 8.0a[12] and Tk 8.0b2.
+ ----------------------------------------------------------------
+
+In win/tkWinImage.c, change the following line in XCreateImage:
+
+ imagePtr->bits_per_pixel = depth;
+
+to
+
+/* ==================================================================== */
+/* The tk photo image booster patch -- patch section 1 */
+/* ==================================================================== */
+
+ if (visual->class == TrueColor)
+ /* true colour is stored as 3 bytes: (blue, green, red) */
+ imagePtr->bits_per_pixel = 24;
+ else
+ imagePtr->bits_per_pixel = depth;
+
+/* ==================================================================== */
+
+
+2. The DitherInstance implementation is not good. It's especially
+bad on highend truecolour displays. IMO, it should be rewritten from
+scratch (some other day...).
+
+ Anyway, the following band-aid makes the situation a little bit
+better under Windows. This hack trades some marginal quality (no
+dithering on 16-bit displays) for a dramatic performance boost.
+Requires patch 1, unless you're using Tk 4.1 or Tk 8.0b1.
+
+In generic/tkImgPhoto.c, add the #ifdef section to the DitherInstance
+function:
+
+ for (; height > 0; height -= nLines) {
+ if (nLines > height) {
+ nLines = height;
+ }
+ dstLinePtr = (unsigned char *) imagePtr->data;
+ yEnd = yStart + nLines;
+
+/* ==================================================================== */
+/* The tk photo image booster patch -- patch section 2 */
+/* ==================================================================== */
+
+#ifdef __WIN32__
+ if (colorPtr->visualInfo.class == TrueColor
+ && instancePtr->gamma == 1.0) {
+ /* Windows hicolor/truecolor booster */
+ for (y = yStart; y < yEnd; ++y) {
+ destBytePtr = dstLinePtr;
+ srcPtr = srcLinePtr;
+ for (x = xStart; x < xEnd; ++x) {
+ destBytePtr[0] = srcPtr[2];
+ destBytePtr[1] = srcPtr[1];
+ destBytePtr[2] = srcPtr[0];
+ destBytePtr += 3; srcPtr += 3;
+ }
+ srcLinePtr += lineLength;
+ dstLinePtr += bytesPerLine;
+ }
+ } else
+#endif
+
+/* ==================================================================== */
+
+ for (y = yStart; y < yEnd; ++y) {
+ srcPtr = srcLinePtr;
+ errPtr = errLinePtr;
+ destBytePtr = dstLinePtr;
+
+====================================================================
+last updated: 97-07-03/fl