Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "GrPath.h"
      9 #include "GrShape.h"
     10 
     11 static inline void write_style_key(uint32_t* key, const GrStyle& style)  {
     12     // Pass 1 for the scale since the GPU will apply the style not GrStyle::applyToPath().
     13     GrStyle::WriteKey(key, style, GrStyle::Apply::kPathEffectAndStrokeRec, SK_Scalar1);
     14 }
     15 
     16 
     17 void GrPath::ComputeKey(const GrShape& shape, GrUniqueKey* key, bool* outIsVolatile) {
     18     int geoCnt = shape.unstyledKeySize();
     19     int styleCnt = GrStyle::KeySize(shape.style(), GrStyle::Apply::kPathEffectAndStrokeRec);
     20     // This should only fail for an arbitrary path effect, and we should not have gotten
     21     // here with anything other than a dash path effect.
     22     SkASSERT(styleCnt >= 0);
     23     if (geoCnt < 0) {
     24         *outIsVolatile = true;
     25         return;
     26     }
     27     static const GrUniqueKey::Domain kGeneralPathDomain = GrUniqueKey::GenerateDomain();
     28     GrUniqueKey::Builder builder(key, kGeneralPathDomain, geoCnt + styleCnt);
     29     shape.writeUnstyledKey(&builder[0]);
     30     if (styleCnt) {
     31         write_style_key(&builder[geoCnt], shape.style());
     32     }
     33     *outIsVolatile = false;
     34 }
     35 
     36 #ifdef SK_DEBUG
     37 bool GrPath::isEqualTo(const SkPath& path, const GrStyle& style) const {
     38     // Since this is only called in debug we don't care about performance.
     39     int cnt0 = GrStyle::KeySize(fStyle, GrStyle::Apply::kPathEffectAndStrokeRec);
     40     int cnt1 = GrStyle::KeySize(style, GrStyle::Apply::kPathEffectAndStrokeRec);
     41     if (cnt0 < 0 || cnt1 < 0 || cnt0 != cnt1) {
     42         return false;
     43     }
     44     if (cnt0) {
     45         SkAutoTArray<uint32_t> key0(cnt0);
     46         SkAutoTArray<uint32_t> key1(cnt0);
     47         write_style_key(key0.get(), fStyle);
     48         write_style_key(key1.get(), style);
     49         if (0 != memcmp(key0.get(), key1.get(), cnt0)) {
     50             return false;
     51         }
     52     }
     53     return fSkPath == path;
     54 }
     55 #endif
     56