Chris@109: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@109: Chris@109: /* Chris@109: Sonic Visualiser Chris@109: An audio file viewer and annotation editor. Chris@109: Centre for Digital Music, Queen Mary, University of London. Chris@109: This file copyright 2006 Chris Cannam. Chris@109: Chris@109: This program is free software; you can redistribute it and/or Chris@109: modify it under the terms of the GNU General Public License as Chris@109: published by the Free Software Foundation; either version 2 of the Chris@109: License, or (at your option) any later version. See the file Chris@109: COPYING included with this distribution for more information. Chris@109: */ Chris@109: Chris@109: #ifndef _RESIZEABLE_BITMAP_H_ Chris@109: #define _RESIZEABLE_BITMAP_H_ Chris@109: Chris@109: #include Chris@109: #include Chris@109: Chris@109: class ResizeableBitmap { Chris@109: Chris@109: public: Chris@109: ResizeableBitmap() : m_bits(0) { Chris@109: } Chris@109: ResizeableBitmap(size_t size) : m_bits(new std::vector) { Chris@109: m_bits->assign(size / 8 + 1, 0); Chris@109: } Chris@109: ResizeableBitmap(const ResizeableBitmap &b) { Chris@109: m_bits = new std::vector(*b.m_bits); Chris@109: } Chris@109: ResizeableBitmap &operator=(const ResizeableBitmap &b) { Chris@109: if (&b != this) return *this; Chris@109: delete m_bits; Chris@109: m_bits = new std::vector(*b.m_bits); Chris@109: return *this; Chris@109: } Chris@109: ~ResizeableBitmap() { Chris@109: delete m_bits; Chris@109: } Chris@109: Chris@109: void resize(size_t bits) { // losing all data Chris@109: if (!m_bits || bits < m_bits->size()) { Chris@109: delete m_bits; Chris@109: m_bits = new std::vector; Chris@109: } Chris@109: m_bits->assign(bits / 8, 0); Chris@109: } Chris@109: Chris@109: bool get(size_t column) const { Chris@109: return ((*m_bits)[column / 8]) & (1u << (column % 8)); Chris@109: } Chris@109: Chris@112: void set(size_t column) { Chris@112: ((*m_bits)[column / 8]) |= (uint8_t(1) << (column % 8)); Chris@112: } Chris@112: Chris@112: void reset(size_t column) { Chris@112: ((*m_bits)[column / 8]) &= ~(uint8_t(1) << (column % 8)); Chris@112: } Chris@112: Chris@112: void copy(size_t source, size_t dest) { Chris@112: get(source) ? set(dest) : reset(dest); Chris@109: } Chris@109: Chris@109: private: Chris@109: std::vector *m_bits; Chris@109: }; Chris@109: Chris@109: Chris@109: #endif Chris@109: