diff --git a/dlls/sane.ds/capability.c b/dlls/sane.ds/capability.c index 63a836182b7..aacc6dea216 100644 --- a/dlls/sane.ds/capability.c +++ b/dlls/sane.ds/capability.c @@ -685,9 +685,11 @@ static TW_UINT16 SANE_ICAPResolution (pTW_CAPABILITY pCapability, TW_UINT16 acti /* ICAP_PIXELFLAVOR */ static TW_UINT16 SANE_ICAPPixelFlavor (pTW_CAPABILITY pCapability, TW_UINT16 action) { + TW_UINT16 twCC = TWCC_BADCAP; +#ifdef SONAME_LIBSANE static const TW_UINT32 possible_values[] = { TWPF_CHOCOLATE, TWPF_VANILLA }; TW_UINT32 val; - TW_UINT16 twCC = TWCC_BADCAP; + TW_UINT32 flavor = activeDS.sane_param.depth == 1 ? TWPF_VANILLA : TWPF_CHOCOLATE; TRACE("ICAP_PIXELFLAVOR\n"); @@ -700,7 +702,7 @@ static TW_UINT16 SANE_ICAPPixelFlavor (pTW_CAPABILITY pCapability, TW_UINT16 act case MSG_GET: twCC = msg_get_enum(pCapability, possible_values, sizeof(possible_values) / sizeof(possible_values[0]), - TWTY_UINT16, TWPF_CHOCOLATE, TWPF_CHOCOLATE); + TWTY_UINT16, flavor, flavor); break; case MSG_SET: @@ -712,16 +714,17 @@ static TW_UINT16 SANE_ICAPPixelFlavor (pTW_CAPABILITY pCapability, TW_UINT16 act break; case MSG_GETDEFAULT: - twCC = set_onevalue(pCapability, TWTY_UINT16, TWPF_CHOCOLATE); + twCC = set_onevalue(pCapability, TWTY_UINT16, flavor); break; case MSG_RESET: /* .. fall through intentional .. */ case MSG_GETCURRENT: - twCC = set_onevalue(pCapability, TWTY_UINT16, TWPF_CHOCOLATE); + twCC = set_onevalue(pCapability, TWTY_UINT16, flavor); break; } +#endif return twCC; } diff --git a/dlls/sane.ds/ds_image.c b/dlls/sane.ds/ds_image.c index 38689da13f8..a78ec4e2686 100644 --- a/dlls/sane.ds/ds_image.c +++ b/dlls/sane.ds/ds_image.c @@ -142,7 +142,10 @@ TW_UINT16 SANE_ImageInfoGet (pTW_IDENTITY pOrigin, pImageInfo->Planar = TRUE; pImageInfo->SamplesPerPixel = 1; pImageInfo->BitsPerSample[0] = activeDS.sane_param.depth; - pImageInfo->PixelType = TWPT_GRAY; + if (activeDS.sane_param.depth == 1) + pImageInfo->PixelType = TWPT_BW; + else + pImageInfo->PixelType = TWPT_GRAY; } else { @@ -366,7 +369,10 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin, int dib_bytes; int dib_bytes_per_line; BYTE *line; + RGBQUAD *colors; + int color_size = 0; int i; + BYTE *p; TRACE("DG_IMAGE/DAT_IMAGENATIVEXFER/MSG_GET\n"); @@ -397,9 +403,23 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin, return TWRC_FAILURE; } - if (activeDS.sane_param.format != SANE_FRAME_RGB) + if (activeDS.sane_param.format == SANE_FRAME_GRAY) { - FIXME("For NATIVE, we support only RGB, not %d\n", activeDS.sane_param.format); + if (activeDS.sane_param.depth == 8) + color_size = (1 << 8) * sizeof(*colors); + else if (activeDS.sane_param.depth == 1) + ; + else + { + FIXME("For NATIVE, we support only 1 bit monochrome and 8 bit Grayscale, not %d\n", activeDS.sane_param.depth); + psane_cancel (activeDS.deviceHandle); + activeDS.twCC = TWCC_OPERATIONERROR; + return TWRC_FAILURE; + } + } + else if (activeDS.sane_param.format != SANE_FRAME_RGB) + { + FIXME("For NATIVE, we support only GRAY and RGB, not %d\n", activeDS.sane_param.format); psane_cancel (activeDS.deviceHandle); activeDS.twCC = TWCC_OPERATIONERROR; return TWRC_FAILURE; @@ -413,7 +433,7 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin, dib_bytes_per_line = ((activeDS.sane_param.bytes_per_line + 3) / 4) * 4; dib_bytes = activeDS.sane_param.lines * dib_bytes_per_line; - hDIB = GlobalAlloc(GMEM_ZEROINIT, dib_bytes + sizeof(*header)); + hDIB = GlobalAlloc(GMEM_ZEROINIT, dib_bytes + sizeof(*header) + color_size); if (hDIB) header = GlobalLock(hDIB); @@ -430,18 +450,31 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin, header->biWidth = activeDS.sane_param.pixels_per_line; header->biHeight = activeDS.sane_param.lines; header->biPlanes = 1; - header->biBitCount = activeDS.sane_param.depth * 3; header->biCompression = BI_RGB; + if (activeDS.sane_param.format == SANE_FRAME_RGB) + header->biBitCount = activeDS.sane_param.depth * 3; + if (activeDS.sane_param.format == SANE_FRAME_GRAY) + header->biBitCount = activeDS.sane_param.depth; header->biSizeImage = dib_bytes; header->biXPelsPerMeter = 0; header->biYPelsPerMeter = 0; header->biClrUsed = 0; header->biClrImportant = 0; + p = (BYTE *)(header + 1); + + if (color_size > 0) + { + colors = (RGBQUAD *) p; + p += color_size; + for (i = 0; i < (color_size / sizeof(*colors)); i++) + colors[i].rgbBlue = colors[i].rgbRed = colors[i].rgbGreen = i; + } + + /* Sane returns data in top down order. Acrobat does best with a bottom up DIB being returned. */ - line = (BYTE *)(header + 1) + - (activeDS.sane_param.lines - 1) * dib_bytes_per_line; + line = p + (activeDS.sane_param.lines - 1) * dib_bytes_per_line; for (i = activeDS.sane_param.lines - 1; i >= 0; i--) { activeDS.progressWnd = ScanningDialogBox(activeDS.progressWnd,