Page 1 of 3 1 2 3 LastLast
Results 1 to 15 of 34

Thread: CreateDIBSection naar eigen memory laten wijzen

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    CreateDIBSection naar eigen memory laten wijzen

    Nomraal reserveert CreateDIBSection memory voor een pointer die je meegeeft en geeft die pointer terug.
    Is het ook mogelijk om deze functie naar je eigen memory te laten wijzen?

  2. #2
    Ja, een beetje. De functie accepteert een hSection handle.
    hSection kan null zijn, of je kan er een filemapping aan meegeven, die je hebt opgevraagd met CreateFileMapping.
    (zie CreateDIBSection documentatie)

    CreateFileMapping geeft normaal gesproken een memory mapped view van een specifieke geopende file terug, maar je kan INVALID_HANDLE_VALUE opgeven als filehandle en een specifieke grootte aangeven, om een blok van die grootte terug te krijgen.
    (zie CreateFileMappingA documentatie)

    Het geheugen in kwestie is deel van de system paging file (het virtual memory) van Windows. Aan jou om te bepalen of je dat vindt gelden als 'eigen' memory.
    1+1=b

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ik zag het ja. De INVALID_HANDLE_VALUE had ik even niet gezien.
    Is dit net zo snel als getmem? Zo ja dan is het misschien test- en zelfs bruikbaar :-)

  4. #4
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Lijkt goed te werken!

    Code:
    procedure Test;
    var
      filemapping: THandle;
      bitmapinfo: TBitmapInfo;
      fBits: PPixelArray; // = pointer to array[0..0] of Cardinal
      bitmaphandle: HBITMAP;
    begin
      filemapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_EXECUTE_READWRITE, 0, 32 * 32 * 4, nil);
    
      if filemapping = 0 then
        raise exception.Create('filemapping = 0');
    
      FillBitmapInfo(32, 32, bitmapinfo); // init bitmapinfo
      bitmaphandle := CreateDIBSection(0, bitmapinfo, DIB_RGB_COLORS, Pointer(fBits), filemapping, 0);
    
      if bitmaphandle = 0 then
        raise exception.Create('bitmaphandle = 0');
    
      // fill
      for var x := 0 to 31 do
        for var y := 0 to 31 do
          if odd(y) then
            fbits^[y * 32 + x] := clGreen
          else
            fbits^[y * 32 + x] := clRed;
    
      // test
      var b: TBitmap := TBitmap.Create;
      b.SetSize(32, 32);
      for var x := 0 to 31 do
        for var y := 0 to 31 do
          b.Canvas.Pixels[x, y] := fbits^[y * 32 + x];
      b.SaveToFile('kanweg.bmp');
      b.Free;
    
    
      CloseHandle(filemapping);
      DeleteObject(bitmaphandle);
    end;

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Misschien is CreateFileMappingNumaA ook een alternatief?

  6. #6
    Ik heb geen idee. Ik heb alleen m'n google-resultaten in een antwoord gegoten. #HetIsNetWerk
    1+1=b

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    @Golez hahaha. #agree

  8. #8
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    CreateFileMapping + CloseHandle is wel heel veel langzamer dan getmem + freemem :-(

  9. #9
    Kan ik me voorstellen. GetMem zou zomaar eens een stuk al gereserveerd geheugen kunnen gebruiken.

    De vraag is, is het eenmalig langzamer of ook in het gebruik? Indien het eerste, dan zal het neem ik aan geen probleem zijn, tenzij het echt secondenlang duurt of je duizenden bitmaps wilt verwerken.
    1+1=b

  10. #10
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ik moet nog even echt kijken en meten. duizenden bitmaps inderdaad.

  11. #11
    Misschien kan je een eenmaal verkregen buffer hergebruiken?
    1+1=b

  12. #12
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Dat ben ik nog aan het zoeken :-) Ik geloof dat het kan

  13. #13
    vraag is waarom filemapping nodig is voor CreateDIBSection en eigenlijk of CreateDIBSection wel gebruikt moet worden. Ik dacht ooit eens wat testen gelezen te hebben waarbij scanline nog steeds sneller was (ook al gebruikt die CreateDIBSection). Maar deze info heeft geen waarde als je niet aan pixel manipulatie wilt (gaan) doen

  14. #14
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Het subdoel van het geheel is om een DC te hebben voor BitBlt, Canvas-functies en Fonts etc. Deze functies moeten 'mijn' HDC kunnen gebruiken, maar het reserveren van geheugen wil ik in eigen hand houden.

  15. #15
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    De CreateDIBSection alloceert zelf zijn memory. En dat willen we niet.
    Na de call naar CreateDIBSection is de fPixels pointer veranderd. Wat doe ik fout? Of liever: hoe kan het anders?
    Code:
         1. fPixels            : Pointer        GetMem(fPixels, NumPixels * 4);
         2. fBitmapInfo        : TBitmapInfo    Gevuld met correcte info
         3. fMemoryHandle      : THandle        CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_EXECUTE_READWRITE, 0, NumPixels * 4, nil)
         4. fBitmapHandle      : HBITMAP        CreateDIBSection(0, fBitmapInfo, DIB_RGB_COLORS, fPixels, fMemoryHandle, 0)
         5. fHandle            : HDC            CreateCompatibleDC(0)
         6. SelectObject(fHandle, fBitmapHandle)

Page 1 of 3 1 2 3 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •