| /* |
| * MSCMS - Color Management System for Wine |
| * |
| * Copyright 2004, 2005 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 "winreg.h" |
| #include "winternl.h" |
| #include "icm.h" |
| |
| #define LCMS_API_FUNCTION(f) extern typeof(f) * p##f; |
| #include "lcms_api.h" |
| #undef LCMS_API_FUNCTION |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(mscms); |
| |
| #ifdef HAVE_LCMS_H |
| |
| static inline void MSCMS_adjust_endianess32( ULONG *ptr ) |
| { |
| #ifndef WORDS_BIGENDIAN |
| *ptr = RtlUlongByteSwap(*ptr); |
| #endif |
| } |
| |
| void MSCMS_get_profile_header( icProfile *iccprofile, PROFILEHEADER *header ) |
| { |
| unsigned int i; |
| |
| memcpy( header, iccprofile, sizeof(PROFILEHEADER) ); |
| |
| /* ICC format is big-endian, swap bytes if necessary */ |
| for (i = 0; i < sizeof(PROFILEHEADER) / sizeof(ULONG); i++) |
| MSCMS_adjust_endianess32( (ULONG *)header + i ); |
| } |
| |
| void MSCMS_set_profile_header( icProfile *iccprofile, PROFILEHEADER *header ) |
| { |
| unsigned int i; |
| icHeader *iccheader = (icHeader *)iccprofile; |
| |
| memcpy( iccheader, header, sizeof(icHeader) ); |
| |
| /* ICC format is big-endian, swap bytes if necessary */ |
| for (i = 0; i < sizeof(icHeader) / sizeof(ULONG); i++) |
| MSCMS_adjust_endianess32( (ULONG *)iccheader + i ); |
| } |
| |
| DWORD MSCMS_get_tag_count( icProfile *iccprofile ) |
| { |
| ULONG count = iccprofile->count; |
| |
| MSCMS_adjust_endianess32( &count ); |
| return count; |
| } |
| |
| void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag ) |
| { |
| icTag *tmp = (icTag *)((char *)&iccprofile->data + index * sizeof(icTag)); |
| |
| tag->sig = tmp->sig; |
| tag->offset = tmp->offset; |
| tag->size = tmp->size; |
| |
| MSCMS_adjust_endianess32( (ULONG *)&tag->sig ); |
| MSCMS_adjust_endianess32( (ULONG *)&tag->offset ); |
| MSCMS_adjust_endianess32( (ULONG *)&tag->size ); |
| } |
| |
| void MSCMS_get_tag_data( icProfile *iccprofile, icTag *tag, DWORD offset, void *buffer ) |
| { |
| memcpy( buffer, (char *)iccprofile + tag->offset + offset, tag->size - offset ); |
| } |
| |
| void MSCMS_set_tag_data( icProfile *iccprofile, icTag *tag, DWORD offset, void *buffer ) |
| { |
| memcpy( (char *)iccprofile + tag->offset + offset, buffer, tag->size - offset ); |
| } |
| |
| DWORD MSCMS_get_profile_size( icProfile *iccprofile ) |
| { |
| DWORD size = ((icHeader *)iccprofile)->size; |
| |
| MSCMS_adjust_endianess32( (ULONG *)&size ); |
| return size; |
| } |
| |
| #endif /* HAVE_LCMS_H */ |