/usr/lib/pike7.8/modules/_Image_DWG.pmod is in pike7.8-image 7.8.866-8.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | // AutoCAD R13/R14/R2000 DWG file decoder
// $Id: fe05a5ffd4f63d71b36188643e303759ba25b271 $
#pike __REAL_VERSION__
//! @appears Image.DWG
//! This module decodes the thumbnail raster images embedded in
//! AutoCAD DWG files for AutoCAD version R13, R14 and R2000 (which
//! equals to file version 12, 14 and 15). Implemented according to
//! specifications from @url{http://www.opendwg.org/@}.
protected constant start = "\x1F\x25\x6D\x07\xD4\x36\x28\x28\x9D\x57\xCA\x3F\x9D\x44\x10\x2B";
protected inline int read_RL(string data, int pos) {
int r;
sscanf(data[pos..pos+3], "%-4c", r);
return r;
}
//! Decodes the DWG @[data] into a mapping.
//! @mapping
//! @member int "version"
//! The version of the DWG file. One of 12, 14 and 15.
//! @member array(string) "bmp"
//! An array with the raw BMP data.
//! @member array(string) "wmf"
//! An array with the raw WMF data.
//! @endmapping
//!
//! @throws
//! This functions throws an error when decoding somehow fails.
mapping __decode(string data) {
// decode version id
if( data[0..3]!="AC10" )
error("Unknown format\n");
int version = (int)data[4..5];
if( !(< 12, 14, 15 >)[version] )
error("Only DWG for AutoCAD R13, R14 and R2000 are supported."
" (File id %d)\n", version);
// Get image data block offset
int pos = read_RL(data, 0x0d);
// Check sentinel
if( data[pos..pos+15]!=start )
error("Error while decoding DWG preview. (Corrupt sentinel)\n");
pos += 16;
// Image data block size
pos += 4;
// Image counter
int i = data[pos++];
array bmps = ({});
array wmfs = ({});
for(; i; i--) {
int(1..3) code = data[pos++];
switch(code) {
case 1:
int h_start = read_RL(data, pos);
pos += 4;
int h_size = read_RL(data, pos);
pos += 4;
// werror( "%O\n", sizeof(data[h_start..h_start+h_size-1]) );
break;
case 2:
int bmp_start = read_RL(data, pos);
pos += 4;
int bmp_size = read_RL(data, pos);
pos += 4;
// For some reason AutoCAD thought it wise to skip the first 14
// bytes of the BMP file. Add "BM", 4 bytes data size, 4 bytes
// reserved and 4 bytes offset to image data.
string header = sprintf("BM%-4c\0\0\0\0\0\0\0\0", bmp_size+14);
bmps += ({ header+data[bmp_start..bmp_start+bmp_size-1] });
break;
case 3:
int wmf_start = read_RL(data, pos);
pos += 4;
int wmf_size = read_RL(data, pos);
pos += 4;
wmfs += ({ data[wmf_start..wmf_start+wmf_size-1] });
break;
default:
error("Error while decoding DWG preview. (Unknown code %d)\n", code);
}
}
return ([ "version" : version,
"bmp" : bmps,
"wmf" : wmfs ]);
}
protected Image.Image get_first_image( mapping data ) {
if( !sizeof(data->bmp) )
error("No bitmap previews available.\n");
foreach(data->bmp, string bmp) {
catch {
return Image.BMP.decode(bmp);
};
}
error("Failed to decode any of the previews.\n");
}
//! Works like @[__decode], but in addition it has the element
//! @tt{"image"@} in the result mapping, containing the first
//! successfully decoded bitmap image. to the result of decode(data).
//! @throws
//! If no preview was stored, or no preview could be decoded an
//! error is thrown.
mapping _decode(string data) {
mapping res = __decode(data);
res->image = get_first_image(res);
return res;
}
//! Returns the first successfully decoded bitmap image.
//! @throws
//! If no preview was stored, or no preview could be decoded an
//! error is thrown.
Image.Image decode(string data) {
return _decode(data)->image;
}
|