00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
#include "magick/studio.h"
00051
#include "magick/blob.h"
00052
#include "magick/blob_private.h"
00053
#include "magick/error.h"
00054
#include "magick/error_private.h"
00055
#include "magick/image.h"
00056
#include "magick/image_private.h"
00057
#include "magick/list.h"
00058
#include "magick/log.h"
00059
#include "magick/magick.h"
00060
#include "magick/memory_.h"
00061
#include "magick/monitor.h"
00062
#include "magick/static.h"
00063
#include "magick/string_.h"
00064
00065
00066 static void InsertRow(
unsigned char *p,
int y,
Image *image)
00067 {
00068
unsigned long bit;
long x;
00069
register PixelPacket *q;
00070
IndexPacket index;
00071
register IndexPacket *indexes;
00072
00073
00074
switch (image->
depth)
00075 {
00076
case 1:
00077 {
00078 q=
SetImagePixels(image,0,y,image->
columns,1);
00079
if (q == (
PixelPacket *) NULL)
00080
break;
00081 indexes=
GetIndexes(image);
00082
for (x=0; x < ((
long) image->
columns-7); x+=8)
00083 {
00084
for (bit=0; bit < 8; bit++)
00085 {
00086 index=(
IndexPacket) (((*p) & (0x80 >> bit)) != 0 ? 0x01 : 0x00);
00087 indexes[x+bit]=index;
00088 *q++=image->
colormap[index];
00089 }
00090 p++;
00091 }
00092
if ((image->
columns % 8) != 0)
00093 {
00094
for (bit=0; bit < (image->
columns % 8); bit++)
00095 {
00096 index=(
IndexPacket) (((*p) & (0x80 >> bit)) != 0 ? 0x01 : 0x00);
00097 indexes[x+bit]=index;
00098 *q++=image->
colormap[index];
00099 }
00100 p++;
00101 }
00102
if (
SyncImagePixels(image) ==
MagickFalse)
00103
break;
00104
00105
00106
00107
break;
00108 }
00109 }
00110 }
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 static Image *
ReadARTImage(
const ImageInfo *image_info,
ExceptionInfo *
exception)
00142 {
00143
Image *image;
00144
int i;
00145
unsigned long width,height,dummy;
00146
long ldblk;
00147
unsigned char *BImgBuff=NULL;
00148
unsigned char k;
00149
MagickBooleanType status;
00150
00151
00152
00153
00154
assert(image_info != (
const ImageInfo *) NULL);
00155
assert(image_info->
signature ==
MagickSignature);
00156
if (image_info->
debug !=
MagickFalse)
00157 (
void)
LogMagickEvent(
TraceEvent,
GetMagickModule(),image_info->
filename);
00158
assert(exception != (
ExceptionInfo *) NULL);
00159
assert(exception->
signature ==
MagickSignature);
00160 image=
AllocateImage(image_info);
00161 status=
OpenBlob(image_info,image,
ReadBinaryBlobMode,exception);
00162
if (status ==
MagickFalse)
00163 {
00164
DestroyImageList(image);
00165
return((
Image *) NULL);
00166 }
00167
00168
00169
00170 dummy=
ReadBlobLSBShort(image);
00171 width=
ReadBlobLSBShort(image);
00172 dummy=
ReadBlobLSBShort(image);
00173 height=
ReadBlobLSBShort(image);
00174
00175 ldblk=(
long) ((width+7) / 8);
00176 k=(
unsigned char) ((-ldblk) & 0x01);
00177
if (
GetBlobSize(image) != (
MagickSizeType) (8+(ldblk+(
long) k)*height))
00178
ThrowReaderException(
CorruptImageError,
"ImproperImageHeader");
00179 image->
columns=width;
00180 image->
rows=height;
00181 image->
depth=1;
00182 image->
colors=1l << image->
depth;
00183
00184
00185
00186
if (
AllocateImageColormap(image,image->
colors) ==
MagickFalse)
goto NoMemory;
00187
00188
00189 BImgBuff=(
unsigned char *)
AcquireMagickMemory((size_t) ldblk);
00190
if (BImgBuff==NULL)
00191 NoMemory:
00192
ThrowReaderException(
ResourceLimitError,
"MemoryAllocationFailed");
00193
for (i=0;i< (
int) height;i++)
00194 {
00195 (
void)
ReadBlob(image,(size_t) ldblk,BImgBuff);
00196 (
void)
ReadBlob(image,(size_t) k,(
unsigned char *) &dummy);
00197
InsertRow(BImgBuff,i,image);
00198 }
00199 BImgBuff=(
unsigned char *)
RelinquishMagickMemory(BImgBuff);
00200
if (
EOFBlob(image) !=
MagickFalse)
00201
ThrowFileException(exception,
CorruptImageError,
"UnexpectedEndOfFile",
00202 image->
filename);
00203
CloseBlob(image);
00204
return(
GetFirstImageInList(image));
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 ModuleExport void RegisterARTImage(
void)
00231 {
00232
MagickInfo
00233 *entry;
00234
00235
static const char
00236 *ARTNote=
00237 {
00238
"Format originally used on the Macintosh (MacPaint?) and later used\n"
00239
"for PFS: 1st Publisher clip art. NOT the AOL ART format."
00240 };
00241
00242 entry=
SetMagickInfo(
"ART");
00243 entry->
decoder=(
DecoderHandler *)
ReadARTImage;
00244 entry->
description=
AcquireString(
"PFS: 1st Publisher");
00245 entry->
module=
AcquireString(
"ART");
00246 entry->
note=
AcquireString(ARTNote);
00247 (
void)
RegisterMagickInfo(entry);
00248 }
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 ModuleExport void UnregisterARTImage(
void)
00270 {
00271 (
void)
UnregisterMagickInfo(
"ART");
00272 }