MS Windows engine: draw elements in the right place.

Work in progress, still remains to be solved the problem of clipping.
This commit is contained in:
Martin Schlemmer
2010-09-03 22:18:21 +02:00
committed by Fridrich Štrba
parent 3b63ef0ac6
commit e6da33a302
2 changed files with 28 additions and 49 deletions

View File

@ -900,42 +900,29 @@ get_window_dc (GtkStyle *style,
gint x, gint y, gint width, gint height, gint x, gint y, gint width, gint height,
RECT *rect_out) RECT *rect_out)
{ {
#if 0
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);
#else
cairo_t *cr; cairo_t *cr;
cairo_surface_t *crs; cairo_surface_t *surface;
gint x_offset, y_offset; HDC dc;
gint x_offset = 0, y_offset = 0;
double x_off, y_off;
dc_info_out->cr = NULL;
dc_info_out->dc = NULL;
cr = gdk_cairo_create (window); cr = gdk_cairo_create (window);
crs = cairo_get_target (cr); if (!cr)
x_offset = 0; return NULL;
y_offset = 0;
surface = cairo_get_target (cr);
cairo_surface_get_device_offset (surface, &x_off, &y_off);
cairo_surface_flush (surface);
dc_info_out->data = NULL; dc = cairo_win32_surface_get_dc (surface);
if (!dc)
return NULL;
x_offset = -x_off;
y_offset = -y_off;
rect_out->left = x - x_offset; rect_out->left = x - x_offset;
rect_out->top = y - y_offset; rect_out->top = y - y_offset;
@ -943,23 +930,24 @@ get_window_dc (GtkStyle *style,
rect_out->bottom = rect_out->top + height; rect_out->bottom = rect_out->top + height;
dc_info_out->cr = cr; dc_info_out->cr = cr;
dc_info_out->dc = dc;
dc_info_out->x_offset = x_offset; dc_info_out->x_offset = x_offset;
dc_info_out->y_offset = y_offset; dc_info_out->y_offset = y_offset;
return cairo_win32_surface_get_dc (crs); return dc;
#endif
} }
void void
release_window_dc (XpDCInfo *dc_info) release_window_dc (XpDCInfo *dc_info)
{ {
#if 0 if (!dc_info->cr || !dc_info->dc)
gdk_win32_hdc_release (dc_info->drawable, dc_info->gc, 0); return;
gdk_win32_end_direct_draw_libgtk_only (dc_info->data); ReleaseDC (NULL, dc_info->dc);
#else
cairo_destroy (dc_info->cr); cairo_destroy (dc_info->cr);
#endif
dc_info->cr = NULL;
dc_info->dc = NULL;
} }
gboolean gboolean

View File

@ -115,19 +115,10 @@ typedef enum
typedef struct typedef struct
{ {
#if 0
GdkDrawable *drawable;
GdkGC *gc;
#else
cairo_t *cr; cairo_t *cr;
cairo_surface_t *crs; HDC dc;
#endif
gint x_offset; gint x_offset;
gint y_offset; gint y_offset;
/*< private >*/
gpointer data;
} XpDCInfo; } XpDCInfo;
HDC get_window_dc (GtkStyle *style, HDC get_window_dc (GtkStyle *style,