| 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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   111                     recs->fScale = 0; // ignore this segment |   111                     recs->fScale = 0; // ignore this segment | 
|   112                 } |   112                 } | 
|   113                 // get ready for the next value |   113                 // get ready for the next value | 
|   114                 prev = curr; |   114                 prev = curr; | 
|   115                 recs += 1; |   115                 recs += 1; | 
|   116             } |   116             } | 
|   117         } else {    // assume even distribution |   117         } else {    // assume even distribution | 
|   118             SkFixed dp = SK_Fixed1 / (desc.fCount - 1); |   118             SkFixed dp = SK_Fixed1 / (desc.fCount - 1); | 
|   119             SkFixed p = dp; |   119             SkFixed p = dp; | 
|   120             SkFixed scale = (desc.fCount - 1) << 8;  // (1 << 24) / dp |   120             SkFixed scale = (desc.fCount - 1) << 8;  // (1 << 24) / dp | 
|   121             for (int i = 1; i < desc.fCount; i++) { |   121             for (int i = 1; i < desc.fCount - 1; i++) { | 
|   122                 recs->fPos   = p; |   122                 recs->fPos   = p; | 
|   123                 recs->fScale = scale; |   123                 recs->fScale = scale; | 
|   124                 recs += 1; |   124                 recs += 1; | 
|   125                 p += dp; |   125                 p += dp; | 
|   126             } |   126             } | 
 |   127             recs->fPos = SK_Fixed1; | 
|   127         } |   128         } | 
|   128     } |   129     } | 
|   129     this->initCommon(); |   130     this->initCommon(); | 
|   130 } |   131 } | 
|   131  |   132  | 
|   132 static uint32_t pack_mode_flags(SkShader::TileMode mode, uint32_t flags) { |   133 static uint32_t pack_mode_flags(SkShader::TileMode mode, uint32_t flags) { | 
|   133     SkASSERT(0 == (flags >> 28)); |   134     SkASSERT(0 == (flags >> 28)); | 
|   134     SkASSERT(0 == ((uint32_t)mode >> 4)); |   135     SkASSERT(0 == ((uint32_t)mode >> 4)); | 
|   135     return (flags << 4) | mode; |   136     return (flags << 4) | mode; | 
|   136 } |   137 } | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   230             return kTwo_GpuColorType; |   231             return kTwo_GpuColorType; | 
|   231         } else if (3 == fColorCount && |   232         } else if (3 == fColorCount && | 
|   232                    (SkScalarAbs( |   233                    (SkScalarAbs( | 
|   233                     SkFixedToScalar(fRecs[1].fPos) - SK_ScalarHalf) < SK_Scalar1
       / 1000)) { |   234                     SkFixedToScalar(fRecs[1].fPos) - SK_ScalarHalf) < SK_Scalar1
       / 1000)) { | 
|   234             return kThree_GpuColorType; |   235             return kThree_GpuColorType; | 
|   235         } |   236         } | 
|   236     } |   237     } | 
|   237     return kTexture_GpuColorType; |   238     return kTexture_GpuColorType; | 
|   238 } |   239 } | 
|   239  |   240  | 
 |   241 void SkGradientShaderBase::FlipGradientColors(SkColor* colorDst, Rec* recDst, | 
 |   242                                               SkColor* colorSrc, Rec* recSrc, | 
 |   243                                               int count) { | 
 |   244     SkAutoSTArray<8, SkColor> colorsTemp(count); | 
 |   245     for (int i = 0; i < count; ++i) { | 
 |   246         int offset = count - i - 1; | 
 |   247         colorsTemp[i] = colorSrc[offset]; | 
 |   248     } | 
 |   249     if (count > 2) { | 
 |   250         SkAutoSTArray<8, Rec> recsTemp(count); | 
 |   251         for (int i = 0; i < count; ++i) { | 
 |   252             int offset = count - i - 1; | 
 |   253             recsTemp[i].fPos = SK_Fixed1 - recSrc[offset].fPos; | 
 |   254             recsTemp[i].fScale = recSrc[offset].fScale; | 
 |   255         } | 
 |   256         memcpy(recDst, recsTemp.get(), count * sizeof(Rec)); | 
 |   257     } | 
 |   258     memcpy(colorDst, colorsTemp.get(), count * sizeof(SkColor)); | 
 |   259 } | 
 |   260  | 
 |   261 void SkGradientShaderBase::flipGradientColors() { | 
 |   262     FlipGradientColors(fOrigColors, fRecs, fOrigColors, fRecs, fColorCount);  | 
 |   263 } | 
 |   264  | 
|   240 bool SkGradientShaderBase::isOpaque() const { |   265 bool SkGradientShaderBase::isOpaque() const { | 
|   241     return fColorsAreOpaque; |   266     return fColorsAreOpaque; | 
|   242 } |   267 } | 
|   243  |   268  | 
|   244 bool SkGradientShaderBase::setContext(const SkBitmap& device, |   269 bool SkGradientShaderBase::setContext(const SkBitmap& device, | 
|   245                                  const SkPaint& paint, |   270                                  const SkPaint& paint, | 
|   246                                  const SkMatrix& matrix) { |   271                                  const SkMatrix& matrix) { | 
|   247     if (!this->INHERITED::setContext(device, paint, matrix)) { |   272     if (!this->INHERITED::setContext(device, paint, matrix)) { | 
|   248         return false; |   273         return false; | 
|   249     } |   274     } | 
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   636     if (!gCache->find(storage.get(), size, bitmap)) { |   661     if (!gCache->find(storage.get(), size, bitmap)) { | 
|   637         // force our cahce32pixelref to be built |   662         // force our cahce32pixelref to be built | 
|   638         (void)this->getCache32(); |   663         (void)this->getCache32(); | 
|   639         bitmap->setConfig(SkImageInfo::MakeN32Premul(kCache32Count, 1)); |   664         bitmap->setConfig(SkImageInfo::MakeN32Premul(kCache32Count, 1)); | 
|   640         bitmap->setPixelRef(fCache32PixelRef); |   665         bitmap->setPixelRef(fCache32PixelRef); | 
|   641  |   666  | 
|   642         gCache->add(storage.get(), size, *bitmap); |   667         gCache->add(storage.get(), size, *bitmap); | 
|   643     } |   668     } | 
|   644 } |   669 } | 
|   645  |   670  | 
|   646 void SkGradientShaderBase::commonAsAGradient(GradientInfo* info) const { |   671 void SkGradientShaderBase::commonAsAGradient(GradientInfo* info, bool flipGrad) 
      const { | 
|   647     if (info) { |   672     if (info) { | 
|   648         if (info->fColorCount >= fColorCount) { |   673         if (info->fColorCount >= fColorCount) { | 
 |   674             SkColor* colorLoc; | 
 |   675             Rec*     recLoc; | 
 |   676             if (flipGrad && (info->fColors || info->fColorOffsets)) { | 
 |   677                 SkAutoSTArray<8, SkColor> colorStorage(fColorCount); | 
 |   678                 SkAutoSTArray<8, Rec> recStorage(fColorCount); | 
 |   679                 colorLoc = colorStorage.get(); | 
 |   680                 recLoc = recStorage.get(); | 
 |   681                 FlipGradientColors(colorLoc, recLoc, fOrigColors, fRecs, fColorC
      ount); | 
 |   682             } else { | 
 |   683                 colorLoc = fOrigColors; | 
 |   684                 recLoc = fRecs; | 
 |   685             } | 
|   649             if (info->fColors) { |   686             if (info->fColors) { | 
|   650                 memcpy(info->fColors, fOrigColors, fColorCount * sizeof(SkColor)
      ); |   687                 memcpy(info->fColors, colorLoc, fColorCount * sizeof(SkColor)); | 
|   651             } |   688             } | 
|   652             if (info->fColorOffsets) { |   689             if (info->fColorOffsets) { | 
|   653                 if (fColorCount == 2) { |   690                 if (fColorCount == 2) { | 
|   654                     info->fColorOffsets[0] = 0; |   691                     info->fColorOffsets[0] = 0; | 
|   655                     info->fColorOffsets[1] = SK_Scalar1; |   692                     info->fColorOffsets[1] = SK_Scalar1; | 
|   656                 } else if (fColorCount > 2) { |   693                 } else if (fColorCount > 2) { | 
|   657                     for (int i = 0; i < fColorCount; ++i) { |   694                     for (int i = 0; i < fColorCount; ++i) { | 
|   658                         info->fColorOffsets[i] = SkFixedToScalar(fRecs[i].fPos); |   695                         info->fColorOffsets[i] = SkFixedToScalar(recLoc[i].fPos)
      ; | 
|   659                     } |   696                     } | 
|   660                 } |   697                 } | 
|   661             } |   698             } | 
|   662         } |   699         } | 
|   663         info->fColorCount = fColorCount; |   700         info->fColorCount = fColorCount; | 
|   664         info->fTileMode = fTileMode; |   701         info->fTileMode = fTileMode; | 
|   665         info->fGradientFlags = fGradFlags; |   702         info->fGradientFlags = fGradFlags; | 
|   666     } |   703     } | 
|   667 } |   704 } | 
|   668  |   705  | 
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   794                                                   int colorCount, |   831                                                   int colorCount, | 
|   795                                                   SkShader::TileMode mode, |   832                                                   SkShader::TileMode mode, | 
|   796                                                   SkUnitMapper* mapper, |   833                                                   SkUnitMapper* mapper, | 
|   797                                                   uint32_t flags) { |   834                                                   uint32_t flags) { | 
|   798     if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { |   835     if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { | 
|   799         return NULL; |   836         return NULL; | 
|   800     } |   837     } | 
|   801     if (start == end && startRadius == endRadius) { |   838     if (start == end && startRadius == endRadius) { | 
|   802         return SkNEW(SkEmptyShader); |   839         return SkNEW(SkEmptyShader); | 
|   803     } |   840     } | 
 |   841  | 
|   804     EXPAND_1_COLOR(colorCount); |   842     EXPAND_1_COLOR(colorCount); | 
|   805  |   843  | 
 |   844     bool flipGradient = startRadius > endRadius; | 
 |   845  | 
|   806     SkGradientShaderBase::Descriptor desc; |   846     SkGradientShaderBase::Descriptor desc; | 
|   807     desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |   847  | 
|   808     return SkNEW_ARGS(SkTwoPointConicalGradient, |   848     if (!flipGradient) { | 
|   809                       (start, startRadius, end, endRadius, desc)); |   849         desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); | 
 |   850         return SkNEW_ARGS(SkTwoPointConicalGradient, | 
 |   851                           (start, startRadius, end, endRadius, flipGradient, des
      c)); | 
 |   852     } else { | 
 |   853         SkAutoSTArray<8, SkColor> colorsNew(colorCount); | 
 |   854         SkAutoSTArray<8, SkScalar> posNew(colorCount); | 
 |   855         for (int i = 0; i < colorCount; ++i) { | 
 |   856             colorsNew[i] = colors[colorCount - i - 1]; | 
 |   857         } | 
 |   858  | 
 |   859         if (pos) { | 
 |   860             for (int i = 0; i < colorCount; ++i) { | 
 |   861                 posNew[i] = 1 - pos[colorCount - i - 1]; | 
 |   862             } | 
 |   863             desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, ma
      pper, flags); | 
 |   864         } else { | 
 |   865             desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, mapper, fl
      ags); | 
 |   866         } | 
 |   867  | 
 |   868         return SkNEW_ARGS(SkTwoPointConicalGradient, | 
 |   869                           (end, endRadius, start, startRadius, flipGradient, des
      c)); | 
 |   870     } | 
|   810 } |   871 } | 
|   811  |   872  | 
|   812 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |   873 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, | 
|   813                                         const SkColor colors[], |   874                                         const SkColor colors[], | 
|   814                                         const SkScalar pos[], |   875                                         const SkScalar pos[], | 
|   815                                         int colorCount, SkUnitMapper* mapper, |   876                                         int colorCount, SkUnitMapper* mapper, | 
|   816                                         uint32_t flags) { |   877                                         uint32_t flags) { | 
|   817     if (NULL == colors || colorCount < 1) { |   878     if (NULL == colors || colorCount < 1) { | 
|   818         return NULL; |   879         return NULL; | 
|   819     } |   880     } | 
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1133             (*stops)[i] = stop; |  1194             (*stops)[i] = stop; | 
|  1134             stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
      op) : 1.f; |  1195             stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
      op) : 1.f; | 
|  1135         } |  1196         } | 
|  1136     } |  1197     } | 
|  1137     *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
      odeCount)); |  1198     *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
      odeCount)); | 
|  1138  |  1199  | 
|  1139     return outColors; |  1200     return outColors; | 
|  1140 } |  1201 } | 
|  1141  |  1202  | 
|  1142 #endif |  1203 #endif | 
| OLD | NEW |