comparison layer/Colour3DPlotLayer.cpp @ 470:26d1ddc0ce96

* another, rather trivial, optimisation
author Chris Cannam
date Mon, 26 Jan 2009 10:49:31 +0000
parents 9863f9a36cc2
children 72a080272a4e
comparison
equal deleted inserted replaced
469:9863f9a36cc2 470:26d1ddc0ce96
1093 float srRatio = float(mmsr) / float(msr); 1093 float srRatio = float(mmsr) / float(msr);
1094 1094
1095 int x0 = rect.left(); 1095 int x0 = rect.left();
1096 int x1 = rect.right() + 1; 1096 int x1 = rect.right() + 1;
1097 1097
1098 int w = x1 - x0; 1098 const int w = x1 - x0; // const so it can be used as array size below
1099 int h = v->height(); 1099 int h = v->height();
1100 int sh = m_model->getHeight(); 1100 int sh = m_model->getHeight();
1101 1101
1102 int symin = m_miny; 1102 int symin = m_miny;
1103 int symax = m_maxy; 1103 int symax = m_maxy;
1126 // std::cerr << "not using peaks cache" << std::endl; 1126 // std::cerr << "not using peaks cache" << std::endl;
1127 } 1127 }
1128 1128
1129 int psy1i = -1; 1129 int psy1i = -1;
1130 int sw = source->width(); 1130 int sw = source->width();
1131
1132 long xf = -1;
1133 long nxf = v->getFrameForX(x0);
1134
1135 int sxa[w * 2];
1136 for (int x = 0; x < w; ++x) {
1137
1138 xf = nxf;
1139 nxf = xf + zoomLevel;
1140
1141 float sx0 = (float(xf) / srRatio - modelStart) / modelResolution;
1142 float sx1 = (float(nxf) / srRatio - modelStart) / modelResolution;
1143
1144 int sx0i = int(sx0 + 0.001);
1145 int sx1i = int(sx1);
1146
1147 sxa[x*2] = sx0i;
1148 sxa[x*2 + 1] = sx1i;
1149 }
1131 1150
1132 for (int y = 0; y < h; ++y) { 1151 for (int y = 0; y < h; ++y) {
1133 1152
1134 float sy0 = symin + (float(h - y - 1) * (symax - symin)) / h; 1153 float sy0 = symin + (float(h - y - 1) * (symax - symin)) / h;
1135 float sy1 = symin + (float(h - y) * (symax - symin)) / h; 1154 float sy1 = symin + (float(h - y) * (symax - symin)) / h;
1149 1168
1150 if (sy < 0 || sy >= source->height()) continue; 1169 if (sy < 0 || sy >= source->height()) continue;
1151 1170
1152 uchar *sourceLine = source->scanLine(sy); 1171 uchar *sourceLine = source->scanLine(sy);
1153 1172
1154 long xf = -1;
1155 long nxf = v->getFrameForX(x0);
1156
1157 int nsxi = -1;
1158
1159 for (int x = 0; x < w; ++x) { 1173 for (int x = 0; x < w; ++x) {
1160 1174
1161 xf = nxf; 1175 int sx0i = sxa[x*2];
1162 nxf = xf + zoomLevel; 1176 int sx1i = sxa[x*2 + 1];
1163
1164 if (xf < 0) {
1165 peaks[x] = 0;
1166 continue;
1167 }
1168
1169 float sx0 = (float(xf) / srRatio - modelStart) / modelResolution;
1170 float sx1 = (float(nxf) / srRatio - modelStart) / modelResolution;
1171
1172 int sx0i = int(sx0 + 0.001);
1173 int sx1i = int(sx1);
1174 1177
1175 uchar peak = 0; 1178 uchar peak = 0;
1176 for (int sx = sx0i; sx <= sx1i; ++sx) { 1179 for (int sx = sx0i; sx <= sx1i; ++sx) {
1177 if (sx < 0 || sx >= sw) continue; 1180 if (sx < 0 || sx >= sw) continue;
1178 if (sourceLine[sx] > peak) peak = sourceLine[sx]; 1181 if (sourceLine[sx] > peak) peak = sourceLine[sx];