From c46eb09e8f49a4db5b9d6f64af0f5f4082893d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 19 Dec 2006 18:45:40 +0000 Subject: [PATCH] * The 4-bit VGA planar mode is now advertized as B_GRAY8 to the app_server. * The app_server now detects that this mode is being used, and at least correctly copies the 32bit data to the first plane, meaning we have a monochrome output for now (it crashed before, as Stefano reported). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19565 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/graphics/vesa/vesa.cpp | 3 +- src/servers/app/drawing/HWInterface.cpp | 80 +++++++++++++++---- 2 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/add-ons/kernel/drivers/graphics/vesa/vesa.cpp b/src/add-ons/kernel/drivers/graphics/vesa/vesa.cpp index 4614dbf1ea..720ba052a1 100644 --- a/src/add-ons/kernel/drivers/graphics/vesa/vesa.cpp +++ b/src/add-ons/kernel/drivers/graphics/vesa/vesa.cpp @@ -89,7 +89,8 @@ vesa_init(vesa_info &info) info.shared_info->current_mode.virtual_height = bufferInfo->height; switch (bufferInfo->depth) { case 4: - // ??? + info.shared_info->current_mode.space = B_GRAY8; + // the app_server is smart enough to translate this to VGA mode break; case 8: info.shared_info->current_mode.space = B_CMAP8; diff --git a/src/servers/app/drawing/HWInterface.cpp b/src/servers/app/drawing/HWInterface.cpp index 4f0d73fb44..259792d3da 100644 --- a/src/servers/app/drawing/HWInterface.cpp +++ b/src/servers/app/drawing/HWInterface.cpp @@ -666,25 +666,73 @@ HWInterface::_CopyToFront(uint8* src, uint32 srcBPR, break; } - case B_GRAY8: { - // offset to left top pixel in dest buffer - dst += y * dstBPR + x; - int32 left = x; - // copy - // TODO: assumes BGR order, does this work on big endian as well? - for (; y <= bottom; y++) { - uint8* srcHandle = src; - uint8* dstHandle = dst; - for (x = left; x <= right; x++) { - *dstHandle = (308 * srcHandle[2] + 600 * srcHandle[1] + 116 * srcHandle[0]) / 1024; - dstHandle ++; - srcHandle += 4; + case B_GRAY8: + if (frontBuffer->Width() > dstBPR) { + // VGA 16 color grayscale planar mode + dst += y * dstBPR + x / 8; + uint8* dstBase = dst; + uint8* srcBase = src; + int32 left = x; + + // TODO: this is awfully slow... + // TODO: assumes BGR order + for (int32 plane = 0; plane < 1; plane++) { + // TODO: we need to select the plane here! + src = srcBase; + dst = dstBase; + + for (; y <= bottom; y++) { + uint8* srcHandle = src; + uint8* dstHandle = dst; + uint8 current8 = dstHandle[0]; + // we store 8 pixels before writing them back + + for (x = left; x <= right; x++) { + uint8 pixel = (308 * srcHandle[2] + 600 * srcHandle[1] + + 116 * srcHandle[0]) / 1024; + srcHandle += 4; + + if (pixel > 128) + current8 |= 0x80 >> (x & 7); + else + current8 &= ~(0x80 >> (x & 7)); + + if ((x & 7) == 7) { + // last pixel in 8 pixel group + dstHandle[0] = current8; + dstHandle++; + current8 = dstHandle[0]; + } + } + + if (x & 7) { + // last pixel has not been written yet + dstHandle[0] = current8; + } + dst += dstBPR; + src += srcBPR; + } + } + } else { + // offset to left top pixel in dest buffer + dst += y * dstBPR + x; + int32 left = x; + // copy + // TODO: assumes BGR order, does this work on big endian as well? + for (; y <= bottom; y++) { + uint8* srcHandle = src; + uint8* dstHandle = dst; + for (x = left; x <= right; x++) { + *dstHandle = (308 * srcHandle[2] + 600 * srcHandle[1] + 116 * srcHandle[0]) / 1024; + dstHandle ++; + srcHandle += 4; + } + dst += dstBPR; + src += srcBPR; } - dst += dstBPR; - src += srcBPR; } break; - } + default: fprintf(stderr, "HWInterface::CopyBackToFront() - unsupported front buffer format!\n"); break;