<DIV>Hi Joonas,</DIV>
<DIV> </DIV>
<DIV>Thank you very much for your help.</DIV>
<DIV><BR>And I still have some questions bellow:</DIV>
<DIV>(1) I compare the DDA algorithms in http://en.wikipedia.org/wiki/Digital_Differential_Analyzer_(graphics_algorithm)<BR>with that in cairo , there are a few differences .</DIV>
<DIV>>> #define RENDER_EDGE_STEP_SMALL(edge)<BR>>> { edge->x += edge->stepx_small;<BR>>> edge->e += edge->dx_small;<BR>>> if(edge->e > 0)<BR>>> { edge->e -= edge->dy;<BR>>> edge->x += edge->signdx;<BR>>> }<BR>>> }<BR>The value of edge->x is the x coordinate multiply 65536,but the value of edge->signdx is "-1" or "1" , it makes no difference by edge->x += edge->signdx . I do not understand .<BR></DIV>
<DIV>(2)What's the meaning of "Cairo internally uses <FONT color="#ff0000">24.8</FONT> and pixman uses <FONT color="#ff0000">16.16 </FONT>fixed </DIV>
<DIV>point representation" , "24.8" and "16.16" ?</DIV>
<DIV> </DIV>
<DIV>(3) I use 1.8.10 cairo code and I can not find the 1.9 code at download/releases , is it insecure yet? How could I know the</DIV>
<DIV>differences between 1.8 cairo code and 1.9 cairo code ?</DIV>
<DIV> </DIV>
<DIV>Thanks,</DIV>
<DIV>chen </DIV>
<DIV></DIV><BR><PRE><BR>
>
>Hi Chen,
>
>On Mon, 19 Jul 2010, xigcw wrote:
>
>> I am learning cairo with image backend for several weeks , and
>> I have several questions whitch troubles me a lot.
>
>Your questions indicate to me that you're probably looking at the <=
>1.8 cairo code. The 1.9 code paths for the image backend have changed
>a lot.
>
>> 1. There are two data changes in cairo:
>> (1) fdx = _cairo_fixed_from_double(dx)
>> (2) x_off_fixed = pixman_int_to_fixed(x_off)
>> that , fdx = dx * 256 , x_off_fixed = x_off * 256 * 256,
>> What's the meaning about the two changes?
>
>These are conversions from doubles (_cairo_fixed_from_double) or
>integers (pixman_int_to_fixed) into fixed point formats used by cairo
>and pixman. Cairo internally uses 24.8 and pixman uses 16.16 fixed
>point representation.
>
>http://en.wikipedia.org/wiki/Fixed-point_arithmetic
>
>> 2. I use a debugger to see how the thick stroking works.
>> After cairo_traps_add_trap,the polygon will be reduced
>> to trapezoid, and then the pixman will compute the right and
>> left edge of the trapezoid .is that right?
>
>Yes.
>
>> When compute the edge of trapezoid ,the algorithms is different
>> from Bresenham algorithms, so I would like to know what computer
>> graphics algorithms does cairo use?(draw line)
>
>The trapezoid stepper is a fairly straight forward DDA over a 17x15
>subpixel grid.
>
>http://en.wikipedia.org/wiki/Digital_Differential_Analyzer_(graphics_algorithm)
>
>> 3. #define RENDER_EDGE_STEP_SMALL(edge)
>> { edge->x += edge->stepx_small;
>> edge->e += edge->dx_small;
>> if(edge->e > 0)
>> { edge->e -= edge->dy;
>> edge->x += edge->signdx;
>> }
>> }
>
>> What's the meaning of edge->e
>
>The edge->e field is the "excess" of the x coordinate and represents
>the fractional part of the x coordinate along the edge for the current
>y. For an edge which goes dx units to the right and dy units down the
>excess is (dx mod dy) - dy. The bias -dy is added to make checking of
>the overflow condition in the DDA a comparison against zero rather
>than dy.
>
>> or What's the meaning of if(edge->e > 0)?
>
>Without the bias -dy in edge->e, the test for overflow would require
>fetching dy into a register just for the test, so comparison against
>zero is usually faster.
>
>> What's the different between RENDER_EDGE_STEP_SMALL(edge) and
>> RENDER_EDGE_STEP_BIG(edge)?
>
>One advances the edge by the amount STEP_Y_SMALL(8) downwards and the
>other by STEP_Y_BIG(8).
>
>For the purposes of rasterization the pixel grid is subdivided into a
>subpixel grid of size 17 x 15. Within each subpixel in the 17 x 15
>grid there is a sample in the middle of the subpixel, and if the
>sample falls within the trapezoid defined by two edges, then it
>contributes to the coverage of its pixel by 1/255.
>
>That's the ideal anyway, but remember that pixman uses 16.16 fixed
>point, so it can't represent the height or width of a subpixel
>_exactly_ correctly (65536 is not divisible by 15 or 17.) So instead
>of having 15 rows of subpixels of uniform height (which it can't
>represent), pixman uses 14 rows of subpixels of the same, nearly
>correct but representable height, and one one slightly larger row
>cover the space between the 14th subpixel row and the bottom of the
>full pixel. The height of the smaller subpixels is STEP_Y_SMALL(8)
>and the height of the larger subpixels is STEP_Y_BIG(8).
>
>Hope that helps,
>
>Joonas
</PRE><br><br><span title="neteasefooter"/><hr/>
<a href="http://qiye.163.com/?163" target="_blank">您想拥有和网易免费邮箱一样强大的软件吗?</a>
</span>