From ddde229665a869d91ceea49748cacb2984409ee6 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 May 2001 00:16:28 +0000 Subject: [PATCH] - fixed speckles (white dots) on dithered images (bug still present on the PowerPC architecture, because on LinuxPPC char is unsigned by default, not signed like on the other platforms). Bug fixed by Philip Derrin - miscelaneous bug fixes We would like people with cvs access experimenting the white 'speckles' on images to test if they still have the problem. --- INSTALL | 1 + WINGs/Tests/wtest.c | 31 ++++++++++++++++--------------- WINGs/wtext.c | 43 +++++++++++++++++++++++-------------------- src/defaults.c | 8 ++++---- wrlib/ChangeLog | 5 +++++ wrlib/convert.c | 20 ++++++++++++++------ wrlib/gradient.c | 12 ++++++------ wrlib/view.c | 12 ++++++++---- 8 files changed, 77 insertions(+), 55 deletions(-) diff --git a/INSTALL b/INSTALL index 46727fd9..f9660115 100644 --- a/INSTALL +++ b/INSTALL @@ -38,6 +38,7 @@ SUPPORTED PLATFORMS - Amiga 3000 running RedHat Linux 5.1 (Rawhide) - IBM S/390 running Linux - iBook running Darwin +- Windows NT with Cygwin/XFree86 Patches to make it work on other platforms are welcome. diff --git a/WINGs/Tests/wtest.c b/WINGs/Tests/wtest.c index 14d4ae50..07839c3d 100644 --- a/WINGs/Tests/wtest.c +++ b/WINGs/Tests/wtest.c @@ -610,21 +610,21 @@ testText(WMScreen *scr) if(file) { char buf[1024]; - WMFreezeText(text); - while(fgets(buf, 1023, file)) - WMAppendTextStream(text, buf); - - fclose(file); - WMThawText(text); - } else { - WMAppendTextStream(text, - "Window Maker is the GNU window manager for the " - "X Window System. It was designed to emulate the " - "look and feel of part of the NEXTSTEP(tm) GUI. Its " - "supposed to be relatively fast and small, feature " - "rich, easy to configure and easy to use, with a simple " - "and elegant appearance borrowed from NEXTSTEP(tm)."); - } + WMFreezeText(text); + while(fgets(buf, 1023, file)) + WMAppendTextStream(text, buf); + + fclose(file); + WMThawText(text); + } else { + WMAppendTextStream(text, + "Window Maker is the GNU window manager for the " + "X Window System. It was designed to emulate the " + "look and feel of part of the NEXTSTEP(tm) GUI. Its " + "supposed to be relatively fast and small, feature " + "rich, easy to configure and easy to use, with a simple " + "and elegant appearance borrowed from NEXTSTEP(tm)."); + } WMRealizeWidget(win); WMMapSubwidgets(win); @@ -1294,6 +1294,7 @@ main(int argc, char **argv) testDragAndDrop(scr); + testText(scr); #if 0 testColorPanel(scr); testScrollView(scr); diff --git a/WINGs/wtext.c b/WINGs/wtext.c index b1d086fe..4e0f916e 100644 --- a/WINGs/wtext.c +++ b/WINGs/wtext.c @@ -616,10 +616,10 @@ TextBlock *tb) } - if(!tb->sections) + if(!tb->sections) { layOutDocument(tPtr); - if(!tb->sections) return 0; + } *dir = !(y <= tb->sections[0].y); if(*dir) { @@ -3597,7 +3597,8 @@ WMAppendTextBlock(WMText *tPtr, void *vtb) tPtr->currentTextBlock = tb; } -void * + +void* WMRemoveTextBlock(WMText *tPtr) { TextBlock *tb = NULL; @@ -3637,15 +3638,15 @@ WMRemoveTextBlock(WMText *tPtr) } +#if 0 static void destroyWidget(WMWidget *widget) { - if(!widget) - return; - WMDestroyWidget(widget); - wfree(widget); + // -- never do this -- wfree(widget); } +#endif + void WMDestroyTextBlock(WMText *tPtr, void *vtb) @@ -3656,30 +3657,32 @@ WMDestroyTextBlock(WMText *tPtr, void *vtb) if (tb->graphic) { if(tb->object) { -/* naturally, there's a danger to destroying widgets whose action - brings us here: ie. press a button to destroy it... - need to find a safer way. till then... this stays commented out */ -/* 5 months later... destroy it 10 seconds after now which should be - enough time for the widget's action to be completed... :-) */ - WMAddTimerHandler(10000, destroyWidget, (void *)tb->d.widget); - tb->d.widget = NULL; - + /* naturally, there's a danger to destroying widgets whose action + * brings us here: ie. press a button to destroy it... + * need to find a safer way. till then... this stays commented out */ + /* 5 months later... destroy it 10 seconds after now which should + * be enough time for the widget's action to be completed... :-) */ + // This is a bad assumption. Just destroy the widget here. + // if the caller needs it, it can protect it with W_RetainView() + //WMAddTimerHandler(10000, destroyWidget, (void *)tb->d.widget); + WMDestroyWidget(tb->d.widget); + //tb->d.widget = NULL; } else { WMReleasePixmap(tb->d.pixmap); - tb->d.pixmap = NULL; + //tb->d.pixmap = NULL; } } else { WMReleaseFont(tb->d.font); } - + WMReleaseColor(tb->color); - if (tb->sections && tb->nsections > 0) + // isn't this going to memleak if nsections==0? if (tb->sections && tb->nsections > 0) + if (tb->sections) wfree(tb->sections); wfree(tb->text); wfree(tb); - tb = NULL; + //tb = NULL; } - void diff --git a/src/defaults.c b/src/defaults.c index 17dce276..a8cfdad2 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -797,18 +797,18 @@ WDefaultEntry optionList[] = { }, {"ScreenSwitchKey", "None", (void*)WKBD_SWITCH_SCREEN, NULL, getKeybind, setKeyGrab - }, + } #ifdef KEEP_XKB_LOCK_STATUS - {"ToggleKbdModeKey", "None", (void*)WKBD_TOGGLE, + ,{"ToggleKbdModeKey", "None", (void*)WKBD_TOGGLE, NULL, getKeybind, setKeyGrab }, {"KbdModeLock", "NO", NULL, &wPreferences.modelock, getBool, NULL - }, + } #endif /* KEEP_XKB_LOCK_STATUS */ #ifdef DEFINABLE_CURSOR - {"NormalCursor", "(builtin, left_ptr)", (void*)WCUR_ROOT, + ,{"NormalCursor", "(builtin, left_ptr)", (void*)WCUR_ROOT, NULL, getCursor, setCursor }, {"MoveCursor", "(builtin, fleur)", (void*)WCUR_MOVE, diff --git a/wrlib/ChangeLog b/wrlib/ChangeLog index da609b3b..f6441228 100644 --- a/wrlib/ChangeLog +++ b/wrlib/ChangeLog @@ -7,6 +7,11 @@ - Small speed improvement for 24 and 32 bpp, if internal converter is used - Small speed improvement for generating gradients. - Fixed RSaveXPM() to output correct xpm images. +- fixed speckles (white dots) on dithered images (bug still present on the + PowerPC architecture, because on LinuxPPC char is unsigned by default, not + signed like on the other platforms). + Bug fixed by Philip Derrin + - fixed code dependant on the order of evaluation. code like *ptr++ = *ptr++ = *ptr++ = color; diff --git a/wrlib/convert.c b/wrlib/convert.c index 4ec4e8d7..ebd5e106 100644 --- a/wrlib/convert.c +++ b/wrlib/convert.c @@ -139,7 +139,7 @@ computeStdTable(unsigned int mult, unsigned int max) static void convertTrueColor_generic(RXImage *ximg, RImage *image, - char *err, char *nerr, + signed char *err, signed char *nerr, const short *rtable, const short *gtable, const short *btable, @@ -148,7 +148,7 @@ convertTrueColor_generic(RXImage *ximg, RImage *image, const unsigned short goffs, const unsigned short boffs) { - char *terr; + signed char *terr; int x, y, r, g, b; int pixel; int rer, ger, ber; @@ -330,7 +330,7 @@ image2TrueColor(RContext *ctx, RImage *image) static void convertPseudoColor_to_8(RXImage *ximg, RImage *image, - char *err, char *nerr, + signed char *err, signed char *nerr, const short *rtable, const short *gtable, const short *btable, @@ -338,7 +338,7 @@ convertPseudoColor_to_8(RXImage *ximg, RImage *image, unsigned long *pixels, int cpc) { - char *terr; + signed char *terr; int x, y, r, g, b; int pixel; int rer, ger, ber; @@ -545,8 +545,8 @@ image2StandardPseudoColor(RContext *ctx, RImage *image) } } else { /* dither */ - short *err, *nerr; - short *terr; + signed short *err, *nerr; + signed short *terr; int rer, ger, ber; int x1, ofs; @@ -842,6 +842,14 @@ hermesConvert(RContext *context, RImage *image) dest.indexed = 1; dest.has_colorkey = 0; + /*printf("source r=0x%x, g=0x%x, b=0x%x, a=0x%x, b=%d, i=%d, c=%d\n", + source.r, source.g, source.b, source.a, + source.bits, source.indexed, source.has_colorkey); + printf("dest r=0x%x, g=0x%x, b=0x%x, a=0x%x, b=%d, i=%d, c=%d\n", + dest.r, dest.g, dest.b, dest.a, + dest.bits, dest.indexed, dest.has_colorkey); + */ + Hermes_ConverterRequest(context->hermes_data->converter, &source, &dest); Hermes_ConverterPalette(context->hermes_data->converter, diff --git a/wrlib/gradient.c b/wrlib/gradient.c index 69e4b80d..41516f7a 100644 --- a/wrlib/gradient.c +++ b/wrlib/gradient.c @@ -115,7 +115,7 @@ renderHGradient(unsigned width, unsigned height, int r0, int g0, int b0, int rf, int gf, int bf) { int i; - unsigned long r, g, b, dr, dg, db; + long r, g, b, dr, dg, db; unsigned lineSize = width*3; RImage *image; unsigned char *ptr; @@ -170,7 +170,7 @@ renderVGradient(unsigned width, unsigned height, int r0, int g0, int b0, int rf, int gf, int bf) { int i, j; - unsigned long r, g, b, dr, dg, db; + long r, g, b, dr, dg, db; RImage *image; unsigned char *ptr; unsigned char rr, gg, bb; @@ -280,7 +280,7 @@ static RImage* renderMHGradient(unsigned width, unsigned height, RColor **colors, int count) { int i, j, k; - unsigned long r, g, b, dr, dg, db; + long r, g, b, dr, dg, db; unsigned lineSize = width*3; RImage *image; unsigned char *ptr; @@ -347,7 +347,7 @@ static RImage* renderMVGradient(unsigned width, unsigned height, RColor **colors, int count) { int i, j, k; - unsigned long r, g, b, dr, dg, db; + long r, g, b, dr, dg, db; unsigned lineSize = width*3; RImage *image; unsigned char *ptr, *tmp; @@ -498,8 +498,8 @@ RRenderInterwovenGradient(unsigned width, unsigned height, RColor colors2[2], int thickness2) { int i, j, k, l, ll; - unsigned long r1, g1, b1, dr1, dg1, db1; - unsigned long r2, g2, b2, dr2, dg2, db2; + long r1, g1, b1, dr1, dg1, db1; + long r2, g2, b2, dr2, dg2, db2; RImage *image; unsigned char *ptr; unsigned char rr, gg, bb; diff --git a/wrlib/view.c b/wrlib/view.c index 97ff07a7..ae1bfead 100644 --- a/wrlib/view.c +++ b/wrlib/view.c @@ -36,15 +36,19 @@ main(int argc, char **argv) puts(RMessageForError(RErrorCode)); exit(1); } - /* + if (argc > 2) { RImage *tmp = img; - img = RSmoothScaleImage(tmp, tmp->width*atol(argv[2]), - tmp->height*atol(argv[2])); + img = RScaleImage(tmp, tmp->width*atol(argv[2]), + tmp->height*atol(argv[2])); + /*img = RSmoothScaleImage(tmp, tmp->width*atol(argv[2]), + tmp->height*atol(argv[2])); + */ + RReleaseImage(tmp); } - */ + #if 0 if (argc > 2) { img = RScaleImage(img, img->width*atof(argv[2]),