diff options
-rw-r--r-- | vncviewer/Surface_OSX.cxx | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/vncviewer/Surface_OSX.cxx b/vncviewer/Surface_OSX.cxx index 3313ae3b..fe2d722b 100644 --- a/vncviewer/Surface_OSX.cxx +++ b/vncviewer/Surface_OSX.cxx @@ -33,9 +33,10 @@ static CGColorSpaceRef srgb = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); static CGImageRef create_image(CGColorSpaceRef lut, const unsigned char* data, - int w, int h) + int w, int h, bool skip_alpha) { CGDataProviderRef provider; + CGImageAlphaInfo alpha; CGImageRef image; @@ -44,8 +45,15 @@ static CGImageRef create_image(CGColorSpaceRef lut, if (!provider) throw rdr::Exception("CGDataProviderCreateWithData"); + // FIXME: This causes a performance hit, but is necessary to avoid + // artifacts in the edges of the window + if (skip_alpha) + alpha = kCGImageAlphaNoneSkipFirst; + else + alpha = kCGImageAlphaPremultipliedFirst; + image = CGImageCreate(w, h, 8, 32, w * 4, lut, - kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, + alpha | kCGBitmapByteOrder32Little, provider, NULL, false, kCGRenderingIntentDefault); CGDataProviderRelease(provider); if (!image) @@ -63,7 +71,7 @@ static void render(CGContextRef gc, CGColorSpaceRef lut, CGRect rect; CGImageRef image, subimage; - image = create_image(lut, data, src_w, src_h); + image = create_image(lut, data, src_w, src_h, mode == kCGBlendModeCopy); rect.origin.x = src_x; rect.origin.y = src_y; |