Results 1 to 10 of 12

Thread: TBItmap scanline

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1

    TBItmap scanline

    from a simple test i did , i noticed that the scanline hasn't a sequential order address with the next scanline, i mean if i take the address of the last pixel in the first scanline and then increment the this address , i'll point to invalide memory location .

    now if i want to travels the whole TBitmap without need of getting the address of evry scanline , i mean just get the first address and then increment it to the end of bitmap pixles .


    Code:
    var
     p : ^integer;
    begin
     p := bmp.ScanLine[0];
     Pinteger(integer(p)+(bmp.width + 1) )^ := $FFFF0000; // access violation
     image1.Canvas.draw(0,0,bmp);
    Last edited by AirPas; 27-05-2011 at 01:39 PM.

  2. #2
    There's not really a way you can do that
    Peregrinus, expectavi pedes meos in cymbalis
    Nullus norvegicorum sole urinat

  3. #3
    You need to use canvas instead of scanline if you want to do that. I would suggest calculating the scanline offset manually instead of using the scanline property. Just be sure to check it's pixelFormat

    Really,
    Code:
    p:=pointer(longword(bmp.canvas)+desiredScanLine*bmp.width*4);
    Should do the trick. Is that REALLY so much harder than calling scanline? I doubt it.

    Oh, and I REALLY suggest using longword instead of integer on these types of operations, you never know when the sign bit is going to mess with you.

    honestly, the mere existance of the scanline method in tbitmap is probably why I stopped using it -- it makes image loads take longer setting up all those pointers.
    Last edited by deathshadow; 12-07-2011 at 04:17 PM.
    The accessibility of a website from time to time must be refreshed with the blood of designers and owners. It is its natural manure

  4. #4
    thanks , but i changed the direction
    i mean it was just my attempt to create a game from scratch (frame buffer) , instead of VCL i used API and CreateDIBSection (much easier) , but even i use assembly code for ploting pixels , i failed to make a smooth sprite movment .

    now i am using SDL
    Last edited by AirPas; 13-07-2011 at 08:58 AM.

  5. #5
    hi again

    could some one correct me , i've tryed to make a procedure that plot a given pixel ( x ,y , color) into TBitmap class

    Code:
    procedure SetScanLinePixel(x,y,c : integer; var _bmp : TBitmap);
    type
      pRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..32768-1] of TRGBTriple;
    var
      raw : pRGBTripleArray;
    begin
      raw := _bmp.ScanLine[y];
      raw[x].rgbtBlue  := ( c and $ff);
      raw[x].rgbtGreen := ( c shl 8 ) and $ff;
      raw[x].rgbtRed:= ( c shl 16) and $ff; //error :constant expression violates subrange bounds 
    end;
    i don't understand the last compiler error ,

  6. #6
    Disable the compiler's range check error in project options or use {$R-} flag at top of your unit. Also change "c" to be Cardinal and change "shl" to "shr".
    Last edited by LP; 20-09-2011 at 04:27 PM.

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
  •