Changeset 7552
- Timestamp:
- 01/19/11 14:35:40 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/components/bio-formats/src/loci/formats/in/SlidebookReader.java
r7543 r7552 64 64 private Vector<Double> ndFilters; 65 65 66 private long[][] planeOffset; 67 66 68 private boolean adjust = true; 67 69 private boolean isSpool; … … 94 96 FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 95 97 96 int plane = FormatTools.getPlaneSize(this); 97 long offset = pixelOffsets.get(series).longValue() + plane * no; 98 long offset = planeOffset[getSeries()][no]; 98 99 in.seek(offset); 99 100 … … 131 132 metadataInPlanes = null; 132 133 adjust = true; 134 planeOffset = null; 133 135 } 134 136 } … … 338 340 } 339 341 342 Vector<Long> orderedSeries = new Vector<Long>(); 343 Hashtable<Long, Vector<Integer>> uniqueSeries = 344 new Hashtable<Long, Vector<Integer>>(); 345 340 346 for (int i=0; i<pixelOffsets.size(); i++) { 341 347 long length = pixelLengths.get(i).longValue(); … … 349 355 i--; 350 356 } 357 else { 358 Vector<Integer> v = uniqueSeries.get(length); 359 if (v == null) { 360 orderedSeries.add(length); 361 v = new Vector<Integer>(); 362 } 363 364 v.add(i); 365 uniqueSeries.put(length, v); 366 } 351 367 } 352 368 353 369 if (pixelOffsets.size() > 1) { 354 370 boolean little = isLittleEndian(); 355 core = new CoreMetadata[ pixelOffsets.size()];371 core = new CoreMetadata[uniqueSeries.size()]; 356 372 for (int i=0; i<getSeriesCount(); i++) { 357 373 core[i] = new CoreMetadata(); … … 376 392 Vector<String> channelNames = new Vector<String>(); 377 393 int nextName = 0; 394 395 int[] sizeX = new int[pixelOffsets.size()]; 396 int[] sizeY = new int[pixelOffsets.size()]; 397 int[] sizeZ = new int[pixelOffsets.size()]; 398 int[] sizeC = new int[pixelOffsets.size()]; 378 399 379 400 // try to find the width and height … … 414 435 pixelOffsets.get(j + 1).longValue(); 415 436 if (in.getFilePointer() < end) { 416 if ( core[j].sizeX== 0) {417 core[j].sizeX= in.readShort();418 core[j].sizeY= in.readShort();437 if (sizeX[j] == 0) { 438 sizeX[j] = in.readShort(); 439 sizeY[j] = in.readShort(); 419 440 int checkX = in.readShort(); 420 441 int checkY = in.readShort(); 421 442 int div = in.readShort(); 422 core[j].sizeX/= (div == 0 ? 1 : div);443 sizeX[j] /= (div == 0 ? 1 : div); 423 444 div = in.readShort(); 424 core[j].sizeY/= (div == 0 ? 1 : div);445 sizeY[j] /= (div == 0 ? 1 : div); 425 446 } 426 447 if (prevSeries != j) { … … 428 449 } 429 450 prevSeries = j; 430 core[j].sizeC= iCount;451 sizeC[j] = iCount; 431 452 break; 432 453 } … … 435 456 else if (n == 'u') { 436 457 uCount++; 437 for (int j=0; j< pixelOffsets.size(); j++) {438 long end = j == pixelOffsets.size() - 1 ? in.length() :458 for (int j=0; j<getSeriesCount(); j++) { 459 long end = j == getSeriesCount() - 1 ? in.length() : 439 460 pixelOffsets.get(j + 1).longValue(); 440 461 if (in.getFilePointer() < end) { … … 443 464 } 444 465 prevSeriesU = j; 445 core[j].sizeZ= uCount;466 sizeZ[j] = uCount; 446 467 break; 447 468 } … … 474 495 div = in.readShort(); 475 496 y /= (div == 0 ? 1 : div); 476 if (x > 16 && (x < core[nextName - 1].sizeX||477 core[nextName - 1].sizeX== 0) && y > 16 &&478 (y < core[nextName - 1].sizeY || core[nextName - 1].sizeY== 0))497 if (x > 16 && (x < sizeX[nextName - 1] || 498 sizeX[nextName - 1] == 0) && y > 16 && 499 (y < sizeY[nextName - 1] || sizeY[nextName - 1] == 0)) 479 500 { 480 core[nextName - 1].sizeX= x;481 core[nextName - 1].sizeY= y;501 sizeX[nextName - 1] = x; 502 sizeY[nextName - 1] = y; 482 503 adjust = false; 483 504 } … … 527 548 if (in.getFilePointer() < end) { 528 549 in.skipBytes(16); 529 core[j].sizeX= in.readShort();530 core[j].sizeY= in.readShort();550 sizeX[j] = in.readShort(); 551 sizeY[j] = in.readShort(); 531 552 adjust = false; 532 553 break; … … 537 558 } 538 559 560 planeOffset = new long[getSeriesCount()][]; 561 539 562 for (int i=0; i<getSeriesCount(); i++) { 540 563 setSeries(i); 541 long pixels = pixelLengths.get(i).longValue() / 2; 564 565 Vector<Integer> pixelIndexes = uniqueSeries.get(orderedSeries.get(i)); 566 int index = pixelIndexes.get(0); 567 568 long pixels = pixelLengths.get(index).longValue() / 2; 542 569 boolean x = true; 570 571 core[i].sizeX = sizeX[index]; 572 core[i].sizeY = sizeY[index]; 573 core[i].sizeC = sizeC[index]; 574 core[i].sizeZ = sizeZ[index]; 543 575 544 576 if (getSizeC() == 0) core[i].sizeC = 1; … … 573 605 } 574 606 if (getSizeT() == 0) core[i].sizeT = 1; 607 608 int nBlocks = uniqueSeries.get(orderedSeries.get(i)).size(); 609 core[i].sizeT *= nBlocks; 575 610 core[i].imageCount = nPlanes * getSizeT(); 576 611 core[i].pixelType = FormatTools.UINT16; 577 core[i].dimensionOrder = "XYZTC";612 core[i].dimensionOrder = nBlocks > 1 ? "XYZCT" : "XYZTC"; 578 613 core[i].indexed = false; 579 614 core[i].falseColor = false; 580 615 core[i].metadataComplete = true; 616 617 planeOffset[i] = new long[getImageCount()]; 618 int nextImage = 0; 619 for (Integer pixelIndex : pixelIndexes) { 620 long offset = pixelOffsets.get(pixelIndex); 621 long length = pixelLengths.get(pixelIndex); 622 int planeSize = getSizeX() * getSizeY() * 2; 623 int planes = (int) (length / planeSize); 624 for (int p=0; p<planes; p++, nextImage++) { 625 planeOffset[i][nextImage] = offset + p * planeSize; 626 } 627 } 581 628 } 582 629 setSeries(0);
Note: See TracChangeset
for help on using the changeset viewer.