|  | /* | 
|  | * MSCMS - Color Management System for Wine | 
|  | * | 
|  | * Copyright 2005, 2006 Hans Leidekker | 
|  | * | 
|  | * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #include "config.h" | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "winnls.h" | 
|  | #include "wingdi.h" | 
|  | #include "winuser.h" | 
|  | #include "icm.h" | 
|  |  | 
|  | #include "mscms_priv.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(mscms); | 
|  |  | 
|  | /****************************************************************************** | 
|  | * CreateColorTransformA            [MSCMS.@] | 
|  | * | 
|  | * See CreateColorTransformW. | 
|  | */ | 
|  | HTRANSFORM WINAPI CreateColorTransformA( LPLOGCOLORSPACEA space, HPROFILE dest, | 
|  | HPROFILE target, DWORD flags ) | 
|  | { | 
|  | LOGCOLORSPACEW spaceW; | 
|  | DWORD len; | 
|  |  | 
|  | TRACE( "( %p, %p, %p, 0x%08x )\n", space, dest, target, flags ); | 
|  |  | 
|  | if (!space || !dest) return FALSE; | 
|  |  | 
|  | memcpy( &spaceW, space, FIELD_OFFSET(LOGCOLORSPACEA, lcsFilename) ); | 
|  | spaceW.lcsSize = sizeof(LOGCOLORSPACEW); | 
|  |  | 
|  | len = MultiByteToWideChar( CP_ACP, 0, space->lcsFilename, -1, NULL, 0 ); | 
|  | MultiByteToWideChar( CP_ACP, 0, space->lcsFilename, -1, spaceW.lcsFilename, len ); | 
|  |  | 
|  | return CreateColorTransformW( &spaceW, dest, target, flags ); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * CreateColorTransformW            [MSCMS.@] | 
|  | * | 
|  | * Create a color transform. | 
|  | * | 
|  | * PARAMS | 
|  | *  space  [I] Input color space. | 
|  | *  dest   [I] Color profile of destination device. | 
|  | *  target [I] Color profile of target device. | 
|  | *  flags  [I] Flags. | 
|  | * | 
|  | * RETURNS | 
|  | *  Success: Handle to a transform. | 
|  | *  Failure: NULL | 
|  | */ | 
|  | HTRANSFORM WINAPI CreateColorTransformW( LPLOGCOLORSPACEW space, HPROFILE dest, | 
|  | HPROFILE target, DWORD flags ) | 
|  | { | 
|  | HTRANSFORM ret = NULL; | 
|  | #ifdef HAVE_LCMS | 
|  | cmsHTRANSFORM cmstransform; | 
|  | cmsHPROFILE cmsprofiles[3]; | 
|  | int intent; | 
|  |  | 
|  | TRACE( "( %p, %p, %p, 0x%08x )\n", space, dest, target, flags ); | 
|  |  | 
|  | if (!space || !dest) return FALSE; | 
|  |  | 
|  | intent = space->lcsIntent > 3 ? INTENT_PERCEPTUAL : space->lcsIntent; | 
|  |  | 
|  | cmsprofiles[0] = cmsCreate_sRGBProfile(); /* FIXME: create from supplied color space */ | 
|  | cmsprofiles[1] = MSCMS_hprofile2cmsprofile( dest ); | 
|  |  | 
|  | if (target) | 
|  | { | 
|  | cmsprofiles[2] = MSCMS_hprofile2cmsprofile( target ); | 
|  | cmstransform = cmsCreateMultiprofileTransform( cmsprofiles, 3, TYPE_BGR_8, | 
|  | TYPE_BGR_8, intent, 0 ); | 
|  | } | 
|  | else | 
|  | cmstransform = cmsCreateTransform( cmsprofiles[0], TYPE_BGR_8, cmsprofiles[1], | 
|  | TYPE_BGR_8, intent, 0 ); | 
|  |  | 
|  | ret = MSCMS_create_htransform_handle( cmstransform ); | 
|  |  | 
|  | #endif /* HAVE_LCMS */ | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * CreateMultiProfileTransform      [MSCMS.@] | 
|  | * | 
|  | * Create a color transform from an array of color profiles. | 
|  | * | 
|  | * PARAMS | 
|  | *  profiles  [I] Array of color profiles. | 
|  | *  nprofiles [I] Number of color profiles. | 
|  | *  intents   [I] Array of rendering intents. | 
|  | *  flags     [I] Flags. | 
|  | *  cmm       [I] Profile to take the CMM from. | 
|  | * | 
|  | * RETURNS | 
|  | *  Success: Handle to a transform. | 
|  | *  Failure: NULL | 
|  | */ | 
|  | HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofiles, | 
|  | PDWORD intents, DWORD nintents, DWORD flags, DWORD cmm ) | 
|  | { | 
|  | HTRANSFORM ret = NULL; | 
|  | #ifdef HAVE_LCMS | 
|  | cmsHPROFILE *cmsprofiles; | 
|  | cmsHTRANSFORM cmstransform; | 
|  | DWORD i; | 
|  |  | 
|  | TRACE( "( %p, 0x%08x, %p, 0x%08x, 0x%08x, 0x%08x ) stub\n", | 
|  | profiles, nprofiles, intents, nintents, flags, cmm ); | 
|  |  | 
|  | if (!profiles || !intents) return NULL; | 
|  |  | 
|  | cmsprofiles = HeapAlloc( GetProcessHeap(), 0, nprofiles * sizeof(cmsHPROFILE) ); | 
|  |  | 
|  | if (cmsprofiles) | 
|  | { | 
|  | for (i = 0; i < nprofiles; i++) | 
|  | cmsprofiles[i] = MSCMS_hprofile2cmsprofile( profiles[i] ); | 
|  | } | 
|  |  | 
|  | cmstransform = cmsCreateMultiprofileTransform( cmsprofiles, nprofiles, TYPE_BGR_8, | 
|  | TYPE_BGR_8, *intents, 0 ); | 
|  | HeapFree( GetProcessHeap(), 0, cmsprofiles ); | 
|  | ret = MSCMS_create_htransform_handle( cmstransform ); | 
|  |  | 
|  | #endif /* HAVE_LCMS */ | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * DeleteColorTransform             [MSCMS.@] | 
|  | * | 
|  | * Delete a color transform. | 
|  | * | 
|  | * PARAMS | 
|  | *  transform [I] Handle to a color transform. | 
|  | * | 
|  | * RETURNS | 
|  | *  Success: TRUE | 
|  | *  Failure: FALSE | 
|  | */ | 
|  | BOOL WINAPI DeleteColorTransform( HTRANSFORM transform ) | 
|  | { | 
|  | BOOL ret = FALSE; | 
|  | #ifdef HAVE_LCMS | 
|  | cmsHTRANSFORM cmstransform; | 
|  |  | 
|  | TRACE( "( %p )\n", transform ); | 
|  |  | 
|  | cmstransform = MSCMS_htransform2cmstransform( transform ); | 
|  | cmsDeleteTransform( cmstransform ); | 
|  |  | 
|  | MSCMS_destroy_htransform_handle( transform ); | 
|  | ret = TRUE; | 
|  |  | 
|  | #endif /* HAVE_LCMS */ | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TranslateBitmapBits              [MSCMS.@] | 
|  | * | 
|  | * Perform color translation. | 
|  | * | 
|  | * PARAMS | 
|  | *  transform    [I] Handle to a color transform. | 
|  | *  srcbits      [I] Source bitmap. | 
|  | *  input        [I] Format of the source bitmap. | 
|  | *  width        [I] Width of the source bitmap. | 
|  | *  height       [I] Height of the source bitmap. | 
|  | *  inputstride  [I] Number of bytes in one scanline. | 
|  | *  destbits     [I] Destination bitmap. | 
|  | *  output       [I] Format of the destination bitmap. | 
|  | *  outputstride [I] Number of bytes in one scanline. | 
|  | *  callback     [I] Callback function. | 
|  | *  data         [I] Callback data. | 
|  | * | 
|  | * RETURNS | 
|  | *  Success: TRUE | 
|  | *  Failure: FALSE | 
|  | */ | 
|  | BOOL WINAPI TranslateBitmapBits( HTRANSFORM transform, PVOID srcbits, BMFORMAT input, | 
|  | DWORD width, DWORD height, DWORD inputstride, PVOID destbits, BMFORMAT output, | 
|  | DWORD outputstride, PBMCALLBACKFN callback, ULONG data ) | 
|  | { | 
|  | BOOL ret = FALSE; | 
|  | #ifdef HAVE_LCMS | 
|  | cmsHTRANSFORM cmstransform; | 
|  |  | 
|  | TRACE( "( %p, %p, 0x%08x, 0x%08x, 0x%08x, 0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x )\n", | 
|  | transform, srcbits, input, width, height, inputstride, destbits, output, | 
|  | outputstride, callback, data ); | 
|  |  | 
|  | cmstransform = MSCMS_htransform2cmstransform( transform ); | 
|  | cmsDoTransform( cmstransform, srcbits, destbits, width * height ); | 
|  | ret = TRUE; | 
|  |  | 
|  | #endif /* HAVE_LCMS */ | 
|  | return ret; | 
|  | } |