summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2014-02-12 13:12:31 +0100
committerPierre Ossman <ossman@cendio.se>2014-07-07 13:27:09 +0200
commit4d0bc6e7cac91fedb70c278a6dc36c75a1344a0e (patch)
treed2e2e68f65f9968095818678c9929fa2ac940bc0 /win
parentb266561b0c6e97fe0669fb25719503aa608237ce (diff)
downloadtigervnc-4d0bc6e7cac91fedb70c278a6dc36c75a1344a0e.tar.gz
tigervnc-4d0bc6e7cac91fedb70c278a6dc36c75a1344a0e.zip
Fix some offenders that poke around in the PixelFormat internals
Diffstat (limited to 'win')
-rw-r--r--win/rfb_win32/DIBSectionBuffer.cxx48
-rw-r--r--win/rfb_win32/DeviceContext.cxx53
2 files changed, 58 insertions, 43 deletions
diff --git a/win/rfb_win32/DIBSectionBuffer.cxx b/win/rfb_win32/DIBSectionBuffer.cxx
index 3c2f5096..0c266b00 100644
--- a/win/rfb_win32/DIBSectionBuffer.cxx
+++ b/win/rfb_win32/DIBSectionBuffer.cxx
@@ -1,4 +1,5 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
+ * Copyright 2014 Pierre Ossman for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -55,9 +56,11 @@ void DIBSectionBuffer::setPF(const PixelFormat& pf) {
if ((pf.bpp <= 8) && pf.trueColour) {
vlog.info("creating %d-bit TrueColour palette", pf.depth);
for (int i=0; i < (1<<(pf.depth)); i++) {
- palette[i].b = ((((i >> pf.blueShift) & pf.blueMax) * 65535) + pf.blueMax/2) / pf.blueMax;
- palette[i].g = ((((i >> pf.greenShift) & pf.greenMax) * 65535) + pf.greenMax/2) / pf.greenMax;
- palette[i].r = ((((i >> pf.redShift) & pf.redMax) * 65535) + pf.redMax/2) / pf.redMax;
+ rdr::U16 r, g, b;
+ pf.rgbFromPixel(i, NULL, &r, &g, &b);
+ palette[i].r = r;
+ palette[i].g = g;
+ palette[i].b = b;
}
refreshPalette();
}
@@ -110,9 +113,9 @@ void DIBSectionBuffer::recreateBuffer() {
bi.bmiHeader.biWidth = width_;
bi.bmiHeader.biHeight = -height_;
bi.bmiHeader.biCompression = (format.bpp > 8) ? BI_BITFIELDS : BI_RGB;
- bi.mask.red = format.redMax << format.redShift;
- bi.mask.green = format.greenMax << format.greenShift;
- bi.mask.blue = format.blueMax << format.blueShift;
+ bi.mask.red = format.pixelFromRGB((rdr::U16)~0, 0, 0);
+ bi.mask.green = format.pixelFromRGB(0, (rdr::U16)~0, 0);
+ bi.mask.blue = format.pixelFromRGB(0, 0, (rdr::U16)~0);
// Create a DIBSection to draw into
if (device)
@@ -160,6 +163,11 @@ void DIBSectionBuffer::recreateBuffer() {
}
if (new_bitmap) {
+ int bpp, depth;
+ bool trueColour;
+ int redMax, greenMax, blueMax;
+ int redShift, greenShift, blueShift;
+
// Set up the new bitmap
bitmap = new_bitmap;
data = new_data;
@@ -180,30 +188,34 @@ void DIBSectionBuffer::recreateBuffer() {
}
// Calculate the PixelFormat for the DIB
- format.bigEndian = 0;
- format.bpp = format.depth = ds.dsBm.bmBitsPixel;
- format.trueColour = format.trueColour || format.bpp > 8;
- if (format.bpp > 8) {
+ bpp = depth = ds.dsBm.bmBitsPixel;
+ trueColour = format.trueColour || format.bpp > 8;
+ if (trueColour) {
// Get the truecolour format used by the DIBSection
- initMaxAndShift(ds.dsBitfields[0], &format.redMax, &format.redShift);
- initMaxAndShift(ds.dsBitfields[1], &format.greenMax, &format.greenShift);
- initMaxAndShift(ds.dsBitfields[2], &format.blueMax, &format.blueShift);
+ initMaxAndShift(ds.dsBitfields[0], &redMax, &redShift);
+ initMaxAndShift(ds.dsBitfields[1], &greenMax, &greenShift);
+ initMaxAndShift(ds.dsBitfields[2], &blueMax, &blueShift);
// Calculate the effective depth
- format.depth = 0;
+ depth = 0;
Pixel bits = ds.dsBitfields[0] | ds.dsBitfields[1] | ds.dsBitfields[2];
while (bits) {
- format.depth++;
+ depth++;
bits = bits >> 1;
}
- if (format.depth > format.bpp)
+ if (depth > bpp)
throw Exception("Bad DIBSection format (depth exceeds bpp)");
- } else {
+ }
+
+ format = PixelFormat(bpp, depth, false, trueColour,
+ redMax, greenMax, blueMax,
+ redShift, greenShift, blueShift);
+
+ if (!trueColour) {
// Set the DIBSection's palette
refreshPalette();
}
-
}
}
diff --git a/win/rfb_win32/DeviceContext.cxx b/win/rfb_win32/DeviceContext.cxx
index 3b97e446..26721a60 100644
--- a/win/rfb_win32/DeviceContext.cxx
+++ b/win/rfb_win32/DeviceContext.cxx
@@ -1,4 +1,5 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
+ * Copyright 2014 Pierre Ossman for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,7 +34,11 @@ PixelFormat DeviceContext::getPF() const {
}
PixelFormat DeviceContext::getPF(HDC dc) {
- PixelFormat format;
+ bool trueColour, bigEndian;
+ int bpp, depth;
+ int redMax, greenMax, blueMax;
+ int redShift, greenShift, blueShift;
+
CompatibleBitmap bitmap(dc, 1, 1);
// -=- Get the bitmap format information
@@ -49,11 +54,11 @@ PixelFormat DeviceContext::getPF(HDC dc) {
}
// Set the initial format information
- format.trueColour = bi.bmiHeader.biBitCount > 8;
- format.bigEndian = 0;
- format.bpp = bi.bmiHeader.biBitCount;
+ trueColour = bi.bmiHeader.biBitCount > 8;
+ bigEndian = 0;
+ bpp = bi.bmiHeader.biBitCount;
- if (format.trueColour) {
+ if (trueColour) {
DWORD rMask=0, gMask=0, bMask=0;
// Which true colour format is the DIB section using?
@@ -92,44 +97,42 @@ PixelFormat DeviceContext::getPF(HDC dc) {
};
// Convert the data we just retrieved
- initMaxAndShift(rMask, &format.redMax, &format.redShift);
- initMaxAndShift(gMask, &format.greenMax, &format.greenShift);
- initMaxAndShift(bMask, &format.blueMax, &format.blueShift);
+ initMaxAndShift(rMask, &redMax, &redShift);
+ initMaxAndShift(gMask, &greenMax, &greenShift);
+ initMaxAndShift(bMask, &blueMax, &blueShift);
// Calculate the depth from the colour shifts
- format.depth = 0;
+ depth = 0;
Pixel bits = rMask | gMask | bMask;
while (bits) {
- format.depth++;
+ depth++;
bits = bits >> 1;
}
// Check that the depth & bpp are valid
- if (format.depth > format.bpp) {
+ if (depth > bpp) {
vlog.error("depth exceeds bits per pixel!");
- format.bpp = format.depth;
+ bpp = depth;
}
// Correct the bits-per-pixel to something we're happy with
- if (format.bpp <= 16)
- format.bpp = 16;
- else if (format.bpp <= 32)
- format.bpp = 32;
+ if (bpp <= 16)
+ bpp = 16;
+ else if (bpp <= 32)
+ bpp = 32;
} else {
// Palettised format - depth reflects number of colours,
// but bits-per-pixel is ALWAYS 8
- format.depth = format.bpp;
- if (format.bpp < 8)
- format.bpp = 8;
- vlog.info("%d-colour palettised", 1<<format.depth);
+ depth = bpp;
+ if (bpp < 8)
+ bpp = 8;
+ vlog.info("%d-colour palettised", 1<<depth);
}
- // Use 10 arguments constructor to trigger PixelFormat::updateState()
- return PixelFormat(format.bpp, format.depth,
- format.bigEndian, format.trueColour,
- format.redMax, format.greenMax, format.blueMax,
- format.redShift, format.greenShift, format.blueShift);
+ return PixelFormat(bpp, depth, bigEndian, trueColour,
+ redMax, greenMax, blueMax,
+ redShift, greenShift, blueShift);
}
Rect DeviceContext::getClipBox() const {