summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas300
1 files changed, 200 insertions, 100 deletions
diff --git a/epostunit.pas b/epostunit.pas
index 5c62226..87bb0ed 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -27,13 +27,20 @@ type
biClrUsed : longint;
biClrImportant : longint;
end ;
- tPalette = record
+ tPalette = class
+ private
+ farben: array[boolean] of tRGBArray;
+ public
name: string;
- farben: tRGBArray;
+ constructor create;
+ constructor create(original: tPalette);
+ destructor destroy; override;
+ procedure kopiereVon(original: tPalette);
+ function neuerWert(s: string; imPart: boolean): boolean; overload;
+ function neuerWert(farbe: tRGB; imPart: boolean): boolean; overload;
+ function wertZuFarbe(x: extended; imPart: boolean = false): tRGB; inline;
end;
- tRGBArrayArray = array of tRGBArray;
- pTPalette = ^tPalette;
- pTPalettenArray = array of pTPalette;
+ tPalettenArray = array of tPalette;
tWerte = class;
tLiKo = array of record
alpha: extended;
@@ -241,10 +248,10 @@ type
farben: tRGBArray;
wertes: array of tExtendedArray;
anzahlens: array of tLongintArray;
- pals: tRGBArrayArray;
- rahmen: boolean;
+ pals: array of tPalette;
+ rahmen,komplex: boolean;
beschr: pTBeschriftungen;
- constructor create(i,maxThreads,iBreite,iHoehe,lO,oO,rO,uO: longint; const wes: tWerteArray; xMin,xMax,tMin,tMax: longint; xZoom,yZoom: extended; nachbearbeitungen: tTransformationArray; paletten: pTPalettenArray; beschri: pTBeschriftungen; rm: boolean);
+ constructor create(i,maxThreads,iBreite,iHoehe,lO,oO,rO,uO: longint; const wes: tWerteArray; xMin,xMax,tMin,tMax: longint; xZoom,yZoom: extended; nachbearbeitungen: tTransformationArray; paletten: tPalettenArray; beschri: pTBeschriftungen; rm,kmpl: boolean);
destructor destroy; override;
procedure stExecute; override;
procedure initAnzahlensFuerKontur;
@@ -379,8 +386,8 @@ type
function neuePalette(f: tMyStringList): boolean;
function initBmpHeader(w,h: longint): tBmpHeader;
procedure schreibeBmpHeader(var f: file; w,h: longint);
-function findePalette(out palette: pTPalette; name: string): boolean;
-function erzeugeLegende(sT: boolean; f: tMyStringList; datei: string; qu: tWerte; minDichte,maxDichte: extended; nB: tTransformation; pal: pTPalette): boolean;
+function findePalette(out palette: tPalette; name: string): boolean;
+function erzeugeLegende(sT: boolean; f: tMyStringList; datei: string; qu: tWerte; minDichte,maxDichte: extended; nB: tTransformation; pal: tPalette): boolean;
function findeWerte(s: string; f: tMyStringList; pws: pTWerteArray; kont: pTKonturenArray; darfErstellen: boolean): integer;
function findeKontur(s: string; f: tMyStringList; pws: pTWerteArray; pks: pTKonturenArray; darfErstellen: boolean): integer;
function externerBefehl(sT: boolean; s: string): boolean;
@@ -388,7 +395,7 @@ procedure warteAufExterneBefehle;
procedure beendeExterneBefehleWennFertig;
var
- paletten: array of tPalette;
+ allePaletten: tPalettenArray;
behalteLogs: boolean;
externeBefehle: array of tBefehlThread;
@@ -396,6 +403,69 @@ implementation
uses math, systemunit;
+// tPalette ********************************************************************
+
+constructor tPalette.create;
+var
+ b: boolean;
+begin
+ inherited create;
+ for b:=false to true do begin
+ fillchar(farben,sizeOf(farben),0);
+ setLength(farben[b],0);
+ end;
+ fillchar(name,sizeOf(name),0);
+end;
+
+constructor tPalette.create(original: tPalette);
+begin
+ create;
+ kopiereVon(original);
+end;
+
+destructor tPalette.destroy;
+var
+ b: boolean;
+begin
+ for b:=false to true do
+ setLength(farben[b],0);
+ inherited destroy;
+end;
+
+procedure tPalette.kopiereVon(original: tPalette);
+var
+ b: boolean;
+ i: longint;
+begin
+ name:=original.name;
+ for b:=false to true do begin
+ setLength(farben[b],length(original.farben[b]));
+ for i:=0 to length(farben[b])-1 do
+ move(original.farben[b][i],farben[b][i],sizeOf(farben[b][i]));
+ end;
+end;
+
+function tPalette.neuerWert(s: string; imPart: boolean): boolean;
+var
+ farbe: tRGB;
+begin
+ result:=strToTRGB(s,farbe);
+ if result then
+ neuerWert(farbe,imPart);
+end;
+
+function tPalette.neuerWert(farbe: tRGB; imPart: boolean): boolean;
+begin
+ setLength(farben[imPart],length(farben[imPart])+1);
+ farben[imPart][length(farben[imPart])-1]:=farbe;
+ result:=true;
+end;
+
+function tPalette.wertZuFarbe(x: extended; imPart: boolean = false): tRGB;
+begin
+ result:=lowlevelunit.wertZuFarbe(x,farben[imPart]);
+end;
+
// tDatenVorfahr ***************************************************************
constructor tDatenVorfahr.create(kont: pTKonturenArray; wert: pTWerteArray);
@@ -4136,7 +4206,7 @@ var
xp0,tp0: extended;
xMin,xMax,tMin,tMax,xp,tp,
breite,hoehe,lOf,rOf,oOf,uOf: longint;
- paletten: pTPalettenArray;
+ paletten: tPalettenArray;
nachbearbeitungen: tTransformationArray;
Ausschnitt: tTransformation;
bilderThreads: array of tBilderThread;
@@ -4252,8 +4322,10 @@ begin
i:=strtoint(erstesArgument(s))
else
i:=0;
- if i>=length(paletten) then
- setLength(paletten,i+1);
+ while i>=length(paletten) do begin
+ setLength(paletten,length(paletten)+1);
+ paletten[length(paletten)-1]:=nil;
+ end;
if not findePalette(paletten[i],s) then begin
gibAus('Kenne Palette '''+s+''' nicht!',3);
aufraeumen;
@@ -4293,6 +4365,11 @@ begin
continue;
end;
if istDasBefehl('Legende:',s,bekannteBefehle,true) then begin
+ if komplex then begin
+ gibAus('Ich kann keine Legende zu komplexen Werten erstellen!',3);
+ aufraeumen;
+ exit;
+ end;
if s[1] in ['0'..'9'] then
i:=strtoint(erstesArgument(s))
else
@@ -4490,7 +4567,7 @@ begin
setLength(bilderThreads,maxThreads);
for i:=0 to length(bilderThreads)-1 do
- bilderThreads[i]:=tBilderThread.create(i,length(bilderThreads),breite,hoehe,lOf,oOf,rOf,uOf,quellen,xMin,xMax,tMin,tMax,xZoom,yZoom,nachbearbeitungen,paletten,@beschriftungen,rahmen);
+ bilderThreads[i]:=tBilderThread.create(i,length(bilderThreads),breite,hoehe,lOf,oOf,rOf,uOf,quellen,xMin,xMax,tMin,tMax,xZoom,yZoom,nachbearbeitungen,paletten,@beschriftungen,rahmen,komplex);
for i:=0 to length(bilderThreads)-1 do begin
gibAus('starte Thread '+intToStr(i)+' ...',1);
bilderThreads[i].suspended:=false;
@@ -5470,7 +5547,7 @@ end;
// tBilderThread ***************************************************************
-constructor tBilderThread.create(i,maxThreads,iBreite,iHoehe,lO,oO,rO,uO: longint; const wes: tWerteArray; xMin,xMax,tMin,tMax: longint; xZoom,yZoom: extended; nachbearbeitungen: tTransformationArray; paletten: pTPalettenArray; beschri: pTBeschriftungen; rm: boolean);
+constructor tBilderThread.create(i,maxThreads,iBreite,iHoehe,lO,oO,rO,uO: longint; const wes: tWerteArray; xMin,xMax,tMin,tMax: longint; xZoom,yZoom: extended; nachbearbeitungen: tTransformationArray; paletten: tPalettenArray; beschri: pTBeschriftungen; rm,kmpl: boolean);
var
ii: longint;
begin
@@ -5494,8 +5571,9 @@ begin
nbs:=nachbearbeitungen;
setLength(pals,length(paletten));
for ii:=0 to length(pals)-1 do
- pals[ii]:=paletten[ii]^.farben;
+ pals[ii]:=paletten[ii];
rahmen:=rm;
+ komplex:=kmpl;
xPMi:=nummer*((gesBreite+lOf+rOf) div mT)-lOf;
if nummer=mT-1 then xPMa:=gesBreite+rOf-1 // der letzte Thread bekommt den Rest
else xPMa:=(nummer+1)*((gesBreite+lOf+rOf) div mT)-lOf-1;
@@ -5559,17 +5637,18 @@ begin
farben[i-xPMi+(j+oOf)*breite].rgbRed:=0;
farben[i-xPMi+(j+oOf)*breite].rgbGreen:=0;
farben[i-xPMi+(j+oOf)*breite].rgbBlue:=0;
- for k:=0 to length(wertes)-1 do begin
- wert:=(wertes[k,i-max(0,xPMi)+j*wBreite]/anzahlens[k,i-max(0,xPMi)+j*wBreite]-ws[k]._minW)/(ws[k]._maxW-ws[k]._minW);
- wert:=max(0,min(wert,1));
- wert:=nbs[k].transformiereWert(wert);
- frb:=wertZuFarbe(wert,pals[k]);
- with farben[i-xPMi+(j+oOf)*breite] do begin // farben startet bei Index 0 + 0*breite
- rgbRed:= rgbRed + frb.rgbRed;
- rgbGreen:=rgbGreen + frb.rgbGreen;
- rgbBlue:= rgbBlue + frb.rgbBlue;
+ for k:=0 to length(wertes)-1 do
+ for b:=false to false do begin
+ wert:=(wertes[k,i-max(0,xPMi)+(j+byte(b)*wHoehe)*wBreite]/anzahlens[k,i-max(0,xPMi)+(j+byte(b)*wHoehe)*wBreite]-ws[k]._minW)/(ws[k]._maxW-ws[k]._minW);
+ wert:=max(0,min(wert,1));
+ wert:=nbs[k].transformiereWert(wert);
+ frb:=pals[k].wertZuFarbe(wert,b);
+ with farben[i-xPMi+(j+oOf)*breite] do begin // farben startet bei Index 0 + 0*breite
+ rgbRed:= rgbRed + frb.rgbRed;
+ rgbGreen:=rgbGreen + frb.rgbGreen;
+ rgbBlue:= rgbBlue + frb.rgbBlue;
+ end;
end;
- end;
end
else begin
farben[i-xPMi+(j+oOf)*breite].rgbRed:=
@@ -6934,22 +7013,21 @@ end;
// sonstiges *******************************************************************
-function findePalette(out palette: pTPalette; name: string): boolean;
+function findePalette(out palette: tPalette; name: string): boolean;
var
i: longint;
begin
result:=true;
- for i:=0 to length(paletten)-1 do
- if paletten[i].name=name then
- begin
- palette:=@(paletten[i]);
- exit;
+ for i:=0 to length(allePaletten)-1 do
+ if allePaletten[i].name=name then begin
+ palette:=allePaletten[i];
+ exit;
end;
palette:=nil;
result:=false;
end;
-function erzeugeLegende(sT: boolean; f: tMyStringList; datei: string; qu: tWerte; minDichte,maxDichte: extended; nB: tTransformation; pal: pTPalette): boolean;
+function erzeugeLegende(sT: boolean; f: tMyStringList; datei: string; qu: tWerte; minDichte,maxDichte: extended; nB: tTransformation; pal: tPalette): boolean;
var
s: string;
breite,hoehe,i,j,k,lO,rO,oO,uO,
@@ -7147,7 +7225,7 @@ begin
wert:=i/length(farben);
if not lineareFarbe then
wert:=nB.transformiereWert(wert);
- farben[i]:=wertZuFarbe(wert,pal^.farben);
+ farben[i]:=pal.wertZuFarbe(wert);
end;
assign(img,datei);
rewrite(img,1);
@@ -7335,15 +7413,15 @@ end;
function neuePalette(f: tMyStringList): boolean;
var
- s,name: string;
- palette: tRGBArray;
- i: longint;
- nPalette: pTPalette;
+ s,name: string;
+ palette,nPalette: tPalette;
+ imPart: boolean;
begin
result:=false;
- setLength(palette,0);
- name:='';
+ palette:=tPalette.create;
nPalette:=nil;
+ name:='';
+ imPart:=false;
repeat
if not f.metaReadln(s,true) then begin
gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
@@ -7355,8 +7433,16 @@ begin
findePalette(nPalette,s);
continue;
end;
- setLength(palette,length(palette)+1);
- if strToTRGB(s,palette[length(palette)-1]) then continue;
+ if startetMit('Imaginärteile:',s) then begin
+ if imPart then begin
+ gibAus('Ich hatte schon Imaginärteile für diese Palette gelesen!',3);
+ exit;
+ end;
+ imPart:=true;
+ continue;
+ end;
+ if palette.neuerWert(s,imPart) then
+ continue;
gibAus(''''+s+''' ist keine Farbe für eine Palette!',3);
exit;
until false;
@@ -7364,19 +7450,21 @@ begin
gibAus('Die Palette braucht einen Namen!',3);
exit;
end;
- if length(palette)<2 then begin
- gibAus('Zu wenige Farben in der Palette '''+name+''', nämlich nur '+intToStr(length(palette)),3);
+ if length(palette.farben[false])<2 then begin
+ gibAus('Zu wenige Farben in der Palette '''+name+''', nämlich nur '+intToStr(length(palette.farben[false])),3);
exit;
end;
if nPalette=nil then begin
- setLength(paletten,length(paletten)+1);
- nPalette:=@(paletten[length(paletten)-1]);
- end;
- nPalette^.name:=name;
- setLength(nPalette^.farben,length(palette));
- for i:=0 to length(palette)-1 do
- nPalette^.farben[i]:=palette[i];
- gibAus('Neue Palette '''+nPalette^.name+''' erstellt!',3);
+ setLength(allePaletten,length(allePaletten)+1);
+ allePaletten[length(allePaletten)-1]:=tPalette.create;
+ nPalette:=allePaletten[length(allePaletten)-1];
+ end
+ else
+ gibAus('Überschreibe bereits vorhandene Palette '''+nPalette.name+'''.',3);
+ nPalette.kopiereVon(palette);
+ nPalette.name:=name;
+ palette.free;
+ gibAus('Neue Palette '''+nPalette.name+''' erstellt!',3);
result:=true;
end;
@@ -7445,57 +7533,69 @@ begin
end;
end;
+var
+ i: longint;
+
begin
fileMode := fmOpenRead;
setLength(externeBefehle,0);
- setLength(paletten,6);
- paletten[0].name:='Graustufen';
- setLength(paletten[0].farben,2);
- paletten[0].farben[0]:=rgb($ff,$ff,$ff);
- paletten[0].farben[1]:=rgb($00,$00,$00);
-
- paletten[1].name:='invertierte Graustufen';
- setLength(paletten[1].farben,2);
- paletten[1].farben[0]:=rgb($00,$00,$00);
- paletten[1].farben[1]:=rgb($ff,$ff,$ff);
-
- paletten[2].name:='Regenbogen';
- setLength(paletten[2].farben,6);
- paletten[2].farben[0]:=rgb($00,$00,$ff);
- paletten[2].farben[1]:=rgb($00,$ff,$ff);
- paletten[2].farben[2]:=rgb($00,$ff,$00);
- paletten[2].farben[3]:=rgb($ff,$ff,$00);
- paletten[2].farben[4]:=rgb($ff,$00,$00);
- paletten[2].farben[5]:=rgb($00,$00,$00);
-
- paletten[3].name:='invertierter Regenbogen';
- setLength(paletten[3].farben,6);
- paletten[3].farben[0]:=rgb($00,$00,$00);
- paletten[3].farben[1]:=rgb($ff,$00,$00);
- paletten[3].farben[2]:=rgb($ff,$ff,$00);
- paletten[3].farben[3]:=rgb($00,$ff,$00);
- paletten[3].farben[4]:=rgb($00,$ff,$ff);
- paletten[3].farben[5]:=rgb($00,$00,$ff);
-
- paletten[4].name:='Jet-Regenbogen';
- setLength(paletten[4].farben,5);
- paletten[4].farben[0]:=rgb($ff,$00,$00);
- paletten[4].farben[1]:=rgb($ff,$ff,$00);
- paletten[4].farben[2]:=rgb($00,$ff,$00);
- paletten[4].farben[3]:=rgb($00,$ff,$ff);
- paletten[4].farben[4]:=rgb($00,$00,$ff);
-
- paletten[5].name:='erweiterter Regenbogen';
- setLength(paletten[5].farben,8);
- paletten[5].farben[0]:=rgb($ff,$ff,$ff);
- paletten[5].farben[1]:=rgb($00,$00,$ff);
- paletten[5].farben[2]:=rgb($00,$ff,$ff);
- paletten[5].farben[3]:=rgb($00,$ff,$00);
- paletten[5].farben[4]:=rgb($ff,$ff,$00);
- paletten[5].farben[5]:=rgb($ff,$00,$00);
- paletten[5].farben[6]:=rgb($ff,$00,$ff);
- paletten[5].farben[7]:=rgb($00,$00,$00);
+ setLength(allePaletten,8);
+ for i:=0 to length(allePaletten)-1 do
+ allePaletten[i]:=tPalette.create;
+
+ allePaletten[0].name:='Graustufen';
+ allePaletten[0].neuerWert(rgb($ff,$ff,$ff),false);
+ allePaletten[0].neuerWert(rgb($00,$00,$00),false);
+
+ allePaletten[1].name:='invertierte Graustufen';
+ allePaletten[1].neuerWert(rgb($00,$00,$00),false);
+ allePaletten[1].neuerWert(rgb($ff,$ff,$ff),false);
+
+ allePaletten[2].name:='Regenbogen';
+ allePaletten[2].neuerWert(rgb($00,$00,$ff),false);
+ allePaletten[2].neuerWert(rgb($00,$ff,$ff),false);
+ allePaletten[2].neuerWert(rgb($00,$ff,$00),false);
+ allePaletten[2].neuerWert(rgb($ff,$ff,$00),false);
+ allePaletten[2].neuerWert(rgb($ff,$00,$00),false);
+ allePaletten[2].neuerWert(rgb($00,$00,$00),false);
+
+ allePaletten[3].name:='invertierter Regenbogen';
+ allePaletten[3].neuerWert(rgb($00,$00,$00),false);
+ allePaletten[3].neuerWert(rgb($ff,$00,$00),false);
+ allePaletten[3].neuerWert(rgb($ff,$ff,$00),false);
+ allePaletten[3].neuerWert(rgb($00,$ff,$00),false);
+ allePaletten[3].neuerWert(rgb($00,$ff,$ff),false);
+ allePaletten[3].neuerWert(rgb($00,$00,$ff),false);
+
+ allePaletten[4].name:='Jet-Regenbogen';
+ allePaletten[4].neuerWert(rgb($ff,$00,$00),false);
+ allePaletten[4].neuerWert(rgb($ff,$ff,$00),false);
+ allePaletten[4].neuerWert(rgb($00,$ff,$00),false);
+ allePaletten[4].neuerWert(rgb($00,$ff,$ff),false);
+ allePaletten[4].neuerWert(rgb($00,$00,$ff),false);
+
+ allePaletten[5].name:='erweiterter Regenbogen';
+ allePaletten[5].neuerWert(rgb($ff,$ff,$ff),false);
+ allePaletten[5].neuerWert(rgb($00,$00,$ff),false);
+ allePaletten[5].neuerWert(rgb($00,$ff,$ff),false);
+ allePaletten[5].neuerWert(rgb($00,$ff,$00),false);
+ allePaletten[5].neuerWert(rgb($ff,$ff,$00),false);
+ allePaletten[5].neuerWert(rgb($ff,$00,$00),false);
+ allePaletten[5].neuerWert(rgb($ff,$00,$ff),false);
+ allePaletten[5].neuerWert(rgb($00,$00,$00),false);
+
+ allePaletten[6].name:='komplexer Martin';
+ allePaletten[6].neuerWert(rgb($00,$00,$ff),false);
+ allePaletten[6].neuerWert(rgb($ff,$00,$00),false);
+ allePaletten[6].neuerWert(rgb($00,$ff,$00),true);
+ allePaletten[6].neuerWert(rgb($00,$00,$00),true);
+
+ allePaletten[6].name:='invertierter komplexer Martin';
+ allePaletten[7].neuerWert(rgb($ff,$ff,$00),false);
+ allePaletten[7].neuerWert(rgb($00,$ff,$ff),false);
+ allePaletten[7].neuerWert(rgb($ff,$00,$ff),true);
+ allePaletten[7].neuerWert(rgb($ff,$ff,$ff),true);
end.