update TileFont codes

This commit is contained in:
hyzboy 2020-07-31 22:21:44 +08:00
parent 1f80f793ac
commit 18b00d40fe
5 changed files with 150 additions and 27 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 5866f9238750b11ddd925d51201da788cb234d7e Subproject commit fbb3c6d13c17d9d5d6e2fba16f1a9614c5c9cf26

View File

@ -12,12 +12,15 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
using TileUVPixel=RectScope2i;
using TileUVFloat=RectScope2d;
struct TileObject struct TileObject
{ {
int col,row; //当前tile在整个纹理中的tile位置 int col,row; //当前tile在整个纹理中的tile位置
RectScope2i uv_pixel; //以象素为单位的tile位置和尺寸 TileUVPixel uv_pixel; //以象素为单位的tile位置和尺寸
RectScope2d uv_float; //以浮点为单位的tile位置和尺寸 TileUVFloat uv_float; //以浮点为单位的tile位置和尺寸
};//struct TileObject };//struct TileObject
/** /**
@ -69,6 +72,8 @@ namespace hgl
TileObject *Commit(const void *,const uint,const int=-1,const int=-1); ///<提交一个Tile TileObject *Commit(const void *,const uint,const int=-1,const int=-1); ///<提交一个Tile
TileObject *Commit(BitmapData *bmp){return this->Commit(bmp->data,bmp->total_bytes,bmp->width,bmp->height);}///<提交一个Tile TileObject *Commit(BitmapData *bmp){return this->Commit(bmp->data,bmp->total_bytes,bmp->width,bmp->height);}///<提交一个Tile
TileObject *Acquire(); ///<请求一个Tile
bool Change(TileObject *,const void *,const uint,const int=-1,const int=-1); ///<更改一个Tile的数据内容 bool Change(TileObject *,const void *,const uint,const int=-1,const int=-1); ///<更改一个Tile的数据内容
int EndCommit(); int EndCommit();

View File

@ -3,27 +3,104 @@
#include<hgl/graph/TileData.h> #include<hgl/graph/TileData.h>
#include<hgl/graph/font/FontSource.h> #include<hgl/graph/font/FontSource.h>
#include<hgl/type/ResPoolManage.h>
namespace hgl namespace hgl
{ {
namespace graph namespace graph
{ {
class TileObjectPool template<typename T> struct RefData
{ {
TileData *tile_data; int ref_count;
T data;
public: public:
TileObject *Acquire(); RefData(const T &value)
void Release(TileObject *); {
ref_count=1;
data=value;
}
};//template<typename T> struct RefData
template<typename T> class DataPool
{
public:
DataPool();
virtual ~DataPool()=default;
virtual bool Acquire(T &)=0;
virtual void Release(const T)=0;
};//
template<typename K,typename V> class ResPool
{
protected:
using ActiveItem=RefData<V>;
DataPool<V> *pool;
MapObject<K,ActiveItem> active_items; ///<活跃的数据
Map<K,V> idle_items; ///<引用计数为0的
public: public:
TileObjectPool(TileData *td):tile_data(td); ResPool(DataPool<V> *dp):pool(dp){}
}; virtual ~ResPool()=default;
using TileObjectManage=_ResPoolManage<u32char,TileObject *,TileObjectPool>; bool Get(const K &key,V &value)
{
ActiveItem *ai;
if(active_items.Get(key,ai)) //在活跃列表中找
{
++ai->ref_count;
value=ai->data;
return(true);
}
if(idle_items.Get(key,value)) //在限制列表中找
{
active_items.Add(key,new ActiveItem(value));
return(true);
}
return(false);
}
bool Create(const K &key,V &value)
{
if(!pool->Acquire(value))
return(false);
active_items.Add(key,new ActiveItem(value));
return(true);
}
void Release(const K &key)
{
int pos;
ActiveItem *ai;
pos=active_items.GetValueAndSerial(key,ai);
if(pos>0)
{
--ai->ref_count;
if(ai->ref_count==0)
{
idle_items.Add(ai->data);
active_items.DeleteBySerial(pos);
}
return;
}
}
};//template<typename K,typename V> class ResPool
using TileResPool=ResPool<u32char,TileObject *>;
/** /**
* Tile字符管理<br> * Tile字符管理<br>
@ -34,8 +111,8 @@ namespace hgl
FontSource *source; FontSource *source;
TileData *tile_data; TileData *tile_data;
TileObjectPool *tile_pool; DataPool<TileObject *> *to_pool;
TileObjectManage *ch_tile_pool; TileResPool *to_res;
public: public:
@ -47,7 +124,7 @@ namespace hgl
TileFont(TileData *td,FontSource *fs); TileFont(TileData *td,FontSource *fs);
virtual ~TileFont(); virtual ~TileFont();
bool Registry(List<RectScope2f> &,const List<u32char> &); ///<注册要使用的字符 bool Registry(List<TileUVFloat> &,const List<u32char> &); ///<注册要使用的字符
void Unregistry(const List<u32char> &); ///<注销要使用的字符 void Unregistry(const List<u32char> &); ///<注销要使用的字符
};//class TileFont };//class TileFont
}//namespace graph }//namespace graph

View File

@ -147,6 +147,16 @@ namespace hgl
return(obj); return(obj);
} }
TileObject *TileData::Acquire()
{
TileObject *obj;
if(!to_pool.Get(obj))
return(nullptr);
return obj;
}
/** /**
* Tile * Tile
* @param obj Tile的对象指针 * @param obj Tile的对象指针

View File

@ -6,13 +6,30 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
TileObject *TileObjectPool::Acquire() namespace
{ {
} using TileObjectPointer=TileObject *;
void TileObjectPool::Release(TileObject *) class TileObjectPool:public DataPool<TileObjectPointer>
{ {
} TileData *tile_data;
public:
TileObjectPool(TileData *td):tile_data(td){}
bool Acquire(TileObjectPointer &top) override
{
top=tile_data->Acquire();
return(top);
}
void Release(TileObjectPointer) override
{
}
};//class TileObjectPool:public DataPool<TileObjectPointer>
}//namespace
TileFont::TileFont(TileData *td,FontSource *fs) TileFont::TileFont(TileData *td,FontSource *fs)
{ {
@ -21,22 +38,22 @@ namespace hgl
if(fs) if(fs)
{ {
source=fs; source=fs;
source->RefAcquire(this); source->RefAcquire(this);
} }
tile_pool=new TileObjectPool(tile_data); to_pool=new TileObjectPool(tile_data);
ch_tile_pool=new TileObjectManage(tile_pool); to_res=new TileResPool(to_pool);
} }
TileFont::~TileFont() TileFont::~TileFont()
{ {
delete ch_tile_pool; delete to_res;
delete tile_pool; delete to_pool;
if(source) if(source)
source->RefRelease(this); source->RefRelease(this);
SAFE_CLEAR(tile_data); delete tile_data;
} }
/** /**
@ -44,9 +61,23 @@ namespace hgl
* @param rs UV坐标 * @param rs UV坐标
* @param ch_list * @param ch_list
*/ */
bool TileFont::Registry(List<RectScope2f> &rs,const List<u32char> &ch_list) bool TileFont::Registry(List<TileUVFloat> &rs,const List<u32char> &ch_list)
{ {
const u32char *cp=ch_list.GetData();
TileObject *to;
List<u32char> new_chars;
for(uint i=0;i<ch_list.GetCount();i++)
{
if(!to_res->Get(*cp,to))
new_chars.Add(*cp);
cp++;
}
tile_data->BeginCommit();
tile_data->EndCommit();
} }
/** /**