Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1786)

Side by Side Diff: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp

Issue 247833003: Fix double to SkScalar issues in SkTwoPointConicalGradient_gpu.cpp (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gm/gradients_2pt_conical.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkTwoPointConicalGradient_gpu.h" 9 #include "SkTwoPointConicalGradient_gpu.h"
10 10
11 #include "SkTwoPointConicalGradient.h" 11 #include "SkTwoPointConicalGradient.h"
12 12
13 #if SK_SUPPORT_GPU 13 #if SK_SUPPORT_GPU
14 #include "GrTBackendEffectFactory.h" 14 #include "GrTBackendEffectFactory.h"
15 // For brevity 15 // For brevity
16 typedef GrGLUniformManager::UniformHandle UniformHandle; 16 typedef GrGLUniformManager::UniformHandle UniformHandle;
17 17
18 static const SkScalar kErrorTol = 0.00001; 18 static const SkScalar kErrorTol = 0.00001f;
19 19
20 /** 20 /**
21 * We have three general cases for 2pt conical gradients. First we always assume that 21 * We have three general cases for 2pt conical gradients. First we always assume that
22 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle 22 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle
23 * is completely enclosed by the end circle. The second case (kOutside_) is the case 23 * is completely enclosed by the end circle. The second case (kOutside_) is the case
24 * when the start circle is either completely outside the end circle or the circ les 24 * when the start circle is either completely outside the end circle or the circ les
25 * overlap. The final case (kEdge_) is when the start circle is inside the end o ne, 25 * overlap. The final case (kEdge_) is when the start circle is inside the end o ne,
26 * but the two are just barely touching at 1 point along their edges. 26 * but the two are just barely touching at 1 point along their edges.
27 */ 27 */
28 enum ConicalType { 28 enum ConicalType {
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 298
299 static ConicalType set_matrix_focal_conical(const SkTwoPointConicalGradient& sha der, 299 static ConicalType set_matrix_focal_conical(const SkTwoPointConicalGradient& sha der,
300 SkMatrix* invLMatrix, SkScalar* foca lX) { 300 SkMatrix* invLMatrix, SkScalar* foca lX) {
301 // Inverse of the current local matrix is passed in then, 301 // Inverse of the current local matrix is passed in then,
302 // translate, scale, and rotate such that endCircle is unit circle on x-axis , 302 // translate, scale, and rotate such that endCircle is unit circle on x-axis ,
303 // and focal point is at the origin. 303 // and focal point is at the origin.
304 ConicalType conicalType; 304 ConicalType conicalType;
305 const SkPoint& focal = shader.getStartCenter(); 305 const SkPoint& focal = shader.getStartCenter();
306 const SkPoint& centerEnd = shader.getEndCenter(); 306 const SkPoint& centerEnd = shader.getEndCenter();
307 SkScalar radius = shader.getEndRadius(); 307 SkScalar radius = shader.getEndRadius();
308 SkScalar invRadius = 1.0 / radius; 308 SkScalar invRadius = 1.f / radius;
309 309
310 SkMatrix matrix; 310 SkMatrix matrix;
311 311
312 matrix.setTranslate(-centerEnd.fX, -centerEnd.fY); 312 matrix.setTranslate(-centerEnd.fX, -centerEnd.fY);
313 matrix.postScale(invRadius, invRadius); 313 matrix.postScale(invRadius, invRadius);
314 314
315 SkPoint focalTrans; 315 SkPoint focalTrans;
316 matrix.mapPoints(&focalTrans, &focal, 1); 316 matrix.mapPoints(&focalTrans, &focal, 1);
317 *focalX = focalTrans.length(); 317 *focalX = focalTrans.length();
318 318
319 if (0.0 != *focalX) { 319 if (0.f != *focalX) {
320 SkScalar invFocalX = SkScalarInvert(*focalX); 320 SkScalar invFocalX = SkScalarInvert(*focalX);
321 SkMatrix rot; 321 SkMatrix rot;
322 rot.setSinCos(-SkScalarMul(invFocalX, focalTrans.fY), 322 rot.setSinCos(-SkScalarMul(invFocalX, focalTrans.fY),
323 SkScalarMul(invFocalX, focalTrans.fX)); 323 SkScalarMul(invFocalX, focalTrans.fX));
324 matrix.postConcat(rot); 324 matrix.postConcat(rot);
325 } 325 }
326 326
327 matrix.postTranslate(-(*focalX), 0.0); 327 matrix.postTranslate(-(*focalX), 0.f);
328 328
329 // If the focal point is touching the edge of the circle it will 329 // If the focal point is touching the edge of the circle it will
330 // cause a degenerate case that must be handled separately 330 // cause a degenerate case that must be handled separately
331 // 5 * kErrorTol was picked after manual testing the stability trade off 331 // 5 * kErrorTol was picked after manual testing the stability trade off
332 // versus the linear approx used in the Edge Shader 332 // versus the linear approx used in the Edge Shader
333 if (SkScalarAbs(1.0 - (*focalX)) < 5 * kErrorTol) { 333 if (SkScalarAbs(1.f - (*focalX)) < 5 * kErrorTol) {
334 return kEdge_ConicalType; 334 return kEdge_ConicalType;
335 } 335 }
336 336
337 // Scale factor 1 / (1 - focalX * focalX) 337 // Scale factor 1 / (1 - focalX * focalX)
338 SkScalar oneMinusF2 = 1.0 - SkScalarMul(*focalX, *focalX); 338 SkScalar oneMinusF2 = 1.f - SkScalarMul(*focalX, *focalX);
339 SkScalar s = SkScalarDiv(1.0, oneMinusF2); 339 SkScalar s = SkScalarDiv(1.f, oneMinusF2);
340 340
341 341
342 if (s >= 0.0) { 342 if (s >= 0.f) {
343 conicalType = kInside_ConicalType; 343 conicalType = kInside_ConicalType;
344 matrix.postScale(s, s * SkScalarSqrt(oneMinusF2)); 344 matrix.postScale(s, s * SkScalarSqrt(oneMinusF2));
345 } else { 345 } else {
346 conicalType = kOutside_ConicalType; 346 conicalType = kOutside_ConicalType;
347 matrix.postScale(s, s); 347 matrix.postScale(s, s);
348 } 348 }
349 349
350 invLMatrix->postConcat(matrix); 350 invLMatrix->postConcat(matrix);
351 351
352 return conicalType; 352 return conicalType;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 return GrTBackendEffectFactory<FocalOutside2PtConicalEffect>::getInstance(); 441 return GrTBackendEffectFactory<FocalOutside2PtConicalEffect>::getInstance();
442 } 442 }
443 443
444 GR_DEFINE_EFFECT_TEST(FocalOutside2PtConicalEffect); 444 GR_DEFINE_EFFECT_TEST(FocalOutside2PtConicalEffect);
445 445
446 GrEffectRef* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random, 446 GrEffectRef* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random,
447 GrContext* context, 447 GrContext* context,
448 const GrDrawTargetCaps&, 448 const GrDrawTargetCaps&,
449 GrTexture**) { 449 GrTexture**) {
450 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 450 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
451 SkScalar radius1 = 0.0; 451 SkScalar radius1 = 0.f;
452 SkPoint center2; 452 SkPoint center2;
453 SkScalar radius2; 453 SkScalar radius2;
454 do { 454 do {
455 center2.set(random->nextUScalar1(), random->nextUScalar1()); 455 center2.set(random->nextUScalar1(), random->nextUScalar1());
456 // Need to make sure the centers are not the same or else focal point wi ll be inside 456 // Need to make sure the centers are not the same or else focal point wi ll be inside
457 } while (center1 == center2); 457 } while (center1 == center2);
458 SkPoint diff = center2 - center1; 458 SkPoint diff = center2 - center1;
459 SkScalar diffLen = diff.length(); 459 SkScalar diffLen = diff.length();
460 // Below makes sure that the focal point is not contained within circle two 460 // Below makes sure that the focal point is not contained within circle two
461 radius2 = random->nextRangeF(0.0, diffLen); 461 radius2 = random->nextRangeF(0.f, diffLen);
462 462
463 SkColor colors[kMaxRandomGradientColors]; 463 SkColor colors[kMaxRandomGradientColors];
464 SkScalar stopsArray[kMaxRandomGradientColors]; 464 SkScalar stopsArray[kMaxRandomGradientColors];
465 SkScalar* stops = stopsArray; 465 SkScalar* stops = stopsArray;
466 SkShader::TileMode tm; 466 SkShader::TileMode tm;
467 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 467 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
468 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 468 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
469 center 2, radius2, 469 center 2, radius2,
470 colors , stops, colorCount, 470 colors , stops, colorCount,
471 tm)); 471 tm));
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 } 531 }
532 532
533 void GLFocalOutside2PtConicalEffect::setData(const GrGLUniformManager& uman, 533 void GLFocalOutside2PtConicalEffect::setData(const GrGLUniformManager& uman,
534 const GrDrawEffect& drawEffect) { 534 const GrDrawEffect& drawEffect) {
535 INHERITED::setData(uman, drawEffect); 535 INHERITED::setData(uman, drawEffect);
536 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>(); 536 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>();
537 SkASSERT(data.isFlipped() == fIsFlipped); 537 SkASSERT(data.isFlipped() == fIsFlipped);
538 SkScalar focal = data.focal(); 538 SkScalar focal = data.focal();
539 539
540 if (fCachedFocal != focal) { 540 if (fCachedFocal != focal) {
541 SkScalar oneMinus2F = 1.0 - SkScalarMul(focal, focal); 541 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal);
542 542
543 float values[2] = { 543 float values[2] = {
544 SkScalarToFloat(focal), 544 SkScalarToFloat(focal),
545 SkScalarToFloat(oneMinus2F), 545 SkScalarToFloat(oneMinus2F),
546 }; 546 };
547 547
548 uman.set1fv(fParamUni, 2, values); 548 uman.set1fv(fParamUni, 2, values);
549 fCachedFocal = focal; 549 fCachedFocal = focal;
550 } 550 }
551 } 551 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 return GrTBackendEffectFactory<FocalInside2PtConicalEffect>::getInstance(); 648 return GrTBackendEffectFactory<FocalInside2PtConicalEffect>::getInstance();
649 } 649 }
650 650
651 GR_DEFINE_EFFECT_TEST(FocalInside2PtConicalEffect); 651 GR_DEFINE_EFFECT_TEST(FocalInside2PtConicalEffect);
652 652
653 GrEffectRef* FocalInside2PtConicalEffect::TestCreate(SkRandom* random, 653 GrEffectRef* FocalInside2PtConicalEffect::TestCreate(SkRandom* random,
654 GrContext* context, 654 GrContext* context,
655 const GrDrawTargetCaps&, 655 const GrDrawTargetCaps&,
656 GrTexture**) { 656 GrTexture**) {
657 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 657 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
658 SkScalar radius1 = 0.0; 658 SkScalar radius1 = 0.f;
659 SkPoint center2; 659 SkPoint center2;
660 SkScalar radius2; 660 SkScalar radius2;
661 do { 661 do {
662 center2.set(random->nextUScalar1(), random->nextUScalar1()); 662 center2.set(random->nextUScalar1(), random->nextUScalar1());
663 // Below makes sure radius2 is larger enouch such that the focal point 663 // Below makes sure radius2 is larger enouch such that the focal point
664 // is inside the end circle 664 // is inside the end circle
665 SkScalar increase = random->nextUScalar1(); 665 SkScalar increase = random->nextUScalar1();
666 SkPoint diff = center2 - center1; 666 SkPoint diff = center2 - center1;
667 SkScalar diffLen = diff.length(); 667 SkScalar diffLen = diff.length();
668 radius2 = diffLen + increase; 668 radius2 = diffLen + increase;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 // translate and scale such that start circle is on the origin and has radiu s 1 751 // translate and scale such that start circle is on the origin and has radiu s 1
752 const SkPoint& centerStart = shader.getStartCenter(); 752 const SkPoint& centerStart = shader.getStartCenter();
753 const SkPoint& centerEnd = shader.getEndCenter(); 753 const SkPoint& centerEnd = shader.getEndCenter();
754 SkScalar radiusStart = shader.getStartRadius(); 754 SkScalar radiusStart = shader.getStartRadius();
755 SkScalar radiusEnd = shader.getEndRadius(); 755 SkScalar radiusEnd = shader.getEndRadius();
756 756
757 SkMatrix matrix; 757 SkMatrix matrix;
758 758
759 matrix.setTranslate(-centerStart.fX, -centerStart.fY); 759 matrix.setTranslate(-centerStart.fX, -centerStart.fY);
760 760
761 SkScalar invStartRad = 1.0 / radiusStart; 761 SkScalar invStartRad = 1.f / radiusStart;
762 matrix.postScale(invStartRad, invStartRad); 762 matrix.postScale(invStartRad, invStartRad);
763 763
764 radiusEnd /= radiusStart; 764 radiusEnd /= radiusStart;
765 765
766 SkPoint centerEndTrans; 766 SkPoint centerEndTrans;
767 matrix.mapPoints(&centerEndTrans, &centerEnd, 1); 767 matrix.mapPoints(&centerEndTrans, &centerEnd, 1);
768 768
769 SkScalar A = centerEndTrans.fX * centerEndTrans.fX + centerEndTrans.fY * cen terEndTrans.fY 769 SkScalar A = centerEndTrans.fX * centerEndTrans.fX + centerEndTrans.fY * cen terEndTrans.fY
770 - radiusEnd * radiusEnd + 2 * radiusEnd - 1; 770 - radiusEnd * radiusEnd + 2 * radiusEnd - 1;
771 771
772 // Check to see if start circle is inside end circle with edges touching. 772 // Check to see if start circle is inside end circle with edges touching.
773 // If touching we return that it is of kEdge_ConicalType, and leave the matr ix setting 773 // If touching we return that it is of kEdge_ConicalType, and leave the matr ix setting
774 // to the edge shader. 5 * kErrorTol was picked after manual testing so that C = 1 / A 774 // to the edge shader. 5 * kErrorTol was picked after manual testing so that C = 1 / A
775 // is stable, and the linear approximation used in the Edge shader is still accurate. 775 // is stable, and the linear approximation used in the Edge shader is still accurate.
776 if (SkScalarAbs(A) < 5 * kErrorTol) { 776 if (SkScalarAbs(A) < 5 * kErrorTol) {
777 return kEdge_ConicalType; 777 return kEdge_ConicalType;
778 } 778 }
779 779
780 SkScalar C = 1.0 / A; 780 SkScalar C = 1.f / A;
781 SkScalar B = (radiusEnd - 1.0) * C; 781 SkScalar B = (radiusEnd - 1.f) * C;
782 782
783 matrix.postScale(C, C); 783 matrix.postScale(C, C);
784 784
785 invLMatrix->postConcat(matrix); 785 invLMatrix->postConcat(matrix);
786 786
787 info->fCenterEnd = centerEndTrans; 787 info->fCenterEnd = centerEndTrans;
788 info->fA = A; 788 info->fA = A;
789 info->fB = B; 789 info->fB = B;
790 info->fC = C; 790 info->fC = C;
791 791
792 // if A ends up being negative, the start circle is contained completely ins ide the end cirlce 792 // if A ends up being negative, the start circle is contained completely ins ide the end cirlce
793 if (A < 0.0) { 793 if (A < 0.f) {
794 return kInside_ConicalType; 794 return kInside_ConicalType;
795 } 795 }
796 return kOutside_ConicalType; 796 return kOutside_ConicalType;
797 } 797 }
798 798
799 class GLCircleInside2PtConicalEffect; 799 class GLCircleInside2PtConicalEffect;
800 800
801 class CircleInside2PtConicalEffect : public GrGradientEffect { 801 class CircleInside2PtConicalEffect : public GrGradientEffect {
802 public: 802 public:
803 803
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 return GrTBackendEffectFactory<CircleInside2PtConicalEffect>::getInstance(); 890 return GrTBackendEffectFactory<CircleInside2PtConicalEffect>::getInstance();
891 } 891 }
892 892
893 GR_DEFINE_EFFECT_TEST(CircleInside2PtConicalEffect); 893 GR_DEFINE_EFFECT_TEST(CircleInside2PtConicalEffect);
894 894
895 GrEffectRef* CircleInside2PtConicalEffect::TestCreate(SkRandom* random, 895 GrEffectRef* CircleInside2PtConicalEffect::TestCreate(SkRandom* random,
896 GrContext* context, 896 GrContext* context,
897 const GrDrawTargetCaps&, 897 const GrDrawTargetCaps&,
898 GrTexture**) { 898 GrTexture**) {
899 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 899 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
900 SkScalar radius1 = random->nextUScalar1() + 0.0001; // make sure radius1 != 0 900 SkScalar radius1 = random->nextUScalar1() + 0.0001f; // make sure radius1 != 0
901 SkPoint center2; 901 SkPoint center2;
902 SkScalar radius2; 902 SkScalar radius2;
903 do { 903 do {
904 center2.set(random->nextUScalar1(), random->nextUScalar1()); 904 center2.set(random->nextUScalar1(), random->nextUScalar1());
905 // Below makes sure that circle one is contained within circle two 905 // Below makes sure that circle one is contained within circle two
906 SkScalar increase = random->nextUScalar1(); 906 SkScalar increase = random->nextUScalar1();
907 SkPoint diff = center2 - center1; 907 SkPoint diff = center2 - center1;
908 SkScalar diffLen = diff.length(); 908 SkScalar diffLen = diff.length();
909 radius2 = radius1 + diffLen + increase; 909 radius2 = radius1 + diffLen + increase;
910 // If the circles are identical the factory will give us an empty shader . 910 // If the circles are identical the factory will give us an empty shader .
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 return GrTBackendEffectFactory<CircleOutside2PtConicalEffect>::getInstance() ; 1117 return GrTBackendEffectFactory<CircleOutside2PtConicalEffect>::getInstance() ;
1118 } 1118 }
1119 1119
1120 GR_DEFINE_EFFECT_TEST(CircleOutside2PtConicalEffect); 1120 GR_DEFINE_EFFECT_TEST(CircleOutside2PtConicalEffect);
1121 1121
1122 GrEffectRef* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random, 1122 GrEffectRef* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random,
1123 GrContext* context, 1123 GrContext* context,
1124 const GrDrawTargetCaps&, 1124 const GrDrawTargetCaps&,
1125 GrTexture**) { 1125 GrTexture**) {
1126 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 1126 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
1127 SkScalar radius1 = random->nextUScalar1() + 0.0001; // make sure radius1 != 0 1127 SkScalar radius1 = random->nextUScalar1() + 0.0001f; // make sure radius1 != 0
1128 SkPoint center2; 1128 SkPoint center2;
1129 SkScalar radius2; 1129 SkScalar radius2;
1130 SkScalar diffLen; 1130 SkScalar diffLen;
1131 do { 1131 do {
1132 center2.set(random->nextUScalar1(), random->nextUScalar1()); 1132 center2.set(random->nextUScalar1(), random->nextUScalar1());
1133 // If the circles share a center than we can't be in the outside case 1133 // If the circles share a center than we can't be in the outside case
1134 } while (center1 == center2); 1134 } while (center1 == center2);
1135 SkPoint diff = center2 - center1; 1135 SkPoint diff = center2 - center1;
1136 diffLen = diff.length(); 1136 diffLen = diff.length();
1137 // Below makes sure that circle one is not contained within circle two 1137 // Below makes sure that circle one is not contained within circle two
1138 // and have radius2 >= radius to match sorting on cpu side 1138 // and have radius2 >= radius to match sorting on cpu side
1139 radius2 = radius1 + random->nextRangeF(0.0, diffLen); 1139 radius2 = radius1 + random->nextRangeF(0.f, diffLen);
1140 1140
1141 SkColor colors[kMaxRandomGradientColors]; 1141 SkColor colors[kMaxRandomGradientColors];
1142 SkScalar stopsArray[kMaxRandomGradientColors]; 1142 SkScalar stopsArray[kMaxRandomGradientColors];
1143 SkScalar* stops = stopsArray; 1143 SkScalar* stops = stopsArray;
1144 SkShader::TileMode tm; 1144 SkShader::TileMode tm;
1145 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 1145 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
1146 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 1146 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
1147 center 2, radius2, 1147 center 2, radius2,
1148 colors , stops, colorCount, 1148 colors , stops, colorCount,
1149 tm)); 1149 tm));
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1293 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o);
1294 } else if (type == kEdge_ConicalType) { 1294 } else if (type == kEdge_ConicalType) {
1295 set_matrix_edge_conical(shader, &matrix); 1295 set_matrix_edge_conical(shader, &matrix);
1296 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1296 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm);
1297 } else { 1297 } else {
1298 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1298 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo);
1299 } 1299 }
1300 } 1300 }
1301 1301
1302 #endif 1302 #endif
OLDNEW
« no previous file with comments | « gm/gradients_2pt_conical.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698