[cairo] Polygon fill styles?
Travis Griggs
tgriggs at cincom.com
Wed Aug 20 10:04:49 PDT 2008
On Aug 20, 2008, at 9:47 AM, Ian Britten wrote:
> Kalle Vahlman wrote:
>>> Hi all,
>>> [ Disclaimer - I'm fearing that most Cairo-purists will cringe
>>> at this question, but I've got to ask... :( ]
>>
>> Heh, all that disclaimer is going to do is *lower* your change of
>> getting a constructive answer (who want's to be called a "purist"?).
>> Fortunately for you, this place is pretty tolerant to such remarks :)
>
> Oops! Sorry, I didn't mean that in a negative way. My apologies
> if anyone took offence!
>
> It's just after my foray into line weights the other day, I'm
> beginning to realize that one of Cairo's main concerns is output
> accuracy, and this doesn't always jive with some device-specific
> operations that I'm trying to shoehorn into cairo (Like fill
> styles!)
>
>>> Failing any native cairo support, does anyone have any suggestions
>>> (Or maybe example code! :) ) for doing stuff like this? I'm
>>> suspect it'll be something to do with a cairo_pattern_t... (But
>>> that's just one of many cairo things I haven't learned yet...)
>>
>> You are right on the money, patterns are exactly what is used for
>> this.
>>
>> The idea is that you first create a small surface (preferrably with
>> create_similar() from the surface you want to draw to) and draw
>> whatever it is you want to repeat to it.
>
> Ok, I think this is my mental stumbling block. Are you suggesting
> that in order to fill with a grid pattern (for example), I'll need
> to dynamically draw a couple of lines to a temporary surface (at
> runtime), to generate the pattern?
>
> I guess I can do that (and cache it, etc), but is there no way to
> help work with precanned stuff? For example, GTK has a
> gdk_bitmap_create_from_data() function, letting you just load (Or
> #include) an externally created XPM file. I didn't see anything
> like that in cairo.
Cairo has support of similiar ilk for Png format files. See the
ImageSurface creation functions.
http://cairographics.org/manual/cairo-PNG-Support.html
> Obviously the first approach will result in nicer vector output,
> is more accurate, more flexible, etc. I'm just trying to keep
> my eyes open for simple approaches, eliminating unnecessary
> steps, etc.
>
>> Then you use
>> cairo_pattern_create_for_surface() to create a pattern of the
>> surface.
>> To get it repeated, you simply set the extend mode for the pattern
>> with cairo_pattern_set_extend() to CAIRO_EXTEND_REPEAT.
>>
>> Then you draw your polygon, but instead of setting the source to a
>> color like normal solid fills, you set the previously created pattern
>> as the source with cairo_set_source().
>>
>> Easy as pie, no?
An alternate way for doing this, at least for something like a grid
pattern, would be to change the operations slightly.
Rather than
build repeating image of grid
set as source
build path
fill
You could:
build path
set it as the clip
now just draw the grid (path the vertical and horizontal lines, then
stroke them)
--
Travis Griggs
Objologist
10 2 letter words: "If it is to be, it is up to me"
More information about the cairo
mailing list