From b5a66667e459f3b1c8e6b5b3226ab885429b289b Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Tue, 15 Mar 2016 11:30:54 +0100 Subject: tKontur aufgeräumt, Farbkonversion ausgelagert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epostunit.pas | 212 +++++++++++++++++++++++++++++++++------------------------- 1 file 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=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; -- cgit v1.2.3-70-g09d2