blob: e38e60346200a2edfb3a9a3102adfe55eaebd9bc [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
vandebo@chromium.orgd3a8c942011-07-02 01:26:37 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
vandebo@chromium.orgd3a8c942011-07-02 01:26:37 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
vandebo@chromium.orgd3a8c942011-07-02 01:26:37 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
vandebo@chromium.orgd3a8c942011-07-02 01:26:37 +000010#include <string.h>
11#include "SkBitSet.h"
12
13SkBitSet::SkBitSet(int numberOfBits)
14 : fBitData(NULL), fDwordCount(0), fBitCount(numberOfBits) {
15 SkASSERT(numberOfBits > 0);
16 // Round up size to 32-bit boundary.
17 fDwordCount = (numberOfBits + 31) / 32;
18 fBitData.set(malloc(fDwordCount * sizeof(uint32_t)));
19 clearAll();
20}
21
22SkBitSet::SkBitSet(const SkBitSet& source)
23 : fBitData(NULL), fDwordCount(0), fBitCount(0) {
24 *this = source;
25}
26
27const SkBitSet& SkBitSet::operator=(const SkBitSet& rhs) {
28 if (this == (SkBitSet*)&rhs) {
29 return *this;
30 }
31 fBitCount = rhs.fBitCount;
32 fBitData.free();
33 fDwordCount = rhs.fDwordCount;
34 fBitData.set(malloc(fDwordCount * sizeof(uint32_t)));
35 memcpy(fBitData.get(), rhs.fBitData.get(), fDwordCount * sizeof(uint32_t));
36 return *this;
37}
38
39bool SkBitSet::operator==(const SkBitSet& rhs) {
40 if (fBitCount == rhs.fBitCount) {
41 if (fBitData.get() != NULL) {
42 return (memcmp(fBitData.get(), rhs.fBitData.get(),
43 fDwordCount * sizeof(uint32_t)) == 0);
44 }
45 return true;
46 }
47 return false;
48}
49
50bool SkBitSet::operator!=(const SkBitSet& rhs) {
51 return !(*this == rhs);
52}
53
54void SkBitSet::clearAll() {
55 if (fBitData.get() != NULL) {
56 sk_bzero(fBitData.get(), fDwordCount * sizeof(uint32_t));
57 }
58}
59
60void SkBitSet::setBit(int index, bool value) {
61 uint32_t mask = 1 << (index % 32);
62 if (value) {
63 *(internalGet(index)) |= mask;
64 } else {
65 *(internalGet(index)) &= ~mask;
66 }
67}
68
vandebo@chromium.org98594282011-07-25 22:34:12 +000069bool SkBitSet::isBitSet(int index) const {
vandebo@chromium.orgd3a8c942011-07-02 01:26:37 +000070 uint32_t mask = 1 << (index % 32);
71 return (*internalGet(index) & mask);
72}
73
vandebo@chromium.org98594282011-07-25 22:34:12 +000074bool SkBitSet::orBits(const SkBitSet& source) {
vandebo@chromium.orgd3a8c942011-07-02 01:26:37 +000075 if (fBitCount != source.fBitCount) {
76 return false;
77 }
78 uint32_t* targetBitmap = internalGet(0);
79 uint32_t* sourceBitmap = source.internalGet(0);
80 for (size_t i = 0; i < fDwordCount; ++i) {
81 targetBitmap[i] |= sourceBitmap[i];
82 }
83 return true;
84}
vandebo@chromium.org17e66e22011-07-27 20:59:55 +000085
86void SkBitSet::exportTo(SkTDArray<uint32_t>* array) const {
87 SkASSERT(array);
88 uint32_t* data = (uint32_t*)fBitData.get();
89 for (unsigned int i = 0; i < fDwordCount; ++i) {
90 uint32_t value = data[i];
91 if (value) { // There are set bits
92 unsigned int index = i * 32;
93 for (unsigned int j = 0; j < 32; ++j) {
94 if (0x1 & (value >> j)) {
95 array->push(index + j);
96 }
97 }
98 }
99 }
100}