Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginPICT.cpp view on Meta::CPAN
// ==========================================================
// Apple Macintosh QuickDraw/PICT Loader
//
// Design and implementation by
// - Amir Ebrahimi (amir@unity3d.com)
//
// Based on PICT loading code from paintlib (http://www.paintlib.de/paintlib/).
//
// Paintlib License:
// The paintlib source code and all documentation are copyright (c) 1996-2002
// Ulrich von Zadow and other contributors.
//
// The paintlib source code is supplied "AS IS". Ulrich von Zadow and other
// contributors disclaim all warranties, expressed or implied, including, without
// limitation, the warranties of merchantability and of fitness for any purpose.
// The authors assume no liability for direct, indirect, incidental, special,
// exemplary, or consequential damages, which may result from the use of paintlib,
// even if advised of the possibility of such damage.
//
// Permission is hereby granted to use, copy, modify, and distribute this source
// code, or portions hereof, for any purpose, without fee, subject to the following
// restrictions:
//
// 1. The origin of this source code must not be misrepresented.
// 2. Altered versions must be plainly marked as such and must not be misrepresented
// as being the original source.
// 3. This Copyright notice may not be removed or altered from any source or altered
// source distribution.
// 4. Executables containing paintlib or parts of it must state that the software
// "contains paintlib code. paintlib is copyright (c) 1996-2002 Ulrich von Zadow
// and other contributors.". This notice must be displayed in at least one place
// where the copyright for the software itself is displayed. The documentation must
// also contain this notice.
//
// Bug fixes were made to the original code to support version 2 PICT files
// properly.
//
// Additional resources:
// http://developer.apple.com/documentation/mac/QuickDraw/QuickDraw-458.html
// http://www.fileformat.info/format/macpict/egff.htm
//
// Notes (http://lists.apple.com/archives/java-dev/2006/Apr/msg00588.html):
// There are three main types of PICT files:
// - Version 1
// - Version 2
// - Extended Version 2
//
// Some things to look out for:
// - The bounds and target DPI are stored in a different place in all three.
// - Some of the values are fixed-point shorts ( short / 65536f )
// - Values are big endian
// - All of this may be *preceded* by a 512 byte header--sometimes it is
// there, and sometimes it isn't. You just have to check for the magic
// values in both places.
//
// This file is part of FreeImage 3
//
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
// ==========================================================
#include "FreeImage.h"
#include "Utilities.h"
// ==========================================================
// Plugin Interface
// ==========================================================
static int s_format_id;
static const int outputMessageSize = 256;
// ==========================================================
// Internal functions
// ==========================================================
static BYTE
Read8(FreeImageIO *io, fi_handle handle) {
BYTE i = 0;
io->read_proc(&i, 1, 1, handle);
return i;
}
static WORD
Read16(FreeImageIO *io, fi_handle handle) {
// reads a two-byte big-endian integer from the given file and returns its value.
// assumes unsigned.
src/Source/FreeImage/PluginPICT.cpp view on Meta::CPAN
// Bitmap/pixmap data clipped by a region.
rowBytes = Read16( io, handle ); // Bytes per row in source when uncompressed.
isRegion = TRUE;
if ( rowBytes & 0x8000) {
pictType = pixmap;
} else {
pictType = bitmap;
}
done = TRUE;
break;
}
case 0x9a:
{
// DirectBitsRect.
Read32( io, handle ); // Skip fake len and fake EOF.
Read16( io, handle ); // bogus row bytes.
// Read in the PixMap fields.
ReadRect( io, handle, &pixMap.Bounds );
ReadPixmap( io, handle, &pixMap );
// Ignore source & destination rectangle as well as transfer mode.
MacRect dummy;
ReadRect( io, handle, &dummy );
ReadRect( io, handle, &dummy );
WORD mode = Read16( io, handle );
pictType=op9a;
done = TRUE;
break;
}
case 0xa1:
{
// long comment
WORD type;
WORD len;
type = Read16( io, handle );
len = Read16( io, handle);
if (len > 0) {
io->seek_proc(handle, len, SEEK_CUR);
}
break;
}
default:
// No function => skip to next opcode
if (optable[opcode].len == WORD_LEN) {
WORD len = Read16( io, handle );
io->seek_proc(handle, len, SEEK_CUR);
} else {
io->seek_proc(handle, optable[opcode].len, SEEK_CUR);
}
break;
}
}
else if (opcode == 0xc00) {
// version 2 header (26 bytes)
WORD minorVersion = Read16( io, handle ); // always FFFE (-2) for extended version 2
Read16( io, handle ); // reserved
hRes = Read32( io, handle ); // original horizontal resolution in pixels/inch
vRes = Read32( io, handle ); // original horizontal resolution in pixels/inch
MacRect dummy;
ReadRect( io, handle, &dummy ); // frame bounds at original resolution
Read32( io, handle ); // reserved
}
else if (opcode == 0x8200) {
// jpeg
long opLen = Read32( io, handle );
BOOL found = FALSE;
int i = 0;
// skip to JPEG header.
while ( !found && i < opLen ) {
// io->seek_proc( handle, 24, SEEK_CUR );
// MacRect dummy;
// ReadRect( io, handle, &dummy );
// io->seek_proc( handle, 122, SEEK_CUR );
// found = TRUE;
BYTE data[ 2 ];
if( io->read_proc( data, 2, 1, handle ) ) {
io->seek_proc( handle, -2, SEEK_CUR );
if ( data[0] == 0xFF && data[1] == 0xD8 ) {
found = TRUE;
} else {
Read8( io, handle );
i++;
}
}
}
if ( found ) {
// Pass the data to the JPEG decoder.
pictType = jpeg;
} else {
throw "PICT file contains unrecognized quicktime data.";
}
done = TRUE;
}
else if (opcode >= 0xa2 && opcode <= 0xaf) {
// reserved
WORD len = Read16( io, handle );
io->seek_proc(handle, len, SEEK_CUR);
}
else if ((opcode >= 0xb0 && opcode <= 0xcf) || (opcode >= 0x8000 && opcode <= 0x80ff)) {
// just a reserved opcode, no data
}
else if ((opcode >= 0xd0 && opcode <= 0xfe) || opcode >= 8100) {
// reserved
LONG len = Read32( io, handle );
io->seek_proc(handle, len, SEEK_CUR);
}
else if (opcode >= 0x100 && opcode <= 0x7fff) {
// reserved
io->seek_proc(handle, ((opcode >> 7) & 255), SEEK_CUR);
}
else {
sprintf( outputMessage, "Can't handle opcode %x.\n", opcode );
throw outputMessage;
}
if(currentPos == io->tell_proc(handle)) {
// we probaly reached the end of file as we can no longer move forward ...
( run in 0.505 second using v1.01-cache-2.11-cpan-5623c5533a1 )