Notes on implementing mscms.dll - for anybody who's interested in digital colour management

Mike McCormack mike at codeweavers.com
Wed Jan 7 03:34:33 CST 2004


Hi,

For whoever is interested in running Phase One's Capture One software 
(http://www.phaseone.com/) on Wine, you'll need mscms.dll for Colour 
Management.

Unfortunately Wine has no implementation of it yet.  I had a quick look 
into what is needed to implement mscms.dll 
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/icm/icmstart_5i91.asp)

It appears the functionality of mscms.dll is mostly defined by the 
International Color consortium (http://www.color.org), and a free 
implementation exists(http://www.littlecms.com/, and is available as a 
(shared?) library on many distros.

I think it's feasable to interface that library to an mscms.dll 
implemented in Wine.  I've created a stub library incase anybody wants 
to have a go at it...  mail me if you're interested in working on it.

Mike

-------------- next part --------------
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR    = @srcdir@
VPATH     = @srcdir@
MODULE    = mscms.dll
IMPORTS   = user32 advapi32 kernel32 ntdll
EXTRALIBS = $(LIBUNICODE) $(LIBUUID)
EXTRADEFS = -DCOM_NO_WINDOWS_H

C_SRCS = \
	mscms.c

@MAKE_DLL_RULES@

### Dependencies:
-------------- next part --------------
/*
 * Copyright (C) 2004 Mike McCormack for Codeweavers
 *
 * 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 <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "icm.h"

#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(mscms);

BOOL WINAPI SetColorProfileElementSize( HPROFILE hProfile, TAGTYPE tag,
   DWORD cbSize)
{
    FIXME("%p %08lx %ld\n", hProfile, tag, cbSize);
    return TRUE;
}

BOOL WINAPI GetColorProfileElement( HPROFILE hProfile, TAGTYPE tag,
   DWORD dwOffset, DWORD *pcbSize, PVOID pBuffer, PBOOL pbReference)
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI GetCountColorProfileElements( HPROFILE hProfile, PDWORD pnCount)
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI SetColorProfileElement( HPROFILE hProfile, TAGTYPE tag, 
  DWORD dwOffset, PDWORD pcbSize, PVOID pBuffer)
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI DeleteColorTransform( HTRANSFORM hColorTransform )
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI CloseColorProfile( HPROFILE hProfile )
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI GetColorDirectoryA( LPCSTR pMachineName, LPSTR pBuffer, 
  PDWORD pdwSize )
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI TranslateBitmapBits( HTRANSFORM hColorTransform, PVOID pSrcBits,
  BMFORMAT bmInput, DWORD dwWidth, DWORD dwHeight, DWORD dwInputStride,
  PVOID pDestBits, BMFORMAT bmOutput, DWORD dwOutputStride, 
  PBMCALLBACKFN pfnCallback, ULONG ulCallbackData)
{
    FIXME("\n");
    return TRUE;
}

HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE pahProfiles,
  DWORD nProfiles, DWORD *padwIntent, DWORD nIntents, DWORD dwFlags,
  DWORD indexPreferredCMM )
{
    FIXME("\n");
    return NULL;
}

HPROFILE WINAPI OpenColorProfileA( PPROFILE pProfile, DWORD dwDesiredAccess,
  DWORD dwShareMode, DWORD dwCreationMode)
{
    FIXME("\n");
    return NULL;
}

BOOL WINAPI GetColorProfileElementTag( HPROFILE hProfile, DWORD dwIndex,
  PTAGTYPE pTag )
{
    FIXME("\n");
    return TRUE;
}

BOOL WINAPI GetColorProfileHeader( HPROFILE hProfile, PPROFILEHEADER pHeader )
{
    FIXME("\n");
    return TRUE;
}
-------------- next part --------------
@ stdcall SetColorProfileElementSize(ptr long long)
@ stdcall GetCountColorProfileElements(ptr ptr)
@ stdcall SetColorProfileElement(ptr ptr long ptr ptr)
@ stdcall GetColorProfileElement(ptr ptr long ptr ptr ptr)
@ stdcall DeleteColorTransform(ptr)
@ stdcall CloseColorProfile(ptr)
@ stdcall GetColorDirectoryA(str ptr ptr)
@ stdcall TranslateBitmapBits(ptr ptr ptr long long long ptr ptr long ptr long)
@ stdcall CreateMultiProfileTransform(ptr long ptr long long long)
@ stdcall OpenColorProfileA(ptr long long long)
@ stdcall GetColorProfileElementTag()
@ stdcall GetColorProfileHeader(ptr ptr)
-------------- next part --------------
/*
 * Copyright (C) the Wine project
 *
 * 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
 */

#ifndef __WINE_ICM_H
#define __WINE_ICM_H

typedef HANDLE HPROFILE;
typedef HPROFILE *PHPROFILE;
typedef HANDLE HTRANSFORM;

typedef DWORD TAGTYPE;
typedef TAGTYPE *PTAGTYPE,*LPTAGTYPE;

typedef enum {
    BM_x555RGB     = 0x00,
    BM_565RGB      = 0x01,
    BM_RGBTRIPLETS = 0x02,
    BM_BGRTRIPLETS = 0x04,
    BM_xRGBQUADS   = 0x08,
    BM_10b_RGB     = 0x09,
    BM_16b_RGB     = 0x0a,
    BM_xBGRQUADS   = 0x10,
    BM_CMYKQUADS   = 0x20,
    BM_x555XYZ     = 0x101,
    BM_x555Yxz,
    BM_x555Lab,
    BM_x555G3CH,
    BM_XYZTRIPLETS = 0x201,
    BM_YxyTRIPLETS,
    BM_LabTRIPLETS,
    BM_G3CHTRIPLETS,
    BM_5CHANNEL,
    BM_6CHANNEL,
    BM_7CHANNEL,
    BM_8CHANNEL,
    BM_GRAY,
    BM_xXYZQUADS   = 0x301,
    BM_xYxyQUADS,
    BM_xLabQUADS,
    BM_xG3CHQUADS,
    BM_KYMCQUADS,
    BM_10b_XYZ     = 0x401,
    BM_10b_Yxy,
    BM_10b_Lab,
    BM_10b_G3CH,
    BM_NAMED_INDEX,
    BM_16b_XYZ     = 0x501,
    BM_16b_Yxy,
    BM_16b_Lab,
    BM_16b_G3CH,
    BM_16b_GRAY,
} BMFORMAT;

typedef BOOL WINAPI (*PBMCALLBACKFN)(ULONG,ULONG,ULONG);
typedef PBMCALLBACKFN LPPBMCALLBACKFN;

typedef struct tagPROFILEHEADER {
    DWORD phSize;
    DWORD phCMMType;
    DWORD phVersion;
    DWORD phClass;
    DWORD phDataColorSpace;
    DWORD phConnectionSpace;
    DWORD phDateTime[3];
    DWORD phSignature;
    DWORD phPlatform;
    DWORD phProfileFlags;
    DWORD phManufacturer;
    DWORD phModel;
    DWORD phAttributes;
    DWORD phRenderingIntent;
    CIEXYZ phIlluminant;
    DWORD phCreator;
    BYTE phReserved[44];
} PROFILEHEADER;
typedef PROFILEHEADER *PPROFILEHEADER,*LPPROFILEHEADER;

typedef struct tagPROFILE {
    DWORD dwType;
    PVOID pProfileData;
    DWORD cbDataSize;
} PROFILE;
typedef PROFILE *PPROFILE,*LPPROFILE;

#endif



More information about the wine-devel mailing list