Oivind Muller
Oivind Muller

Reputation: 43

Rotation has no effect on GetPath?

I'm using Delphi (XE5) to create a graphic component. One challenge is to rotate a closed path by SetWorldTransform, then read back the outline with GetPath. Rotation works ok, but the points retreived from GetPath are not rotated (however, obtating a region (PathToRegion) works as expected!).

My code:

procedure Rotate(DestBitmap : TBitmapEx; Radians : Single;  FigureRect : TRect);

// DestBitmap is where to draw the figure. Size of DestBitmap is computed from
//the actual angle and figure size (not shown here). FigureRect is the plain
//figure rectangle without rotation

var
  XForm: tagXFORM;
  C, S : single;
  Points : array of TPoint;
  NumPoints : integer;
  Bytes : TByteArray;
  Rgn : HRGN;
  X, Y : integer;

 begin
  //Locate FigureRect to center of bitmap: 
  X := (DestBitmap.Width - FigureRect.Width) div 2;
  Y := (DestBitmap.Height - FigureRect.Height) div 2;
  FigureRect.Location := Point(X,Y);

  //Set rotate mode 
  C := Cos(Radians);
  S := Sin(Radians);
  XForm.eM11 := C;
  XForm.eM12 := S;
  XForm.eM21 := -S;
  XForm.eM22 := C;
  XForm.eDx := (DestBitmap.Width - DestBitmap.Width * C +
    DestBitmap.Height * S) / 2;
  XForm.eDy := (DestBitmap.Height - DestBitmap.Width * S -
    DestBitmap.Height * C) / 2;
  SetGraphicsMode(DestBitmap.Canvas.Handle, GM_ADVANCED);
  SetWorldTransform(DestBitmap.Canvas.Handle, XForm);

  //Rotate the figure
  BeginPath(DestBitmap.Canvas.Handle);
  DestBitmap.Canvas.Rectangle(FigureRect);
  EndPath(DestBitmap.Canvas.Handle);
  FlattenPath(DestBitmap.Canvas.Handle);
  NumPoints := GetPath(DestBitmap.Canvas.Handle, Points[0], Bytes[0], 0);
  SetLength(Points, NumPoints);
  GetPath(DestBitmap.Canvas.Handle, Points[0], Bytes[0], NumPoints);

  //Points now describes the plain, unrotated figure, but if instead:
  //Rgn := PathToRegion(DestBitmap.Canvas.Handle);
  //Rgn describes the rotated area, as expected 
end;

Upvotes: 3

Views: 180

Answers (1)

Sertac Akyuz
Sertac Akyuz

Reputation: 54822

That is expected, GetPath returns points in logical coordinates. Whereas the resulting region of PathToRegion uses device coordinates - so it is unaffected by the transform. See documentation of both functions.

Or three, SetWorldTransform transforms logical coordinates. To everything in the logical world, nothing has been changed. The transform is with respect to the device.

Upvotes: 2

Related Questions