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