Chromium Code Reviews

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

Issue 778453002: Remove backend factories (Closed) Base URL: https://skia.googlesource.com/skia.git@unichoice
Patch Set: cleanup Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkLightingImageFilter.h" 8 #include "SkLightingImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
11 #include "SkReadBuffer.h" 11 #include "SkReadBuffer.h"
12 #include "SkWriteBuffer.h" 12 #include "SkWriteBuffer.h"
13 #include "SkReadBuffer.h" 13 #include "SkReadBuffer.h"
14 #include "SkWriteBuffer.h" 14 #include "SkWriteBuffer.h"
15 #include "SkTypes.h" 15 #include "SkTypes.h"
16 16
17 #if SK_SUPPORT_GPU 17 #if SK_SUPPORT_GPU
18 #include "GrFragmentProcessor.h"
19 #include "GrInvariantOutput.h"
18 #include "effects/GrSingleTextureEffect.h" 20 #include "effects/GrSingleTextureEffect.h"
19 #include "gl/GrGLProcessor.h" 21 #include "gl/GrGLProcessor.h"
20 #include "gl/builders/GrGLProgramBuilder.h" 22 #include "gl/builders/GrGLProgramBuilder.h"
21 #include "GrFragmentProcessor.h"
22 #include "GrInvariantOutput.h"
23 #include "GrTBackendProcessorFactory.h"
24 23
25 class GrGLDiffuseLightingEffect; 24 class GrGLDiffuseLightingEffect;
26 class GrGLSpecularLightingEffect; 25 class GrGLSpecularLightingEffect;
27 26
28 // For brevity 27 // For brevity
29 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 28 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
30 #endif 29 #endif
31 30
32 namespace { 31 namespace {
33 32
(...skipping 333 matching lines...)
367 SkScalar surfaceScale, 366 SkScalar surfaceScale,
368 const SkMatrix& matrix, 367 const SkMatrix& matrix,
369 SkScalar kd) { 368 SkScalar kd) {
370 return SkNEW_ARGS(GrDiffuseLightingEffect, (texture, 369 return SkNEW_ARGS(GrDiffuseLightingEffect, (texture,
371 light, 370 light,
372 surfaceScale, 371 surfaceScale,
373 matrix, 372 matrix,
374 kd)); 373 kd));
375 } 374 }
376 375
377 static const char* Name() { return "DiffuseLighting"; } 376 virtual const char* name() const SK_OVERRIDE { return "DiffuseLighting"; }
378 377
379 typedef GrGLDiffuseLightingEffect GLProcessor; 378 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons t SK_OVERRIDE;
380 379
381 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE; 380 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE;
381
382 virtual uint32_t classID() const {
383 static uint32_t id = GenClassID();
384 return id;
385 }
386
382 SkScalar kd() const { return fKD; } 387 SkScalar kd() const { return fKD; }
383 388
384 private: 389 private:
385 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; 390 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
386 391
387 GrDiffuseLightingEffect(GrTexture* texture, 392 GrDiffuseLightingEffect(GrTexture* texture,
388 const SkLight* light, 393 const SkLight* light,
389 SkScalar surfaceScale, 394 SkScalar surfaceScale,
390 const SkMatrix& matrix, 395 const SkMatrix& matrix,
391 SkScalar kd); 396 SkScalar kd);
(...skipping 11 matching lines...)
403 const SkMatrix& matrix, 408 const SkMatrix& matrix,
404 SkScalar ks, 409 SkScalar ks,
405 SkScalar shininess) { 410 SkScalar shininess) {
406 return SkNEW_ARGS(GrSpecularLightingEffect, (texture, 411 return SkNEW_ARGS(GrSpecularLightingEffect, (texture,
407 light, 412 light,
408 surfaceScale, 413 surfaceScale,
409 matrix, 414 matrix,
410 ks, 415 ks,
411 shininess)); 416 shininess));
412 } 417 }
413 static const char* Name() { return "SpecularLighting"; }
414 418
415 typedef GrGLSpecularLightingEffect GLProcessor; 419 virtual const char* name() const SK_OVERRIDE { return "SpecularLighting"; }
416 420
417 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE; 421 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons t SK_OVERRIDE;
422
423 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE;
424
425 virtual uint32_t classID() const {
426 static uint32_t id = GenClassID();
427 return id;
428 }
429
418 SkScalar ks() const { return fKS; } 430 SkScalar ks() const { return fKS; }
419 SkScalar shininess() const { return fShininess; } 431 SkScalar shininess() const { return fShininess; }
420 432
421 private: 433 private:
422 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; 434 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
423 435
424 GrSpecularLightingEffect(GrTexture* texture, 436 GrSpecularLightingEffect(GrTexture* texture,
425 const SkLight* light, 437 const SkLight* light,
426 SkScalar surfaceScale, 438 SkScalar surfaceScale,
427 const SkMatrix& matrix, 439 const SkMatrix& matrix,
(...skipping 755 matching lines...)
1183 default: 1195 default:
1184 SkFAIL("Unexpected value."); 1196 SkFAIL("Unexpected value.");
1185 return NULL; 1197 return NULL;
1186 } 1198 }
1187 } 1199 }
1188 1200
1189 } 1201 }
1190 1202
1191 class GrGLLightingEffect : public GrGLFragmentProcessor { 1203 class GrGLLightingEffect : public GrGLFragmentProcessor {
1192 public: 1204 public:
1193 GrGLLightingEffect(const GrBackendProcessorFactory&, const GrProcessor&); 1205 GrGLLightingEffect(const GrProcessor&);
1194 virtual ~GrGLLightingEffect(); 1206 virtual ~GrGLLightingEffect();
1195 1207
1196 virtual void emitCode(GrGLFPBuilder*, 1208 virtual void emitCode(GrGLFPBuilder*,
1197 const GrFragmentProcessor&, 1209 const GrFragmentProcessor&,
1198 const char* outputColor, 1210 const char* outputColor,
1199 const char* inputColor, 1211 const char* inputColor,
1200 const TransformedCoordsArray&, 1212 const TransformedCoordsArray&,
1201 const TextureSamplerArray&) SK_OVERRIDE; 1213 const TextureSamplerArray&) SK_OVERRIDE;
1202 1214
1203 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe yBuilder* b); 1215 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe yBuilder* b);
(...skipping 11 matching lines...)
1215 1227
1216 UniformHandle fImageIncrementUni; 1228 UniformHandle fImageIncrementUni;
1217 UniformHandle fSurfaceScaleUni; 1229 UniformHandle fSurfaceScaleUni;
1218 GrGLLight* fLight; 1230 GrGLLight* fLight;
1219 }; 1231 };
1220 1232
1221 /////////////////////////////////////////////////////////////////////////////// 1233 ///////////////////////////////////////////////////////////////////////////////
1222 1234
1223 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { 1235 class GrGLDiffuseLightingEffect : public GrGLLightingEffect {
1224 public: 1236 public:
1225 GrGLDiffuseLightingEffect(const GrBackendProcessorFactory&, const GrProcesso r&); 1237 GrGLDiffuseLightingEffect(const GrProcessor&);
1226 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) SK_OVERRIDE; 1238 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) SK_OVERRIDE;
1227 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE; 1239 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
1228 1240
1229 private: 1241 private:
1230 typedef GrGLLightingEffect INHERITED; 1242 typedef GrGLLightingEffect INHERITED;
1231 1243
1232 UniformHandle fKDUni; 1244 UniformHandle fKDUni;
1233 }; 1245 };
1234 1246
1235 /////////////////////////////////////////////////////////////////////////////// 1247 ///////////////////////////////////////////////////////////////////////////////
1236 1248
1237 class GrGLSpecularLightingEffect : public GrGLLightingEffect { 1249 class GrGLSpecularLightingEffect : public GrGLLightingEffect {
1238 public: 1250 public:
1239 GrGLSpecularLightingEffect(const GrBackendProcessorFactory&, const GrProcess or&); 1251 GrGLSpecularLightingEffect(const GrProcessor&);
1240 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) SK_OVERRIDE; 1252 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) SK_OVERRIDE;
1241 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE; 1253 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
1242 1254
1243 private: 1255 private:
1244 typedef GrGLLightingEffect INHERITED; 1256 typedef GrGLLightingEffect INHERITED;
1245 1257
1246 UniformHandle fKSUni; 1258 UniformHandle fKSUni;
1247 UniformHandle fShininessUni; 1259 UniformHandle fShininessUni;
1248 }; 1260 };
1249 1261
(...skipping 26 matching lines...)
1276 /////////////////////////////////////////////////////////////////////////////// 1288 ///////////////////////////////////////////////////////////////////////////////
1277 1289
1278 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, 1290 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture,
1279 const SkLight* light, 1291 const SkLight* light,
1280 SkScalar surfaceScale, 1292 SkScalar surfaceScale,
1281 const SkMatrix& matrix, 1293 const SkMatrix& matrix,
1282 SkScalar kd) 1294 SkScalar kd)
1283 : INHERITED(texture, light, surfaceScale, matrix), fKD(kd) { 1295 : INHERITED(texture, light, surfaceScale, matrix), fKD(kd) {
1284 } 1296 }
1285 1297
1286 const GrBackendFragmentProcessorFactory& GrDiffuseLightingEffect::getFactory() c onst {
1287 return GrTBackendFragmentProcessorFactory<GrDiffuseLightingEffect>::getInsta nce();
1288 }
1289
1290 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { 1298 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
1291 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); 1299 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>();
1292 return INHERITED::onIsEqual(sBase) && 1300 return INHERITED::onIsEqual(sBase) &&
1293 this->kd() == s.kd(); 1301 this->kd() == s.kd();
1294 } 1302 }
1295 1303
1304 void GrDiffuseLightingEffect::getGLProcessorKey(const GrGLCaps& caps,
1305 GrProcessorKeyBuilder* b) const {
1306 GrGLDiffuseLightingEffect::GenKey(*this, caps, b);
1307 }
1308
1309 GrGLFragmentProcessor* GrDiffuseLightingEffect::createGLInstance() const {
1310 return SkNEW_ARGS(GrGLDiffuseLightingEffect, (*this));
1311 }
1312
1296 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDiffuseLightingEffect); 1313 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDiffuseLightingEffect);
1297 1314
1298 GrFragmentProcessor* GrDiffuseLightingEffect::TestCreate(SkRandom* random, 1315 GrFragmentProcessor* GrDiffuseLightingEffect::TestCreate(SkRandom* random,
1299 GrContext* context, 1316 GrContext* context,
1300 const GrDrawTargetCaps&, 1317 const GrDrawTargetCaps&,
1301 GrTexture* textures[]) { 1318 GrTexture* textures[]) {
1302 SkScalar surfaceScale = random->nextSScalar1(); 1319 SkScalar surfaceScale = random->nextSScalar1();
1303 SkScalar kd = random->nextUScalar1(); 1320 SkScalar kd = random->nextUScalar1();
1304 SkAutoTUnref<SkLight> light(create_random_light(random)); 1321 SkAutoTUnref<SkLight> light(create_random_light(random));
1305 SkMatrix matrix; 1322 SkMatrix matrix;
1306 for (int i = 0; i < 9; i++) { 1323 for (int i = 0; i < 9; i++) {
1307 matrix[i] = random->nextUScalar1(); 1324 matrix[i] = random->nextUScalar1();
1308 } 1325 }
1309 return GrDiffuseLightingEffect::Create(textures[GrProcessorUnitTest::kAlphaT extureIdx], 1326 return GrDiffuseLightingEffect::Create(textures[GrProcessorUnitTest::kAlphaT extureIdx],
1310 light, surfaceScale, matrix, kd); 1327 light, surfaceScale, matrix, kd);
1311 } 1328 }
1312 1329
1313 1330
1314 /////////////////////////////////////////////////////////////////////////////// 1331 ///////////////////////////////////////////////////////////////////////////////
1315 1332
1316 GrGLLightingEffect::GrGLLightingEffect(const GrBackendProcessorFactory& factory, 1333 GrGLLightingEffect::GrGLLightingEffect(const GrProcessor& fp) {
1317 const GrProcessor& fp)
1318 : INHERITED(factory) {
1319 const GrLightingEffect& m = fp.cast<GrLightingEffect>(); 1334 const GrLightingEffect& m = fp.cast<GrLightingEffect>();
1320 fLight = m.light()->createGLLight(); 1335 fLight = m.light()->createGLLight();
1321 } 1336 }
1322 1337
1323 GrGLLightingEffect::~GrGLLightingEffect() { 1338 GrGLLightingEffect::~GrGLLightingEffect() {
1324 delete fLight; 1339 delete fLight;
1325 } 1340 }
1326 1341
1327 void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder, 1342 void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder,
1328 const GrFragmentProcessor&, 1343 const GrFragmentProcessor&,
(...skipping 104 matching lines...)
1433 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he ight()); 1448 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he ight());
1434 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); 1449 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale());
1435 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting. filterMatrix())); 1450 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting. filterMatrix()));
1436 fLight->setData(pdman, transformedLight); 1451 fLight->setData(pdman, transformedLight);
1437 } 1452 }
1438 1453
1439 /////////////////////////////////////////////////////////////////////////////// 1454 ///////////////////////////////////////////////////////////////////////////////
1440 1455
1441 /////////////////////////////////////////////////////////////////////////////// 1456 ///////////////////////////////////////////////////////////////////////////////
1442 1457
1443 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendProcessorFac tory& factory, 1458 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc)
1444 const GrProcessor& proc) 1459 : INHERITED(proc) {
1445 : INHERITED(factory, proc) {
1446 } 1460 }
1447 1461
1448 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString* funcName) { 1462 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString* funcName) {
1449 const char* kd; 1463 const char* kd;
1450 fKDUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1464 fKDUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1451 kFloat_GrSLType, 1465 kFloat_GrSLType,
1452 "KD", 1466 "KD",
1453 &kd); 1467 &kd);
1454 1468
1455 static const GrGLShaderVar gLightArgs[] = { 1469 static const GrGLShaderVar gLightArgs[] = {
(...skipping 25 matching lines...)
1481 const SkLight* light, 1495 const SkLight* light,
1482 SkScalar surfaceScale, 1496 SkScalar surfaceScale,
1483 const SkMatrix& matrix, 1497 const SkMatrix& matrix,
1484 SkScalar ks, 1498 SkScalar ks,
1485 SkScalar shininess) 1499 SkScalar shininess)
1486 : INHERITED(texture, light, surfaceScale, matrix), 1500 : INHERITED(texture, light, surfaceScale, matrix),
1487 fKS(ks), 1501 fKS(ks),
1488 fShininess(shininess) { 1502 fShininess(shininess) {
1489 } 1503 }
1490 1504
1491 const GrBackendFragmentProcessorFactory& GrSpecularLightingEffect::getFactory() const {
1492 return GrTBackendFragmentProcessorFactory<GrSpecularLightingEffect>::getInst ance();
1493 }
1494
1495 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { 1505 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
1496 const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); 1506 const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>();
1497 return INHERITED::onIsEqual(sBase) && 1507 return INHERITED::onIsEqual(sBase) &&
1498 this->ks() == s.ks() && 1508 this->ks() == s.ks() &&
1499 this->shininess() == s.shininess(); 1509 this->shininess() == s.shininess();
1500 } 1510 }
1501 1511
1512 void GrSpecularLightingEffect::getGLProcessorKey(const GrGLCaps& caps,
1513 GrProcessorKeyBuilder* b) const {
1514 GrGLSpecularLightingEffect::GenKey(*this, caps, b);
1515 }
1516
1517 GrGLFragmentProcessor* GrSpecularLightingEffect::createGLInstance() const {
1518 return SkNEW_ARGS(GrGLSpecularLightingEffect, (*this));
1519 }
1520
1502 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSpecularLightingEffect); 1521 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSpecularLightingEffect);
1503 1522
1504 GrFragmentProcessor* GrSpecularLightingEffect::TestCreate(SkRandom* random, 1523 GrFragmentProcessor* GrSpecularLightingEffect::TestCreate(SkRandom* random,
1505 GrContext* context, 1524 GrContext* context,
1506 const GrDrawTargetCaps &, 1525 const GrDrawTargetCaps &,
1507 GrTexture* textures[]) { 1526 GrTexture* textures[]) {
1508 SkScalar surfaceScale = random->nextSScalar1(); 1527 SkScalar surfaceScale = random->nextSScalar1();
1509 SkScalar ks = random->nextUScalar1(); 1528 SkScalar ks = random->nextUScalar1();
1510 SkScalar shininess = random->nextUScalar1(); 1529 SkScalar shininess = random->nextUScalar1();
1511 SkAutoTUnref<SkLight> light(create_random_light(random)); 1530 SkAutoTUnref<SkLight> light(create_random_light(random));
1512 SkMatrix matrix; 1531 SkMatrix matrix;
1513 for (int i = 0; i < 9; i++) { 1532 for (int i = 0; i < 9; i++) {
1514 matrix[i] = random->nextUScalar1(); 1533 matrix[i] = random->nextUScalar1();
1515 } 1534 }
1516 return GrSpecularLightingEffect::Create(textures[GrProcessorUnitTest::kAlpha TextureIdx], 1535 return GrSpecularLightingEffect::Create(textures[GrProcessorUnitTest::kAlpha TextureIdx],
1517 light, surfaceScale, matrix, ks, shi niness); 1536 light, surfaceScale, matrix, ks, shi niness);
1518 } 1537 }
1519 1538
1520 /////////////////////////////////////////////////////////////////////////////// 1539 ///////////////////////////////////////////////////////////////////////////////
1521 1540
1522 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendProcessorF actory& factory, 1541 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc)
1523 const GrProcessor& proc) 1542 : INHERITED(proc) {
1524 : INHERITED(factory, proc) {
1525 } 1543 }
1526 1544
1527 void GrGLSpecularLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString* funcName) { 1545 void GrGLSpecularLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString* funcName) {
1528 const char* ks; 1546 const char* ks;
1529 const char* shininess; 1547 const char* shininess;
1530 1548
1531 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1549 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1532 kFloat_GrSLType, "KS", &ks); 1550 kFloat_GrSLType, "KS", &ks);
1533 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility , 1551 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility ,
1534 kFloat_GrSLType, "Shininess", &shininess ); 1552 kFloat_GrSLType, "Shininess", &shininess );
(...skipping 146 matching lines...)
1681 1699
1682 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); 1700 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight);
1683 } 1701 }
1684 1702
1685 #endif 1703 #endif
1686 1704
1687 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) 1705 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
1688 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) 1706 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
1689 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) 1707 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
1690 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1708 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW

Powered by Google App Engine