Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2013 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 #ifndef SkMipMap_DEFINED
      9 #define SkMipMap_DEFINED
     10 
     11 #include "SkCachedData.h"
     12 #include "SkPixmap.h"
     13 #include "SkScalar.h"
     14 #include "SkSize.h"
     15 
     16 class SkBitmap;
     17 class SkDiscardableMemory;
     18 
     19 typedef SkDiscardableMemory* (*SkDiscardableFactoryProc)(size_t bytes);
     20 
     21 class SkMipMap : public SkCachedData {
     22 public:
     23     static SkMipMap* Build(const SkPixmap& src, SkDiscardableFactoryProc);
     24     static SkMipMap* Build(const SkBitmap& src, SkDiscardableFactoryProc);
     25 
     26     // This function lets you determine how many levels a SkMipMap will have without
     27     // creating that mipmap.
     28     static int ComputeLevelCount(int baseWidth, int baseHeight);
     29 
     30     struct Level {
     31         SkPixmap    fPixmap;
     32         SkSize      fScale; // < 1.0
     33     };
     34 
     35     bool extractLevel(const SkSize& scale, Level*) const;
     36     int countLevels() const;
     37     bool getLevel(int index, Level*) const;
     38 
     39 protected:
     40     void onDataChange(void* oldData, void* newData) override {
     41         fLevels = (Level*)newData; // could be nullptr
     42     }
     43 
     44 private:
     45     Level*  fLevels;
     46     int     fCount;
     47 
     48     // we take ownership of levels, and will free it with sk_free()
     49     SkMipMap(void* malloc, size_t size) : INHERITED(malloc, size) {}
     50     SkMipMap(size_t size, SkDiscardableMemory* dm) : INHERITED(size, dm) {}
     51 
     52     static size_t AllocLevelsSize(int levelCount, size_t pixelSize);
     53 
     54     typedef SkCachedData INHERITED;
     55 };
     56 
     57 #endif
     58