| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright 2006 The Android Open Source Project |     2  * Copyright 2006 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 "SkGradientShaderPriv.h" |     8 #include "SkGradientShaderPriv.h" | 
|     9 #include "SkLinearGradient.h" |     9 #include "SkLinearGradient.h" | 
|    10 #include "SkRadialGradient.h" |    10 #include "SkRadialGradient.h" | 
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   590     } |   590     } | 
|   591 } |   591 } | 
|   592  |   592  | 
|   593 /* |   593 /* | 
|   594  *  The gradient holds a cache for the most recent value of alpha. Successive |   594  *  The gradient holds a cache for the most recent value of alpha. Successive | 
|   595  *  callers with the same alpha value will share the same cache. |   595  *  callers with the same alpha value will share the same cache. | 
|   596  */ |   596  */ | 
|   597 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU 
      alpha) const { |   597 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU 
      alpha) const { | 
|   598     SkAutoMutexAcquire ama(fCacheMutex); |   598     SkAutoMutexAcquire ama(fCacheMutex); | 
|   599     if (!fCache || fCache->getAlpha() != alpha) { |   599     if (!fCache || fCache->getAlpha() != alpha) { | 
|   600         fCache.reset(SkNEW_ARGS(GradientShaderCache, (alpha, *this))); |   600         fCache.reset(new GradientShaderCache(alpha, *this)); | 
|   601     } |   601     } | 
|   602     // Increment the ref counter inside the mutex to ensure the returned pointer
       is still valid. |   602     // Increment the ref counter inside the mutex to ensure the returned pointer
       is still valid. | 
|   603     // Otherwise, the pointer may have been overwritten on a different thread be
      fore the object's |   603     // Otherwise, the pointer may have been overwritten on a different thread be
      fore the object's | 
|   604     // ref count was incremented. |   604     // ref count was incremented. | 
|   605     fCache.get()->ref(); |   605     fCache.get()->ref(); | 
|   606     return fCache; |   606     return fCache; | 
|   607 } |   607 } | 
|   608  |   608  | 
|   609 SK_DECLARE_STATIC_MUTEX(gGradientCacheMutex); |   609 SK_DECLARE_STATIC_MUTEX(gGradientCacheMutex); | 
|   610 /* |   610 /* | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|   641     SkASSERT(buffer - storage.get() == count); |   641     SkASSERT(buffer - storage.get() == count); | 
|   642  |   642  | 
|   643     /////////////////////////////////// |   643     /////////////////////////////////// | 
|   644  |   644  | 
|   645     static SkGradientBitmapCache* gCache; |   645     static SkGradientBitmapCache* gCache; | 
|   646     // each cache cost 1K of RAM, since each bitmap will be 1x256 at 32bpp |   646     // each cache cost 1K of RAM, since each bitmap will be 1x256 at 32bpp | 
|   647     static const int MAX_NUM_CACHED_GRADIENT_BITMAPS = 32; |   647     static const int MAX_NUM_CACHED_GRADIENT_BITMAPS = 32; | 
|   648     SkAutoMutexAcquire ama(gGradientCacheMutex); |   648     SkAutoMutexAcquire ama(gGradientCacheMutex); | 
|   649  |   649  | 
|   650     if (NULL == gCache) { |   650     if (NULL == gCache) { | 
|   651         gCache = SkNEW_ARGS(SkGradientBitmapCache, (MAX_NUM_CACHED_GRADIENT_BITM
      APS)); |   651         gCache = new SkGradientBitmapCache(MAX_NUM_CACHED_GRADIENT_BITMAPS); | 
|   652     } |   652     } | 
|   653     size_t size = count * sizeof(int32_t); |   653     size_t size = count * sizeof(int32_t); | 
|   654  |   654  | 
|   655     if (!gCache->find(storage.get(), size, bitmap)) { |   655     if (!gCache->find(storage.get(), size, bitmap)) { | 
|   656         // force our cahce32pixelref to be built |   656         // force our cahce32pixelref to be built | 
|   657         (void)cache->getCache32(); |   657         (void)cache->getCache32(); | 
|   658         bitmap->setInfo(SkImageInfo::MakeN32Premul(kCache32Count, 1)); |   658         bitmap->setInfo(SkImageInfo::MakeN32Premul(kCache32Count, 1)); | 
|   659         bitmap->setPixelRef(cache->getCache32PixelRef()); |   659         bitmap->setPixelRef(cache->getCache32PixelRef()); | 
|   660  |   660  | 
|   661         gCache->add(storage.get(), size, *bitmap); |   661         gCache->add(storage.get(), size, *bitmap); | 
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   772     if (!pts) { |   772     if (!pts) { | 
|   773         return NULL; |   773         return NULL; | 
|   774     } |   774     } | 
|   775     if (!valid_grad(colors, pos, colorCount, mode)) { |   775     if (!valid_grad(colors, pos, colorCount, mode)) { | 
|   776         return NULL; |   776         return NULL; | 
|   777     } |   777     } | 
|   778     EXPAND_1_COLOR(colorCount); |   778     EXPAND_1_COLOR(colorCount); | 
|   779  |   779  | 
|   780     SkGradientShaderBase::Descriptor desc; |   780     SkGradientShaderBase::Descriptor desc; | 
|   781     desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |   781     desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 
|   782     return SkNEW_ARGS(SkLinearGradient, (pts, desc)); |   782     return new SkLinearGradient(pts, desc); | 
|   783 } |   783 } | 
|   784  |   784  | 
|   785 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |   785 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, | 
|   786                                          const SkColor colors[], |   786                                          const SkColor colors[], | 
|   787                                          const SkScalar pos[], int colorCount, |   787                                          const SkScalar pos[], int colorCount, | 
|   788                                          SkShader::TileMode mode, |   788                                          SkShader::TileMode mode, | 
|   789                                          uint32_t flags, |   789                                          uint32_t flags, | 
|   790                                          const SkMatrix* localMatrix) { |   790                                          const SkMatrix* localMatrix) { | 
|   791     if (radius <= 0) { |   791     if (radius <= 0) { | 
|   792         return NULL; |   792         return NULL; | 
|   793     } |   793     } | 
|   794     if (!valid_grad(colors, pos, colorCount, mode)) { |   794     if (!valid_grad(colors, pos, colorCount, mode)) { | 
|   795         return NULL; |   795         return NULL; | 
|   796     } |   796     } | 
|   797     EXPAND_1_COLOR(colorCount); |   797     EXPAND_1_COLOR(colorCount); | 
|   798  |   798  | 
|   799     SkGradientShaderBase::Descriptor desc; |   799     SkGradientShaderBase::Descriptor desc; | 
|   800     desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |   800     desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 
|   801     return SkNEW_ARGS(SkRadialGradient, (center, radius, desc)); |   801     return new SkRadialGradient(center, radius, desc); | 
|   802 } |   802 } | 
|   803  |   803  | 
|   804 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |   804 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, | 
|   805                                                   SkScalar startRadius, |   805                                                   SkScalar startRadius, | 
|   806                                                   const SkPoint& end, |   806                                                   const SkPoint& end, | 
|   807                                                   SkScalar endRadius, |   807                                                   SkScalar endRadius, | 
|   808                                                   const SkColor colors[], |   808                                                   const SkColor colors[], | 
|   809                                                   const SkScalar pos[], |   809                                                   const SkScalar pos[], | 
|   810                                                   int colorCount, |   810                                                   int colorCount, | 
|   811                                                   SkShader::TileMode mode, |   811                                                   SkShader::TileMode mode, | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|   822     } |   822     } | 
|   823  |   823  | 
|   824     EXPAND_1_COLOR(colorCount); |   824     EXPAND_1_COLOR(colorCount); | 
|   825  |   825  | 
|   826     bool flipGradient = startRadius > endRadius; |   826     bool flipGradient = startRadius > endRadius; | 
|   827  |   827  | 
|   828     SkGradientShaderBase::Descriptor desc; |   828     SkGradientShaderBase::Descriptor desc; | 
|   829  |   829  | 
|   830     if (!flipGradient) { |   830     if (!flipGradient) { | 
|   831         desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |   831         desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 
|   832         return SkNEW_ARGS(SkTwoPointConicalGradient, |   832         return new SkTwoPointConicalGradient(start, startRadius, end, endRadius,
       flipGradient, | 
|   833                           (start, startRadius, end, endRadius, flipGradient, des
      c)); |   833                                              desc); | 
|   834     } else { |   834     } else { | 
|   835         SkAutoSTArray<8, SkColor> colorsNew(colorCount); |   835         SkAutoSTArray<8, SkColor> colorsNew(colorCount); | 
|   836         SkAutoSTArray<8, SkScalar> posNew(colorCount); |   836         SkAutoSTArray<8, SkScalar> posNew(colorCount); | 
|   837         for (int i = 0; i < colorCount; ++i) { |   837         for (int i = 0; i < colorCount; ++i) { | 
|   838             colorsNew[i] = colors[colorCount - i - 1]; |   838             colorsNew[i] = colors[colorCount - i - 1]; | 
|   839         } |   839         } | 
|   840  |   840  | 
|   841         if (pos) { |   841         if (pos) { | 
|   842             for (int i = 0; i < colorCount; ++i) { |   842             for (int i = 0; i < colorCount; ++i) { | 
|   843                 posNew[i] = 1 - pos[colorCount - i - 1]; |   843                 posNew[i] = 1 - pos[colorCount - i - 1]; | 
|   844             } |   844             } | 
|   845             desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, fl
      ags, localMatrix); |   845             desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, fl
      ags, localMatrix); | 
|   846         } else { |   846         } else { | 
|   847             desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, flags, loc
      alMatrix); |   847             desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, flags, loc
      alMatrix); | 
|   848         } |   848         } | 
|   849  |   849  | 
|   850         return SkNEW_ARGS(SkTwoPointConicalGradient, |   850         return new SkTwoPointConicalGradient(end, endRadius, start, startRadius,
       flipGradient, | 
|   851                           (end, endRadius, start, startRadius, flipGradient, des
      c)); |   851                                              desc); | 
|   852     } |   852     } | 
|   853 } |   853 } | 
|   854  |   854  | 
|   855 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |   855 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, | 
|   856                                         const SkColor colors[], |   856                                         const SkColor colors[], | 
|   857                                         const SkScalar pos[], |   857                                         const SkScalar pos[], | 
|   858                                         int colorCount, |   858                                         int colorCount, | 
|   859                                         uint32_t flags, |   859                                         uint32_t flags, | 
|   860                                         const SkMatrix* localMatrix) { |   860                                         const SkMatrix* localMatrix) { | 
|   861     if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { |   861     if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { | 
|   862         return NULL; |   862         return NULL; | 
|   863     } |   863     } | 
|   864     EXPAND_1_COLOR(colorCount); |   864     EXPAND_1_COLOR(colorCount); | 
|   865  |   865  | 
|   866     SkGradientShaderBase::Descriptor desc; |   866     SkGradientShaderBase::Descriptor desc; | 
|   867     desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags, 
      localMatrix); |   867     desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags, 
      localMatrix); | 
|   868     return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc)); |   868     return new SkSweepGradient(cx, cy, desc); | 
|   869 } |   869 } | 
|   870  |   870  | 
|   871 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) |   871 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) | 
|   872     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) |   872     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) | 
|   873     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) |   873     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) | 
|   874     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) |   874     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) | 
|   875     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) |   875     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) | 
|   876 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |   876 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 
|   877  |   877  | 
|   878 /////////////////////////////////////////////////////////////////////////////// |   878 /////////////////////////////////////////////////////////////////////////////// | 
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1178             (*stops)[i] = stop; |  1178             (*stops)[i] = stop; | 
|  1179             stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
      op) : 1.f; |  1179             stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
      op) : 1.f; | 
|  1180         } |  1180         } | 
|  1181     } |  1181     } | 
|  1182     *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
      odeCount)); |  1182     *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
      odeCount)); | 
|  1183  |  1183  | 
|  1184     return outColors; |  1184     return outColors; | 
|  1185 } |  1185 } | 
|  1186  |  1186  | 
|  1187 #endif |  1187 #endif | 
| OLD | NEW |