update for HEAD-2003091401
[reactos.git] / lib / twain / ds_image.c
diff --git a/lib/twain/ds_image.c b/lib/twain/ds_image.c
new file mode 100644 (file)
index 0000000..0193bcd
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2000 Corel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+//#include "config.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "twain.h"
+#include "twain_i.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(twain);
+
+/* DG_IMAGE/DAT_CIECOLOR/MSG_GET */
+TW_UINT16 TWAIN_CIEColorGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                             TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_EXTIMAGEINFO/MSG_GET */
+TW_UINT16 TWAIN_ExtImageInfoGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                 TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_GRAYRESPONSE/MSG_RESET */
+TW_UINT16 TWAIN_GrayResponseReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                   TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_GRAYRESPONSE/MSG_SET */
+TW_UINT16 TWAIN_GrayResponseSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                 TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGEFILEXFER/MSG_GET */
+TW_UINT16 TWAIN_ImageFileXferGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                  TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGEINFO/MSG_GET */
+TW_UINT16 TWAIN_ImageInfoGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                              TW_MEMREF pData)
+{
+#ifndef HAVE_SANE
+    return TWRC_FAILURE;
+#else
+    TW_UINT16 twRC = TWRC_SUCCESS;
+    pTW_IMAGEINFO pImageInfo = (pTW_IMAGEINFO) pData;
+    activeDS *pSource = TWAIN_LookupSource (pDest);
+    SANE_Status status;
+
+    TRACE("DG_IMAGE/DAT_IMAGEINFO/MSG_GET\n");
+
+    if (!pSource)
+    {
+        twRC = TWRC_FAILURE;
+        DSM_twCC = TWCC_BADDEST;
+    }
+    else if (pSource->currentState != 6 && pSource->currentState != 7)
+    {
+        twRC = TWRC_FAILURE;
+        pSource->twCC = TWCC_SEQERROR;
+    }
+    else
+    {
+        if (pSource->currentState == 6)
+        {
+            /* return general image description information about the image about to be transfer */
+            status = sane_get_parameters (pSource->deviceHandle, &pSource->sane_param);
+        }
+
+        pImageInfo->XResolution.Whole = -1;
+        pImageInfo->XResolution.Frac = 0;
+        pImageInfo->YResolution.Whole = -1;
+        pImageInfo->YResolution.Frac = 0;
+        pImageInfo->ImageWidth = pSource->sane_param.pixels_per_line;
+        pImageInfo->ImageLength = pSource->sane_param.lines;
+        if (pSource->sane_param.depth == 24)
+        {
+            pImageInfo->SamplesPerPixel = 3;
+            pImageInfo->BitsPerSample[0] = 8;
+            pImageInfo->BitsPerSample[1] = 8;
+            pImageInfo->BitsPerSample[2] = 8;
+            pImageInfo->BitsPerPixel = 24;
+            pImageInfo->Planar = TRUE;
+            pImageInfo->PixelType = TWPT_RGB;
+            pImageInfo->Compression = TWCP_NONE;
+        }
+        else if (pSource->sane_param.depth == 8)
+        {
+            /* FIXME: fill the image info structure for 8-bit image */
+        }
+    }
+
+    return twRC;
+#endif
+}
+
+/* DG_IMAGE/DAT_IMAGELAYOUT/MSG_GET */
+TW_UINT16 TWAIN_ImageLayoutGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGELAYOUT/MSG_GETDEFAULT */
+TW_UINT16 TWAIN_ImageLayoutGetDefault (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                       TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGELAYOUT/MSG_RESET */
+TW_UINT16 TWAIN_ImageLayoutReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                  TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGELAYOUT/MSG_SET */
+TW_UINT16 TWAIN_ImageLayoutSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGEMEMXFER/MSG_GET */
+TW_UINT16 TWAIN_ImageMemXferGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                 TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_IMAGENATIVEXFER/MSG_GET */
+TW_UINT16 TWAIN_ImageNativeXferGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                    TW_MEMREF pData)
+{
+#ifndef HAVE_SANE
+    return TWRC_FAILURE;
+#else
+    TW_UINT16 twRC = TWRC_SUCCESS;
+    pTW_UINT32 pHandle = (pTW_UINT32) pData;
+    activeDS *pSource = TWAIN_LookupSource (pDest);
+    SANE_Status status;
+    SANE_Byte buffer[32*1024];
+    int buff_len;
+    HBITMAP hDIB;
+    BITMAPINFO bmpInfo;
+    VOID *pBits;
+    HDC dc;
+
+    TRACE("DG_IMAGE/DAT_IMAGENATIVEXFER/MSG_GET\n");
+
+    if (!pSource)
+    {
+        twRC = TWRC_FAILURE;
+        DSM_twCC = TWCC_NODS;
+    }
+    else if (pSource->currentState != 6)
+    {
+        twRC = TWRC_FAILURE;
+        pSource->twCC = TWCC_SEQERROR;
+    }
+    else
+    {
+        /* Transfer an image from the source to the application */
+        status = sane_start (pSource->deviceHandle);
+        if (status != SANE_STATUS_GOOD)
+        {
+            WARN("sane_start: %s\n", sane_strstatus (status));
+            sane_cancel (pSource->deviceHandle);
+            pSource->twCC = TWCC_OPERATIONERROR;
+            return TWRC_FAILURE;
+        }
+
+        status = sane_get_parameters (pSource->deviceHandle, &pSource->sane_param);
+        if (status != SANE_STATUS_GOOD)
+        {
+            WARN("sane_get_parameters: %s\n", sane_strstatus (status));
+            sane_cancel (pSource->deviceHandle);
+            pSource->twCC = TWCC_OPERATIONERROR;
+            return TWRC_FAILURE;
+        }
+
+        TRACE("Acquiring image %dx%dx%d bits (format=%d last=%d) from sane...\n"
+              , pSource->sane_param.pixels_per_line, pSource->sane_param.lines,
+              pSource->sane_param.depth, pSource->sane_param.format,
+              pSource->sane_param.last_frame);
+
+        ZeroMemory (&bmpInfo, sizeof (BITMAPINFO));
+        bmpInfo.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
+        bmpInfo.bmiHeader.biWidth = pSource->sane_param.pixels_per_line;
+        bmpInfo.bmiHeader.biHeight = pSource->sane_param.lines;
+        bmpInfo.bmiHeader.biPlanes = 1;
+        bmpInfo.bmiHeader.biBitCount = pSource->sane_param.depth;
+        bmpInfo.bmiHeader.biCompression = BI_RGB;
+        bmpInfo.bmiHeader.biSizeImage = 0;
+        bmpInfo.bmiHeader.biXPelsPerMeter = 0;
+        bmpInfo.bmiHeader.biYPelsPerMeter = 0;
+        bmpInfo.bmiHeader.biClrUsed = 1;
+        bmpInfo.bmiHeader.biClrImportant = 0;
+        bmpInfo.bmiColors[0].rgbBlue = 128;
+        bmpInfo.bmiColors[0].rgbGreen = 128;
+        bmpInfo.bmiColors[0].rgbRed = 128;
+        hDIB = CreateDIBSection ((dc = GetDC(pSource->hwndOwner)), &bmpInfo,
+                                 DIB_RGB_COLORS, &pBits, 0, 0);
+        if (!hDIB)
+        {
+            sane_cancel (pSource->deviceHandle);
+            pSource->twCC = TWCC_LOWMEMORY;
+            return TWRC_FAILURE;
+        }
+
+        do
+        {
+            status = sane_read (pSource->deviceHandle, buffer,
+                                sizeof (buffer),  &buff_len);
+            if (status == SANE_STATUS_GOOD)
+            {
+                /* FIXME: put code for coverting the image data into DIB here */
+
+            }
+            else if (status != SANE_STATUS_EOF)
+            {
+                WARN("sane_read: %s\n", sane_strstatus (status));
+                sane_cancel (pSource->deviceHandle);
+                pSource->twCC = TWCC_OPERATIONERROR;
+                return TWRC_FAILURE;
+            }
+        } while (status == SANE_STATUS_GOOD);
+
+        sane_cancel (pSource->deviceHandle);
+        ReleaseDC (pSource->hwndOwner, dc);
+        *pHandle = (TW_UINT32)hDIB;
+        twRC = TWRC_XFERDONE;
+        pSource->twCC = TWCC_SUCCESS;
+        pSource->currentState = 7;
+    }
+    return twRC;
+#endif
+}
+
+/* DG_IMAGE/DAT_JPEGCOMPRESSION/MSG_GET */
+TW_UINT16 TWAIN_JPEGCompressionGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                    TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_JPEGCOMPRESSION/MSG_GETDEFAULT */
+TW_UINT16 TWAIN_JPEGCompressionGetDefault (pTW_IDENTITY pOrigin,
+                                           pTW_IDENTITY pDest,
+                                           TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_JPEGCOMPRESSION/MSG_RESET */
+TW_UINT16 TWAIN_JPEGCompressionReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                      TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_JPEGCOMPRESSION/MSG_SET */
+TW_UINT16 TWAIN_JPEGCompressionSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                    TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_PALETTE8/MSG_GET */
+TW_UINT16 TWAIN_Palette8Get (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                             TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_PALETTE8/MSG_GETDEFAULT */
+TW_UINT16 TWAIN_Palette8GetDefault (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                    TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_PALETTE8/MSG_RESET */
+TW_UINT16 TWAIN_Palette8Reset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                               TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_PALETTE8/MSG_SET */
+TW_UINT16 TWAIN_Palette8Set (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                             TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_RGBRESPONSE/MSG_RESET */
+TW_UINT16 TWAIN_RGBResponseReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                  TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}
+
+/* DG_IMAGE/DAT_RGBRESPONSE/MSG_SET */
+TW_UINT16 TWAIN_RGBResponseSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
+                                TW_MEMREF pData)
+{
+    FIXME ("stub!\n");
+
+    return TWRC_FAILURE;
+}