home *** CD-ROM | disk | FTP | other *** search
- {$define RETAIL_VERSION}
- {!$define Win32}
- {***************************************************************************
- Source File Name : WMFIMP.PAS
- Autor : Mario M. Westphal
- Erstellt am : 18.02.1993
-
- Compiler : Borland Pascal for Windows 1.x
- Betriebssystem : DOS 5.0, Windows 3.x
- Compiler-Schalter : -
-
- Bemerkungen : -
-
- Beschreibung : Bibliothek fⁿr den Import von "APM"-Metafiles
-
- Revisionen : 1.00 18.02,1993 created (MW)
- 07.04.1993 revisited (MW)
- ****************************************************************************}
- {$M 8192,8192}
- {$A+,B-,D+,F-,G+,I+,L+,N-,R+,S+,V+,W-,X+,Q+}
-
- {$ifdef RETAIL_VERSION}
- {$D-,L-,S-,R-,Q-,I-}
- {$endif}
-
- library WMFIMP;
- {$D Copyright⌐ 1993 by Mario M. Westphal. Import filter for APM Metafiles. }
- {$C MOVEABLE PRELOAD DISCARDABLE}
-
- uses
- WinTypes,
- WinProcs,
- Objects,
- Win31,
- Strings,
- SysTools,
- bpwmfimp;
-
- const
- FILTERVERSION = $0102; { Aktuelle Version der Bibliothek }
- APMID = $9AC6CDD7; { Kennung APM File }
- HFILE_ERROR = -1; { Ergebnis von _llseek }
-
- var
- MFUsesOwnPal : Boolean; { Wird von EnumMetaFileColors verwendet }
-
- {*******************************************************************************}
- { Sortierte Kollektion mit PaletteneintrΣgen }
- { Wird zur Zwischenspeicherung bei der Analyse des Metafiles verwendet. }
- { Sortiert wird nach RGB-Werten und deren HΣufigkeit. Dies ist eine ziemliche }
- { "brute force"-Methode, aber das Einfⁿgen eines besseren Algorithmus ist ohne }
- { Probleme machbar. }
- {*******************************************************************************}
- type
- { Ein Eintrag in der Palette }
- PPalEntry = ^TPalEntry;
- TPalEntry = object(TObject)
- Color : TColorRef; { RGB-Wert }
- Count : LongInt; { Anzahl der Referenzen auf diese Farbe }
- constructor Init (C: TColorRef);
- destructor Done; virtual;
- end;
-
- constructor TPalEntry.Init (C: TColorRef);
- begin
- Inherited Init;
- Color := C;
- Count := 1;
- end;
-
- destructor TPalEntry.Done;
- begin
- Inherited Done;
- end;
-
- type
- { Kollektion fⁿr die Metafile-Palette. Sortiert nach RGB-Werten. }
- PPalCol = ^TPalCol;
- TPalCol = object(TSortedCollection)
- function KeyOf (Item: Pointer) : Pointer; virtual;
- function Compare (Key1, Key2: Pointer) : Integer; virtual;
- end;
-
- { Schlⁿssel ist die Farbe }
- function TPalCol.KeyOf (Item: Pointer) : Pointer;
- begin
- KeyOf := @TPalEntry(Item^).Color;
- end;
-
- { Sortieren nach RGB-Werten }
- function TPalCol.Compare (Key1, Key2: Pointer) : Integer;
- begin
- if TColorRef(Key1^) < TColorRef(Key2^) then Compare := -1
- else if TColorRef(Key1^) > TColorRef(Key2^) then Compare := 1
- else Compare := 0;
- end;
-
- {-------------------------------------------------------------------------------
- Liefert die Versionsnummer des Filters
- }
- function GetFilterVersion : Word; EXPORT;
- begin
- GetFilterVersion := FILTERVERSION;
- end; { GetFilterVersion }
-
-
- {-------------------------------------------------------------------------------
- Callback-Funktion fⁿr EnumMetafile.
- Diese Funktion extrahiert aus den Records des Metafiles alle RGB-Werte
- (einschlie▀lich der Paletten in Bitmap-Feldern) und erzeugt daraus eine
- Kollektion mit FarbeintrΣgen und der absoluten HΣufigkeit, mit der die
- jeweilige Farbe refernziert wird.
- Die hier gewonnenen Informationen werden spΣter verwendet, um eine optimale
- Palette anzulegen. Dazu werden alle RGB-Farbbezⁿge, die direkt angegeben
- wurden, in Paletten-relative RGB-Werte umgerechnet. Dadurch wird die erzeugte
- Palette von allen Elementen des Metafiles verwendet.
-
- PARAMETER:
- Die fⁿr ein Metafile-Callback ⁿblichen Parameter. lParam enthΣlt den
- Zeiger auf die Kollektion mit FarbeintrΣgen.
- ERGEBNIS:
- Immer <> 0, damit die AufzΣhlung fortgesetzt wird.
-
- }
- function EnumMetaFileColors (PaintDC: HDC; lpHt, lpMR: Pointer;
- cObj: Integer; lParam: PPalCol) : Integer; EXPORT;
-
- type
- { Special Metafile-Records }
-
- { meta_StretchBlt }
- PStretchBlt = ^TStretchBlt;
- TStretchBlt = record
- RopLo : Word;
- RopHi : Word;
- SYE : Word;
- SXE : Word;
- SY : Word;
- SX : Word;
- DYE : Word;
- DXE : Word;
- DY : Word;
- DX : Word;
- BitmapInfo : TBitmapInfo;
- bits : array[0..0] of Byte;
- end;
-
- type
- { meta_StretchDIB }
- PStretchDIB = ^TStretchDIB;
- TStretchDIB = record
- RopLo : Word;
- RopHi : Word;
- Usag : Word;
- srcYExt : Word;
- srcXExt : Word;
- srcY : Word;
- srcX : Word;
- dstYExt : Word;
- dstXExt : Word;
- dstY : Word;
- dstX : Word;
- BitmapInfo : TBitmapInfo;
- bits : Word;
- end;
-
- type
- { meta_SetDIBitsToDevice }
- PSetDIBits = ^TSetDIBits;
- TSetDIBits = record
- wUsage : Word;
- numscans : Word;
- startscan : Word;
- srcY : Word;
- srcX : Word;
- extY : Word;
- extX : Word;
- destY : Word;
- destX : Word;
- BitmapInfo : TBitmapInfo;
- bits : Word;
- end;
-
- type
- { meta_bitblt }
- PBitBlt = ^TBitBlt;
- TBitBlt = record
- RopLo : Word;
- RopHi : Word;
- SY : Word;
- SX : Word;
- DYE : Word;
- DXE : Word;
- DY : Word;
- DX : Word;
- BitmapInfo : TBitmapInfo;
- bits : Word;
- end;
-
- type
- { meta_setpixel }
- PSetPixelRec = ^TSetPixelRec;
- TSetPixelRec = record
- x : Word;
- y : Word;
- Color : TColorRef;
- end;
-
- type
- { meta_floodfill }
- PFloodFillRec = ^TFloodFillRec;
- TFloodFillRec = record
- x : Integer;
- y : Integer;
- Color : TColorRef;
- end;
-
- type
- PColorRef = ^TColorRef;
- PRGBColors = ^TRGBColors;
- TRGBColors = array[0..0] of TRGBQUAD;
-
- var
- MR : PMetaRecord;
- L : PLogBrush;
- P : PLogPen;
-
- i : Integer;
- j : LongInt;
-
- TC : PColorRef;
- RC : TColorRef;
-
- bmInfo: PBitmapInfo;
- Colors: LongInt;
-
- x,y : Integer;
- PP : PPoint;
-
- {$ifopt R+}
- {$define R_ON}
- {$R-}
- {$endif}
-
- { Fⁿgt alle Farben aus der ⁿbergebenen Bitmap-Palette in die Paletten-Kollektion ein }
- procedure ScanBMPPal (pPal: PRGBColors; Count: Word);
- var
- j : Word;
- TC: TColorRef;
- begin
- for j := 0 to Pred(Count) do
- begin
- with pPal^[j] do TC := RGB(rgbRed,rgbGreen,rgbBlue);
- if lParam^.Search(@TC,i) then
- inc(TPalEntry(lParam^.At(i)^).Count) { RGB-Wert bereits enthalten! }
- else
- lParam^.Insert(New(PPalEntry,Init(TC))); { Neue Farbe => in Palette aufnehmen }
- end;
- end;
-
-
- begin
- MR := lpMR;
- case MR^.rdFunction of
-
- META_CREATEBRUSHINDIRECT : begin
- L := @MR^.rdParm;
- if lParam^.Search(@L^.lbColor,i) then
- inc(TPalEntry(lParam^.At(i)^).Count) { Farbe bereits vorhanden }
- else
- lParam^.Insert(New(PPalEntry,Init(L^.lbColor))); { Neuer Eintrag }
- { RGB-Wert -> Palettenbezogener RGB-Wert }
- L^.lbColor := L^.lbColor or $02000000
- end; { meta_createbrushindirect }
-
-
- META_CREATEPENINDIRECT : begin
- P := @MR^.rdParm;
- if lParam^.Search(@P^.lopnColor,i) then
- inc(TPalEntry(lParam^.At(i)^).Count)
- else
- lParam^.Insert(New(PPalEntry,Init(P^.lopnColor)));
- { RGB-Wert -> Palettenbezogener RGB-Wert }
- P^.lopnColor := P^.lopnColor or $02000000
- end; { meta_createpenindirect }
-
-
- META_SETBKCOLOR : begin
- TC := PColorRef(@MR^.rdParm);
- if lParam^.Search(@TC,i) then
- inc(TPalEntry(lParam^.At(i)^).Count)
- else
- lParam^.Insert(New(PPalEntry,Init(TC^)));
- { RGB-Wert -> Palettenbezogener RGB-Wert }
- TC^ := TC^ and $02000000;
- end;
-
-
- META_SETPIXEL : begin
- TC := @PSetPixelRec(@MR^.rdParm)^.Color;
- if lParam^.Search(@TC,i) then
- inc(TPalEntry(lParam^.At(i)^).Count)
- else
- lParam^.Insert(New(PPalEntry,Init(TC^)));
- { RGB-Wert -> Palettenbezogener RGB-Wert }
- TC^ := TC^ and $02000000;
- end;
-
-
- META_SETTEXTCOLOR : begin
- TC := PColorRef(@MR^.rdParm);
- if lParam^.Search(@TC,i) then
- inc(TPalEntry(lParam^.At(i)^).Count)
- else
- lParam^.Insert(New(PPalEntry,Init(TC^)));
- { RGB-Wert -> Palettenbezogener RGB-Wert }
- TC^ := TC^ and $02000000;
- end;
-
-
- META_FLOODFILL : begin
- TC := @PFloodFillRec(@MR^.rdParm)^.Color;
- if lParam^.Search(@TC,i) then
- inc(TPalEntry(lParam^.At(i)^).Count)
- else
- lParam^.Insert(New(PPalEntry,Init(TC^)));
- { RGB-Wert -> Palettenbezogener RGB-Wert }
- TC^ := TC^ and $02000000;
- end;
-
- META_STRETCHDIB,
- META_SETDIBTODEV,
- META_STRETCHBLT,
- META_BITBLT : begin
- case MR^.rdFunction of
- META_STRETCHDIB : bmInfo := @PStretchDIB(@MR^.rdParm)^.BitmapInfo;
- META_SETDIBTODEV : bmInfo := @PSetDIBits(@MR^.rdParm)^.BitmapInfo;
- META_STRETCHBLT : bmInfo := @PStretchBlt(@MR^.rdParm)^.BitmapInfo;
- META_BITBLT : bmInfo := @PBitBlt(@MR^.rdParm)^.BitmapInfo;
- end; { case }
-
- { Ermittle die Anzahl der Farben in der Bitmap }
- with bmInfo^.bmiHeader do
- begin
- if biClrUsed <> 0 then Colors := biClrUsed
- else if biBitCount < 24 then Colors := 1 shl biBitCount
- else Colors := 0; { flag 24-Bit }
- end;
-
- if Colors > 0 then { Keine 24-Bit Bimap }
- begin
- ScanBMPPal(@bmInfo^.bmiColors,Colors);
- end
- else
- begin
- { Analyse eines 24-Bit Bitmaps }
- { Zu aufwenig fⁿr den Zweck. Um ein 24-Bit Bitmap darzustellen, mⁿ▀te dieses }
- { auch gedithert werden. Dieser Proze▀ ist zu aufwendig fⁿr das einmalige }
- { Darstellen eines Bildes und wird aus diesem Grund hier nicht durchgefⁿhrt. }
- end;
- end; { Bitmaps }
-
-
- { Die paletten-spezifischen Records des Metafiles werden nicht interpretiert, }
- { sondern werden nur abgefangen, um das globale Flag MFUsesOwnPal zu setzen. }
- { Die aufrufende Anwendung kann dann entscheiden, ob sie die aufgebaute Palette }
- { oder die im Metafile enthaltene Palette benutzt. }
-
- META_ANIMATEPALETTE,
- META_CREATEPALETTE,
- META_RESIZEPALETTE,
- META_SELECTPALETTE,
- META_SETPALENTRIES,
- META_REALIZEPALETTE : begin
-
- MFUsesOwnPal := true;
-
- end;
-
- end; { case }
-
- {$ifdef R_ON}
- {$undef R_ON}
- {$R+}
- {$endif}
- EnumMetaFileColors := 1;
- end;
-
-
- {-------------------------------------------------------------------------------
- Erzeugt eine Palette aus dem ⁿbergebenen Metafile.
- Diese Funktion prⁿft, ob der Bildschirm rasterfΣhig ist und erzeugt nur
- dann eine Palette, wenn dies n÷tig ist. Bei einer Videokarte mit 16 Farben
- ist die Verwendung einer Palette nicht sinnvoll. Bei vielen Grafikkarten mit
- mehr als 256 Farben wird ⁿberhaupt keine Palette mehr verwendet. Auch in
- diesem Fall wird keine Palette erzeugt.
-
- PARAMETER:
- hMF : Handle des Metafiles
- Flags : 0 : Normale Palette (Alle Farben des Metafiles sind enthalten.
- So kann die Palette von der aufrufenden Anwendung selbst
- optimiert werden.
- 1 : Die Palette des Metafiles wird nach HΣufigkeit sortiert und
- optimal an die Systempalette angepasst.
- ERGEBNIS:
- Der Handle einer Palette, wenn die Funktion erfolgreich ausgefⁿhrt wurde.
- Andernfalls ist der Rⁿckgabewert 0.
-
- Der Parameter Flags wird auf 0 gesetzt, wenn im Metafile keine paletten-
- spezifischen Records vorhanden sind, ansonsten auf 1.
- }
- function CreateFilePalette (hMF: THandle; var Flags: Byte) : HPalette;
- type
- OP = record
- Count : LongInt;
- Color : TColorRef;
- end;
-
- OPType = array[0..0] of OP;
-
- var
- LogPalette : PLogPalette;
- hPalette : THandle;
- PalEntrys : Word;
- PalCol : PPalCol;
- i,j : LongInt;
- hOptPal : THandle;
- OptPal : ^OPType;
- WinMaxPalEntrys : LongInt;
- DC : HDC;
- EnumProc : TFarProc;
-
- {$ifopt R+}
- {$define R_ON}
- {$R-}
- {$endif}
-
- { Sortiert die Palette nach dem Feld "Count". Einfacher Bubble-Sort. }
- procedure SortOptPal;
- var
- Temp : OP;
- i1,i2 : LongInt;
- begin
- for i1 := 0 to PalCol^.Count-2 do
- begin
- for i2 := Pred(PalCol^.Count) downto Succ(i1) do
- begin
- if OptPal^[i1].Count < OptPal^[i2].Count then
- begin
- Temp := OptPal^[i1];
- OptPal^[i1] := OptPal^[i2];
- OptPal^[i2] := Temp;
- end;
- end;
- end;
- end;
-
-
- begin
- { Hole maximale Palettengr÷▀e }
- DC := CreateDC('DISPLAY',nil,nil,nil);
-
- if (GetDeviceCaps(DC,RASTERCAPS) and RC_PALETTE <> 0) then
- begin
- { Maximale Anzahl: Gr÷▀e der Systempalette - Anzahl der reservierten Farben }
- WinMaxPalEntrys := Word(GetDeviceCaps(DC,SIZEPALETTE)) - GetDeviceCaps(DC,NUMRESERVED);
- end
- else
- begin
- WinMaxPalEntrys := GetDeviceCaps(DC,NUMCOLORS);
- end;
-
- { Kollektion fⁿr die MetaBild-Palette }
- if WinMaxPalEntrys > 0 then
- begin
- New(PalCol,Init(WinMaxPalEntrys,10));
- PalCol^.Duplicates := false;
- end
- else
- begin
- { In diesem Fall wird keine Palette ben÷tigt }
- DeleteDC(DC);
- CreateFilePalette := 0;
- exit;
- end;
-
- { Diese Variable wird von EnumMetaFileColors auf true gesetzt, wenn im }
- { Metafile eine paletten-spezifische Funktion enthalten ist. }
- MFUsesOwnPal := false;
-
- { RGB-Werte aus dem Metafile auslesen und in die Kollektion aufnehmen }
- EnumProc := MakeProcInstance(@EnumMetaFileColors,HInstance);
- EnumMetaFile(DC,hMF,EnumProc,PalCol);
- FreeProcInstance(EnumProc);
-
- DeleteDC(DC);
-
- { Wenn in der erzeugten Palette mehr EintrΣge enthalten sind, als in der }
- { Systempalette Platz haben, werden hier die WinMaxPalEntrys's EintrΣge }
- { gesucht, die am hΣufigsten referenziert wurden. Aus diesen wird dann }
- { eine optimierte Palette aufgebaut. }
- if (Flags and 1 <> 0) and (PalCol^.Count > WinMaxPalEntrys) then
- begin
- PalEntrys := WinMaxPalEntrys;
- hOptPal := GlobalAlloc(GHND,SizeOf(OPType)*PalCol^.Count);
- OptPal := GlobalLock(hOptPal);
-
- { Alle EintrΣge aus der Kollektion kopieren }
- for i := 0 to Pred(PalCol^.Count) do
- begin
- OptPal^[i].Count := PPalEntry(PalCol^.At(i))^.Count;
- OptPal^[i].Color := PPalEntry(PalCol^.At(i))^.Color;
- end;
-
- { Absteigend nach HΣufigkeit sortieren. OptPal enthΣlt dann alle PaletteneintrΣge, }
- { nach HΣufigkeit der Referenzierung sortiert. Die ersten "WinMaxPalEntrys" EintrΣge }
- { bilden dann die zu realisierende Palette. }
- SortOptPal;
-
- { Speicher fⁿr die Palette holen }
- hPalette := GlobalAlloc(GHND,SizeOf(LogPalette^)+PalEntrys*SizeOf(TPaletteEntry));
- LogPalette := GlobalLock(hPalette);
-
- { Kompatible Palette aufbauen }
- LogPalette^.palVersion := $300;
- LogPalette^.palNumEntries := PalEntrys;
- for i := 0 to Pred(PalEntrys) do
- begin
- LogPalette^.palpalEntry[i].peRed := GetRValue(OptPal^[i].Color);
- LogPalette^.palpalEntry[i].peGreen := GetGValue(OptPal^[i].Color);
- LogPalette^.palpalEntry[i].peBlue := GetBValue(OptPal^[i].Color);
- LogPalette^.palpalEntry[i].peFlags := PC_NOCOLLAPSE;
- end;
-
- CreateFilePalette := CreatePalette(LogPalette^);
- GlobalUnlock(hPalette);
- GlobalFree(hPalette);
-
- GlobalUnlock(hOptPal);
- GlobalFree(hOptPal);
- end
-
- else
-
- { Die erzeugte Palette lΣ▀t sich vollstΣndig in der Systempalette abbilden, oder }
- { Flag wurde mit 0 ⁿbergeben => Erzeuge Palette mit allen Farben der Kollektion }
- begin
- PalEntrys := PalCol^.Count;
- hPalette := GlobalAlloc(GHND,SizeOf(LogPalette^)+PalEntrys*SizeOf(TPaletteEntry));
- LogPalette := GlobalLock(hPalette);
-
- { Kompatible Palette aufbauen }
- LogPalette^.palVersion := $300;
- LogPalette^.palNumEntries := PalEntrys;
- for i := 0 to Pred(PalEntrys) do
- begin
- LogPalette^.palpalEntry[i].peRed := GetRValue(TPalEntry(PalCol^.At(i)^).Color);
- LogPalette^.palpalEntry[i].peGreen := GetGValue(TPalEntry(PalCol^.At(i)^).Color);
- LogPalette^.palpalEntry[i].peBlue := GetBValue(TPalEntry(PalCol^.At(i)^).Color);
- LogPalette^.palpalEntry[i].peFlags := PC_NOCOLLAPSE;
- end;
-
- CreateFilePalette := CreatePalette(LogPalette^);
- GlobalUnlock(hPalette);
- GlobalFree(hPalette);
- end;
-
- { Die Kollektion wird nicht mehr gebraucht }
- Dispose(PalCol,Done);
-
- { Informationen ⁿber die Metafile-Palette zurⁿckliefern }
- if MFUsesOwnPal then Flags := 1 { Eigene Palette im Metafile }
- else Flags := 0; { Keine eigene Palette }
-
- {$ifdef R_ON}
- {$undef R_ON}
- {$R+}
- {$endif}
- end;
-
- {-------------------------------------------------------------------------------
- LΣdt das Metafile aus der in FileSpec angegebenen Datei.
- Die aktuelle Position in der Datei wird nicht verΣndert.
-
- PARAMETER:
- FileSpec : EnthΣlt die Informationen, die zum Lesen
- der Datei ben÷tigt werden.
- In dieser Struktur werden auch Informationen
- ⁿber das geladene Metafile zurⁿckgeliefert.
- ERGEBNIS:
- 0 : Kein Fehler
- 1 : Keine APM-Datei
- 2 : Ungⁿltige Prⁿfsumme
- 3 : Fehler beim Lesen
- 4 : Datei nicht gefunden
- 5 : Allgemeiner Fehler
- 6 : Nicht genug Speicher
- }
- function LoadFile (var FileSpec: TFileSpec) : Integer; EXPORT;
- var
- MFBits : THandle;
- MFRec : TAPMFileHeader;
- MH : TMetaHeader;
- Count : Longint;
- Size : LongInt;
- CheckSum : Word;
- i : Integer;
- TOF : TOFStruct;
- Bits : Pointer;
- fOldPos : LongInt;
- Flags : Byte;
-
- begin
- if StrLen(FileSpec.Fullname) = 0 then { Sicherheitshalber }
- begin
- LoadFile := 4; { FEHLER: Datei nicht gefunden }
- exit;
- end;
-
- fOldPos := FileSpec.FPos;
- if _llSeek(FileSpec.FHandle,0,0) = HFILE_ERROR then
- begin
- LoadFile := 3; { FEHLER: Fehler beim Lesen }
- exit;
- end;
-
- { APM-Header lesen }
- if _lread(FileSpec.FHandle,@MFRec,SizeOf(MFRec)) <> SizeOf(MFRec) then
- begin
- LoadFile := 3; { FEHLER: Fehler beim Lesen }
- _llSeek(FileSpec.FHandle,FOldPos,0);
- exit;
- end;
-
- { Prⁿfen der Datei auf die APM-Kennung }
- if MFRec.dwKey <> APMID then
- begin
- LoadFile := 1; { FEHLER: Keine APM-Datei }
- _llSeek(FileSpec.FHandle,FOldPos,0);
- exit;
- end;
-
- { Prⁿfsumme testen: Die ersten 10 Words des Headers ⁿber XOR verknⁿpfen }
- CheckSum := 0;
- for i := 0 to 9 do
- begin
- CheckSum := CheckSum xor Word(Ptr(Seg(MFRec),Ofs(MFRec)+2*i)^);
- end;
- if CheckSum <> MFRec.wCheckSum then
- begin
- LoadFile := 2; { FEHLER: Falsche Prⁿfsumme }
- _llSeek(FileSpec.FHandle,FOldPos,0);
- exit;
- end;
-
- { Metafile-Header lesen }
- if _lread(FileSpec.FHandle,@MH,SizeOf(MH)) <> SizeOf(MH) then
- begin
- LoadFile := 3; { FEHLER: Fehler beim Lesen }
- _llSeek(FileSpec.FHandle,FOldPos,0);
- exit;
- end
- else
- begin
- { Zurⁿck an den Anfang des Metafile-Headers }
- _llseek(FileSpec.FHandle,-SizeOf(MH),1);
- end;
-
- { Alloziere Speicher und lade das Metafile in den globalen Heap. }
- Size := MH.mtSize * 2;
- MFBits := GlobalAlloc(GHND,Size);
- if MFBits = 0 then
- begin
- LoadFile := 6; { FEHLER: Nicht genug Speicher }
- _llSeek(FileSpec.FHandle,FOldPos,0);
- exit;
- end;
-
- Bits := GlobalLock(MFBits);
- if _hread(FileSpec.FHandle,Bits,Size) <> Size then
- begin
- _llSeek(FileSpec.FHandle,FOldPos,0);
- LoadFile := 3; { FEHLER: Fehler beim Lesen }
- GlobalUnlock(MFBits);
- GlobalFree(MFBits);
- exit;
- end;
-
- { Erzeuge aus dem globalen Speicher ein Memory-Metafile }
- MFRec.hMF := SetMetaFileBits(MFBits);
- GlobalUnlock(MFBits);
-
- { Informationen ⁿber das Metafile ablegen }
- with FileSpec.FInfo do
- begin
- hMF := MFRec.hMF; { Handle der Datei }
- lSize := Size; { Gr÷▀e des Metafiles im globalen Heap }
- rcBBox := MFRec.rcBBox; { Umgebendes Rechteck }
- wInch := MFRec.wInch; { Punkte pro logischem Zoll }
- end;
-
- _llSeek(FileSpec.FHandle,FOldPos,0); { Zurⁿck an die Startposition }
-
- if MFRec.hMF = 0 then
- LoadFile := 6 { FEHLER: Nicht genug Speicher }
- else
- begin
- LoadFile := 0; { Alles Ok! }
- { Palette aufbauen }
- case FileSpec.PalSpec of
- bpBuilt : begin
- Flags := 0;
- FileSpec.FInfo.hPal := CreateFilePalette(MFRec.hMF,Flags);
- end;
- bpOptimize : begin
- Flags := 1;
- FileSpec.FInfo.hPal := CreateFilePalette(MFRec.hMF,Flags);
- end;
- else begin
- FileSpec.FInfo.hPal := 0;
- Flags := 0;
- end;
- end; { case }
-
- { OwnPal ist true, wenn das Metafile paletten-spezifische Records enthΣlt }
- FileSpec.FInfo.OwnPal := Flags <> 0;
- end;
- end;
-
-
- {*******************************************************************************}
- { EXPORT Section }
- {*******************************************************************************}
- EXPORTS
- GetFilterVersion INDEX 1,
- LoadFile INDEX 2;
-
-
- {*******************************************************************************}
- { LibMain und WEP }
- {*******************************************************************************}
- var
- SavedExitProc : Pointer;
-
- {-------------------------------------------------------------------------------
- Exitprozedur der Bibliothek
- }
- procedure LibExit; Far;
- begin
- ExitProc := SavedExitProc;
- end;
-
- BEGIN
- SavedExitProc := @ExitProc;
- END.