diff options
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 300 |
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. |