summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-03-15 11:30:54 +0100
committerErich Eckner <git@eckner.net>2016-03-15 11:31:35 +0100
commitb5a66667e459f3b1c8e6b5b3226ab885429b289b (patch)
tree5add0e9bb77d3b2289fecb2ab88f4951d5b77c07
parentf8c67d5ff033fdd9f104d82bed1d7e3ed9b214ce (diff)
downloadepost-b5a66667e459f3b1c8e6b5b3226ab885429b289b.tar.xz
tKontur aufgeräumt, Farbkonversion ausgelagert
-rw-r--r--epostunit.pas212
1 files changed, 122 insertions, 90 deletions
diff --git a/epostunit.pas b/epostunit.pas
index 94af43d..2863e15 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -64,7 +64,6 @@ type
function sortiere_nach_y(mt,von,bis: longint): boolean; overload;
function exprtofloat(st: boolean; s: string; kvs: tKnownValues): extended;
public
- farbe: tRGB;
orte: tExtPointArray;
function init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean;
function liesVonDatei(st: boolean; s: string; xmi,xma,tmi,tma: extended): boolean;
@@ -179,6 +178,14 @@ type
schritte: longint;
linear: boolean;
end;
+ tZuZeichnendeKontur = class
+ farbe: tRGB;
+ deckKraft,dicke: extended;
+ kontur: tKontur;
+ constructor create; overload;
+ constructor create(original: tZuZeichnendeKontur; kont: tKontur); overload;
+ destructor destroy; override;
+ end;
tLogThread = class(tThread)
private
_fertig: boolean;
@@ -232,6 +239,7 @@ type
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);
destructor destroy; override;
procedure stExecute; override;
+ procedure initAnzahlensFuerKontur;
end;
tDichteThread = class(tLogThread)
maxDichte,minDichte: extended;
@@ -3162,7 +3170,7 @@ var
s,datei: string;
i,j,k,schriftgroesze: longint;
xzoom,yzoom,wert,schritt,miw,maw,Zeit,
- xp0,tp0,konturDicke: extended;
+ xp0,tp0: extended;
xmin,xmax,tmin,tmax,xp,tp,
breite,hoehe,lof,rof,oof,uof: longint;
Paletten: pTPalettenArray;
@@ -3174,8 +3182,8 @@ var
Achsen: array of TAchse;
fontRenderer: tFontRenderer;
beschriftungen: array of tBeschriftung;
- verwKonturen: tLongintArray;
- konturDicken: tExtendedArray;
+ verwKonturen: array of tZuZeichnendeKontur;
+ musterKontur: tZuZeichnendeKontur;
quellen: tWerteArray;
procedure aufraeumen;
@@ -3198,6 +3206,10 @@ begin
setlength(Achsen,0);
if assigned(fontRenderer) then
fontRenderer.free;
+ for ii:=0 to length(verwKonturen)-1 do
+ verwKonturen[ii].free;
+ setlength(verwKonturen,0);
+ musterKontur.free;
end;
begin
@@ -3213,7 +3225,6 @@ begin
tmin:=0;
tmax:=_tsiz-1;
schriftgroesze:=24;
- konturDicke:=1;
setlength(quellen,1);
quellen[0]:=self;
setlength(Nachbearbeitungen,1);
@@ -3222,7 +3233,7 @@ begin
findePalette(Paletten[0],'Graustufen');
setlength(Achsen,0);
setlength(verwKonturen,0);
- setlength(konturDicken,0);
+ musterKontur:=tZuZeichnendeKontur.create;
setlength(beschriftungen,0);
setlength(BilderThreads,0);
Ausschnitt:=nil;
@@ -3343,22 +3354,38 @@ begin
Achsen[length(Achsen)-1].Striche:=strtoint(s);
continue;
end;
- if startetMit('Konturdicke:',s) then begin
- konturDicke:=exprToFloat(st,s);
- continue;
- end;
- if startetMit('Kontur:',s) then begin
- while length(s)>0 do begin
- setlength(verwKonturen,length(verwKonturen)+1);
- setlength(konturDicken,length(konturDicken)+1);
- verwKonturen[length(verwKonturen)-1]:=findeKontur(erstesArgument(s),nil,Wertes,Konturen,false);
- if (verwKonturen[length(verwKonturen)-1]<0) or (verwKonturen[length(verwKonturen)-1]>=length(Konturen^)) then begin
- gibAus('Die Kontur gibt es nicht!',3);
- aufraeumen;
+ if s='Konturen:' then begin
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
exit;
end;
- konturDicken[length(konturDicken)-1]:=konturDicke;
- end;
+ if s='Ende' then
+ break;
+ if startetMit('Dicke:',s) then begin
+ musterKontur.dicke:=exprToFloat(st,s);
+ continue;
+ end;
+ if startetMit('Deckkraft:',s) then begin
+ musterKontur.deckKraft:=exprToFloat(st,s);
+ continue;
+ end;
+ if startetMit('Farbe:',s) then begin
+ if strToTRGB(s,musterKontur.farbe) then continue;
+ gibAus(''''+s+''' ist keine gültige Farbe!',3);
+ exit;
+ end;
+ while s<>'' do begin
+ setlength(verwKonturen,length(verwKonturen)+1);
+ i:=findeKontur(erstesArgument(s),nil,Wertes,Konturen,false);
+ if (i<0) or (i>=length(Konturen^)) then begin
+ gibAus('Die Kontur gibt es nicht!',3);
+ aufraeumen;
+ exit;
+ end;
+ verwKonturen[length(verwKonturen)-1]:=tZuZeichnendeKontur.create(musterKontur,Konturen^[i]);
+ end;
+ until false;
continue;
end;
if startetMit('Daten:',s) then begin
@@ -3503,21 +3530,31 @@ begin
fertig:=fertig and Bilderthreads[i].fertig;
until fertig;
gibAus('Alle Threads beendet, Konturen einfügen ...',1);
- for i:=0 to length(verwKonturen)-1 do
- for j:=0 to length(konturen^[verwKonturen[i]].orte)-1 do begin
- xp0:=(kont2diskFak('x',konturen^[verwKonturen[i]].orte[j]['x'])-xmin)*xzoom;
- tp0:=(kont2diskFak('t',konturen^[verwKonturen[i]].orte[j]['y'])-tmin)*yzoom;
-
- for xp:=ceil(xp0-konturDicken[i]/2) to floor(xp0+konturDicken[i]/2) do
- for tp:=ceil(tp0-konturDicken[i]/2) to floor(tp0+konturDicken[i]/2) do
- if (0<=xp) and (xp<=Breite) and (0<=tp) and (tp<=Hoehe) and (sqr(xp-xp0)+sqr(tp-tp0)<=sqr(konturDicken[i]/2)) then begin
+ for i:=0 to length(verwKonturen)-1 do begin
+ for j:=0 to length(BilderThreads)-1 do
+ bilderThreads[j].initAnzahlensFuerKontur;
+ for j:=0 to length(verwKonturen[i].kontur.orte)-1 do begin
+ xp0:=(kont2diskFak('x',verwKonturen[i].kontur.orte[j]['x'])-xmin)*xzoom;
+ tp0:=(kont2diskFak('t',verwKonturen[i].kontur.orte[j]['y'])-tmin)*yzoom;
+
+ for xp:=ceil(xp0-verwKonturen[i].dicke/2) to floor(xp0+verwKonturen[i].dicke/2) do
+ for tp:=ceil(tp0-verwKonturen[i].dicke/2) to floor(tp0+verwKonturen[i].dicke/2) do
+ if (0<=xp) and (xp<Breite) and (0<=tp) and (tp<Hoehe) and (sqr(xp-xp0)+sqr(tp-tp0)<=sqr(verwKonturen[i].dicke/2)) then begin
k:=0;
while (k<length(Bilderthreads)-1) and (xp>=Bilderthreads[k+1].xpmi) do
inc(k);
- Bilderthreads[k].farben[(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi]:=
- konturen^[verwKonturen[i]].farbe;
+ if Bilderthreads[k].anzahlens[0,(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi] = 0 then begin
+ Bilderthreads[k].anzahlens[0,(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi]:=1;
+ Bilderthreads[k].farben[(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi]:=
+ mischeFarben(
+ Bilderthreads[k].farben[(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi],
+ verwKonturen[i].farbe,
+ verwKonturen[i].deckKraft
+ );
+ end;
end;
end;
+ end;
gibAus('fertig, speichere Bild ...',1);
assign(img,datei);
rewrite(img,1);
@@ -3909,6 +3946,32 @@ begin
end;
end;
+// tZuZeichnendeKontur *********************************************************
+
+constructor tZuZeichnendeKontur.create;
+begin
+ inherited create;
+ farbe:=rgb($00,$00,$00);
+ deckKraft:=1;
+ dicke:=1;
+ kontur:=nil;
+end;
+
+constructor tZuZeichnendeKontur.create(original: tZuZeichnendeKontur; kont: tKontur);
+begin
+ inherited create;
+ farbe:=original.farbe;
+ deckKraft:=original.deckKraft;
+ dicke:=original.dicke;
+ kontur:=kont;
+end;
+
+destructor tZuZeichnendeKontur.destroy;
+begin
+ kontur:=nil;
+ inherited destroy;
+end;
+
// tLogThread ******************************************************************
constructor tLogThread.create;
@@ -4588,6 +4651,18 @@ begin
fertig:=true;
end;
+procedure tBilderThread.initAnzahlensFuerKontur;
+var
+ ii: longint;
+begin
+ for ii:=1 to length(anzahlens)-1 do
+ setlength(anzahlens[ii],0);
+ setlength(anzahlens,1);
+ setlength(anzahlens[0],length(farben));
+ for ii:=0 to length(anzahlens[0])-1 do
+ anzahlens[0,ii]:=0;
+end;
+
// tDichteThread ***************************************************************
constructor tDichteThread.create(xmi,xma,tmi,tma: longint; const werte: tWerte);
@@ -4881,9 +4956,6 @@ end;
constructor tKontur.create(Kont: pTKonturenArray; wert: pTWerteArray);
begin
inherited create(Kont,wert);
- farbe.rgbRed:=$00;
- farbe.rgbGreen:=$00;
- farbe.rgbBlue:=$00;
setlength(orte,0);
bezeichner:='';
end;
@@ -4954,7 +5026,7 @@ end;
function tKontur.init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean;
var
s,xmi,xma,tmi,tma,dx,dt: string;
- i,j,k,tmpi: longint;
+ i,j,k: longint;
begin
result:=false;
gibAus('Kontur erzeugen ...',1);
@@ -4969,23 +5041,6 @@ begin
gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
exit;
end;
- if startetMit('Farbe:',s) then begin
- if length(s)=6 then begin
- tmpi:=0;
- for i:=1 to 6 do
- tmpi:=
- (tmpi shl 4) or
- (ord(s[i])-ord('0')
- - byte(s[i] in ['a'..'f'])*(ord('a')-ord('0')-10)
- - byte(s[i] in ['A'..'F'])*(ord('A')-ord('0')-10));
- end
- else
- tmpi:=strtoint(copy(s,1,pos(' ',s)-1));
- farbe.rgbRed:= (tmpi and $ff0000) shr 16;
- farbe.rgbGreen:=(tmpi and $ff00) shr 8;
- farbe.rgbBlue:= tmpi and $ff;
- continue;
- end;
if startetMit('Datei:',s) then begin
if length(orte)>0 then begin
gibAus('Diese Kontur hat schon Werte!',3);
@@ -5872,24 +5927,13 @@ begin
end;
if s='Ende' then
break;
- if not ((pos('linear',s)=1) or (pos('logarithmisch',s)=1) or (length(beschriftungsschritte)>1)) then begin
- gibAus('Ich weiß nicht, ob die Beschriftung linear oder logarithmisch sein soll!',3);
- exit;
- end;
setlength(beschriftungsschritte,length(beschriftungsschritte)+1);
- if not ((pos('linear',s)=1) or (pos('logarithmisch',s)=1)) then begin
- beschriftungsschritte[length(beschriftungsschritte)-1].linear:=
- beschriftungsschritte[length(beschriftungsschritte)-2].linear;
- end;
if startetMit('linear',s) then
- beschriftungsschritte[length(beschriftungsschritte)-1].linear:=true;
- if startetMit('logarithmisch',s) then begin
+ beschriftungsschritte[length(beschriftungsschritte)-1].linear:=true
+ else if startetMit('logarithmisch',s) then begin
beschriftungsschritte[length(beschriftungsschritte)-1].linear:=false;
- while pos(' ',s)=1 do
- delete(s,1,1);
- minDichte:=Qu.exprtofloat(st,copy(s,1,pos(' ',s)-1));
+ minDichte:=Qu.exprtofloat(st,erstesArgument(s));
beschriftungsschritte[0].bis:=maxDichte*minDichte;
- delete(s,1,pos(' ',s));
tmpTr:=nb;
while assigned(tmpTr) do begin
if tmpTr is tWerteLogTransformation then begin
@@ -5902,8 +5946,14 @@ begin
end;
tmpTr:=tmpTr.beliebigerVorgaenger;
end;
+ end
+ else if length(beschriftungsschritte)>2 then
+ beschriftungsschritte[length(beschriftungsschritte)-1].linear:=
+ beschriftungsschritte[length(beschriftungsschritte)-2].linear
+ else begin
+ gibAus('Ich weiß nicht, ob die Beschriftung linear oder logarithmisch sein soll!',3);
+ exit;
end;
- s:=trim(s);
beschriftungsschritte[length(beschriftungsschritte)-1].bis:=Qu.exprtofloat(st,erstesArgument(s));
if endetMit('+',s) then beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=0.5
else if endetMit('-',s) then beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=2
@@ -6196,10 +6246,10 @@ end;
function neuePalette(var f: tMyStringlist): boolean;
var
- s,name: string;
- Palette: tRGBArray;
- i,tmpi: longint;
- nPalette: pTPalette;
+ s,name: string;
+ Palette: tRGBArray;
+ i: longint;
+ nPalette: pTPalette;
begin
result:=false;
setlength(Palette,0);
@@ -6216,26 +6266,8 @@ begin
findePalette(nPalette,s);
continue;
end;
- if (length(s)=6) and (s[1] in ['0'..'9','a'..'f']) and
- (s[2] in ['0'..'9','a'..'f']) and
- (s[3] in ['0'..'9','a'..'f']) and
- (s[4] in ['0'..'9','a'..'f']) and
- (s[5] in ['0'..'9','a'..'f']) and
- (s[6] in ['0'..'9','a'..'f']) then begin
- setlength(Palette,length(Palette)+1);
- tmpi:=0;
- for i:=1 to 6 do begin
- tmpi:=tmpi shl 4;
- if s[i] in ['0'..'9'] then
- tmpi:=tmpi + ord(s[i])-ord('0')
- else
- tmpi:=tmpi + ord(s[i])-ord('a')+10;
- end;
- Palette[length(Palette)-1].rgbRed:= tmpi and $0000ff;
- Palette[length(Palette)-1].rgbGreen:=(tmpi and $00ff00) shr 8;
- Palette[length(Palette)-1].rgbBlue:= (tmpi and $ff0000) shr 16;
- continue;
- end;
+ setlength(Palette,length(Palette)+1);
+ if strToTRGB(s,Palette[length(Palette)-1]) then continue;
gibAus(''''+s+''' ist keine Farbe für eine Palette!',3);
exit;
until false;