Add CODING_STYLE document to standardize on some style issues.

Standardize brace handling around all else clauses according to new CODING_STYLE guidelines.
This commit is contained in:
Carl Worth 2005-06-03 14:51:57 +00:00
parent f87fd91bcf
commit 36beed9bf1
15 changed files with 297 additions and 30 deletions

211
CODING_STYLE Normal file
View file

@ -0,0 +1,211 @@
Cairo coding style.
This document is intended to be a short description of the preferred
coding style for the cairo source code. Good style requires good
taste, which means this can't all be reduced to automated rules, and
there are exceptions.
We want the code to be easy to understand and maintain, and consistent
style plays an important part in that, even if some of the specific
details seem trivial. If nothing else, this document gives a place to
put consistent answers for issues that would otherwise be arbitrary.
Most of the guidelines here are demonstrated by examples, (which means
this document is quicker to read than it might appear given its
length). Most of the examples are positive examples that you should
imitate. The few negative examples are clearly marked with a comment
of /* Yuck! */. Please don't submit code to cairo that looks like any
of these.
Indentation
-----------
Each new level is indented 4 more spaces than the previous level:
if (condition)
do_something ();
Spaces or tabs (or a combination) can be used in indentation, but tabs
must always be interpreted as 8 spaces. Code using single tabs for all
indentation (expecting people to interpret tabs as 4 spaces) will not
be accepted in cairo.
The rationale here is that tabs are used in the code for lining things
up other than indentation, (see the Whitespace section below), and
changing the interpretation of tab from 8 characters will break this.
Braces
------
Most of the code in cairo uses bracing in the style of K&R:
if (condition) {
do_this ();
do_that ();
} else {
do_the_other ();
}
but some of the code uses an alternate style:
if (condition)
{
do_this ();
do_that ();
}
else
{
do_the_other ();
}
and that seems just fine. We won't lay down any strict rule on this
point, (though there should be some local). If you came here hoping to
find some guidance, then use the first form above.
If all of the substatements of an if statement are single statements,
the optional braces should not usually appear:
if (condition)
do_this ();
else
do_that ();
But the braces are mandatory when mixing single statement and compund
statements in the various clauses. For example, do not do this:
if (condition) {
do_this ();
do_that ();
} else /* Yuck! */
do_the_other ();
And of course, there are exceptions for when the code just looks
better with the braces:
if (condition) {
/* Note that we have to be careful here. */
do_something_dangerous (with_care);
}
if (condition &&
other_condition &&
yet_another)
{
do_something ();
}
And note that this last example also shows a situtation in which the
opening brace really needs to be on its own line. The following looks awful:
if (condition &&
other_condition &&
yet_another) { /* Yuck! */
do_something ();
}
As we said above, legible code that is easy to understand and maintain
is the goal, not adherence to strict rules.
Whitespace
----------
Separate logically distinct chunks with a single newline. This
obviously applies between functions, but also applies within a
function or block and can even be used to good effect within a
structure definition:
struct _cairo_gstate {
cairo_operator_t operator;
double tolerance;
/* stroke style */
double line_width;
cairo_line_cap_t line_cap;
cairo_line_join_t line_join;
double miter_limit;
cairo_fill_rule_t fill_rule;
double *dash;
int num_dashes;
double dash_offset;
...
}
Use a single space before a left parenthesis, except where the
standard will not allow it, (eg. when defining a parameterized macro).
Don't eliminate whitespace just because things would still fit on one
line. This breaks the expected visual structure of the code making it
much harder to read and understand:
if (condition) foo (); else bar (); /* Yuck! */
As a special case of the bracing and whitespace guidelines, function
definitions should always take the following form:
void
my_function (argument)
{
do_my_things ();
}
And function prototypes should similarly have the return type (and
associated specifiers and qualifiers) on a line above the function, so
that the function name is flush left.
Break up long line (> ~80 characters) and use whitespace to align
things nicely. For example the arguments in a long list to a function call should all be aligned with each other:
align_function_arguments (argument_the_first,
argument_the_second,
argument_the_third);
And as a special rule, in a function prototype, (as well as in the
definition), whitespace should be inserted between the parameter types
and names so that the names are aligned:
void
align_parameter_names_in_prototypes (const char *char_star_arg,
int int_arg,
double *double_star_arg,
double duble_arg);
Note that parameters with a * prefix are aligned one character to the
left so that the actual names are aligned.
Managing nested blocks
----------------------
Long blocks that are deeply nested make the code very hard to
read. Fortunately such blocks often indicate logically distinct chunks
of functionality that are begging to be split into their own
functions. Please listen to the blocks when they beg.
In other cases, gratuitous nesting comes about because the primary
functionality gets buried in a nested block rather than living at the
primary level where it belongs. Consider the following:
foo = malloc (sizeof (foo_t));
if (foo) { /* Yuck! */
...
/* lots of code to initialize foo */
...
return SUCCESS;
}
return FAILURE;
This kind of gratuitous nesting can be avoided by following a pattern
of handling exceptional cases early and returning:
foo = malloc (sizeof (foo_t));
if (foo == NULL)
return FAILURE;
...
/* lots of code to initialize foo */
...
return SUCCESS;
The return statement is often the best thing to use in a pattern like
this. If it's not available due to additional nesting above which
require some cleanup after the current block, then consider splitting
the current block into a new function before using goto.

View file

@ -1,10 +1,29 @@
2005-06-03 Carl Worth <cworth@cworth.org>
* CODING_STYLE: Add CODING_STYLE document to standardize on some
style issues.
* src/cairo-atsui-font.c:
* src/cairo-cache.c:
* src/cairo-ft-font.c:
* src/cairo-glitz-surface.c:
* src/cairo-gstate.c:
* src/cairo-matrix.c:
* src/cairo-pattern.c:
* src/cairo-pdf-surface.c:
* src/cairo-spline.c:
* src/cairo-wideint.c:
* src/cairo-win32-font.c:
* src/cairo-xlib-surface.c: Standardize brace handling around all
else clauses according to new CODING_STYLE guidelines.
2005-06-03 Kristian Høgsberg <krh@redhat.com>
Patch from Tomasz Cholewo <cholewo@ieee-cis.org>:
* src/cairo-pdf-surface.c: (cairo_pdf_ft_font_write_head_table),
(cairo_pdf_ft_font_generate): Store the index of the checksum
instea of a pointer to the location.
instead of a pointer to the location.
2005-06-03 Carl Worth <cworth@cworth.org>

View file

@ -486,14 +486,16 @@ _cairo_atsui_font_show_glyphs(void *abstract_font,
CGContextSetTextMatrix(myBitmapContext, textTransform);
if (pattern->type == CAIRO_PATTERN_SOLID &&
_cairo_pattern_is_opaque_solid(pattern)) {
_cairo_pattern_is_opaque_solid(pattern))
{
cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *)pattern;
CGContextSetRGBFillColor(myBitmapContext,
solid->color.red,
solid->color.green,
solid->color.blue, 1.0f);
} else
} else {
CGContextSetRGBFillColor(myBitmapContext, 0.0f, 0.0f, 0.0f, 0.0f);
}
// TODO - bold and italic text
//

View file

@ -182,19 +182,25 @@ _cache_lookup (cairo_cache_t *cache,
{
/* We are looking up an exact entry. */
if (*probe == NULL)
{
/* Found an empty spot, there can't be a match */
break;
}
else if (*probe != DEAD_ENTRY
&& (*probe)->hashcode == hash
&& predicate (cache, key, *probe))
{
return probe;
}
}
else
{
/* We are just looking for a free slot. */
if (*probe == NULL
|| *probe == DEAD_ENTRY)
{
return probe;
}
}
if (step == 0) {

View file

@ -575,10 +575,9 @@ _cairo_ft_unscaled_font_create_glyph (void *abstract_
height = (unsigned int) ((cbox.yMax - cbox.yMin) >> 6);
stride = (width + 3) & -4;
if (width * height == 0)
if (width * height == 0) {
val->image = NULL;
else
{
} else {
bitmap.pixel_mode = ft_pixel_mode_grays;
bitmap.num_grays = 256;

View file

@ -1403,8 +1403,9 @@ _cairo_glitz_area_find (cairo_glitz_area_t *area,
return CAIRO_INT_STATUS_UNSUPPORTED;
_cairo_glitz_area_move_out (area);
} else
} else {
return CAIRO_INT_STATUS_UNSUPPORTED;
}
/* fall-through */
case CAIRO_GLITZ_AREA_AVAILABLE: {
@ -1488,8 +1489,9 @@ _cairo_glitz_area_find (cairo_glitz_area_t *area,
to_area->closure,
closure) >= 0)
return CAIRO_INT_STATUS_UNSUPPORTED;
} else
} else {
return CAIRO_INT_STATUS_UNSUPPORTED;
}
}
for (i = 0; i < 4; i++)

View file

@ -1079,9 +1079,13 @@ _clip_and_compute_extents_arbitrary (cairo_gstate_t *gstate,
if (pixman_region_intersect (intersection,
gstate->clip.region,
intersection) == PIXMAN_REGION_STATUS_SUCCESS)
{
_region_rect_extents (intersection, extents);
}
else
{
status = CAIRO_STATUS_NO_MEMORY;
}
pixman_region_destroy (intersection);

View file

@ -182,19 +182,25 @@ _cache_lookup (cairo_cache_t *cache,
{
/* We are looking up an exact entry. */
if (*probe == NULL)
{
/* Found an empty spot, there can't be a match */
break;
}
else if (*probe != DEAD_ENTRY
&& (*probe)->hashcode == hash
&& predicate (cache, key, *probe))
{
return probe;
}
}
else
{
/* We are just looking for a free slot. */
if (*probe == NULL
|| *probe == DEAD_ENTRY)
{
return probe;
}
}
if (step == 0) {

View file

@ -526,7 +526,9 @@ _cairo_matrix_compute_scale_factors (const cairo_matrix_t *matrix,
_cairo_matrix_compute_determinant (matrix, &det);
if (det == 0)
{
*sx = *sy = 0;
}
else
{
double x = x_major != 0;

View file

@ -868,8 +868,9 @@ _cairo_image_data_set_radial (cairo_radial_pattern_t *pattern,
c0_x = y_x + c0_y;
factor = (c0_e - r0) / (c0_x - r0);
} else
} else {
factor = -r0;
}
}
_cairo_pattern_calc_color_at_pixel (&op, factor * 65536, pixels++);
@ -1130,11 +1131,13 @@ _cairo_pattern_acquire_surface (cairo_pattern_t *pattern,
attributes);
}
else
{
status = _cairo_pattern_acquire_surface_for_gradient (src, dst,
x, y,
width, height,
surface_out,
attributes);
}
} break;
case CAIRO_PATTERN_SURFACE: {
cairo_surface_pattern_t *src = (cairo_surface_pattern_t *) pattern;
@ -1169,8 +1172,11 @@ _cairo_pattern_release_surface (cairo_surface_t *dst,
_cairo_surface_release_source_image (dst,
(cairo_image_surface_t *) surface,
attributes->extra);
} else
}
else
{
cairo_surface_destroy (surface);
}
}
cairo_int_status_t
@ -1199,7 +1205,7 @@ _cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
* support RENDER-style 4-channel masks. */
if (src->type == CAIRO_PATTERN_SOLID &&
mask && mask->type == CAIRO_PATTERN_SOLID)
{
{
cairo_color_t combined;
cairo_solid_pattern_t *src_solid = (cairo_solid_pattern_t *) src;
cairo_solid_pattern_t *mask_solid = (cairo_solid_pattern_t *) mask;
@ -1210,7 +1216,9 @@ _cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
_cairo_pattern_init_solid (&tmp.solid, &combined);
mask = NULL;
} else {
}
else
{
_cairo_pattern_init_copy (&tmp.base, src);
}

View file

@ -505,8 +505,7 @@ cairo_pdf_ft_font_write_glyf_table (cairo_pdf_ft_font_t *font,
if (header->Index_To_Loc_Format == 0) {
begin = be16_to_cpu (u.short_offsets[index]) * 2;
end = be16_to_cpu (u.short_offsets[index + 1]) * 2;
}
else {
} else {
begin = be32_to_cpu (u.long_offsets[index]);
end = be32_to_cpu (u.long_offsets[index + 1]);
}
@ -631,8 +630,7 @@ cairo_pdf_ft_font_write_loca_table (cairo_pdf_ft_font_t *font,
if (header->Index_To_Loc_Format == 0) {
for (i = 0; i < font->base.num_glyphs + 1; i++)
cairo_pdf_ft_font_write_be16 (font, font->glyphs[i].location / 2);
}
else {
} else {
for (i = 0; i < font->base.num_glyphs + 1; i++)
cairo_pdf_ft_font_write_be32 (font, font->glyphs[i].location);
}

View file

@ -64,23 +64,21 @@ _cairo_spline_init (cairo_spline_t *spline,
spline->c = *c;
spline->d = *d;
if (a->x != b->x || a->y != b->y) {
if (a->x != b->x || a->y != b->y)
_cairo_slope_init (&spline->initial_slope, &spline->a, &spline->b);
} else if (a->x != c->x || a->y != c->y) {
else if (a->x != c->x || a->y != c->y)
_cairo_slope_init (&spline->initial_slope, &spline->a, &spline->c);
} else if (a->x != d->x || a->y != d->y) {
else if (a->x != d->x || a->y != d->y)
_cairo_slope_init (&spline->initial_slope, &spline->a, &spline->d);
} else {
else
return CAIRO_INT_STATUS_DEGENERATE;
}
if (c->x != d->x || c->y != d->y) {
if (c->x != d->x || c->y != d->y)
_cairo_slope_init (&spline->final_slope, &spline->c, &spline->d);
} else if (b->x != d->x || b->y != d->y) {
else if (b->x != d->x || b->y != d->y)
_cairo_slope_init (&spline->final_slope, &spline->b, &spline->d);
} else {
else
_cairo_slope_init (&spline->final_slope, &spline->a, &spline->d);
}
spline->num_points = 0;
spline->points_size = 0;

View file

@ -1,5 +1,5 @@
/*
* $Id: cairo-wideint.c,v 1.4 2005-01-19 15:07:00 cworth Exp $
* $Id: cairo-wideint.c,v 1.5 2005-06-03 21:51:57 cworth Exp $
*
* Copyright © 2004 Keith Packard
*
@ -421,7 +421,9 @@ _cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den)
num = _cairo_uint64_sub (num, den);
}
else
{
q0 = 0;
}
q1 = 0;
r0 = num.lo;
@ -937,7 +939,9 @@ _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
num = _cairo_uint128_sub (num, den);
}
else
{
q0 = _cairo_uint32_to_uint64 (0);
}
q1 = _cairo_uint32_to_uint64 (0);
r0 = num.lo;

View file

@ -194,8 +194,9 @@ _get_system_quality (void)
}
return ANTIALIASED_QUALITY;
} else
} else {
return DEFAULT_QUALITY;
}
}
static cairo_scaled_font_t *

View file

@ -1122,13 +1122,14 @@ _cairo_xlib_surface_create_internal (Display *dpy,
if (CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE (surface)) {
if (!format) {
if (visual) {
if (visual)
format = XRenderFindVisualFormat (dpy, visual);
} else if (depth == 1)
else if (depth == 1)
format = XRenderFindStandardFormat (dpy, PictStandardA1);
}
} else
} else {
format = NULL;
}
surface->visual = visual;
surface->format = format;
@ -1778,20 +1779,26 @@ _cairo_xlib_surface_show_glyphs (cairo_scaled_font_t *scaled_font,
_cairo_xlib_surface_ensure_dst_picture (self);
if (elt_size == 8)
{
status = _cairo_xlib_surface_show_glyphs8 (scaled_font, operator, g, &key, src, self,
source_x + attributes.x_offset,
source_y + attributes.y_offset,
glyphs, entries, num_glyphs);
}
else if (elt_size == 16)
{
status = _cairo_xlib_surface_show_glyphs16 (scaled_font, operator, g, &key, src, self,
source_x + attributes.x_offset,
source_y + attributes.y_offset,
glyphs, entries, num_glyphs);
}
else
{
status = _cairo_xlib_surface_show_glyphs32 (scaled_font, operator, g, &key, src, self,
source_x + attributes.x_offset,
source_y + attributes.y_offset,
glyphs, entries, num_glyphs);
}
for (i = 0; i < num_glyphs; ++i)
_xlib_glyphset_cache_destroy_entry (g, entries[i]);