1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "SkBitSet.h" 11 12 SkBitSet::SkBitSet(int numberOfBits) 13 : fBitData(NULL), fDwordCount(0), fBitCount(numberOfBits) { 14 SkASSERT(numberOfBits > 0); 15 // Round up size to 32-bit boundary. 16 fDwordCount = (numberOfBits + 31) / 32; 17 fBitData.set(malloc(fDwordCount * sizeof(uint32_t))); 18 clearAll(); 19 } 20 21 SkBitSet::SkBitSet(const SkBitSet& source) 22 : fBitData(NULL), fDwordCount(0), fBitCount(0) { 23 *this = source; 24 } 25 26 SkBitSet& SkBitSet::operator=(const SkBitSet& rhs) { 27 if (this == &rhs) { 28 return *this; 29 } 30 fBitCount = rhs.fBitCount; 31 fBitData.free(); 32 fDwordCount = rhs.fDwordCount; 33 fBitData.set(malloc(fDwordCount * sizeof(uint32_t))); 34 memcpy(fBitData.get(), rhs.fBitData.get(), fDwordCount * sizeof(uint32_t)); 35 return *this; 36 } 37 38 bool SkBitSet::operator==(const SkBitSet& rhs) { 39 if (fBitCount == rhs.fBitCount) { 40 if (fBitData.get() != NULL) { 41 return (memcmp(fBitData.get(), rhs.fBitData.get(), 42 fDwordCount * sizeof(uint32_t)) == 0); 43 } 44 return true; 45 } 46 return false; 47 } 48 49 bool SkBitSet::operator!=(const SkBitSet& rhs) { 50 return !(*this == rhs); 51 } 52 53 void SkBitSet::clearAll() { 54 if (fBitData.get() != NULL) { 55 sk_bzero(fBitData.get(), fDwordCount * sizeof(uint32_t)); 56 } 57 } 58 59 void SkBitSet::setBit(int index, bool value) { 60 uint32_t mask = 1 << (index % 32); 61 if (value) { 62 *(internalGet(index)) |= mask; 63 } else { 64 *(internalGet(index)) &= ~mask; 65 } 66 } 67 68 bool SkBitSet::isBitSet(int index) const { 69 uint32_t mask = 1 << (index % 32); 70 return 0 != (*internalGet(index) & mask); 71 } 72 73 bool SkBitSet::orBits(const SkBitSet& source) { 74 if (fBitCount != source.fBitCount) { 75 return false; 76 } 77 uint32_t* targetBitmap = internalGet(0); 78 uint32_t* sourceBitmap = source.internalGet(0); 79 for (size_t i = 0; i < fDwordCount; ++i) { 80 targetBitmap[i] |= sourceBitmap[i]; 81 } 82 return true; 83 } 84