import xemacs-21.2.37
[chise/xemacs-chise.git.1] / src / redisplay-msw.c
index 744d6ba..307fd6e 100644 (file)
@@ -134,9 +134,9 @@ separate_textual_runs (unsigned char *text_storage,
 #ifdef MULE
          {
            Lisp_Object ccl_prog = XCHARSET_CCL_PROGRAM (charset);
-           need_ccl_conversion = !NILP (ccl_prog);
-           if (need_ccl_conversion)
-             setup_ccl_program (&char_converter, ccl_prog);
+           if ((!NILP (ccl_prog))
+                 && (setup_ccl_program (&char_converter, ccl_prog) >= 0))
+             need_ccl_conversion = 1;
          }
 #endif
        }
@@ -576,42 +576,66 @@ mswindows_output_dibitmap (struct frame *f, Lisp_Image_Instance *p,
   HDC hdc = get_frame_dc (f, 1);
   HDC hcompdc = get_frame_compdc (f);
   HGDIOBJ old=NULL;
-  COLORREF bgcolor = GetBkColor (hdc);
+  const int real_x = IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (p);
+  const int real_y = IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (p);
+  const int surface_x = IMAGE_INSTANCE_PIXMAP_WIDTH (p);
+  const int surface_y = IMAGE_INSTANCE_PIXMAP_HEIGHT (p);
 
-  /* first blt the mask */
+  /* first blit the mask */
   if (IMAGE_INSTANCE_MSWINDOWS_MASK (p))
     {
-      RGBQUAD col;
-      col.rgbBlue = GetBValue (bgcolor);
-      col.rgbRed = GetRValue (bgcolor);
-      col.rgbGreen = GetGValue (bgcolor);
-      col.rgbReserved = 0;
+      RGBQUAD bg;
+      COLORREF bgcolor;
 
       old = SelectObject (hcompdc, IMAGE_INSTANCE_MSWINDOWS_MASK (p));
       
-      SetDIBColorTable (hcompdc, 1, 1, &col);
-
-      BitBlt (hdc, 
-             db->xpos, db->ypos,
-             dga->width, dga->height, 
-             hcompdc,
-             dga->xoffset, dga->yoffset, 
-             SRCCOPY);                  
+      if (IMAGE_INSTANCE_TYPE (p) == IMAGE_MONO_PIXMAP)
+       {
+         COLORREF fgcolor;
+         RGBQUAD fg;
+
+         fgcolor = GetTextColor (hdc);
+         fg.rgbBlue = GetBValue (fgcolor);
+         fg.rgbRed = GetRValue (fgcolor);
+         fg.rgbGreen = GetGValue (fgcolor);
+         fg.rgbReserved = 0;
+         SetDIBColorTable (hcompdc, 0, 1, &fg);
+       }
+
+      bgcolor = GetBkColor (hdc);
+      bg.rgbBlue = GetBValue (bgcolor);
+      bg.rgbRed = GetRValue (bgcolor);
+      bg.rgbGreen = GetGValue (bgcolor);
+      bg.rgbReserved = 0;
+      SetDIBColorTable (hcompdc, 1, 1, &bg);
+
+      StretchBlt (hdc, 
+                 db->xpos, db->ypos,
+                 dga->width, dga->height, 
+                 hcompdc,
+                 MulDiv (dga->xoffset, real_x, surface_x),
+                 MulDiv (dga->yoffset, real_y, surface_y),
+                 MulDiv (dga->width, real_x, surface_x),
+                 MulDiv (dga->height, real_y, surface_y),
+                 SRCCOPY);                  
 
       SelectObject (hcompdc, old);
     }
   
-  /* Now blt the bitmap itself, or one of its slices. */
+  /* Now blit the bitmap itself, or one of its slices. */
   old = SelectObject (hcompdc,
                      IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE 
                      (p, IMAGE_INSTANCE_PIXMAP_SLICE (p)));
 
-  BitBlt (hdc, 
-         db->xpos, db->ypos,
-         dga->width, dga->height,
-         hcompdc,
-         dga->xoffset, dga->yoffset, 
-         IMAGE_INSTANCE_MSWINDOWS_MASK (p) ? SRCINVERT : SRCCOPY);
+  StretchBlt (hdc, 
+             db->xpos, db->ypos,
+             dga->width, dga->height,
+             hcompdc,
+             MulDiv (dga->xoffset, real_x, surface_x),
+             MulDiv (dga->yoffset, real_y, surface_y),
+             MulDiv (dga->width, real_x, surface_x),
+             MulDiv (dga->height, real_y, surface_y),
+             IMAGE_INSTANCE_MSWINDOWS_MASK (p) ? SRCINVERT : SRCCOPY);
 
   SelectObject (hcompdc, old);
 }
@@ -947,22 +971,38 @@ mswindows_eol_cursor_width (void)
 }
 
 /*****************************************************************************
- mswindows_output_begin
+ mswindows_frame_output_begin
 
  Perform any necessary initialization prior to an update.
  ****************************************************************************/
 static void
-mswindows_output_begin (struct device *d)
+mswindows_frame_output_begin (struct frame *f)
 {
 }
 
 /*****************************************************************************
- mswindows_output_end
+ mswindows_frame_output_end
 
  Perform any necessary flushing of queues when an update has completed.
  ****************************************************************************/
 static void
-mswindows_output_end (struct device *d)
+mswindows_frame_output_end (struct frame *f)
+{
+#ifdef DEFER_WINDOW_POS
+  HDWP hdwp = FRAME_MSWINDOWS_DATA (f)->hdwp;
+
+  if (hdwp != 0)
+    {
+      EndDeferWindowPos (hdwp);
+      FRAME_MSWINDOWS_DATA (f)->hdwp = 0;
+    }
+#endif
+  GdiFlush();
+}
+
+/* Printer version is more lightweight. */
+static void
+msprinter_frame_output_end (struct frame *f)
 {
   GdiFlush();
 }
@@ -1137,27 +1177,6 @@ mswindows_output_display_block (struct window *w, struct display_line *dl, int b
                {
                  switch (XIMAGE_INSTANCE_TYPE (instance))
                    {
-                   case IMAGE_TEXT:
-                     {
-                       /* #### This is way losing.  See the comment in
-                          add_glyph_rune(). */
-                       Lisp_Object string =
-                         XIMAGE_INSTANCE_TEXT_STRING (instance);
-                       convert_bufbyte_string_into_emchar_dynarr
-                         (XSTRING_DATA (string), XSTRING_LENGTH (string), buf);
-                       
-                       if (rb->cursor_type == CURSOR_ON)
-                         mswindows_output_cursor (w, dl, xpos, cursor_width,
-                                                  findex, Dynarr_at (buf, 0), 0);
-                       else /* #### redisplay-x passes -1 as the width: why ? */
-                         mswindows_output_string (w, dl, buf, xpos,
-                                                  rb->object.dglyph.xoffset,
-                                                  start_pixpos, rb->width, findex,
-                                                  0, 0, 0, 0);
-                       Dynarr_reset (buf);
-                     }
-                     break;
-                     
                    case IMAGE_MONO_PIXMAP:
                    case IMAGE_COLOR_PIXMAP:
                      redisplay_output_pixmap (w, instance, &dbox, &dga, findex,
@@ -1168,11 +1187,19 @@ mswindows_output_display_block (struct window *w, struct display_line *dl, int b
                                                 findex, 0, 1);
                      break;
                      
-                   case IMAGE_POINTER:
-                     abort ();
-                     
-                   case IMAGE_SUBWINDOW:
                    case IMAGE_WIDGET:
+                     if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
+                             Qlayout))
+                       {
+                         redisplay_output_layout (window, instance, &dbox, &dga, findex,
+                                                  cursor_start, cursor_width,
+                                                  cursor_height);
+                         if (rb->cursor_type == CURSOR_ON)
+                           mswindows_output_cursor (w, dl, xpos, cursor_width,
+                                                    findex, 0, 1);
+                         break;
+                       }
+                   case IMAGE_SUBWINDOW:
                      redisplay_output_subwindow (w, instance, &dbox, &dga, findex,
                                                  cursor_start, cursor_width,
                                                  cursor_height);
@@ -1181,19 +1208,12 @@ mswindows_output_display_block (struct window *w, struct display_line *dl, int b
                                                 findex, 0, 1);
                      break;
                      
-                   case IMAGE_LAYOUT:
-                     redisplay_output_layout (w, instance, &dbox, &dga, findex,
-                                              cursor_start, cursor_width,
-                                              cursor_height);
-                     if (rb->cursor_type == CURSOR_ON)
-                       mswindows_output_cursor (w, dl, xpos, cursor_width,
-                                                findex, 0, 1);
-                     break;
-                     
                    case IMAGE_NOTHING:
                      /* nothing is as nothing does */
                      break;
-                     
+
+                   case IMAGE_TEXT:
+                   case IMAGE_POINTER:
                    default:
                      abort ();
                    }
@@ -1370,8 +1390,8 @@ console_type_create_redisplay_mswindows (void)
   CONSOLE_HAS_METHOD (mswindows, output_vertical_divider);
   CONSOLE_HAS_METHOD (mswindows, clear_region);
   CONSOLE_HAS_METHOD (mswindows, clear_frame);
-  CONSOLE_HAS_METHOD (mswindows, output_begin);
-  CONSOLE_HAS_METHOD (mswindows, output_end);
+  CONSOLE_HAS_METHOD (mswindows, frame_output_begin);
+  CONSOLE_HAS_METHOD (mswindows, frame_output_end);
   CONSOLE_HAS_METHOD (mswindows, flash);
   CONSOLE_HAS_METHOD (mswindows, ring_bell);
   CONSOLE_HAS_METHOD (mswindows, bevel_area);
@@ -1379,6 +1399,7 @@ console_type_create_redisplay_mswindows (void)
   CONSOLE_HAS_METHOD (mswindows, output_pixmap);
 
   /* redisplay methods - printer */
+  CONSOLE_HAS_METHOD (msprinter, frame_output_end);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, text_width);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_display_block);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, divider_height);
@@ -1386,8 +1407,7 @@ console_type_create_redisplay_mswindows (void)
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_vertical_divider);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, clear_region);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, clear_frame);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_begin);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_end);
+  CONSOLE_INHERITS_METHOD (msprinter, mswindows, frame_output_begin);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, bevel_area);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_string);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_pixmap);