Kstars

starblocklist.cpp
1/*
2 SPDX-FileCopyrightText: 2008 Akarsh Simha <akarshsimha@gmail.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "starblocklist.h"
8
9#include "binfilehelper.h"
10#include "deepstarcomponent.h"
11#include "starblock.h"
12#include "starcomponent.h"
13
14#ifdef KSTARS_LITE
15#include "skymaplite.h"
16#include "kstarslite/skyitems/skynodes/pointsourcenode.h"
17#endif
18
19#include <QDebug>
20
22{
23 trixel = tr;
24 this->parent = parent;
25 staticStars = parent->hasStaticStars();
26}
27
29{
30 if (block != blocks[nBlocks - 1].get())
31 qDebug() << Q_FUNC_INFO << "ERROR: Trying to release a block which is not the last block! Trixel = " << trixel;
32
33 else if (blocks.size() > 0)
34 {
35#ifdef KSTARS_LITE
36 for (int i = 0; i < block->getStarCount(); ++i)
37 {
38 PointSourceNode *node = block->star(i)->starNode;
39 if (node)
40 {
41 SkyMapLite::Instance()->deleteSkyNode(node);
42 block->star(i)->starNode = 0;
43 }
44 }
45#endif
46 blocks.removeLast();
47 nBlocks--;
48 nStars -= block->getStarCount();
49
50 readOffset -= parent->getStarReader()->guessRecordSize() * block->getStarCount();
51 if (nBlocks <= 0)
52 faintMag = -5.0;
53 else
54 faintMag = blocks[nBlocks - 1]->faintMag;
55
56 return 1;
57 }
58
59 return 0;
60}
61
62bool StarBlockList::fillToMag(float maglim)
63{
64 // TODO: Remove staticity of BinFileHelper
67 StarData stardata;
68 DeepStarData deepstardata;
70
71 dSReader = parent->getStarReader();
72 dataFile = dSReader->getFileHandle();
73 SBFactory = StarBlockFactory::Instance();
74
75 if (staticStars)
76 return false;
77
78 if (faintMag >= maglim)
79 return true;
80
81 if (!dataFile)
82 {
83 qDebug() << Q_FUNC_INFO << "dataFile not opened!";
84 return false;
85 }
86
87 Trixel trixelId =
88 trixel; //( ( trixel < 256 ) ? ( trixel + 256 ) : ( trixel - 256 ) ); // Trixel ID on datafile is assigned differently
89
90 if (readOffset <= 0)
91 readOffset = dSReader->getOffset(trixelId);
92
93 Q_ASSERT(nBlocks == (unsigned int)blocks.size());
94
96
97 /*
98 qDebug() << Q_FUNC_INFO << "Reading trixel" << trixel << ", id on disk =" << trixelId << ", currently nStars =" << nStars
99 << ", record count =" << dSReader->getRecordCount( trixelId ) << ", first block = " << blocks[0]->getStarCount()
100 << "to maglim =" << maglim << "with current faintMag =" << faintMag;
101 */
102
103 while (maglim >= faintMag && nStars < dSReader->getRecordCount(trixelId))
104 {
105 int ret = 0;
106
107 if (nBlocks == 0 || blocks[nBlocks - 1]->isFull())
108 {
109 std::shared_ptr<StarBlock> newBlock = SBFactory->getBlock();
110
111 if (!newBlock.get())
112 {
113 qWarning() << "ERROR: Could not get a new block from StarBlockFactory::getBlock() in trixel " << trixel
114 << ", while trying to create block #" << nBlocks + 1;
115 return false;
116 }
117 blocks.append(newBlock);
118 blocks[nBlocks]->parent = this;
119 if (nBlocks == 0)
120 SBFactory->markFirst(blocks[0]);
121 else if (!SBFactory->markNext(blocks[nBlocks - 1], blocks[nBlocks]))
122 qWarning() << "ERROR: markNext() failed on block #" << nBlocks + 1 << "in trixel" << trixel;
123
124 ++nBlocks;
125 }
126 // TODO: Make this more general
127 if (dSReader->guessRecordSize() == 32)
128 {
129 ret = fread(&stardata, sizeof(StarData), 1, dataFile);
130 if (dSReader->getByteSwap())
131 DeepStarComponent::byteSwap(&stardata);
132 readOffset += sizeof(StarData);
133 blocks[nBlocks - 1]->addStar(stardata);
134 }
135 else
136 {
137 ret = fread(&deepstardata, sizeof(DeepStarData), 1, dataFile);
138 if (dSReader->getByteSwap())
139 DeepStarComponent::byteSwap(&deepstardata);
140 readOffset += sizeof(DeepStarData);
141 blocks[nBlocks - 1]->addStar(deepstardata);
142 }
143
144 /*
145 if( faintMag > -5.0 && fabs(faintMag - blocks[nBlocks - 1]->getFaintMag()) > 0.2 ) {
146 qDebug() << Q_FUNC_INFO << "Encountered a jump from mag" << faintMag << "to mag"
147 << blocks[nBlocks - 1]->getFaintMag() << "in trixel" << trixel;
148 }
149 */
150 faintMag = blocks[nBlocks - 1]->getFaintMag();
151 nStars++;
152 }
153
154 return ((maglim < faintMag) ? true : false);
155}
156
157void StarBlockList::setStaticBlock(std::shared_ptr<StarBlock> &block)
158{
159 if (!block)
160 return;
161 if (nBlocks == 0)
162 {
163 blocks.append(block);
164 }
165 else
166 blocks[0] = block;
167
168 blocks[0]->parent = this;
169 faintMag = blocks[0]->faintMag;
170 nBlocks = 1;
171 staticStars = true;
172}
This class provides utility functions to handle binary data files in the format prescribed by KStars.
static int unsigned_KDE_fseek(FILE *stream, quint32 offset, int whence)
Wrapper around fseek for large offsets.
int guessRecordSize() const
Return a guessed record size.
Stores and manages unnamed stars, most of which are dynamically loaded into memory.
bool hasStaticStars() const
A SkyNode derived class used for displaying PointNode with coordinates provided by SkyObject.
A factory that creates StarBlocks and recycles them in an LRU Cache.
std::shared_ptr< StarBlock > block(unsigned int i)
Returns the i-th block in this StarBlockList.
StarBlockList(const Trixel &trixel, DeepStarComponent *parent=nullptr)
Constructor for deep star catalogs.
void setStaticBlock(std::shared_ptr< StarBlock > &block)
Sets the first StarBlock in the list to point to the given StarBlock.
bool fillToMag(float maglim)
Ensures that the list is loaded with stars to given magnitude limit.
int releaseBlock(StarBlock *block)
Drops the StarBlock with the given pointer from the list.
Holds a block of stars and various peripheral variables to mark its place in data structures.
Definition starblock.h:43
void append(QList< T > &&value)
void removeLast()
qsizetype size() const const
A 16-byte structure that holds star data for really faint stars.
A 32-byte Structure that holds star data.
Definition stardata.h:18
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri May 17 2024 11:48:27 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.