~ubuntu-branches/ubuntu/natty/mricron/natty

« back to all changes in this revision

Viewing changes to nifti_img_view.pas

  • Committer: Bazaar Package Importer
  • Author(s): Michael Hanke
  • Date: 2010-11-08 07:55:47 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20101108075547-g99ufaelkf17kiss
Tags: 0.20101102.1~dfsg.1-1
* New upstream code.
* Changed get-orig-src to get-orig-source target in debian/rules for policy
  compliance.
* Added patch for compatibility with Lazarus version in Debian.
* Added patch for Ubuntu lucid backports that can be automatically applied
  by backport-dsc.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
unit nifti_img_view;
2
2
 
3
3
interface
4
 
 
 
4
{$IFNDEF ENDIAN_BIG}
5
5
{$DEFINE COMPILEYOKE}
6
 
 
 
6
{$ENDIF}
7
7
uses
8
8
{$H+}
9
9
{$IFDEF Darwin}CarbonOpenDoc,{$ENDIF}
13
13
  Windows,ShellAPI,
14
14
{$ENDIF}
15
15
{$IFDEF COMPILEYOKE}
16
 
yokeipc,
 
16
yokesharemem,
17
17
{$ENDIF}
18
18
 
19
19
LResources, fx8, cpucount, SysUtils, Classes, Graphics, Controls, Forms,
20
20
Dialogs, Menus, ComCtrls, ExtCtrls, StdCtrls, GraphicsMathLibrary, ClipBrd,
21
21
define_types, Spin, Buttons, nifti_hdr, nifti_hdr_view, nifti_img, voismooth,
22
 
IniFiles, ReadInt, registry, simpleipc, stat, Distr, bet, mni, prefs, CropEdges,
 
22
IniFiles, ReadInt, registry,  stat, Distr, bet, mni, prefs, CropEdges,
23
23
userdir, graphx, GraphType, IntfGraphics, landmarks;
24
24
 
25
 
{$IFDEF COMPILEYOKE}
26
 
{type
27
 
  PINtBuffer = ^TIntBuffer;
28
 
  TIntBuffer = Array[0..6] of single;}
29
 
{$ENDIF}
 
25
 
30
26
type
31
27
 
32
28
  { TImgForm }
86
82
        Pen1: TMenuItem;
87
83
        Penautoclose1: TMenuItem;
88
84
        CircleSquare1: TMenuItem;
89
 
SimpleIPCClient1: TSimpleIPCClient;
90
 
SimpleIPCServer1: TSimpleIPCServer;
91
85
        YokeTimer: TTimer;
92
86
        XViewEdit: TSpinEdit;
93
87
        YViewEdit: TSpinEdit;
223
217
procedure Resliceimage1Click(Sender: TObject);
224
218
procedure SaveasNIfTI1Click(Sender: TObject);
225
219
procedure SaveDialog1Close(Sender: TObject);
226
 
procedure SimpleIPCServer1Message(Sender: TObject);
227
220
procedure UpdateColorSchemes;
228
221
        procedure UpdateTemplates;
229
222
        procedure UpdateMRU;
335
328
        procedure SaveOrCopyImages(lCopy: boolean);
336
329
 private
337
330
        { Private declarations }
338
 
{$IFDEF COMPILEYOKE}
339
 
 //   gShareIntBuf: PIntBuffer;
340
 
{$ENDIF}
 
331
 
341
332
{$IFDEF FPC} function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;MousePos: TPoint): Boolean; override;{$ENDIF}
342
333
  public
343
334
        { Public declarations }
438
429
procedure TImgForm.CloseShareMem;
439
430
begin
440
431
{$IFDEF COMPILEYOKE}
441
 
  SimpleIPCServer1.active := false;
442
 
  SimpleIPCClient1.active := false;
 
432
YokeTimer.Enabled := false;
 
433
  CloseSharedMem;
443
434
{$ENDIF}
444
435
end;
445
436
 
448
439
{$IFDEF COMPILEYOKE}
449
440
  if not gYoke then
450
441
         exit;
451
 
        SendIPCFloats(SimpleIPCClient1,lXmm,lYmm,lZmm);
 
442
  SetShareFloats(lXmm,lYmm,lZmm);
 
443
 
452
444
{$ENDIF}
453
445
end;
454
446
 
455
447
procedure TImgForm.CreateShareMem;
456
448
begin
457
449
     {$IFDEF COMPILEYOKE}
458
 
             startipcserver(SimpleIPCServer1,SimpleIPCClient1);
459
 
             SetShareMem (0,0,0);
 
450
          CreateSharedMem(self);
 
451
          SetShareMem (0,0,0);
 
452
          YokeTimer.Enabled := gYoke;
460
453
     {$ENDIF}
461
454
end;
462
455
 
463
456
procedure TImgForm.YokeTimerTimer(Sender: TObject);
 
457
var
 
458
   lX,lY,lZ: integer;
 
459
   lXmm,lYmm,lZmm: single;
464
460
begin
465
461
  if not gYoke then
466
462
     YokeTimer.Enabled := false;
467
 
  {$IFDEF UNIX}
468
 
      if SimpleIPCServer1.Active then SimpleIPCServer1.PeekMessage(1,true);
 
463
  {$IFDEF COMPILEYOKE}
 
464
  //labelx.caption := inttostr(random(888));
 
465
  if not gYoke then
 
466
     exit;
 
467
  //LabelX.caption := inttostr(random(888));
 
468
  if not GetShareFloats(lXmm,lYmm,lZmm) then
 
469
     exit;
 
470
  //LabelY.caption := inttostr(random(888));
 
471
  MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm);
 
472
  if lX <> XViewEdit.value then XViewEdit.value := lX;
 
473
  if lY <> YViewEdit.value then YViewEdit.value := lY;
 
474
  if lZ <> ZViewEdit.value then ZViewEdit.value := lZ;
 
475
  XViewEditChange(nil);
 
476
 
469
477
  {$ENDIF}
470
478
end;
471
479
 
668
676
  gBGImg.ResliceOnLoad := IniBool(lIniFile,'Reslice',gBGImg.ResliceOnLoad);
669
677
  gBGImg.OrthoReslice := IniBool(lIniFile,'ResliceOrtho',gBGImg.OrthoReslice);
670
678
  gBGImg.ThinPen := IniBool(lIniFile, 'ThinPen',True);
671
 
  ToolPanel.Visible := IniBool(lIniFile, 'ShowDraw',False);
 
679
  ToolPanel.Visible := IniBool(lIniFile, 'ShowDraw',True);
672
680
  DrawMenu.Visible := ToolPanel.visible;
673
681
  if IniBool(lIniFile,'Smooth2D',Menu2DSmooth.checked) then
674
682
     gBGImg.StretchQuality := sqHigh
1108
1116
        SaveAsVOIorNIFTI(gMRIcroOverlay[lLayer].ImgBuffer,gMRIcroOverlay[lLayer].ImgBufferItems,gMRIcroOverlay[lLayer].ImgBufferBPP,1,false,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[lLayer].HdrFilename);
1109
1117
end;
1110
1118
 
1111
 
 
1112
1119
procedure ApplySaveDlgFilter (lSaveDlg: TSaveDialog);
1113
1120
var
1114
1121
   lLen,lPos,lPipes,lPipesReq: integer;
1115
 
   lExt: string;
 
1122
   lExt,lName: string;
1116
1123
begin
1117
1124
     lPipesReq := (lSaveDlg.FilterIndex * 2)-1;
1118
1125
     if lPipesReq < 1 then exit;
1119
1126
     lLen := length(lSaveDlg.Filter);
1120
1127
     lPos := 1;
1121
1128
     lPipes := 0;
1122
 
     //Median(DeltaF, 1, N_inc) / LN2
1123
1129
     while (lPos < lLen) and (lPipes < lPipesReq) do begin
1124
1130
           if lSaveDlg.Filter[lPos] = '|' then
1125
1131
              inc(lPipes);
1133
1139
              lExt := lExt + lSaveDlg.Filter[lPos];
1134
1140
           inc(lPos);
1135
1141
     end;
 
1142
     lName :=  lSaveDlg.Filename;
1136
1143
     if lExt <> '' then
1137
 
        lSaveDlg.Filename := ChangeFileExt(lSaveDlg.Filename,lExt);
 
1144
        lSaveDlg.Filename := ChangeFileExtX(lName,lExt);
1138
1145
end;
1139
1146
 
 
1147
 
 
1148
 
1140
1149
procedure TImgForm.SaveDialog1Close(Sender: TObject);
1141
1150
begin
1142
1151
  ApplySaveDlgFilter(SaveDialog1);
1143
1152
end;
1144
1153
 
1145
 
procedure TImgForm.SimpleIPCServer1Message(Sender: TObject);
1146
 
var
1147
 
   lX,lY,lZ: integer;
1148
 
   lXmm,lYmm,lZmm: single;
1149
 
begin
1150
 
  if not gYoke then
1151
 
     exit;
1152
 
  if not GetIPCFloats(SimpleIPCServer1.StringMessage, lXmm,lYmm,lZmm) then
1153
 
     exit;
1154
 
  MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm);
1155
 
  if lX <> XViewEdit.value then XViewEdit.value := lX;
1156
 
  if lY <> YViewEdit.value then YViewEdit.value := lY;
1157
 
  if lZ <> ZViewEdit.value then ZViewEdit.value := lZ;
1158
 
  XViewEditChange(nil);
1159
 
    {$IFDEF UNIX}
1160
 
      if SimpleIPCServer1.Active then SimpleIPCServer1.PeekMessage(1,true);
1161
 
  {$ENDIF}
1162
 
end;
1163
1154
 
1164
1155
procedure Add2MRU (var lNewFilename: string); //add new file to most-recent list
1165
1156
var
1279
1270
         //if (ssShift in KeyDataToShiftState(vk_Shift)) then begin
1280
1271
         //    if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,not gBGImg.ResliceOnLoad,false) then exit
1281
1272
         //end else
 
1273
         if (ssCtrl in KeyDataToShiftState(vk_Shift)) and (gBGIMg.OrthoReslice) then begin
 
1274
          gBGIMg.OrthoReslice := false;
 
1275
          OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,false,false);
 
1276
          gBGIMg.OrthoReslice := true;
 
1277
         end else if (ssShift in KeyDataToShiftState(vk_Shift)) then begin
 
1278
          if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,not gBGImg.ResliceOnLoad,false) then exit
 
1279
         end else
1282
1280
             if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,gBGImg.ResliceOnLoad,false) then exit;
1283
1281
 
1284
1282
     XViewEdit.MaxValue := gBGImg.ScrnDim[1];//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1];
2435
2433
 
2436
2434
end;
2437
2435
 
2438
 
procedure DescribeVOIonLabels (lOverlayNum: integer; lShowFilename: boolean);
 
2436
(*procedure DescribeVOIonLabelsz (lOverlayNum: integer; lShowFilename: boolean);
2439
2437
var
2440
2438
   lLocalMax,lLocalSum : HistoDoubleRA;
2441
2439
   l16Buf : SmallIntP;
2523
2521
         end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
2524
2522
                        TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
2525
2523
     end; //for each row
 
2524
end;     *)
 
2525
procedure DescribeVOIonLabels (lOverlayNum: integer; lShowFilename: boolean);
 
2526
var
 
2527
   lLocalMax,lLocalSum : HistoDoubleRA;
 
2528
   l16Buf : SmallIntP;
 
2529
   l32Buf : SingleP;
 
2530
   l8Buf: byteP;
 
2531
   lInten: double;
 
2532
   lXmm,lYmm,lZmm: single;
 
2533
   lHisto,lRegionVol,lLocalMaxPos: HistoRA;
 
2534
   lInc,lRegion: Integer;
 
2535
   lLabelStr: string;
 
2536
   lVOI: boolean;
 
2537
   lLabelStr50 : Array[0..kHistoBins] of kstr50;
 
2538
begin
 
2539
     lInten := 0;//just to hide compiler hint...
 
2540
     (*if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) and ('ratlas.nii.gz' = (extractfilename( gMRIcroOverlay[kBGOverlayNum].HdrFileName))) then begin
 
2541
        DescribeVOIonLabelsRAT(lOverlayNum,lShowFilename);
 
2542
        exit;
 
2543
     end; *)
 
2544
     if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then
 
2545
        exit;
 
2546
     TextForm.MemoT.Lines.add(' Custom Region Analysis');
 
2547
     TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label');
 
2548
     lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName);
 
2549
     if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then
 
2550
        lVOI := true;
 
2551
     //next describe format
 
2552
     if lShowfilename then
 
2553
        lLabelStr := kTextSep+'Filename'+kTextSep
 
2554
     else
 
2555
         lLabelStr := kTextSep;
 
2556
     if lVOI then //intensity min/max position are not important
 
2557
        TextForm.MemoT.Lines.add(lLabelStr+'Index'+kTextSep+'Area'+kTextSep+'N>0'+kTextSep+'%N>0')
 
2558
     else
 
2559
         TextForm.MemoT.Lines.add(lLabelStr+'Index'+kTextSep+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ');
 
2560
   //next initialize
 
2561
   if lShowFilename then begin
 
2562
       if gMRIcroOverlay[lOverlayNum].HdrFileName = '' then
 
2563
               lLabelStr := 'VOI'+kTextSep
 
2564
       else
 
2565
           lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+kTextSep;
 
2566
   end else
 
2567
       lLabelStr := '';
 
2568
     for lInc := 0 to kHistoBins do begin
 
2569
         lHisto[lInc] := 0;
 
2570
         lLocalMax[lInc] := 0;
 
2571
         lLocalSum[lInc] := 0;
 
2572
         lRegionVol[lInc] := 0;
 
2573
         if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) then
 
2574
            lLabelStr50[lInc] := inttostr(lInc)+kTextSep+gBGImg.LabelStr20[lInc]
 
2575
         else
 
2576
             lLabelStr50[lInc] := inttostr(lInc)+kTextSep+realtostr(Scrn2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lInc),2);
 
2577
     end;
 
2578
      for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do
 
2579
         if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then
 
2580
            inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]]);
 
2581
     //local max start
 
2582
     l32Buf := SingleP(gMRIcroOverlay[lOverlayNum].ImgBuffer );
 
2583
     l16Buf := SmallIntP(gMRIcroOverlay[lOverlayNum].ImgBuffer );
 
2584
     //NEXT if..else July07 - ROIs only use screen buffer, not imgbuffer...
 
2585
     if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[lOverlayNum].ImgBufferItems then
 
2586
        l8Buf := gMRIcroOverlay[lOverlayNum].ImgBuffer
 
2587
     else
 
2588
         l8Buf := gMRIcroOverlay[lOverlayNum].ScrnBuffer;
 
2589
     for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin
 
2590
         if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP  = 4) then
 
2591
           lInten := l32Buf^[lInc]
 
2592
         else if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP  = 2) then
 
2593
              lInten := l16Buf^[lInc]
 
2594
         else if gMRIcroOverlay[lOverlayNum].ImgBufferBPP  = 1 then
 
2595
                  lInten := l8Buf^[lInc];//July07
 
2596
         lRegion := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc];
 
2597
         if lInten > 0 then
 
2598
            lLocalSum[lRegion] := lLocalSum[lRegion]+lInten;
 
2599
         if  lInten > lLocalMax[lRegion] then begin
 
2600
             lLocalMax[lRegion] := lInten;//intensity
 
2601
             lLocalMaxPos[lRegion] := lInc;//location
 
2602
         end;
 
2603
         inc(lRegionVol[lRegion]);
 
2604
     end;
 
2605
     for lInc := 0 to kHistoBins do  begin
 
2606
         if (not lVOI) and (lLocalMax[lInc] > 0) then begin
 
2607
            lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]);
 
2608
            lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]);
 
2609
            ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm);
 
2610
            TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr50[lInc] +kTextSep + inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])
 
2611
               +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
 
2612
               +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) );
 
2613
         end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
 
2614
                        TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr50[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
 
2615
     end; //for each row
2526
2616
end;
2527
2617
 
 
2618
 
2528
2619
procedure ShowDescriptive (lOverlayNum: integer; lShowFilename: boolean);
2529
2620
var
2530
2621
        lROIVol: array [1..3] of integer;
3820
3911
  end;
3821
3912
end;
3822
3913
 
3823
 
procedure DescribeVOIonLabels (lOverlayNum: integer);
 
3914
procedure DescribeVOIonLabelsX (lOverlayNum: integer);
3824
3915
var
3825
3916
   lShowfilename: boolean = true;
3826
3917
   lLocalMax,lLocalSum : HistoDoubleRA;
3899
3990
         end;
3900
3991
         inc(lRegionVol[lRegion]);
3901
3992
     end;
 
3993
 
3902
3994
     for lInc := 0 to kHistoBins do  begin
3903
3995
         if (not lVOI) and (lLocalMax[lInc] > 0) then begin
3904
3996
            lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]);
3908
4000
               +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
3909
4001
               +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) );
3910
4002
         end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
3911
 
                        TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] + kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
 
4003
                        TextForm.MemoT.Lines.Add({lLabelStr+ lLabelStr20[lInc]}gBGImg.LabelStr20[lInc] + kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
3912
4004
     end; //for each row
3913
4005
end;
3914
4006
 
3932
4024
                        TextForm.Memo1.Lines.Add( gBGImg.LabelStr20[lInc] + ', ' + inttostr(lHisto[lInc]) );
3933
4025
 
3934
4026
        end;
3935
 
end;   *)
 
4027
end;*)
3936
4028
 
3937
4029
procedure TImgForm.DescriptiveMenuItemClick(Sender: TObject);
3938
4030
var
4015
4107
                TextForm.MemoT.Lines.Add(lStr);
4016
4108
        end;
4017
4109
        if      gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette then
4018
 
                DescribeVOIonLabels(lOverlayNum);
 
4110
                DescribeVOIonLabels(lOverlayNum,false);
4019
4111
        TextForm.MemoT.Lines.Add('');
4020
4112
   end; //overlaynum loaded
4021
4113
 end; //for each overlay
4415
4507
            CreateShareMem
4416
4508
         else
4417
4509
             CloseShareMem;
4418
 
         YokeTimer.Enabled := gYoke;
 
4510
 
4419
4511
end;
4420
4512
 
4421
4513
procedure TImgForm.About1Click(Sender: TObject);