diff --git a/graphics/x11drv/dib.c b/graphics/x11drv/dib.c
index 789ba03425ef976719ae673f1f184b16ced07008..2ebc269d72653cf38011222f0e166ad8cebcf6aa 100644
--- a/graphics/x11drv/dib.c
+++ b/graphics/x11drv/dib.c
@@ -4023,8 +4023,16 @@ UINT X11DRV_DIB_SetDIBColorTable(BITMAPOBJ *bmp, DC *dc, UINT start, UINT count,
   X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *) bmp->dib;
 
   if (dib && dib->colorMap) {
-    X11DRV_DIB_GenColorMap( dc, dib->colorMap, DIB_RGB_COLORS, dib->dibSection.dsBm.bmBitsPixel,
+    /*
+     * Changing color table might change the mapping between
+     * DIB colors and X11 colors and thus alter the visible state
+     * of the bitmap object.
+     */
+    X11DRV_DIB_Lock(bmp, DIB_Status_AppMod, FALSE);
+    X11DRV_DIB_GenColorMap( dc, dib->colorMap, DIB_RGB_COLORS, 
+                           dib->dibSection.dsBm.bmBitsPixel,
                             TRUE, colors, start, count + start );
+    X11DRV_DIB_Unlock(bmp, TRUE);
     return count;
   }
   return 0;