HDC get_window_dc (GtkStyle *style, GdkWindow *window, GtkStateType state_type, XpDCInfo *dc_info_out, gint x, gint y, gint width, gint height, RECT *rect_out) { GdkDrawable *drawable = NULL; GdkGC *gc = style->dark_gc[state_type]; gint x_offset, y_offset; dc_info_out->data = NULL; drawable = gdk_win32_begin_direct_draw_libgtk_only (window, gc, &dc_info_out->data, &x_offset, &y_offset); if (!drawable) return NULL; rect_out->left = x - x_offset; rect_out->top = y - y_offset; rect_out->right = rect_out->left + width; rect_out->bottom = rect_out->top + height; dc_info_out->drawable = drawable; dc_info_out->gc = gc; dc_info_out->x_offset = x_offset; dc_info_out->y_offset = y_offset; return gdk_win32_hdc_get (drawable, gc, 0); }
/* Handle a draw/expose by finding the paragraphs that intersect * the region and reexposing them. */ void draw (GtkWidget *layout, GdkRectangle *area) { GList *tmp_list; guint height = 0; HDC hdc; const GdkGCValuesMask mask = GDK_GC_FOREGROUND|GDK_GC_BACKGROUND|GDK_GC_FONT; gdk_draw_rectangle (GTK_LAYOUT (layout)->bin_window, layout->style->base_gc[layout->state], TRUE, area->x, area->y, area->width, area->height); gdk_gc_set_clip_rectangle (layout->style->text_gc[layout->state], area); hdc = gdk_win32_hdc_get (GTK_LAYOUT (layout)->bin_window, layout->style->text_gc[GTK_STATE_NORMAL], mask); tmp_list = paragraphs; while (tmp_list && height < area->y + area->height + GTK_LAYOUT (layout)->yoffset) { Paragraph *para = tmp_list->data; tmp_list = tmp_list->next; if (height + para->height >= GTK_LAYOUT (layout)->yoffset + area->y) pango_win32_render_layout (hdc, para->layout, 0, height - GTK_LAYOUT (layout)->yoffset); height += para->height; } gdk_win32_hdc_release (GTK_LAYOUT (layout)->bin_window, layout->style->text_gc[GTK_STATE_NORMAL], mask); gdk_gc_set_clip_rectangle (layout->style->text_gc[layout->state], NULL); if (highlight_para) xor_char (layout, area, highlight_para, highlight_offset); }