xref: /aosp_15_r20/external/skia/site/docs/dev/contrib/style.md (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker---
2*c8dee2aaSAndroid Build Coastguard Workertitle: 'Coding Style Guidelines'
3*c8dee2aaSAndroid Build Coastguard WorkerlinkTitle: 'Coding Style Guidelines'
4*c8dee2aaSAndroid Build Coastguard Worker---
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard WorkerThese conventions have evolved over time. Some of the earlier code in both
7*c8dee2aaSAndroid Build Coastguard Workerprojects doesn't strictly adhere to the guidelines. However, as the code evolves
8*c8dee2aaSAndroid Build Coastguard Workerwe hope to make the existing code conform to the guildelines.
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker## Files
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard WorkerWe use .cpp and .h as extensions for c++ source and header files.
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard WorkerHeaders that aren't meant for public consumption should be placed in src
15*c8dee2aaSAndroid Build Coastguard Workerdirectories so that they aren't in a client's search path, or in include/private
16*c8dee2aaSAndroid Build Coastguard Workerif they need to be used by public headers.
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard WorkerWe prefer to minimize includes. If forward declaring a name in a header is
19*c8dee2aaSAndroid Build Coastguard Workersufficient then that is preferred to an include.
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard WorkerForward declarations and file includes should be in alphabetical order.
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker### No define before sktypes
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard WorkerDo not use #if/#ifdef before including "SkTypes.h" (directly or indirectly).
26*c8dee2aaSAndroid Build Coastguard WorkerMost things you'd #if on tend to not yet be decided until SkTypes.h.
27*c8dee2aaSAndroid Build Coastguard Worker
28*c8dee2aaSAndroid Build Coastguard WorkerWe use 4 spaces, not tabs.
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard WorkerWe use Unix style endlines (LF).
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard WorkerWe prefer no trailing whitespace but aren't very strict about it.
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard WorkerWe wrap lines at 100 columns unless it is excessively ugly (use your judgement).
35*c8dee2aaSAndroid Build Coastguard Worker
36*c8dee2aaSAndroid Build Coastguard Worker## Naming
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard WorkerMost externally visible types and functions use an Sk- prefix to designate
39*c8dee2aaSAndroid Build Coastguard Workerthey're part of Skia, but code in Ganesh uses Gr-. Nested types need not be
40*c8dee2aaSAndroid Build Coastguard Workerprefixed.
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker```
45*c8dee2aaSAndroid Build Coastguard Workerclass SkClass {
46*c8dee2aaSAndroid Build Coastguard Workerpublic:
47*c8dee2aaSAndroid Build Coastguard Worker    class HelperClass {
48*c8dee2aaSAndroid Build Coastguard Worker        ...
49*c8dee2aaSAndroid Build Coastguard Worker    };
50*c8dee2aaSAndroid Build Coastguard Worker};
51*c8dee2aaSAndroid Build Coastguard Worker```
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard WorkerData fields in structs, classes, and unions that have methods begin with
54*c8dee2aaSAndroid Build Coastguard Workerlower-case f and are then camel-capped, to distinguish those fields from other
55*c8dee2aaSAndroid Build Coastguard Workervariables. Types that are predominantly meant for direct field access don't need
56*c8dee2aaSAndroid Build Coastguard Workerf-decoration.
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker```
61*c8dee2aaSAndroid Build Coastguard Workerstruct GrCar {
62*c8dee2aaSAndroid Build Coastguard Worker    float milesDriven;
63*c8dee2aaSAndroid Build Coastguard Worker    Color color;
64*c8dee2aaSAndroid Build Coastguard Worker};
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Workerclass GrMotorcyle {
67*c8dee2aaSAndroid Build Coastguard Workerpublic:
68*c8dee2aaSAndroid Build Coastguard Worker    float getMilesDriven() const { return fMilesDriven; }
69*c8dee2aaSAndroid Build Coastguard Worker    void  setMilesDriven(float milesDriven) { fMilesDriven = milesDriven; }
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker    Color getColor() const { return fColor; }
72*c8dee2aaSAndroid Build Coastguard Workerprivate:
73*c8dee2aaSAndroid Build Coastguard Worker    float fMilesDriven;
74*c8dee2aaSAndroid Build Coastguard Worker    Color fColor;
75*c8dee2aaSAndroid Build Coastguard Worker};
76*c8dee2aaSAndroid Build Coastguard Worker```
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard WorkerGlobal variables are similar but prefixed with g and camel-capped.
79*c8dee2aaSAndroid Build Coastguard Worker
80*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker```
83*c8dee2aaSAndroid Build Coastguard Workerbool gLoggingEnabled;
84*c8dee2aaSAndroid Build Coastguard Worker```
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard WorkerLocal variables and arguments are camel-capped with no initial cap.
87*c8dee2aaSAndroid Build Coastguard Worker
88*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker```
91*c8dee2aaSAndroid Build Coastguard Workerint herdCats(const Array& cats) {
92*c8dee2aaSAndroid Build Coastguard Worker    int numCats = cats.count();
93*c8dee2aaSAndroid Build Coastguard Worker}
94*c8dee2aaSAndroid Build Coastguard Worker```
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard WorkerVariables declared `constexpr` or `const`, and whose value is fixed for the
97*c8dee2aaSAndroid Build Coastguard Workerduration of the program, are named with a leading "k" and then camel-capped.
98*c8dee2aaSAndroid Build Coastguard Worker
99*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker```
102*c8dee2aaSAndroid Build Coastguard Workerint drawPicture() {
103*c8dee2aaSAndroid Build Coastguard Worker    constexpr SkISize kPictureSize = {100, 100};
104*c8dee2aaSAndroid Build Coastguard Worker    constexpr float kZoom = 1.0f;
105*c8dee2aaSAndroid Build Coastguard Worker}
106*c8dee2aaSAndroid Build Coastguard Worker```
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard WorkerEnum values are also prefixed with k. Unscoped enum values are postfixed with an
109*c8dee2aaSAndroid Build Coastguard Workerunderscore and singular name of the enum name. The enum itself should be
110*c8dee2aaSAndroid Build Coastguard Workersingular for exclusive values or plural for a bitfield. If a count is needed it
111*c8dee2aaSAndroid Build Coastguard Workeris `k<singular enum name>Count` and not be a member of the enum (see example),
112*c8dee2aaSAndroid Build Coastguard Workeror a kLast member of the enum is fine too.
113*c8dee2aaSAndroid Build Coastguard Worker
114*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker```
117*c8dee2aaSAndroid Build Coastguard Worker// Enum class does not need suffixes.
118*c8dee2aaSAndroid Build Coastguard Workerenum class SkPancakeType {
119*c8dee2aaSAndroid Build Coastguard Worker     kBlueberry,
120*c8dee2aaSAndroid Build Coastguard Worker     kPlain,
121*c8dee2aaSAndroid Build Coastguard Worker     kChocolateChip,
122*c8dee2aaSAndroid Build Coastguard Worker};
123*c8dee2aaSAndroid Build Coastguard Worker```
124*c8dee2aaSAndroid Build Coastguard Worker
125*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
126*c8dee2aaSAndroid Build Coastguard Worker
127*c8dee2aaSAndroid Build Coastguard Worker```
128*c8dee2aaSAndroid Build Coastguard Worker// Enum should have a suffix after the enum name.
129*c8dee2aaSAndroid Build Coastguard Workerenum SkDonutType {
130*c8dee2aaSAndroid Build Coastguard Worker     kGlazed_DonutType,
131*c8dee2aaSAndroid Build Coastguard Worker     kSprinkles_DonutType,
132*c8dee2aaSAndroid Build Coastguard Worker     kChocolate_DonutType,
133*c8dee2aaSAndroid Build Coastguard Worker     kMaple_DonutType,
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Worker     kLast_DonutType = kMaple_DonutType
136*c8dee2aaSAndroid Build Coastguard Worker};
137*c8dee2aaSAndroid Build Coastguard Worker
138*c8dee2aaSAndroid Build Coastguard Workerstatic const SkDonutType kDonutTypeCount = kLast_DonutType + 1;
139*c8dee2aaSAndroid Build Coastguard Worker```
140*c8dee2aaSAndroid Build Coastguard Worker
141*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
142*c8dee2aaSAndroid Build Coastguard Worker
143*c8dee2aaSAndroid Build Coastguard Worker```
144*c8dee2aaSAndroid Build Coastguard Workerenum SkSausageIngredientBits {
145*c8dee2aaSAndroid Build Coastguard Worker    kFennel_SausageIngredientBit = 0x1,
146*c8dee2aaSAndroid Build Coastguard Worker    kBeef_SausageIngredientBit   = 0x2
147*c8dee2aaSAndroid Build Coastguard Worker};
148*c8dee2aaSAndroid Build Coastguard Worker```
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
151*c8dee2aaSAndroid Build Coastguard Worker
152*c8dee2aaSAndroid Build Coastguard Worker```
153*c8dee2aaSAndroid Build Coastguard Workerenum SkMatrixFlags {
154*c8dee2aaSAndroid Build Coastguard Worker    kTranslate_MatrixFlag = 0x1,
155*c8dee2aaSAndroid Build Coastguard Worker    kRotate_MatrixFlag    = 0x2
156*c8dee2aaSAndroid Build Coastguard Worker};
157*c8dee2aaSAndroid Build Coastguard Worker```
158*c8dee2aaSAndroid Build Coastguard Worker
159*c8dee2aaSAndroid Build Coastguard WorkerMacros are all caps with underscores between words. Macros that have greater
160*c8dee2aaSAndroid Build Coastguard Workerthan file scope should be prefixed SK or GR.
161*c8dee2aaSAndroid Build Coastguard Worker
162*c8dee2aaSAndroid Build Coastguard WorkerStatic non-class functions in implementation files are lower-case with
163*c8dee2aaSAndroid Build Coastguard Workerunderscores separating words:
164*c8dee2aaSAndroid Build Coastguard Worker
165*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
166*c8dee2aaSAndroid Build Coastguard Worker
167*c8dee2aaSAndroid Build Coastguard Worker```
168*c8dee2aaSAndroid Build Coastguard Workerstatic inline bool tastes_like_chicken(Food food) {
169*c8dee2aaSAndroid Build Coastguard Worker    return kIceCream_Food != food;
170*c8dee2aaSAndroid Build Coastguard Worker}
171*c8dee2aaSAndroid Build Coastguard Worker```
172*c8dee2aaSAndroid Build Coastguard Worker
173*c8dee2aaSAndroid Build Coastguard WorkerExterned functions or static class functions are camel-capped with an initial
174*c8dee2aaSAndroid Build Coastguard Workercap:
175*c8dee2aaSAndroid Build Coastguard Worker
176*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
177*c8dee2aaSAndroid Build Coastguard Worker
178*c8dee2aaSAndroid Build Coastguard Worker```
179*c8dee2aaSAndroid Build Coastguard Workerbool SkIsOdd(int n);
180*c8dee2aaSAndroid Build Coastguard Worker
181*c8dee2aaSAndroid Build Coastguard Workerclass SkFoo {
182*c8dee2aaSAndroid Build Coastguard Workerpublic:
183*c8dee2aaSAndroid Build Coastguard Worker    static int FooInstanceCount();
184*c8dee2aaSAndroid Build Coastguard Worker
185*c8dee2aaSAndroid Build Coastguard Worker    // Not static.
186*c8dee2aaSAndroid Build Coastguard Worker    int barBaz();
187*c8dee2aaSAndroid Build Coastguard Worker};
188*c8dee2aaSAndroid Build Coastguard Worker```
189*c8dee2aaSAndroid Build Coastguard Worker
190*c8dee2aaSAndroid Build Coastguard Worker## Macros
191*c8dee2aaSAndroid Build Coastguard Worker
192*c8dee2aaSAndroid Build Coastguard WorkerGanesh macros that are GL-specific should be prefixed GR_GL.
193*c8dee2aaSAndroid Build Coastguard Worker
194*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
195*c8dee2aaSAndroid Build Coastguard Worker
196*c8dee2aaSAndroid Build Coastguard Worker```
197*c8dee2aaSAndroid Build Coastguard Worker#define GR_GL_TEXTURE0 0xdeadbeef
198*c8dee2aaSAndroid Build Coastguard Worker```
199*c8dee2aaSAndroid Build Coastguard Worker
200*c8dee2aaSAndroid Build Coastguard WorkerGanesh prefers that macros are always defined and the use of `#if MACRO` rather
201*c8dee2aaSAndroid Build Coastguard Workerthan `#ifdef MACRO`.
202*c8dee2aaSAndroid Build Coastguard Worker
203*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
204*c8dee2aaSAndroid Build Coastguard Worker
205*c8dee2aaSAndroid Build Coastguard Worker```
206*c8dee2aaSAndroid Build Coastguard Worker#define GR_GO_SLOWER 0
207*c8dee2aaSAndroid Build Coastguard Worker...
208*c8dee2aaSAndroid Build Coastguard Worker#if GR_GO_SLOWER
209*c8dee2aaSAndroid Build Coastguard Worker    Sleep(1000);
210*c8dee2aaSAndroid Build Coastguard Worker#endif
211*c8dee2aaSAndroid Build Coastguard Worker```
212*c8dee2aaSAndroid Build Coastguard Worker
213*c8dee2aaSAndroid Build Coastguard WorkerThe rest of Skia tends to use `#ifdef SK_MACRO` for boolean flags.
214*c8dee2aaSAndroid Build Coastguard Worker
215*c8dee2aaSAndroid Build Coastguard Worker## Braces
216*c8dee2aaSAndroid Build Coastguard Worker
217*c8dee2aaSAndroid Build Coastguard WorkerOpen braces don't get a newline. `else` and `else if` appear on same line as
218*c8dee2aaSAndroid Build Coastguard Workeropening and closing braces unless preprocessor conditional compilation
219*c8dee2aaSAndroid Build Coastguard Workerinterferes. Braces are always used with `if`, `else`, `while`, `for`, and `do`.
220*c8dee2aaSAndroid Build Coastguard Worker
221*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
222*c8dee2aaSAndroid Build Coastguard Worker
223*c8dee2aaSAndroid Build Coastguard Worker```
224*c8dee2aaSAndroid Build Coastguard Workerif (...) {
225*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
226*c8dee2aaSAndroid Build Coastguard Worker}
227*c8dee2aaSAndroid Build Coastguard Worker
228*c8dee2aaSAndroid Build Coastguard Workerif (...) {
229*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
230*c8dee2aaSAndroid Build Coastguard Worker} else if (...) {
231*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
232*c8dee2aaSAndroid Build Coastguard Worker} else {
233*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
234*c8dee2aaSAndroid Build Coastguard Worker}
235*c8dee2aaSAndroid Build Coastguard Worker
236*c8dee2aaSAndroid Build Coastguard Workerfor (...) {
237*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
238*c8dee2aaSAndroid Build Coastguard Worker}
239*c8dee2aaSAndroid Build Coastguard Worker
240*c8dee2aaSAndroid Build Coastguard Workerwhile (...) {
241*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
242*c8dee2aaSAndroid Build Coastguard Worker}
243*c8dee2aaSAndroid Build Coastguard Worker
244*c8dee2aaSAndroid Build Coastguard Workervoid function(...) {
245*c8dee2aaSAndroid Build Coastguard Worker    oneOrManyLines;
246*c8dee2aaSAndroid Build Coastguard Worker}
247*c8dee2aaSAndroid Build Coastguard Worker
248*c8dee2aaSAndroid Build Coastguard Workerif (!error) {
249*c8dee2aaSAndroid Build Coastguard Worker    proceed_as_usual();
250*c8dee2aaSAndroid Build Coastguard Worker}
251*c8dee2aaSAndroid Build Coastguard Worker#if HANDLE_ERROR
252*c8dee2aaSAndroid Build Coastguard Workerelse {
253*c8dee2aaSAndroid Build Coastguard Worker    freak_out();
254*c8dee2aaSAndroid Build Coastguard Worker}
255*c8dee2aaSAndroid Build Coastguard Worker#endif
256*c8dee2aaSAndroid Build Coastguard Worker```
257*c8dee2aaSAndroid Build Coastguard Worker
258*c8dee2aaSAndroid Build Coastguard Worker## Flow Control
259*c8dee2aaSAndroid Build Coastguard Worker
260*c8dee2aaSAndroid Build Coastguard WorkerThere is a space between flow control words and parentheses, and between
261*c8dee2aaSAndroid Build Coastguard Workerparentheses and braces:
262*c8dee2aaSAndroid Build Coastguard Worker
263*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
264*c8dee2aaSAndroid Build Coastguard Worker
265*c8dee2aaSAndroid Build Coastguard Worker```
266*c8dee2aaSAndroid Build Coastguard Workerwhile (...) {
267*c8dee2aaSAndroid Build Coastguard Worker}
268*c8dee2aaSAndroid Build Coastguard Worker
269*c8dee2aaSAndroid Build Coastguard Workerdo {
270*c8dee2aaSAndroid Build Coastguard Worker} while (...);
271*c8dee2aaSAndroid Build Coastguard Worker
272*c8dee2aaSAndroid Build Coastguard Workerswitch (...) {
273*c8dee2aaSAndroid Build Coastguard Worker...
274*c8dee2aaSAndroid Build Coastguard Worker}
275*c8dee2aaSAndroid Build Coastguard Worker```
276*c8dee2aaSAndroid Build Coastguard Worker
277*c8dee2aaSAndroid Build Coastguard WorkerCases and default in switch statements are indented from the switch.
278*c8dee2aaSAndroid Build Coastguard Worker
279*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
280*c8dee2aaSAndroid Build Coastguard Worker
281*c8dee2aaSAndroid Build Coastguard Worker```
282*c8dee2aaSAndroid Build Coastguard Workerswitch (color) {
283*c8dee2aaSAndroid Build Coastguard Worker    case kBlue:
284*c8dee2aaSAndroid Build Coastguard Worker        ...
285*c8dee2aaSAndroid Build Coastguard Worker        break;
286*c8dee2aaSAndroid Build Coastguard Worker    case kGreen:
287*c8dee2aaSAndroid Build Coastguard Worker        ...
288*c8dee2aaSAndroid Build Coastguard Worker        break;
289*c8dee2aaSAndroid Build Coastguard Worker    ...
290*c8dee2aaSAndroid Build Coastguard Worker    default:
291*c8dee2aaSAndroid Build Coastguard Worker       ...
292*c8dee2aaSAndroid Build Coastguard Worker       break;
293*c8dee2aaSAndroid Build Coastguard Worker}
294*c8dee2aaSAndroid Build Coastguard Worker```
295*c8dee2aaSAndroid Build Coastguard Worker
296*c8dee2aaSAndroid Build Coastguard WorkerFallthrough from one case to the next is annotated with `[[fallthrough]]`.
297*c8dee2aaSAndroid Build Coastguard WorkerHowever, when multiple case statements in a row are used, they do not need the
298*c8dee2aaSAndroid Build Coastguard Worker`[[fallthrough]]` annotation.
299*c8dee2aaSAndroid Build Coastguard Worker
300*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
301*c8dee2aaSAndroid Build Coastguard Worker
302*c8dee2aaSAndroid Build Coastguard Worker```
303*c8dee2aaSAndroid Build Coastguard Workerswitch (recipe) {
304*c8dee2aaSAndroid Build Coastguard Worker    ...
305*c8dee2aaSAndroid Build Coastguard Worker    case kSmallCheesePizza_Recipe:
306*c8dee2aaSAndroid Build Coastguard Worker    case kLargeCheesePizza_Recipe:
307*c8dee2aaSAndroid Build Coastguard Worker        ingredients |= kCheese_Ingredient | kDough_Ingredient | kSauce_Ingredient;
308*c8dee2aaSAndroid Build Coastguard Worker        break;
309*c8dee2aaSAndroid Build Coastguard Worker    case kCheeseOmelette_Recipe:
310*c8dee2aaSAndroid Build Coastguard Worker        ingredients |= kCheese_Ingredient;
311*c8dee2aaSAndroid Build Coastguard Worker        [[fallthrough]]
312*c8dee2aaSAndroid Build Coastguard Worker    case kPlainOmelette_Recipe:
313*c8dee2aaSAndroid Build Coastguard Worker        ingredients |= (kEgg_Ingredient | kMilk_Ingredient);
314*c8dee2aaSAndroid Build Coastguard Worker        break;
315*c8dee2aaSAndroid Build Coastguard Worker    ...
316*c8dee2aaSAndroid Build Coastguard Worker}
317*c8dee2aaSAndroid Build Coastguard Worker```
318*c8dee2aaSAndroid Build Coastguard Worker
319*c8dee2aaSAndroid Build Coastguard WorkerWhen a block is needed to declare variables within a case follow this pattern:
320*c8dee2aaSAndroid Build Coastguard Worker
321*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
322*c8dee2aaSAndroid Build Coastguard Worker
323*c8dee2aaSAndroid Build Coastguard Worker```
324*c8dee2aaSAndroid Build Coastguard Workerswitch (filter) {
325*c8dee2aaSAndroid Build Coastguard Worker    ...
326*c8dee2aaSAndroid Build Coastguard Worker    case kGaussian_Filter: {
327*c8dee2aaSAndroid Build Coastguard Worker        Bitmap srcCopy = src->makeCopy();
328*c8dee2aaSAndroid Build Coastguard Worker        ...
329*c8dee2aaSAndroid Build Coastguard Worker    } break;
330*c8dee2aaSAndroid Build Coastguard Worker    ...
331*c8dee2aaSAndroid Build Coastguard Worker};
332*c8dee2aaSAndroid Build Coastguard Worker```
333*c8dee2aaSAndroid Build Coastguard Worker
334*c8dee2aaSAndroid Build Coastguard Worker## Classes
335*c8dee2aaSAndroid Build Coastguard Worker
336*c8dee2aaSAndroid Build Coastguard WorkerUnless there is a need for forward declaring something, class declarations
337*c8dee2aaSAndroid Build Coastguard Workershould be ordered `public`, `protected`, `private`. Each should be preceded by a
338*c8dee2aaSAndroid Build Coastguard Workernewline. Within each visibility section (`public`, `private`), fields should not
339*c8dee2aaSAndroid Build Coastguard Workerbe intermixed with methods. It's nice to keep all data fields together at the
340*c8dee2aaSAndroid Build Coastguard Workerend.
341*c8dee2aaSAndroid Build Coastguard Worker
342*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
343*c8dee2aaSAndroid Build Coastguard Worker
344*c8dee2aaSAndroid Build Coastguard Worker```
345*c8dee2aaSAndroid Build Coastguard Workerclass SkFoo {
346*c8dee2aaSAndroid Build Coastguard Worker
347*c8dee2aaSAndroid Build Coastguard Workerpublic:
348*c8dee2aaSAndroid Build Coastguard Worker    ...
349*c8dee2aaSAndroid Build Coastguard Worker
350*c8dee2aaSAndroid Build Coastguard Workerprotected:
351*c8dee2aaSAndroid Build Coastguard Worker    ...
352*c8dee2aaSAndroid Build Coastguard Worker
353*c8dee2aaSAndroid Build Coastguard Workerprivate:
354*c8dee2aaSAndroid Build Coastguard Worker    void barHelper(...);
355*c8dee2aaSAndroid Build Coastguard Worker    ...
356*c8dee2aaSAndroid Build Coastguard Worker
357*c8dee2aaSAndroid Build Coastguard Worker    SkBar fBar;
358*c8dee2aaSAndroid Build Coastguard Worker    ...
359*c8dee2aaSAndroid Build Coastguard Worker};
360*c8dee2aaSAndroid Build Coastguard Worker```
361*c8dee2aaSAndroid Build Coastguard Worker
362*c8dee2aaSAndroid Build Coastguard WorkerVirtual functions that are overridden in derived classes should use override,
363*c8dee2aaSAndroid Build Coastguard Workerand the virtual keyword should be omitted.
364*c8dee2aaSAndroid Build Coastguard Worker
365*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
366*c8dee2aaSAndroid Build Coastguard Worker
367*c8dee2aaSAndroid Build Coastguard Worker```
368*c8dee2aaSAndroid Build Coastguard Workervoid myVirtual() override {
369*c8dee2aaSAndroid Build Coastguard Worker}
370*c8dee2aaSAndroid Build Coastguard Worker```
371*c8dee2aaSAndroid Build Coastguard Worker
372*c8dee2aaSAndroid Build Coastguard WorkerIf you call a method on a parent type that must stand out as specifically the
373*c8dee2aaSAndroid Build Coastguard Workerparent's version of that method, such as `Parent::method()`. The `this->` that
374*c8dee2aaSAndroid Build Coastguard Workerwould normally be required before a method call on the current object is not
375*c8dee2aaSAndroid Build Coastguard Workernecessary when using a scope qualifier.
376*c8dee2aaSAndroid Build Coastguard Worker
377*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
378*c8dee2aaSAndroid Build Coastguard Worker
379*c8dee2aaSAndroid Build Coastguard Worker```
380*c8dee2aaSAndroid Build Coastguard Workerclass GrDillPickle : public GrPickle {
381*c8dee2aaSAndroid Build Coastguard Worker    ...
382*c8dee2aaSAndroid Build Coastguard Worker    bool onTasty() const override {
383*c8dee2aaSAndroid Build Coastguard Worker        return GrPickle::onTasty()
384*c8dee2aaSAndroid Build Coastguard Worker            && fFreshDill;
385*c8dee2aaSAndroid Build Coastguard Worker    }
386*c8dee2aaSAndroid Build Coastguard Worker    ...
387*c8dee2aaSAndroid Build Coastguard Workerprivate:
388*c8dee2aaSAndroid Build Coastguard Worker    bool fFreshDill;
389*c8dee2aaSAndroid Build Coastguard Worker};
390*c8dee2aaSAndroid Build Coastguard Worker```
391*c8dee2aaSAndroid Build Coastguard Worker
392*c8dee2aaSAndroid Build Coastguard WorkerConstructor initializers should be placed on the same line as the constructor,
393*c8dee2aaSAndroid Build Coastguard Workerif they fit. Otherwise, each initializer should be on its own line, indented,
394*c8dee2aaSAndroid Build Coastguard Workerwith punctuation placed before the initializer.
395*c8dee2aaSAndroid Build Coastguard Worker
396*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
397*c8dee2aaSAndroid Build Coastguard Worker
398*c8dee2aaSAndroid Build Coastguard Worker```
399*c8dee2aaSAndroid Build Coastguard WorkerGrDillPickle::GrDillPickle() : GrPickle(), fSize(kDefaultPickleSize) {}
400*c8dee2aaSAndroid Build Coastguard Worker
401*c8dee2aaSAndroid Build Coastguard WorkerGrDillPickle::GrDillPickle(float size, float crunchiness, const PickleOptions* options)
402*c8dee2aaSAndroid Build Coastguard Worker        : GrPickle(options)
403*c8dee2aaSAndroid Build Coastguard Worker        , fSize(size)
404*c8dee2aaSAndroid Build Coastguard Worker        , fCrunchiness(crunchiness) {}
405*c8dee2aaSAndroid Build Coastguard Worker```
406*c8dee2aaSAndroid Build Coastguard Worker
407*c8dee2aaSAndroid Build Coastguard WorkerConstructors that take one argument should almost always be explicit, with
408*c8dee2aaSAndroid Build Coastguard Workerexceptions made only for the (rare) automatic compatibility class.
409*c8dee2aaSAndroid Build Coastguard Worker
410*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
411*c8dee2aaSAndroid Build Coastguard Worker
412*c8dee2aaSAndroid Build Coastguard Worker```
413*c8dee2aaSAndroid Build Coastguard Workerclass Foo {
414*c8dee2aaSAndroid Build Coastguard Worker    explicit Foo(int x);  // Good.
415*c8dee2aaSAndroid Build Coastguard Worker    Foo(float y);         // Spooky implicit conversion from float to Foo.  No no no!
416*c8dee2aaSAndroid Build Coastguard Worker    ...
417*c8dee2aaSAndroid Build Coastguard Worker};
418*c8dee2aaSAndroid Build Coastguard Worker```
419*c8dee2aaSAndroid Build Coastguard Worker
420*c8dee2aaSAndroid Build Coastguard WorkerMethod calls within method calls should be prefixed with dereference of the
421*c8dee2aaSAndroid Build Coastguard Worker'this' pointer. For example:
422*c8dee2aaSAndroid Build Coastguard Worker
423*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
424*c8dee2aaSAndroid Build Coastguard Worker
425*c8dee2aaSAndroid Build Coastguard Worker```
426*c8dee2aaSAndroid Build Coastguard Workerthis->method();
427*c8dee2aaSAndroid Build Coastguard Worker```
428*c8dee2aaSAndroid Build Coastguard Worker
429*c8dee2aaSAndroid Build Coastguard WorkerA common pattern for virtual methods in Skia is to include a public non-virtual
430*c8dee2aaSAndroid Build Coastguard Worker(or final) method, paired with a private virtual method named "onMethodName".
431*c8dee2aaSAndroid Build Coastguard WorkerThis ensures that the base-class method is always invoked and gives it control
432*c8dee2aaSAndroid Build Coastguard Workerover how the virtual method is used, rather than relying on each subclass to
433*c8dee2aaSAndroid Build Coastguard Workercall `Parent::onMethodName()`. For example:
434*c8dee2aaSAndroid Build Coastguard Worker
435*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
436*c8dee2aaSAndroid Build Coastguard Worker
437*c8dee2aaSAndroid Build Coastguard Worker```
438*c8dee2aaSAndroid Build Coastguard Workerclass SkSandwich {
439*c8dee2aaSAndroid Build Coastguard Workerpublic:
440*c8dee2aaSAndroid Build Coastguard Worker    void assemble() {
441*c8dee2aaSAndroid Build Coastguard Worker        // All sandwiches must have bread on the top and bottom.
442*c8dee2aaSAndroid Build Coastguard Worker        this->addIngredient(kBread_Ingredient);
443*c8dee2aaSAndroid Build Coastguard Worker        this->onAssemble();
444*c8dee2aaSAndroid Build Coastguard Worker        this->addIngredient(kBread_Ingredient);
445*c8dee2aaSAndroid Build Coastguard Worker    }
446*c8dee2aaSAndroid Build Coastguard Worker    bool cook() {
447*c8dee2aaSAndroid Build Coastguard Worker        return this->onCook();
448*c8dee2aaSAndroid Build Coastguard Worker    }
449*c8dee2aaSAndroid Build Coastguard Worker
450*c8dee2aaSAndroid Build Coastguard Workerprivate:
451*c8dee2aaSAndroid Build Coastguard Worker    // All sandwiches must implement onAssemble.
452*c8dee2aaSAndroid Build Coastguard Worker    virtual void onAssemble() = 0;
453*c8dee2aaSAndroid Build Coastguard Worker    // Sandwiches can remain uncooked by default.
454*c8dee2aaSAndroid Build Coastguard Worker    virtual bool onCook() { return true; }
455*c8dee2aaSAndroid Build Coastguard Worker};
456*c8dee2aaSAndroid Build Coastguard Worker
457*c8dee2aaSAndroid Build Coastguard Workerclass SkGrilledCheese : public SkSandwich {
458*c8dee2aaSAndroid Build Coastguard Workerprivate:
459*c8dee2aaSAndroid Build Coastguard Worker    void onAssemble() override {
460*c8dee2aaSAndroid Build Coastguard Worker        this->addIngredient(kCheese_Ingredient);
461*c8dee2aaSAndroid Build Coastguard Worker    }
462*c8dee2aaSAndroid Build Coastguard Worker    bool onCook() override {
463*c8dee2aaSAndroid Build Coastguard Worker        return this->toastOnGriddle();
464*c8dee2aaSAndroid Build Coastguard Worker    }
465*c8dee2aaSAndroid Build Coastguard Worker};
466*c8dee2aaSAndroid Build Coastguard Worker
467*c8dee2aaSAndroid Build Coastguard Workerclass SkPeanutButterAndJelly : public SkSandwich {
468*c8dee2aaSAndroid Build Coastguard Workerprivate:
469*c8dee2aaSAndroid Build Coastguard Worker    void onAssemble() override {
470*c8dee2aaSAndroid Build Coastguard Worker        this->addIngredient(kPeanutButter_Ingredient);
471*c8dee2aaSAndroid Build Coastguard Worker        this->addIngredient(kGrapeJelly_Ingredient);
472*c8dee2aaSAndroid Build Coastguard Worker    }
473*c8dee2aaSAndroid Build Coastguard Worker};
474*c8dee2aaSAndroid Build Coastguard Worker```
475*c8dee2aaSAndroid Build Coastguard Worker
476*c8dee2aaSAndroid Build Coastguard Worker## Integer Types
477*c8dee2aaSAndroid Build Coastguard Worker
478*c8dee2aaSAndroid Build Coastguard WorkerWe follow the Google C++ guide for ints and are slowly making older code conform
479*c8dee2aaSAndroid Build Coastguard Workerto this
480*c8dee2aaSAndroid Build Coastguard Worker
481*c8dee2aaSAndroid Build Coastguard Worker(https://google.github.io/styleguide/cppguide.html#Integer_Types)
482*c8dee2aaSAndroid Build Coastguard Worker
483*c8dee2aaSAndroid Build Coastguard WorkerSummary: Use `int` unless you have need a guarantee on the bit count, then use
484*c8dee2aaSAndroid Build Coastguard Worker`stdint.h` types (`int32_t`, etc). Assert that counts, etc are not negative
485*c8dee2aaSAndroid Build Coastguard Workerinstead of using unsigned. Bitfields use `uint32_t` unless they have to be made
486*c8dee2aaSAndroid Build Coastguard Workershorter for packing or performance reasons.
487*c8dee2aaSAndroid Build Coastguard Worker
488*c8dee2aaSAndroid Build Coastguard Worker## Function Parameters
489*c8dee2aaSAndroid Build Coastguard Worker
490*c8dee2aaSAndroid Build Coastguard WorkerMandatory constant object parameters are passed to functions as const
491*c8dee2aaSAndroid Build Coastguard Workerreferences. Optional constant object parameters are passed to functions as const
492*c8dee2aaSAndroid Build Coastguard Workerpointers. Mutable object parameters are passed to functions as pointers. We very
493*c8dee2aaSAndroid Build Coastguard Workerrarely pass anything by non-const reference.
494*c8dee2aaSAndroid Build Coastguard Worker
495*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
496*c8dee2aaSAndroid Build Coastguard Worker
497*c8dee2aaSAndroid Build Coastguard Worker```
498*c8dee2aaSAndroid Build Coastguard Worker// src and paint are optional
499*c8dee2aaSAndroid Build Coastguard Workervoid SkCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
500*c8dee2aaSAndroid Build Coastguard Worker                              const SkRect& dst, const SkPaint* paint = nullptr);
501*c8dee2aaSAndroid Build Coastguard Worker
502*c8dee2aaSAndroid Build Coastguard Worker// metrics is mutable (it is changed by the method)
503*c8dee2aaSAndroid Build Coastguard WorkerSkScalar SkPaint::getFontMetrics(FontMetric* metrics, SkScalar scale) const;
504*c8dee2aaSAndroid Build Coastguard Worker
505*c8dee2aaSAndroid Build Coastguard Worker```
506*c8dee2aaSAndroid Build Coastguard Worker
507*c8dee2aaSAndroid Build Coastguard WorkerIf function arguments or parameters do not all fit on one line, the overflowing
508*c8dee2aaSAndroid Build Coastguard Workerparameters may be lined up with the first parameter on the next line
509*c8dee2aaSAndroid Build Coastguard Worker
510*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
511*c8dee2aaSAndroid Build Coastguard Worker
512*c8dee2aaSAndroid Build Coastguard Worker```
513*c8dee2aaSAndroid Build Coastguard Workervoid drawBitmapRect(const SkBitmap& bitmap, const SkRect& dst,
514*c8dee2aaSAndroid Build Coastguard Worker                    const SkPaint* paint = nullptr) {
515*c8dee2aaSAndroid Build Coastguard Worker    this->drawBitmapRectToRect(bitmap, nullptr, dst, paint,
516*c8dee2aaSAndroid Build Coastguard Worker                               kNone_DrawBitmapRectFlag);
517*c8dee2aaSAndroid Build Coastguard Worker}
518*c8dee2aaSAndroid Build Coastguard Worker```
519*c8dee2aaSAndroid Build Coastguard Worker
520*c8dee2aaSAndroid Build Coastguard Workeror all parameters placed on the next line and indented eight spaces
521*c8dee2aaSAndroid Build Coastguard Worker
522*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify?-->
523*c8dee2aaSAndroid Build Coastguard Worker
524*c8dee2aaSAndroid Build Coastguard Worker```
525*c8dee2aaSAndroid Build Coastguard Workervoid drawBitmapRect(
526*c8dee2aaSAndroid Build Coastguard Worker        const SkBitmap& bitmap, const SkRect& dst, const SkPaint* paint = nullptr) {
527*c8dee2aaSAndroid Build Coastguard Worker    this->drawBitmapRectToRect(
528*c8dee2aaSAndroid Build Coastguard Worker            bitmap, nullptr, dst, paint, kNone_DrawBitmapRectFlag);
529*c8dee2aaSAndroid Build Coastguard Worker}
530*c8dee2aaSAndroid Build Coastguard Worker```
531*c8dee2aaSAndroid Build Coastguard Worker
532*c8dee2aaSAndroid Build Coastguard Worker## Python
533*c8dee2aaSAndroid Build Coastguard Worker
534*c8dee2aaSAndroid Build Coastguard WorkerPython code follows the
535*c8dee2aaSAndroid Build Coastguard Worker[Google Python Style Guide](https://google.github.io/styleguide/pyguide.html).
536*c8dee2aaSAndroid Build Coastguard Worker
537*c8dee2aaSAndroid Build Coastguard Worker## Folder Organiziation
538*c8dee2aaSAndroid Build Coastguard Worker
539*c8dee2aaSAndroid Build Coastguard WorkerSkia's public API should live in the `include` directory. Skia's private headers and implementation
540*c8dee2aaSAndroid Build Coastguard Workerfiles should live in the `src` directory. The `modules` directory contains extra features that are
541*c8dee2aaSAndroid Build Coastguard Workerbuilt on top of Skia (`modules/skcms` being an exception) and can be used by clients.
542*c8dee2aaSAndroid Build Coastguard WorkerPrivate utilities to test Skia live in `tools` and can be used for reference but should not be used
543*c8dee2aaSAndroid Build Coastguard Workerby clients.
544*c8dee2aaSAndroid Build Coastguard Worker
545*c8dee2aaSAndroid Build Coastguard WorkerNo header in `include` should depend on files in other directories (`modules/skcms` being an exception).
546*c8dee2aaSAndroid Build Coastguard WorkerThis is to prevent private symbols from leaking into client code via transitive dependencies.
547