开发者

Drawing a non rectangular part of a picture in delphi canvas

开发者 https://www.devze.com 2023-01-08 13:00 出处:网络
Can anyone share a samp开发者_C百科le code to draw a non-rectangular part of a picture in delphi canvas?You\'re looking for GDI paths. Start here, which explains what paths are in this context, and pr

Can anyone share a samp开发者_C百科le code to draw a non-rectangular part of a picture in delphi canvas?


You're looking for GDI paths. Start here, which explains what paths are in this context, and provides links on the left to explain the functionality available with them.

Google can turn up lots of examples of using paths in Delphi. If you can't find them, post a comment back here and I'll see what I can turn up for you.


Your question is pretty vague. But I suspect what you are looking for is clipping regions. Read up on them. Set the clipping region on the target device to the shape you want, and then draw the image onto the device. Only the part of the image that would be within the clipping region will be drawn.


Canvas.Ellipse(0, 0, 10, 20); // not a rectangle


I use so called runlists for this feature (generalized shapes and blitting them). I've seen them called warplists too. A shape is encoded as a runlist by defining it as a set of horizontal lines, and each line is two integer values (skip n pixels,copy n pixels).

This means you can draw entire lines, leaving you with only "height" draw operations.

So a rectangle is defined (the first "skip" pixels from top level corner to the left corner (xorg,yorg). The rectangle is width_rect wide, and width_pixels goes a line further. width_pixels can be wider than the width of the picture (alignment bytes)

(yorg*width_pixels+xorg  , width_rect),
(width_pixels-width_rect , width_rect),
(width_pixels-width_rect , width_rect),
(width_pixels-width_rect , width_rect),
..
..

This way you can make your drawing routines pretty generic, and for simple, regular shapes (rects, circles) it takes only minor math to precalculate these lists. It simplified my shape handling enormously.

However I draw directly to bitmaps, not to canvasses, so I can't help with that part. A primitive that efficiently draws a row, and a way to extract a row from a graphic should be enough.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号