Finished chess animator.
[tagua/yd.git] / src / spriteloader.cpp
blob43ff01194640a44ba300b9e488012fd4f521da60
1 /*
2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 */
11 #include <map>
12 #include "loader/theme.h"
13 #include "spriteloader.h"
15 class SpriteLoader::Loader : public ::Loader::Theme {
16 public:
17 int m_ref_count;
18 Loader(const QString& s)
19 : ::Loader::Theme(s)
20 , m_ref_count(0) {
24 /* inherit instead of typedef to ease forward declaration :) */
25 class SpriteLoader::LoadersCache : public
26 std::map<QString, SpriteLoader::Loader*> {
29 SpriteLoader::LoadersCache SpriteLoader::loaders;
31 SpriteLoader::SpriteLoader()
32 : m_loader(NULL)
33 , m_size(0)
37 SpriteLoader::~SpriteLoader() {
38 flush();
41 void SpriteLoader::flush() {
42 if(m_loader) {
43 /* unref the size */
44 if(m_size)
45 m_loader->unrefSize(m_size);
47 /* unref the loader, and possibly destroy it */
48 if(!--m_loader->m_ref_count) {
49 delete m_loader;
50 loaders.erase(m_base);
52 m_loader = NULL;
56 void SpriteLoader::setBasePath(const QString& base) {
57 //QString base = PixmapLoader::Loader::resolveBasePath(__base);
59 if(base == m_base)
60 return;
62 flush();
63 m_base = base;
66 void SpriteLoader::setSize(int s) {
67 if(m_loader) {
68 if(s)
69 m_loader->refSize(s);
70 if(m_size)
71 m_loader->unrefSize(m_size);
73 m_size = s;
76 void SpriteLoader::initialize() {
77 if(m_loader)
78 return;
80 /* try to get a loader */
81 if(loaders.count(m_base))
82 m_loader = loaders[m_base];
83 else {
84 m_loader = new Loader(m_base);
85 loaders[m_base] = m_loader;
88 m_loader->m_ref_count++;
89 m_loader->refSize(m_size);
92 QPixmap SpriteLoader::operator()(const QString& id) {
93 if(!m_size || m_base.isEmpty())
94 return QPixmap();
96 if(!m_loader)
97 initialize();
99 return m_loader->getPixmap(id, m_size);
102 ::Loader::PixmapOrMap SpriteLoader::getPixmapMap(const QString& id) {
103 if(!m_size || m_base.isEmpty())
104 return ::Loader::PixmapOrMap();
106 if(!m_loader)
107 initialize();
109 return m_loader->getPixmapMap(id, m_size);
112 ::Loader::Glyph SpriteLoader::getGlyph(const QString& id) {
113 if(!m_size || m_base.isEmpty())
114 return ::Loader::Glyph();
116 if(!m_loader)
117 initialize();
119 return m_loader->getGlyph(id, m_size);