annotate data/model/PowerOfSqrtTwoZoomConstraint.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "PowerOfSqrtTwoZoomConstraint.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include <iostream>
lbajardsilogic@0 19 #include <cmath>
lbajardsilogic@0 20
lbajardsilogic@0 21
lbajardsilogic@0 22 size_t
lbajardsilogic@0 23 PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(size_t blockSize,
lbajardsilogic@0 24 RoundingDirection dir) const
lbajardsilogic@0 25 {
lbajardsilogic@0 26 int type, power;
lbajardsilogic@0 27 size_t rv = getNearestBlockSize(blockSize, type, power, dir);
lbajardsilogic@0 28 return rv;
lbajardsilogic@0 29 }
lbajardsilogic@0 30
lbajardsilogic@0 31 size_t
lbajardsilogic@0 32 PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(size_t blockSize,
lbajardsilogic@0 33 int &type,
lbajardsilogic@0 34 int &power,
lbajardsilogic@0 35 RoundingDirection dir) const
lbajardsilogic@0 36 {
lbajardsilogic@0 37 // std::cerr << "given " << blockSize << std::endl;
lbajardsilogic@0 38
lbajardsilogic@0 39 size_t minCachePower = getMinCachePower();
lbajardsilogic@0 40
lbajardsilogic@0 41 if (blockSize < (1U << minCachePower)) {
lbajardsilogic@0 42 type = -1;
lbajardsilogic@0 43 power = 0;
lbajardsilogic@0 44 float val = 1.0, prevVal = 1.0;
lbajardsilogic@0 45 while (val + 0.01 < blockSize) {
lbajardsilogic@0 46 prevVal = val;
lbajardsilogic@0 47 val *= sqrt(2.0);
lbajardsilogic@0 48 }
lbajardsilogic@0 49 size_t rval;
lbajardsilogic@0 50 if (dir == RoundUp) rval = size_t(val + 0.01);
lbajardsilogic@0 51 else if (dir == RoundDown) rval = size_t(prevVal + 0.01);
lbajardsilogic@0 52 else if (val - blockSize < blockSize - prevVal) rval = size_t(val + 0.01);
lbajardsilogic@0 53 else rval = size_t(prevVal + 0.01);
lbajardsilogic@0 54 // std::cerr << "returning " << rval << std::endl;
lbajardsilogic@0 55 return rval;
lbajardsilogic@0 56 }
lbajardsilogic@0 57
lbajardsilogic@0 58 unsigned int prevBase = (1 << minCachePower);
lbajardsilogic@0 59 unsigned int prevPower = minCachePower;
lbajardsilogic@0 60 unsigned int prevType = 0;
lbajardsilogic@0 61
lbajardsilogic@0 62 size_t result = 0;
lbajardsilogic@0 63
lbajardsilogic@0 64 for (unsigned int i = 0; ; ++i) {
lbajardsilogic@0 65
lbajardsilogic@0 66 power = minCachePower + i/2;
lbajardsilogic@0 67 type = i % 2;
lbajardsilogic@0 68
lbajardsilogic@0 69 unsigned int base;
lbajardsilogic@0 70 if (type == 0) {
lbajardsilogic@0 71 base = (1 << power);
lbajardsilogic@0 72 } else {
lbajardsilogic@0 73 base = (((unsigned int)((1 << minCachePower) * sqrt(2.0) + 0.01))
lbajardsilogic@0 74 << (power - minCachePower));
lbajardsilogic@0 75 }
lbajardsilogic@0 76
lbajardsilogic@0 77 // std::cerr << "Testing base " << base << std::endl;
lbajardsilogic@0 78 if (base >= blockSize) {
lbajardsilogic@0 79 if (dir == RoundNearest) {
lbajardsilogic@0 80 if (base - blockSize < blockSize - prevBase) {
lbajardsilogic@0 81 dir = RoundUp;
lbajardsilogic@0 82 } else {
lbajardsilogic@0 83 dir = RoundDown;
lbajardsilogic@0 84 }
lbajardsilogic@0 85 }
lbajardsilogic@0 86 if (dir == RoundUp) {
lbajardsilogic@0 87 result = base;
lbajardsilogic@0 88 break;
lbajardsilogic@0 89 } else {
lbajardsilogic@0 90 type = prevType;
lbajardsilogic@0 91 power = prevPower;
lbajardsilogic@0 92 result = prevBase;
lbajardsilogic@0 93 break;
lbajardsilogic@0 94 }
lbajardsilogic@0 95 }
lbajardsilogic@0 96
lbajardsilogic@0 97 prevType = type;
lbajardsilogic@0 98 prevPower = power;
lbajardsilogic@0 99 prevBase = base;
lbajardsilogic@0 100 }
lbajardsilogic@0 101
lbajardsilogic@0 102 if (result > getMaxZoomLevel()) result = getMaxZoomLevel();
lbajardsilogic@0 103 return result;
lbajardsilogic@0 104 }