summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorIzik Eidus <ieidus@redhat.com>2009-12-23 17:43:12 +0200
committerYaniv Kamay <ykamay@redhat.com>2010-01-03 17:48:52 +0200
commit032740323dda52be5b2cad0ddae96781072503f8 (patch)
tree95f1e467417db9d2105e9267c67838626b6963e6 /common
parent1c87b17283cec9a6b231a0109861aca71427d2d9 (diff)
downloadspice-032740323dda52be5b2cad0ddae96781072503f8.tar.gz
spice-032740323dda52be5b2cad0ddae96781072503f8.tar.xz
spice-032740323dda52be5b2cad0ddae96781072503f8.zip
spice client: fix wrong gdi-canvas handling of blend_alpha
Signed-off-by: Izik Eidus <ieidus@redhat.com>
Diffstat (limited to 'common')
-rw-r--r--common/gdi_canvas.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c
index 99079f56..0bd19a4a 100644
--- a/common/gdi_canvas.c
+++ b/common/gdi_canvas.c
@@ -1157,14 +1157,19 @@ void gdi_canvas_draw_transparent(GdiCanvas *canvas, Rect *bbox, Clip *clip,
}
static void gdi_draw_bitmap_alpha(HDC dest_dc, const Rect *src, const Rect *dest,
- HDC src_dc, uint8_t alpha)
+ HDC src_dc, uint8_t alpha, int use_bitmap_alpha)
{
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = alpha;
- bf.AlphaFormat = AC_SRC_ALPHA;
+
+ if (use_bitmap_alpha) {
+ bf.AlphaFormat = AC_SRC_ALPHA;
+ } else {
+ bf.AlphaFormat = 0;
+ }
if (!AlphaBlend(dest_dc, dest->left, dest->top, dest->right - dest->left,
dest->bottom - dest->top, src_dc, src->left, src->top,
@@ -1176,7 +1181,7 @@ static void gdi_draw_bitmap_alpha(HDC dest_dc, const Rect *src, const Rect *dest
static void gdi_draw_image_alpha(HDC dest_dc, const Rect *src, const Rect *dest,
const uint8_t *bitmap_data, int bit_stride,
int bit_width, int bit_height, uint8_t alpha,
- int rotate)
+ int rotate, int use_bitmap_alpha)
{
HDC dc;
HBITMAP bitmap;
@@ -1185,7 +1190,7 @@ static void gdi_draw_image_alpha(HDC dest_dc, const Rect *src, const Rect *dest,
create_bitmap(&bitmap, &prev_bitmap, &dc, bitmap_data, bit_width, bit_height,
bit_stride, 32, rotate);
- gdi_draw_bitmap_alpha(dest_dc, src, dest, dc, alpha);
+ gdi_draw_bitmap_alpha(dest_dc, src, dest, dc, alpha, use_bitmap_alpha);
release_bitmap(dc, bitmap, prev_bitmap, 0);
}
@@ -1195,8 +1200,10 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph
cairo_surface_t *surface;
GdiImage image;
BitmapCache *bitmap_cache;
+ int use_bitmap_alpha;
surface = canvas_get_image(&canvas->base, alpha_blend->src_bitmap);
+ use_bitmap_alpha = cairo_image_surface_get_format(surface) == CAIRO_FORMAT_ARGB32;
bitmap_cache = (BitmapCache *)cairo_surface_get_user_data(surface, &bitmap_data_type);
Lock lock(*canvas->lock);
@@ -1207,7 +1214,8 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph
dc = create_compatible_dc();
prev_bitmap = (HBITMAP)SelectObject(dc, bitmap_cache->bitmap);
- gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha);
+ gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha,
+ use_bitmap_alpha);
SelectObject(dc, prev_bitmap);
DeleteObject(dc);
ReleaseMutex(bitmap_cache->mutex);
@@ -1215,7 +1223,7 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph
surface_to_image(surface, &image);
gdi_draw_image_alpha(canvas->dc, &alpha_blend->src_area, bbox, image.pixels,
image.stride, image.width, image.height,
- alpha_blend->alpha, 0);
+ alpha_blend->alpha, 0, use_bitmap_alpha);
}
cairo_surface_destroy(surface);