mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@61945 954022d7-b5bf-4e40-9824-e11837661b57
126 lines
4.7 KiB
C
126 lines
4.7 KiB
C
/**
|
|
* libpsd - Photoshop file formats (*.psd) decode library
|
|
* Copyright (C) 2004-2007 Graphest Software.
|
|
*
|
|
* libpsd is the legal property of its developers, whose names are too numerous
|
|
* to list here. Please refer to the COPYRIGHT file distributed with this
|
|
* source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Library General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* $Id: file_header.c, created by Patrick in 2006.05.18, libpsd@graphest.com Exp $
|
|
*/
|
|
|
|
#include "libpsd.h"
|
|
#include "psd_config.h"
|
|
#include "psd_color.h"
|
|
#include "psd_stream.h"
|
|
#include "psd_system.h"
|
|
|
|
|
|
typedef struct
|
|
{
|
|
psd_char signature[4]; //Signature: always equal to '8BPS'. Do not try to read the file if the signature does not match this value.
|
|
psd_uchar version[2]; //Version: always equal to 1. Do not try to read the file if the version does not match this value. (**PSB** version is 2.)
|
|
psd_char reserved[6]; //Reserved: must be zero.
|
|
psd_uchar number_of_channels[2]; //The number of channels in the image, including any alpha channels. Supported range is 1 to 56.
|
|
psd_uchar height_of_image[4]; //The height of the image in pixels. Supported range is 1 to 30,000. (**PSB** max of 300,000.)
|
|
psd_uchar width_of_image[4]; //The width of the image in pixels. Supported range is 1 to 30,000. (*PSB** max of 300,000)
|
|
psd_uchar depth[2]; //Depth: the number of bits per channel. Supported values are 1, 8, and 16.
|
|
psd_uchar color_mode[2]; //The color mode of the file. Supported values are: Bitmap = 0; Grayscale = 1; Indexed = 2; RGB = 3; CMYK = 4; Multichannel = 7; Duotone = 8; Lab = 9.
|
|
} psd_file_header_binary;
|
|
|
|
|
|
// The file header contains the basic properties of the image
|
|
// input: context, the context of psd file
|
|
// output: status of done
|
|
psd_status psd_get_file_header(psd_context * context)
|
|
{
|
|
psd_file_header_binary header;
|
|
|
|
if(psd_stream_get(context, (psd_uchar *)&header, sizeof(psd_file_header_binary)) == sizeof(psd_file_header_binary))
|
|
{
|
|
// Signature: always equal to '8BPS'
|
|
if(memcmp(header.signature, "8BPS", 4) != 0)
|
|
return psd_status_file_signature_error;
|
|
|
|
// Version: always equal to 1
|
|
if(PSD_CHAR_TO_SHORT(header.version) != 1)
|
|
return psd_status_file_version_error;
|
|
|
|
// The height of the image in pixels
|
|
context->height = PSD_CHAR_TO_INT(header.height_of_image);
|
|
// Supported range is 1 to 30,000
|
|
psd_assert(context->height >= 1 && context->height <= 30000);
|
|
|
|
// The width of the image in pixels
|
|
context->width = PSD_CHAR_TO_INT(header.width_of_image);
|
|
// Supported range is 1 to 30,000
|
|
psd_assert(context->width >= 1 && context->width <= 30000);
|
|
|
|
// The number of channels in the image, including any alpha channels
|
|
context->color_channels = context->channels = PSD_CHAR_TO_SHORT(header.number_of_channels);
|
|
// Supported range is 1 to 56.
|
|
psd_assert(context->channels >= 1 && context->channels <= 56);
|
|
|
|
// Depth: the number of bits per channel
|
|
context->depth = PSD_CHAR_TO_SHORT(header.depth);
|
|
// Supported values are 1, 8, and 16.
|
|
psd_assert(context->depth == 1 || context->depth == 8 || context->depth == 16);
|
|
if(context->depth != 1 && context->depth != 8 && context->depth != 16)
|
|
return psd_status_unsupport_color_depth;
|
|
|
|
// The color mode of the file
|
|
context->color_mode = PSD_CHAR_TO_SHORT(header.color_mode);
|
|
switch(context->color_mode)
|
|
{
|
|
case psd_color_mode_bitmap:
|
|
case psd_color_mode_grayscale:
|
|
case psd_color_mode_indexed:
|
|
case psd_color_mode_rgb:
|
|
case psd_color_mode_duotone:
|
|
break;
|
|
|
|
case psd_color_mode_cmyk:
|
|
#ifndef PSD_SUPPORT_CMYK
|
|
return psd_status_unknown_color_mode;
|
|
#endif
|
|
break;
|
|
|
|
case psd_color_mode_lab:
|
|
#ifndef PSD_SUPPORT_LAB
|
|
return psd_status_unknown_color_mode;
|
|
#endif
|
|
break;
|
|
|
|
case psd_color_mode_multichannel:
|
|
#ifndef PSD_SUPPORT_MULTICHANNEL
|
|
return psd_status_unknown_color_mode;
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
psd_assert(0);
|
|
return psd_status_unknown_color_mode;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return psd_status_fread_error;
|
|
}
|
|
|
|
return psd_status_done;
|
|
}
|