Add ImageCache, add ResourceCache, add Frame, rename Frames to FrameSequence
This commit is contained in:
parent
645603775d
commit
bd58cf1b49
|
|
@ -1,6 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\Action.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionGroup.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionHelper.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionManager.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionTween.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\action\Animation.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Frame.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\GifSprite.h" />
|
||||
<ClInclude Include="..\src\kiwano\base\Director.h" />
|
||||
<ClInclude Include="..\src\kiwano\base\types.h" />
|
||||
|
|
@ -8,20 +15,12 @@
|
|||
<ClInclude Include="..\src\kiwano\config.h" />
|
||||
<ClInclude Include="..\src\kiwano\macros.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\include-forwards.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Action.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionGroup.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionHelper.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionManager.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionTween.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Animation.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Canvas.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Color.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\DebugNode.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Font.hpp" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Frames.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\FrameSequence.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\ShapeNode.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\GifImage.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Image.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Layer.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Actor.h" />
|
||||
<ClInclude Include="..\src\kiwano\2d\Stage.h" />
|
||||
|
|
@ -70,7 +69,10 @@
|
|||
<ClInclude Include="..\src\kiwano\renderer\D3D10DeviceResources.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\D3D11DeviceResources.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\D3DDeviceResourcesBase.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\GifImage.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\helper.hpp" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\Image.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\ImageCache.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\render.h" />
|
||||
<ClInclude Include="..\src\kiwano\renderer\TextRenderer.h" />
|
||||
<ClInclude Include="..\src\kiwano\third-party\StackWalker\StackWalker.h" />
|
||||
|
|
@ -80,22 +82,21 @@
|
|||
<ClInclude Include="..\src\kiwano\utils\DataUtil.h" />
|
||||
<ClInclude Include="..\src\kiwano\utils\FileUtil.h" />
|
||||
<ClInclude Include="..\src\kiwano\utils\Path.h" />
|
||||
<ClInclude Include="..\src\kiwano\utils\ResLoader.h" />
|
||||
<ClInclude Include="..\src\kiwano\utils\ResourceCache.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\kiwano\2d\Action.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\ActionGroup.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\ActionManager.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\ActionTween.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Animation.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\action\Action.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\action\ActionGroup.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\action\ActionManager.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\action\ActionTween.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\action\Animation.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Canvas.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Color.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\DebugNode.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Frames.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Frame.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\FrameSequence.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\ShapeNode.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\GifImage.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\GifSprite.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Image.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Layer.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Actor.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\2d\Stage.cpp" />
|
||||
|
|
@ -119,6 +120,9 @@
|
|||
<ClCompile Include="..\src\kiwano\renderer\D2DDeviceResources.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\D3D10DeviceResources.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\D3D11DeviceResources.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\GifImage.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\Image.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\ImageCache.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\render.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\renderer\TextRenderer.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\third-party\StackWalker\StackWalker.cpp" />
|
||||
|
|
@ -128,7 +132,7 @@
|
|||
<ClCompile Include="..\src\kiwano\utils\DataUtil.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\utils\FileUtil.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\utils\Path.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\utils\ResLoader.cpp" />
|
||||
<ClCompile Include="..\src\kiwano\utils\ResourceCache.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
|
|
|
|||
|
|
@ -34,6 +34,9 @@
|
|||
<Filter Include="third-party\tinyxml2">
|
||||
<UniqueIdentifier>{0cae76f7-7016-4a45-bb26-a130fbce8024}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="2d\action">
|
||||
<UniqueIdentifier>{9314f30d-5742-48b6-94e5-e3b4284106f6}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\src\kiwano\ui\Button.h">
|
||||
|
|
@ -42,24 +45,6 @@
|
|||
<ClInclude Include="..\src\kiwano\ui\Menu.h">
|
||||
<Filter>ui</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\Action.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionGroup.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionHelper.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionManager.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\ActionTween.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\Animation.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\Canvas.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -72,12 +57,6 @@
|
|||
<ClInclude Include="..\src\kiwano\2d\Font.hpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\Frames.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\Image.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\include-forwards.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -186,9 +165,6 @@
|
|||
<ClInclude Include="..\src\kiwano\utils\Path.h">
|
||||
<Filter>utils</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\utils\ResLoader.h">
|
||||
<Filter>utils</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\config.h" />
|
||||
<ClInclude Include="..\src\kiwano\macros.h" />
|
||||
<ClInclude Include="..\src\kiwano\math\helper.h">
|
||||
|
|
@ -222,9 +198,6 @@
|
|||
<ClInclude Include="..\src\kiwano\base\AsyncTask.h">
|
||||
<Filter>base</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\GifImage.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\third-party\StackWalker\StackWalker.h">
|
||||
<Filter>third-party\StackWalker</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -270,6 +243,42 @@
|
|||
<ClInclude Include="..\src\kiwano\2d\Stage.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\Frame.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\renderer\GifImage.h">
|
||||
<Filter>renderer</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\renderer\Image.h">
|
||||
<Filter>renderer</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\Action.h">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionGroup.h">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionHelper.h">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionTween.h">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\ActionManager.h">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\action\Animation.h">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\renderer\ImageCache.h">
|
||||
<Filter>renderer</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\utils\ResourceCache.h">
|
||||
<Filter>utils</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\kiwano\2d\FrameSequence.h">
|
||||
<Filter>2d</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\kiwano\ui\Button.cpp">
|
||||
|
|
@ -278,21 +287,6 @@
|
|||
<ClCompile Include="..\src\kiwano\ui\Menu.cpp">
|
||||
<Filter>ui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Action.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\ActionGroup.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\ActionManager.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\ActionTween.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Animation.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Canvas.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -302,12 +296,6 @@
|
|||
<ClCompile Include="..\src\kiwano\2d\DebugNode.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Frames.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Image.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Layer.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -359,9 +347,6 @@
|
|||
<ClCompile Include="..\src\kiwano\utils\Path.cpp">
|
||||
<Filter>utils</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\utils\ResLoader.cpp">
|
||||
<Filter>utils</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\base\Input.cpp">
|
||||
<Filter>base</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -383,9 +368,6 @@
|
|||
<ClCompile Include="..\src\kiwano\base\AsyncTask.cpp">
|
||||
<Filter>base</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\GifImage.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\third-party\StackWalker\StackWalker.cpp">
|
||||
<Filter>third-party\StackWalker</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -410,5 +392,38 @@
|
|||
<ClCompile Include="..\src\kiwano\2d\Stage.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\Frame.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\renderer\GifImage.cpp">
|
||||
<Filter>renderer</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\renderer\Image.cpp">
|
||||
<Filter>renderer</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\action\Action.cpp">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\action\ActionGroup.cpp">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\action\ActionTween.cpp">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\action\ActionManager.cpp">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\action\Animation.cpp">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\renderer\ImageCache.cpp">
|
||||
<Filter>renderer</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\utils\ResourceCache.cpp">
|
||||
<Filter>utils</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\kiwano\2d\FrameSequence.cpp">
|
||||
<Filter>2d</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -19,7 +19,6 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "Actor.h"
|
||||
#include "Action.h"
|
||||
#include "Stage.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../renderer/render.h"
|
||||
|
|
@ -658,11 +657,11 @@ namespace kiwano
|
|||
}
|
||||
|
||||
|
||||
void VisualNode::PrepareRender()
|
||||
void VisualActor::PrepareRender()
|
||||
{
|
||||
auto renderer = Renderer::Instance();
|
||||
renderer->SetTransform(transform_matrix_);
|
||||
renderer->SetOpacity(displayed_opacity_);
|
||||
auto renderer = Renderer::Instance();
|
||||
renderer->SetTransform(transform_matrix_);
|
||||
renderer->SetOpacity(displayed_opacity_);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
#pragma once
|
||||
#include "include-forwards.h"
|
||||
#include "Transform.hpp"
|
||||
#include "ActionManager.h"
|
||||
#include "action/ActionManager.h"
|
||||
#include "../base/TimerManager.h"
|
||||
#include "../base/EventDispatcher.h"
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ namespace kiwano
|
|||
// »ñÈ¡ y ×ø±ê
|
||||
float GetPositionY() const { return transform_.position.y; }
|
||||
|
||||
// 获取横向缩放比例
|
||||
// 获取缩放比例
|
||||
Point GetScale() const { return transform_.scale; }
|
||||
|
||||
// »ñÈ¡ºáÏòËõ·Å±ÈÀý
|
||||
|
|
@ -452,8 +452,9 @@ namespace kiwano
|
|||
};
|
||||
|
||||
|
||||
// 可视化角色
|
||||
class KGE_API VisualNode
|
||||
// 可视角色
|
||||
// 在渲染前处理二维旋转矩阵和透明度
|
||||
class KGE_API VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "Canvas.h"
|
||||
#include "Image.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../renderer/render.h"
|
||||
|
||||
|
|
@ -258,7 +257,7 @@ namespace kiwano
|
|||
D2D1::RectF(0, 0, image->GetWidth(), image->GetHeight()),
|
||||
opacity,
|
||||
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
|
||||
DX::ConvertToRectF(image->GetCropRect())
|
||||
D2D1::RectF(0, 0, image->GetWidth(), image->GetHeight())
|
||||
);
|
||||
cache_expired_ = true;
|
||||
}
|
||||
|
|
@ -463,8 +462,7 @@ namespace kiwano
|
|||
|
||||
ImagePtr Canvas::ExportToImage() const
|
||||
{
|
||||
auto image = new Image(GetBitmap());
|
||||
image->Crop(Rect(Point{}, this->GetSize()));
|
||||
ImagePtr image = new Image(GetBitmap());
|
||||
return image;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,15 +22,18 @@
|
|||
#include "Actor.h"
|
||||
#include "Font.hpp"
|
||||
#include "TextStyle.hpp"
|
||||
#include "../renderer/Image.h"
|
||||
#include "../renderer/TextRenderer.h"
|
||||
|
||||
#undef DrawText
|
||||
#ifdef DrawText
|
||||
# undef DrawText
|
||||
#endif
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
// »²¼
|
||||
class KGE_API Canvas
|
||||
: public VisualNode
|
||||
: public VisualActor
|
||||
{
|
||||
public:
|
||||
Canvas();
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
namespace kiwano
|
||||
{
|
||||
class KGE_API DebugNode
|
||||
: public VisualNode
|
||||
: public VisualActor
|
||||
{
|
||||
public:
|
||||
DebugNode();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,73 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "Frame.h"
|
||||
#include "../renderer/ImageCache.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
Frame::Frame()
|
||||
{
|
||||
}
|
||||
|
||||
Frame::Frame(Resource const& res)
|
||||
{
|
||||
Load(res);
|
||||
}
|
||||
|
||||
Frame::Frame(ImagePtr image)
|
||||
: image_(image)
|
||||
{
|
||||
}
|
||||
|
||||
bool Frame::Load(Resource const& res)
|
||||
{
|
||||
ImagePtr image = ImageCache::Instance()->AddImage(res);
|
||||
if (image && image->IsValid())
|
||||
{
|
||||
SetImage(image);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Frame::Crop(Rect const& crop_rect)
|
||||
{
|
||||
if (image_)
|
||||
{
|
||||
auto bitmap_size = image_->GetSize();
|
||||
crop_rect_.origin.x = std::min(std::max(crop_rect.origin.x, 0.f), bitmap_size.x);
|
||||
crop_rect_.origin.y = std::min(std::max(crop_rect.origin.y, 0.f), bitmap_size.y);
|
||||
crop_rect_.size.x = std::min(std::max(crop_rect.size.x, 0.f), bitmap_size.x - crop_rect.origin.x);
|
||||
crop_rect_.size.y = std::min(std::max(crop_rect.size.y, 0.f), bitmap_size.y - crop_rect.origin.y);
|
||||
}
|
||||
}
|
||||
|
||||
void Frame::SetImage(ImagePtr image)
|
||||
{
|
||||
image_ = image;
|
||||
if (image_)
|
||||
{
|
||||
crop_rect_.origin.x = crop_rect_.origin.y = 0;
|
||||
crop_rect_.size.x = image_->GetWidth();
|
||||
crop_rect_.size.y = image_->GetHeight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include "../renderer/Image.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
// ֡ͼÏñ
|
||||
class KGE_API Frame
|
||||
: public Object
|
||||
{
|
||||
public:
|
||||
Frame();
|
||||
|
||||
explicit Frame(
|
||||
Resource const& res
|
||||
);
|
||||
|
||||
explicit Frame(
|
||||
ImagePtr image
|
||||
);
|
||||
|
||||
bool Load(
|
||||
Resource const& res
|
||||
);
|
||||
|
||||
// ²Ã¼ô¾ØÐÎ
|
||||
void Crop(
|
||||
Rect const& crop_rect /* ²Ã¼ô¾ØÐÎ */
|
||||
);
|
||||
|
||||
// »ñÈ¡¿í¶È
|
||||
float GetWidth() const { return crop_rect_.size.x; }
|
||||
|
||||
// »ñÈ¡¸ß¶È
|
||||
float GetHeight() const { return crop_rect_.size.y; }
|
||||
|
||||
// »ñÈ¡´óС
|
||||
Size GetSize() const { return crop_rect_.size; }
|
||||
|
||||
// »ñÈ¡²Ã¼ôλÖÃ
|
||||
Point GetCropPoint() const { return crop_rect_.origin; }
|
||||
|
||||
// »ñÈ¡²Ã¼ô¾ØÐÎ
|
||||
inline Rect const& GetCropRect() const { return crop_rect_; }
|
||||
|
||||
// »ñȡλͼ
|
||||
inline ImagePtr GetImage() const { return image_; }
|
||||
|
||||
// ÉèÖÃλͼ
|
||||
void SetImage(ImagePtr image);
|
||||
|
||||
protected:
|
||||
ImagePtr image_;
|
||||
Rect crop_rect_;
|
||||
};
|
||||
}
|
||||
|
|
@ -18,28 +18,28 @@
|
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "Frames.h"
|
||||
#include "Image.h"
|
||||
#include "FrameSequence.h"
|
||||
#include "Frame.h"
|
||||
#include "../base/logs.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
Frames::Frames()
|
||||
FrameSequence::FrameSequence()
|
||||
{
|
||||
}
|
||||
|
||||
Frames::Frames(Array<ImagePtr> const& frames)
|
||||
FrameSequence::FrameSequence(Array<FramePtr> const& frames)
|
||||
{
|
||||
this->Add(frames);
|
||||
this->AddFrames(frames);
|
||||
}
|
||||
|
||||
Frames::~Frames()
|
||||
FrameSequence::~FrameSequence()
|
||||
{
|
||||
}
|
||||
|
||||
void Frames::Add(ImagePtr frame)
|
||||
void FrameSequence::AddFrame(FramePtr frame)
|
||||
{
|
||||
KGE_ASSERT(frame && "Frames::Add failed, NULL pointer exception");
|
||||
KGE_ASSERT(frame && "FrameSequence::Add failed, NULL pointer exception");
|
||||
|
||||
if (frame)
|
||||
{
|
||||
|
|
@ -47,7 +47,7 @@ namespace kiwano
|
|||
}
|
||||
}
|
||||
|
||||
void Frames::Add(Array<ImagePtr> const& frames)
|
||||
void FrameSequence::AddFrames(Array<FramePtr> const& frames)
|
||||
{
|
||||
if (frames_.empty())
|
||||
frames_ = frames;
|
||||
|
|
@ -55,40 +55,43 @@ namespace kiwano
|
|||
{
|
||||
frames_.reserve(frames_.size() + frames.size());
|
||||
for (const auto& image : frames)
|
||||
Add(image);
|
||||
AddFrame(image);
|
||||
}
|
||||
}
|
||||
|
||||
Array<ImagePtr> const& Frames::GetFrames() const
|
||||
FramePtr FrameSequence::GetFrame(size_t index) const
|
||||
{
|
||||
KGE_ASSERT(index < frames_.size());
|
||||
return frames_[index];
|
||||
}
|
||||
|
||||
Array<FramePtr> const& FrameSequence::GetFrames() const
|
||||
{
|
||||
return frames_;
|
||||
}
|
||||
|
||||
FramesPtr Frames::Clone() const
|
||||
FrameSequencePtr FrameSequence::Clone() const
|
||||
{
|
||||
auto animation = new (std::nothrow) Frames;
|
||||
if (animation)
|
||||
auto frame_seq = new (std::nothrow) FrameSequence;
|
||||
if (frame_seq)
|
||||
{
|
||||
for (const auto& frame : frames_)
|
||||
{
|
||||
animation->Add(frame);
|
||||
}
|
||||
frame_seq->AddFrames(frames_);
|
||||
}
|
||||
return animation;
|
||||
return frame_seq;
|
||||
}
|
||||
|
||||
FramesPtr Frames::Reverse() const
|
||||
FrameSequencePtr FrameSequence::Reverse() const
|
||||
{
|
||||
auto animation = new (std::nothrow) Frames;
|
||||
auto frame_seq = new (std::nothrow) FrameSequence;
|
||||
if (!frames_.empty())
|
||||
{
|
||||
for (auto iter = frames_.crbegin(), crend = frames_.crend(); iter != crend; ++iter)
|
||||
{
|
||||
if (*iter)
|
||||
animation->Add(*iter);
|
||||
frame_seq->AddFrame(*iter);
|
||||
}
|
||||
}
|
||||
return animation;
|
||||
return frame_seq;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -24,38 +24,41 @@
|
|||
namespace kiwano
|
||||
{
|
||||
// 序列帧
|
||||
class KGE_API Frames
|
||||
class KGE_API FrameSequence
|
||||
: public Object
|
||||
{
|
||||
public:
|
||||
Frames();
|
||||
FrameSequence();
|
||||
|
||||
explicit Frames(
|
||||
Array<ImagePtr> const& frames /* ÐòÁÐÖ¡ */
|
||||
explicit FrameSequence(
|
||||
Array<FramePtr> const& frames /* 帧序列 */
|
||||
);
|
||||
|
||||
virtual ~Frames();
|
||||
virtual ~FrameSequence();
|
||||
|
||||
// 添加关键帧
|
||||
void Add(
|
||||
ImagePtr frame
|
||||
void AddFrame(
|
||||
FramePtr frame
|
||||
);
|
||||
|
||||
// 添加多个关键帧
|
||||
void Add(
|
||||
Array<ImagePtr> const& frames
|
||||
void AddFrames(
|
||||
Array<FramePtr> const& frames
|
||||
);
|
||||
|
||||
// 获取关键帧
|
||||
Array<ImagePtr> const& GetFrames() const;
|
||||
FramePtr GetFrame(size_t index) const;
|
||||
|
||||
// 获取关键帧
|
||||
Array<FramePtr> const& GetFrames() const;
|
||||
|
||||
// 获取帧动画的拷贝对象
|
||||
FramesPtr Clone() const;
|
||||
FrameSequencePtr Clone() const;
|
||||
|
||||
// 获取帧动画的倒转
|
||||
FramesPtr Reverse() const;
|
||||
FrameSequencePtr Reverse() const;
|
||||
|
||||
protected:
|
||||
Array<ImagePtr> frames_;
|
||||
Array<FramePtr> frames_;
|
||||
};
|
||||
}
|
||||
|
|
@ -19,7 +19,6 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "GifSprite.h"
|
||||
#include "GifImage.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../platform/modules.h"
|
||||
|
||||
|
|
@ -87,7 +86,7 @@ namespace kiwano
|
|||
|
||||
void GifSprite::Update(Duration dt)
|
||||
{
|
||||
VisualNode::Update(dt);
|
||||
VisualActor::Update(dt);
|
||||
|
||||
if (image_ && animating_)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -22,11 +22,12 @@
|
|||
#include "Actor.h"
|
||||
#include "../base/Resource.h"
|
||||
#include "../renderer/render.h"
|
||||
#include "../renderer/GifImage.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
class KGE_API GifSprite
|
||||
: public VisualNode
|
||||
: public VisualActor
|
||||
{
|
||||
public:
|
||||
using LoopDoneCallback = Closure<void(int)>;
|
||||
|
|
|
|||
|
|
@ -1,184 +0,0 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "Image.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../platform/modules.h"
|
||||
#include "../utils/FileUtil.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
Image::Image()
|
||||
: bitmap_(nullptr)
|
||||
, crop_rect_()
|
||||
{
|
||||
}
|
||||
|
||||
Image::Image(Resource const& res)
|
||||
: Image()
|
||||
{
|
||||
this->Load(res);
|
||||
}
|
||||
|
||||
Image::Image(Resource const& res, Rect const& crop_rect)
|
||||
: Image()
|
||||
{
|
||||
this->Load(res);
|
||||
this->Crop(crop_rect);
|
||||
}
|
||||
|
||||
Image::Image(ComPtr<ID2D1Bitmap> const & bitmap)
|
||||
: Image()
|
||||
{
|
||||
SetBitmap(bitmap);
|
||||
}
|
||||
|
||||
Image::~Image()
|
||||
{
|
||||
}
|
||||
|
||||
bool Image::Load(Resource const& res)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
ComPtr<ID2D1Bitmap> bitmap;
|
||||
|
||||
if (res.IsFileType())
|
||||
{
|
||||
#if defined(KGE_DEBUG)
|
||||
if (!FileUtil::ExistsFile(res.GetFileName()))
|
||||
{
|
||||
KGE_WARNING_LOG(L"Image file '%s' not found!", res.GetFileName().c_str());
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
hr = Renderer::Instance()->GetD2DDeviceResources()->CreateBitmapFromFile(bitmap, res.GetFileName());
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = Renderer::Instance()->GetD2DDeviceResources()->CreateBitmapFromResource(bitmap, res);
|
||||
}
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
KGE_ERROR_LOG(L"Load image file failed with HRESULT of %08X", hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
SetBitmap(bitmap);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Image::IsValid() const
|
||||
{
|
||||
return !!bitmap_;
|
||||
}
|
||||
|
||||
void Image::Crop(Rect const& crop_rect)
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
auto bitmap_size = bitmap_->GetSize();
|
||||
crop_rect_.origin.x = std::min(std::max(crop_rect.origin.x, 0.f), bitmap_size.width);
|
||||
crop_rect_.origin.y = std::min(std::max(crop_rect.origin.y, 0.f), bitmap_size.height);
|
||||
crop_rect_.size.x = std::min(std::max(crop_rect.size.x, 0.f), bitmap_size.width - crop_rect.origin.x);
|
||||
crop_rect_.size.y = std::min(std::max(crop_rect.size.y, 0.f), bitmap_size.height - crop_rect.origin.y);
|
||||
}
|
||||
}
|
||||
|
||||
float Image::GetWidth() const
|
||||
{
|
||||
return crop_rect_.size.x;
|
||||
}
|
||||
|
||||
float Image::GetHeight() const
|
||||
{
|
||||
return crop_rect_.size.y;
|
||||
}
|
||||
|
||||
Size Image::GetSize() const
|
||||
{
|
||||
return crop_rect_.size;
|
||||
}
|
||||
|
||||
float Image::GetSourceWidth() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
return bitmap_->GetSize().width;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
float Image::GetSourceHeight() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
return bitmap_->GetSize().height;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Size Image::GetSourceSize() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
auto bitmap_size = bitmap_->GetSize();
|
||||
return Size{ bitmap_size.width, bitmap_size.height };
|
||||
}
|
||||
return Size{};
|
||||
}
|
||||
|
||||
float Image::GetCropX() const
|
||||
{
|
||||
return crop_rect_.origin.x;
|
||||
}
|
||||
|
||||
float Image::GetCropY() const
|
||||
{
|
||||
return crop_rect_.origin.y;
|
||||
}
|
||||
|
||||
Point Image::GetCropPos() const
|
||||
{
|
||||
return crop_rect_.origin;
|
||||
}
|
||||
|
||||
Rect Image::GetCropRect() const
|
||||
{
|
||||
return crop_rect_;
|
||||
}
|
||||
|
||||
ComPtr<ID2D1Bitmap> const& Image::GetBitmap() const
|
||||
{
|
||||
return bitmap_;
|
||||
}
|
||||
|
||||
void Image::SetBitmap(ComPtr<ID2D1Bitmap> const & bitmap)
|
||||
{
|
||||
if (bitmap)
|
||||
{
|
||||
bitmap_ = bitmap;
|
||||
crop_rect_.origin.x = crop_rect_.origin.y = 0;
|
||||
crop_rect_.size.x = bitmap_->GetSize().width;
|
||||
crop_rect_.size.y = bitmap_->GetSize().height;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ namespace kiwano
|
|||
{
|
||||
// śţÎŹÍźĐνÇÉŤ
|
||||
class KGE_API ShapeNode
|
||||
: public VisualNode
|
||||
: public VisualActor
|
||||
{
|
||||
public:
|
||||
ShapeNode();
|
||||
|
|
|
|||
|
|
@ -24,74 +24,70 @@
|
|||
namespace kiwano
|
||||
{
|
||||
Sprite::Sprite()
|
||||
: image_(nullptr)
|
||||
: frame_(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
Sprite::Sprite(ImagePtr image)
|
||||
: image_(nullptr)
|
||||
{
|
||||
Load(image);
|
||||
}
|
||||
|
||||
Sprite::Sprite(Resource const& res)
|
||||
: image_(nullptr)
|
||||
: frame_(nullptr)
|
||||
{
|
||||
Load(res);
|
||||
}
|
||||
|
||||
Sprite::Sprite(Resource const& res, const Rect& crop_rect)
|
||||
: image_(nullptr)
|
||||
: frame_(nullptr)
|
||||
{
|
||||
Load(res);
|
||||
Crop(crop_rect);
|
||||
}
|
||||
|
||||
Sprite::Sprite(FramePtr frame)
|
||||
: frame_(nullptr)
|
||||
{
|
||||
SetFrame(frame);
|
||||
}
|
||||
|
||||
Sprite::~Sprite()
|
||||
{
|
||||
}
|
||||
|
||||
bool Sprite::Load(ImagePtr image)
|
||||
{
|
||||
if (image && image_ != image)
|
||||
{
|
||||
image_ = image;
|
||||
|
||||
Actor::SetSize(image_->GetWidth(), image_->GetHeight());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Sprite::Load(Resource const& res)
|
||||
{
|
||||
ImagePtr image = new (std::nothrow) Image;
|
||||
if (image->Load(res))
|
||||
FramePtr frame = new (std::nothrow) Frame;
|
||||
if (frame->Load(res))
|
||||
{
|
||||
return Load(image);
|
||||
SetFrame(frame);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Sprite::Crop(const Rect& crop_rect)
|
||||
{
|
||||
image_->Crop(crop_rect);
|
||||
Actor::SetSize(
|
||||
std::min(std::max(crop_rect.size.x, 0.f), image_->GetSourceWidth() - image_->GetCropX()),
|
||||
std::min(std::max(crop_rect.size.y, 0.f), image_->GetSourceHeight() - image_->GetCropY())
|
||||
);
|
||||
if (frame_)
|
||||
{
|
||||
frame_->Crop(crop_rect);
|
||||
SetSize(frame_->GetWidth(), frame_->GetHeight());
|
||||
}
|
||||
}
|
||||
|
||||
ImagePtr Sprite::GetImage() const
|
||||
void Sprite::SetFrame(FramePtr frame)
|
||||
{
|
||||
return image_;
|
||||
if (frame_ != frame)
|
||||
{
|
||||
frame_ = frame;
|
||||
if (frame_)
|
||||
{
|
||||
SetSize(frame_->GetWidth(), frame_->GetHeight());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Sprite::OnRender()
|
||||
{
|
||||
if (image_)
|
||||
if (frame_)
|
||||
{
|
||||
Renderer::Instance()->DrawImage(image_, GetBounds());
|
||||
Renderer::Instance()->DrawBitmap(frame_->GetImage()->GetBitmap(), frame_->GetCropRect(), GetBounds());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -20,54 +20,52 @@
|
|||
|
||||
#pragma once
|
||||
#include "Actor.h"
|
||||
#include "Image.h"
|
||||
#include "Frame.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
// ¾«Áé
|
||||
class KGE_API Sprite
|
||||
: public VisualNode
|
||||
: public VisualActor
|
||||
{
|
||||
public:
|
||||
Sprite();
|
||||
|
||||
explicit Sprite(
|
||||
ImagePtr image
|
||||
);
|
||||
|
||||
explicit Sprite(
|
||||
Resource const& res
|
||||
);
|
||||
|
||||
explicit Sprite(
|
||||
Resource const& res,
|
||||
const Rect& crop_rect /* 裁剪矩形 */
|
||||
Rect const& crop_rect /* ²Ã¼ô¾ØÐÎ */
|
||||
);
|
||||
|
||||
explicit Sprite(
|
||||
FramePtr frame
|
||||
);
|
||||
|
||||
virtual ~Sprite();
|
||||
|
||||
// 加载图片文件
|
||||
// ¼ÓÔØÍ¼Ïñ×ÊÔ´
|
||||
bool Load(
|
||||
Resource const& res
|
||||
);
|
||||
|
||||
// 加载图片
|
||||
bool Load(
|
||||
ImagePtr image
|
||||
);
|
||||
|
||||
// 将图片裁剪为矩形
|
||||
// ²Ã¼ô¾ØÐÎ
|
||||
void Crop(
|
||||
const Rect& crop_rect /* 裁剪矩形 */
|
||||
const Rect& crop_rect
|
||||
);
|
||||
|
||||
// 获取 Image 对象
|
||||
ImagePtr GetImage() const;
|
||||
// »ñȡ֡ͼÏñ
|
||||
inline FramePtr GetFrame() const { return frame_; }
|
||||
|
||||
// ÉèÖÃ֡ͼÏñ
|
||||
void SetFrame(FramePtr frame);
|
||||
|
||||
// äÖȾ¾«Áé
|
||||
void OnRender() override;
|
||||
|
||||
protected:
|
||||
ImagePtr image_;
|
||||
FramePtr frame_;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ namespace kiwano
|
|||
{
|
||||
// 文本
|
||||
class KGE_API Text
|
||||
: public VisualNode
|
||||
: public VisualActor
|
||||
{
|
||||
public:
|
||||
Text();
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "Action.h"
|
||||
#include "Actor.h"
|
||||
#include "../Actor.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include "include-forwards.h"
|
||||
#include "../include-forwards.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "ActionGroup.h"
|
||||
#include "Actor.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../Actor.h"
|
||||
#include "../../base/logs.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "ActionManager.h"
|
||||
#include "Actor.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../Actor.h"
|
||||
#include "../../base/logs.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
@ -19,8 +19,7 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "ActionTween.h"
|
||||
#include "include-forwards.h"
|
||||
#include "Actor.h"
|
||||
#include "../Actor.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
|
||||
#pragma once
|
||||
#include "Action.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../renderer/render.h" // ID2D1PathGeometry, ID2D1GeometrySink
|
||||
#include "../../base/logs.h"
|
||||
#include "../../renderer/render.h" // ID2D1PathGeometry, ID2D1GeometrySink
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
@ -19,50 +19,49 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "Animation.h"
|
||||
#include "Frames.h"
|
||||
#include "Image.h"
|
||||
#include "Sprite.h"
|
||||
#include "../FrameSequence.h"
|
||||
#include "../Sprite.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
Animation::Animation()
|
||||
: frames_(nullptr)
|
||||
: frame_seq_(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
Animation::Animation(Duration duration, FramesPtr animation, EaseFunc func)
|
||||
Animation::Animation(Duration duration, FrameSequencePtr frame_seq, EaseFunc func)
|
||||
: ActionTween(duration, func)
|
||||
, frames_(nullptr)
|
||||
, frame_seq_(nullptr)
|
||||
{
|
||||
this->SetFrames(animation);
|
||||
this->SetFrameSequence(frame_seq);
|
||||
}
|
||||
|
||||
Animation::~Animation()
|
||||
{
|
||||
}
|
||||
|
||||
FramesPtr Animation::GetFrames() const
|
||||
FrameSequencePtr Animation::GetFrameSequence() const
|
||||
{
|
||||
return frames_;
|
||||
return frame_seq_;
|
||||
}
|
||||
|
||||
void Animation::SetFrames(FramesPtr frames)
|
||||
void Animation::SetFrameSequence(FrameSequencePtr frames)
|
||||
{
|
||||
frames_ = frames;
|
||||
frame_seq_ = frames;
|
||||
}
|
||||
|
||||
void Animation::Init(ActorPtr target)
|
||||
{
|
||||
if (!frames_ || frames_->GetFrames().empty())
|
||||
if (!frame_seq_ || frame_seq_->GetFrames().empty())
|
||||
{
|
||||
Done();
|
||||
return;
|
||||
}
|
||||
|
||||
auto sprite_target = dynamic_cast<Sprite*>(target.Get());
|
||||
if (sprite_target && frames_)
|
||||
if (sprite_target && frame_seq_)
|
||||
{
|
||||
sprite_target->Load(frames_->GetFrames()[0]);
|
||||
sprite_target->SetFrame(frame_seq_->GetFrames()[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -72,27 +71,27 @@ namespace kiwano
|
|||
|
||||
KGE_ASSERT(sprite_target && "Animation only supports Sprites");
|
||||
|
||||
const auto& frames = frames_->GetFrames();
|
||||
const auto& frames = frame_seq_->GetFrames();
|
||||
auto size = frames.size();
|
||||
auto index = std::min(static_cast<size_t>(math::Floor(size * percent)), size - 1);
|
||||
|
||||
sprite_target->Load(frames[index]);
|
||||
sprite_target->SetFrame(frames[index]);
|
||||
}
|
||||
|
||||
ActionPtr Animation::Clone() const
|
||||
{
|
||||
if (frames_)
|
||||
if (frame_seq_)
|
||||
{
|
||||
return new (std::nothrow) Animation(dur_, frames_, ease_func_);
|
||||
return new (std::nothrow) Animation(dur_, frame_seq_, ease_func_);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ActionPtr Animation::Reverse() const
|
||||
{
|
||||
if (frames_)
|
||||
if (frame_seq_)
|
||||
{
|
||||
FramesPtr frames = frames_->Reverse();
|
||||
FrameSequencePtr frames = frame_seq_->Reverse();
|
||||
if (frames)
|
||||
{
|
||||
return new (std::nothrow) Animation(dur_, frames, ease_func_);
|
||||
|
|
@ -32,18 +32,18 @@ namespace kiwano
|
|||
|
||||
Animation(
|
||||
Duration duration, /* 动画时长 */
|
||||
FramesPtr frames, /* ÐòÁÐÖ¡ */
|
||||
FrameSequencePtr frame_seq, /* ÐòÁÐÖ¡ */
|
||||
EaseFunc func = nullptr /* 速度变化 */
|
||||
);
|
||||
|
||||
virtual ~Animation();
|
||||
|
||||
// 获取动画
|
||||
FramesPtr GetFrames() const;
|
||||
FrameSequencePtr GetFrameSequence() const;
|
||||
|
||||
// 设置动画
|
||||
void SetFrames(
|
||||
FramesPtr frames
|
||||
void SetFrameSequence(
|
||||
FrameSequencePtr frames
|
||||
);
|
||||
|
||||
// 获取该动作的拷贝对象
|
||||
|
|
@ -58,6 +58,6 @@ namespace kiwano
|
|||
void UpdateTween(ActorPtr target, float percent) override;
|
||||
|
||||
protected:
|
||||
FramesPtr frames_;
|
||||
FrameSequencePtr frame_seq_;
|
||||
};
|
||||
}
|
||||
|
|
@ -34,9 +34,8 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
KGE_DECLARE_SMART_PTR(Image);
|
||||
KGE_DECLARE_SMART_PTR(GifImage);
|
||||
KGE_DECLARE_SMART_PTR(Frames);
|
||||
KGE_DECLARE_SMART_PTR(Frame);
|
||||
KGE_DECLARE_SMART_PTR(FrameSequence);
|
||||
|
||||
KGE_DECLARE_SMART_PTR(Actor);
|
||||
KGE_DECLARE_SMART_PTR(Stage);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ namespace kiwano
|
|||
size_t Resource::GetHashCode() const
|
||||
{
|
||||
if (type_ == Type::File)
|
||||
return std::hash<String>{}(GetFileName());
|
||||
return GetFileName().hash();
|
||||
return std::hash<LPCWSTR>{}(bin_name_);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,8 +18,8 @@
|
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
//
|
||||
// Website: https://www.kiwano.cn
|
||||
// Source Code: https://github.com/kiwano/kiwano
|
||||
// Website: https://www.kiwanoengine.com
|
||||
// Source Code: https://github.com/KiwanoEngine/Kiwano
|
||||
//
|
||||
|
||||
|
||||
|
|
@ -60,14 +60,15 @@
|
|||
// base
|
||||
//
|
||||
|
||||
#include "renderer/render.h"
|
||||
#include "renderer/Image.h"
|
||||
#include "renderer/GifImage.h"
|
||||
|
||||
#include "base/time.h"
|
||||
#include "base/window.h"
|
||||
#include "base/input.h"
|
||||
#include "base/Director.h"
|
||||
#include "base/logs.h"
|
||||
#include "renderer/render.h"
|
||||
#include "platform/modules.h"
|
||||
#include "platform/Application.h"
|
||||
|
||||
#include "base/Object.h"
|
||||
#include "base/Event.hpp"
|
||||
|
|
@ -83,15 +84,16 @@
|
|||
#include "2d/Transform.hpp"
|
||||
#include "2d/TextStyle.hpp"
|
||||
|
||||
#include "2d/Image.h"
|
||||
#include "2d/GifImage.h"
|
||||
#include "2d/Frames.h"
|
||||
#include "2d/Action.h"
|
||||
#include "2d/ActionGroup.h"
|
||||
#include "2d/ActionTween.h"
|
||||
#include "2d/ActionHelper.h"
|
||||
#include "2d/Animation.h"
|
||||
#include "2d/ActionManager.h"
|
||||
#include "2d/Frame.h"
|
||||
#include "2d/FrameSequence.h"
|
||||
|
||||
#include "2d/action/Action.h"
|
||||
#include "2d/action/ActionGroup.h"
|
||||
#include "2d/action/ActionTween.h"
|
||||
#include "2d/action/Animation.h"
|
||||
#include "2d/action/ActionHelper.h"
|
||||
#include "2d/action/ActionManager.h"
|
||||
|
||||
#include "2d/Transition.h"
|
||||
|
||||
#include "2d/Actor.h"
|
||||
|
|
@ -104,6 +106,8 @@
|
|||
#include "2d/ShapeNode.h"
|
||||
#include "2d/DebugNode.h"
|
||||
|
||||
#include "platform/modules.h"
|
||||
#include "platform/Application.h"
|
||||
|
||||
//
|
||||
// utils
|
||||
|
|
@ -112,7 +116,7 @@
|
|||
#include "utils/Path.h"
|
||||
#include "utils/DataUtil.h"
|
||||
#include "utils/FileUtil.h"
|
||||
#include "utils/ResLoader.h"
|
||||
#include "utils/ResourceCache.h"
|
||||
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace kiwano
|
|||
value_type x;
|
||||
value_type y;
|
||||
|
||||
Vec2T() : x(0.f), y(0.f) {}
|
||||
Vec2T() : x(value_type(0)), y(value_type(0)) {}
|
||||
|
||||
Vec2T(value_type x, value_type y) : x(x), y(y) {}
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ namespace kiwano
|
|||
|
||||
inline value_type Length() const
|
||||
{
|
||||
return math::Sqrt(x * x + y * y);
|
||||
return static_cast<value_type>(math::Sqrt(static_cast<float>(x * x + y * y)));
|
||||
}
|
||||
|
||||
inline bool IsOrigin() const
|
||||
|
|
|
|||
|
|
@ -19,9 +19,9 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "D2DDeviceResources.h"
|
||||
#include "../2d/Image.h"
|
||||
#include "ImageCache.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../platform/modules.h"
|
||||
#include "../utils/FileUtil.h"
|
||||
|
||||
#pragma comment(lib, "d2d1.lib")
|
||||
#pragma comment(lib, "dwrite.lib")
|
||||
|
|
@ -73,9 +73,7 @@ namespace kiwano
|
|||
|
||||
ID2D1StrokeStyle* GetStrokeStyle(StrokeStyle stroke) const override;
|
||||
|
||||
void ClearImageCache() override;
|
||||
|
||||
void DiscardResources() override;
|
||||
void DiscardResources() override;
|
||||
|
||||
public:
|
||||
unsigned long STDMETHODCALLTYPE AddRef();
|
||||
|
|
@ -91,9 +89,6 @@ namespace kiwano
|
|||
unsigned long ref_count_;
|
||||
float dpi_;
|
||||
|
||||
using BitmapMap = UnorderedMap<size_t, ComPtr<ID2D1Bitmap>>;
|
||||
BitmapMap bitmap_cache_;
|
||||
|
||||
ComPtr<ID2D1StrokeStyle> d2d_miter_stroke_style_;
|
||||
ComPtr<ID2D1StrokeStyle> d2d_bevel_stroke_style_;
|
||||
ComPtr<ID2D1StrokeStyle> d2d_round_stroke_style_;
|
||||
|
|
@ -179,7 +174,7 @@ namespace kiwano
|
|||
|
||||
void D2DDeviceResources::DiscardResources()
|
||||
{
|
||||
ClearImageCache();
|
||||
ImageCache::Instance()->Clear();
|
||||
|
||||
factory_.Reset();
|
||||
device_.Reset();
|
||||
|
|
@ -328,11 +323,10 @@ namespace kiwano
|
|||
if (!imaging_factory_ || !device_context_)
|
||||
return E_UNEXPECTED;
|
||||
|
||||
size_t hash_code = std::hash<String>{}(file_path);
|
||||
if (bitmap_cache_.find(hash_code) != bitmap_cache_.end())
|
||||
if (!FileUtil::ExistsFile(file_path))
|
||||
{
|
||||
bitmap = bitmap_cache_[hash_code];
|
||||
return S_OK;
|
||||
KGE_WARNING_LOG(L"Image file '%s' not found!", file_path.c_str());
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
ComPtr<IWICBitmapDecoder> decoder;
|
||||
|
|
@ -384,9 +378,7 @@ namespace kiwano
|
|||
if (SUCCEEDED(hr))
|
||||
{
|
||||
bitmap = bitmap_tmp;
|
||||
bitmap_cache_.insert(std::make_pair(hash_code, bitmap));
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
|
@ -395,13 +387,6 @@ namespace kiwano
|
|||
if (!imaging_factory_ || !device_context_)
|
||||
return E_UNEXPECTED;
|
||||
|
||||
size_t hash_code = res.GetHashCode();
|
||||
if (bitmap_cache_.find(hash_code) != bitmap_cache_.end())
|
||||
{
|
||||
bitmap = bitmap_cache_[hash_code];
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
ComPtr<IWICBitmapDecoder> decoder;
|
||||
ComPtr<IWICBitmapFrameDecode> source;
|
||||
ComPtr<IWICStream> stream;
|
||||
|
|
@ -471,9 +456,7 @@ namespace kiwano
|
|||
if (SUCCEEDED(hr))
|
||||
{
|
||||
bitmap = bitmap_tmp;
|
||||
bitmap_cache_.insert(std::make_pair(hash_code, bitmap));
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
|
@ -599,11 +582,6 @@ namespace kiwano
|
|||
return hr;
|
||||
}
|
||||
|
||||
void D2DDeviceResources::ClearImageCache()
|
||||
{
|
||||
bitmap_cache_.clear();
|
||||
}
|
||||
|
||||
ID2D1StrokeStyle* D2DDeviceResources::GetStrokeStyle(StrokeStyle stroke) const
|
||||
{
|
||||
switch (stroke)
|
||||
|
|
|
|||
|
|
@ -70,8 +70,6 @@ namespace kiwano
|
|||
_In_ ComPtr<ID2D1Bitmap1> const& target
|
||||
) = 0;
|
||||
|
||||
virtual void ClearImageCache() = 0;
|
||||
|
||||
virtual void DiscardResources() = 0;
|
||||
|
||||
inline ID2D1Factory1* GetFactory() const { KGE_ASSERT(factory_); return factory_.Get(); }
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
#include "D3D10DeviceResources.h"
|
||||
|
||||
#include "../2d/Image.h"
|
||||
#include "../base/logs.h"
|
||||
|
||||
#pragma comment(lib, "d3d10_1.lib")
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
#include "D3D11DeviceResources.h"
|
||||
|
||||
#include "../2d/Image.h"
|
||||
#include "../base/logs.h"
|
||||
#include <versionhelpers.h> // IsWindows10OrGreater
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
#include "GifImage.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../platform/modules.h"
|
||||
#include "../utils/FileUtil.h"
|
||||
|
||||
namespace kiwano
|
||||
|
|
@ -19,12 +19,13 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include "include-forwards.h"
|
||||
#include "../base/Resource.h"
|
||||
#include "../renderer/render.h"
|
||||
#include "render.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
// GIF ͼÏñ
|
||||
KGE_DECLARE_SMART_PTR(GifImage);
|
||||
class KGE_API GifImage
|
||||
: public Object
|
||||
{
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "Image.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../platform/modules.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
Image::Image()
|
||||
: bitmap_(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
Image::Image(ComPtr<ID2D1Bitmap> const & bitmap)
|
||||
: Image()
|
||||
{
|
||||
SetBitmap(bitmap);
|
||||
}
|
||||
|
||||
Image::~Image()
|
||||
{
|
||||
}
|
||||
|
||||
bool Image::IsValid() const
|
||||
{
|
||||
return !!bitmap_;
|
||||
}
|
||||
|
||||
float Image::GetWidth() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
return bitmap_->GetSize().width;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
float Image::GetHeight() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
return bitmap_->GetSize().height;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Size Image::GetSize() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
auto bitmap_size = bitmap_->GetSize();
|
||||
return Size{ bitmap_size.width, bitmap_size.height };
|
||||
}
|
||||
return Size{};
|
||||
}
|
||||
|
||||
UINT32 Image::GetWidthInPixels() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
return bitmap_->GetPixelSize().width;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT32 Image::GetHeightInPixels() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
return bitmap_->GetPixelSize().height;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
math::Vec2T<UINT32> Image::GetSizeInPixels() const
|
||||
{
|
||||
if (bitmap_)
|
||||
{
|
||||
auto bitmap_size = bitmap_->GetPixelSize();
|
||||
return math::Vec2T<UINT32>{ bitmap_size.width, bitmap_size.height };
|
||||
}
|
||||
return math::Vec2T<UINT32>{};
|
||||
}
|
||||
|
||||
ComPtr<ID2D1Bitmap> Image::GetBitmap() const
|
||||
{
|
||||
return bitmap_;
|
||||
}
|
||||
|
||||
void Image::SetBitmap(ComPtr<ID2D1Bitmap> bitmap)
|
||||
{
|
||||
bitmap_ = bitmap;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,86 +19,53 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include "include-forwards.h"
|
||||
#include "../base/Resource.h"
|
||||
#include "../renderer/render.h"
|
||||
#include "render.h" // ID2D1Bitmap
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
// 图片
|
||||
// 图像
|
||||
KGE_DECLARE_SMART_PTR(Image);
|
||||
class KGE_API Image
|
||||
: public Object
|
||||
{
|
||||
public:
|
||||
Image();
|
||||
|
||||
explicit Image(
|
||||
Resource const& res
|
||||
);
|
||||
|
||||
explicit Image(
|
||||
Resource const& res,
|
||||
Rect const& crop_rect /* 裁剪矩形 */
|
||||
);
|
||||
|
||||
explicit Image(
|
||||
ComPtr<ID2D1Bitmap> const& bitmap
|
||||
);
|
||||
|
||||
virtual ~Image();
|
||||
|
||||
// 加载图片资源
|
||||
bool Load(
|
||||
Resource const& res
|
||||
);
|
||||
|
||||
// 资源是否有效
|
||||
bool IsValid() const;
|
||||
|
||||
// 将图片裁剪为矩形
|
||||
void Crop(
|
||||
Rect const& crop_rect /* 裁剪矩形 */
|
||||
);
|
||||
|
||||
// 获取宽度
|
||||
// 获取位图宽度
|
||||
float GetWidth() const;
|
||||
|
||||
// 获取高度
|
||||
// 获取位图高度
|
||||
float GetHeight() const;
|
||||
|
||||
// 获取大小
|
||||
// 获取位图大小
|
||||
Size GetSize() const;
|
||||
|
||||
// 获取源图片宽度
|
||||
float GetSourceWidth() const;
|
||||
// 获取位图像素宽度
|
||||
UINT32 GetWidthInPixels() const;
|
||||
|
||||
// 获取源图片高度
|
||||
float GetSourceHeight() const;
|
||||
// 获取位图像素高度
|
||||
UINT32 GetHeightInPixels() const;
|
||||
|
||||
// 获取源图片大小
|
||||
Size GetSourceSize() const;
|
||||
// 获取位图像素大小
|
||||
math::Vec2T<UINT32> GetSizeInPixels() const;
|
||||
|
||||
// 获取裁剪位置 X 坐标
|
||||
float GetCropX() const;
|
||||
// 获取源位图
|
||||
ComPtr<ID2D1Bitmap> GetBitmap() const;
|
||||
|
||||
// 获取裁剪位置 Y 坐标
|
||||
float GetCropY() const;
|
||||
|
||||
// 获取裁剪位置
|
||||
Point GetCropPos() const;
|
||||
|
||||
// 获取裁剪矩形
|
||||
Rect GetCropRect() const;
|
||||
|
||||
ComPtr<ID2D1Bitmap> const& GetBitmap() const;
|
||||
// 设置源位图
|
||||
void SetBitmap(ComPtr<ID2D1Bitmap> bitmap);
|
||||
|
||||
protected:
|
||||
void SetBitmap(
|
||||
ComPtr<ID2D1Bitmap> const& bitmap
|
||||
);
|
||||
|
||||
protected:
|
||||
Rect crop_rect_;
|
||||
ComPtr<ID2D1Bitmap> bitmap_;
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
// Copyright (c) 2016-2019 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "ImageCache.h"
|
||||
#include "../base/logs.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
||||
ImageCache::ImageCache()
|
||||
{
|
||||
}
|
||||
|
||||
ImageCache::~ImageCache()
|
||||
{
|
||||
}
|
||||
|
||||
ImagePtr ImageCache::AddImage(Resource const& res)
|
||||
{
|
||||
size_t hash_code = res.GetHashCode();
|
||||
auto iter = image_cache_.find(hash_code);
|
||||
if (iter != image_cache_.end())
|
||||
{
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
ComPtr<ID2D1Bitmap> bitmap;
|
||||
|
||||
if (res.IsFileType())
|
||||
{
|
||||
hr = Renderer::Instance()->GetD2DDeviceResources()->CreateBitmapFromFile(bitmap, res.GetFileName());
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = Renderer::Instance()->GetD2DDeviceResources()->CreateBitmapFromResource(bitmap, res);
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ImagePtr ptr = new Image(bitmap);
|
||||
image_cache_.insert(std::make_pair(hash_code, ptr));
|
||||
}
|
||||
else
|
||||
{
|
||||
KGE_ERROR_LOG(L"Load image file failed with HRESULT of %08X", hr);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ImageCache::RemoveImage(Resource const& res)
|
||||
{
|
||||
size_t hash_code = res.GetHashCode();
|
||||
auto iter = image_cache_.find(hash_code);
|
||||
if (iter != image_cache_.end())
|
||||
{
|
||||
image_cache_.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
void ImageCache::Clear()
|
||||
{
|
||||
image_cache_.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
// Copyright (c) 2016-2019 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include "../common/Singleton.hpp"
|
||||
#include "render.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
class KGE_API ImageCache
|
||||
: public Singleton<ImageCache>
|
||||
{
|
||||
KGE_DECLARE_SINGLETON(ImageCache);
|
||||
|
||||
public:
|
||||
ImagePtr AddImage(Resource const& res);
|
||||
|
||||
void RemoveImage(Resource const& res);
|
||||
|
||||
void Clear();
|
||||
|
||||
protected:
|
||||
ImageCache();
|
||||
|
||||
virtual ~ImageCache();
|
||||
|
||||
protected:
|
||||
using ImageMap = UnorderedMap<size_t, ImagePtr>;
|
||||
ImageMap image_cache_;
|
||||
};
|
||||
}
|
||||
|
|
@ -19,7 +19,6 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include "render.h"
|
||||
#include "../2d/Image.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../base/window.h"
|
||||
|
||||
|
|
@ -29,7 +28,7 @@ namespace kiwano
|
|||
: hwnd_(nullptr)
|
||||
, antialias_(true)
|
||||
, vsync_(true)
|
||||
, text_antialias_(TextAntialias::ClearType)
|
||||
, text_antialias_(TextAntialias::GrayScale)
|
||||
, clear_color_(Color::Black)
|
||||
, opacity_(1.f)
|
||||
, collecting_status_(false)
|
||||
|
|
@ -292,27 +291,6 @@ namespace kiwano
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT Renderer::DrawImage(ImagePtr image, Rect const& dest_rect)
|
||||
{
|
||||
if (!device_context_)
|
||||
return E_UNEXPECTED;
|
||||
|
||||
if (!image->GetBitmap())
|
||||
return S_OK;
|
||||
|
||||
device_context_->DrawBitmap(
|
||||
image->GetBitmap().Get(),
|
||||
DX::ConvertToRectF(dest_rect),
|
||||
opacity_,
|
||||
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
|
||||
DX::ConvertToRectF(image->GetCropRect())
|
||||
);
|
||||
|
||||
if (collecting_status_)
|
||||
++status_.primitives;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT Renderer::DrawBitmap(ComPtr<ID2D1Bitmap> const & bitmap, Rect const& src_rect, Rect const& dest_rect)
|
||||
{
|
||||
if (!device_context_)
|
||||
|
|
@ -321,7 +299,6 @@ namespace kiwano
|
|||
if (!bitmap)
|
||||
return S_OK;
|
||||
|
||||
// Do not crop bitmap
|
||||
device_context_->DrawBitmap(
|
||||
bitmap.Get(),
|
||||
DX::ConvertToRectF(dest_rect),
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include "../2d/Font.hpp"
|
||||
#include "../2d/TextStyle.hpp"
|
||||
#include "helper.hpp"
|
||||
#include "Image.h"
|
||||
#include "TextRenderer.h"
|
||||
#include "D2DDeviceResources.h"
|
||||
|
||||
|
|
@ -79,11 +80,6 @@ namespace kiwano
|
|||
Color const& fill_color
|
||||
);
|
||||
|
||||
HRESULT DrawImage(
|
||||
ImagePtr image,
|
||||
Rect const& dest_rect
|
||||
);
|
||||
|
||||
HRESULT DrawBitmap(
|
||||
ComPtr<ID2D1Bitmap> const& bitmap,
|
||||
Rect const& src_rect,
|
||||
|
|
|
|||
|
|
@ -18,11 +18,11 @@
|
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "ResLoader.h"
|
||||
#include "ResourceCache.h"
|
||||
#include "../base/logs.h"
|
||||
#include "../2d/Image.h"
|
||||
#include "../2d/Frames.h"
|
||||
#include "../2d/GifImage.h"
|
||||
#include "../2d/Frame.h"
|
||||
#include "../2d/FrameSequence.h"
|
||||
#include "../renderer/GifImage.h"
|
||||
#include "FileUtil.h"
|
||||
#include <fstream>
|
||||
|
||||
|
|
@ -35,7 +35,7 @@ namespace kiwano
|
|||
String path;
|
||||
};
|
||||
|
||||
bool LoadImagesFromData(ResLoader* loader, GlobalData* gdata, const String* id, const String* type,
|
||||
bool LoadImagesFromData(ResourceCache* loader, GlobalData* gdata, const String* id, const String* type,
|
||||
const String* file, const Array<const wchar_t*>* files, int rows, int cols)
|
||||
{
|
||||
if (!gdata || !id) return false;
|
||||
|
|
@ -52,13 +52,13 @@ namespace kiwano
|
|||
{
|
||||
if (rows || cols)
|
||||
{
|
||||
// Image slices
|
||||
return !!loader->AddFrames(*id, Resource(gdata->path + (*file)), std::max(cols, 1), std::max(rows, 1));
|
||||
// Frame slices
|
||||
return !!loader->AddFrameSequence(*id, Resource(gdata->path + (*file)), std::max(cols, 1), std::max(rows, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Simple image
|
||||
return loader->AddImage(*id, Resource(gdata->path + (*file)));
|
||||
return loader->AddFrame(*id, Resource(gdata->path + (*file)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -66,22 +66,22 @@ namespace kiwano
|
|||
// Frames
|
||||
if (files)
|
||||
{
|
||||
Array<ImagePtr> images;
|
||||
images.reserve(files->size());
|
||||
Array<FramePtr> frames;
|
||||
frames.reserve(files->size());
|
||||
for (const auto& file : (*files))
|
||||
{
|
||||
ImagePtr image = new Image(gdata->path + (file));
|
||||
if (image->IsValid())
|
||||
FramePtr frame = new Frame;
|
||||
if (frame->Load(gdata->path + (file)))
|
||||
{
|
||||
images.push_back(image);
|
||||
frames.push_back(frame);
|
||||
}
|
||||
}
|
||||
return !!loader->AddFrames(*id, images);
|
||||
return !!loader->AddFrameSequence(*id, frames);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LoadJsonData(ResLoader* loader, Json const& json_data)
|
||||
bool LoadJsonData(ResourceCache* loader, Json const& json_data)
|
||||
{
|
||||
GlobalData global_data;
|
||||
if (json_data.count(L"path"))
|
||||
|
|
@ -123,7 +123,7 @@ namespace kiwano
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LoadXmlData(ResLoader* loader, tinyxml2::XMLElement* elem)
|
||||
bool LoadXmlData(ResourceCache* loader, tinyxml2::XMLElement* elem)
|
||||
{
|
||||
GlobalData global_data;
|
||||
if (auto path = elem->FirstChildElement(L"path"))
|
||||
|
|
@ -170,18 +170,18 @@ namespace kiwano
|
|||
|
||||
namespace
|
||||
{
|
||||
Map<String, Closure<bool(ResLoader*, Json const&)>> load_json_funcs = {
|
||||
Map<String, Closure<bool(ResourceCache*, Json const&)>> load_json_funcs = {
|
||||
{ L"latest", __res_loader_01::LoadJsonData },
|
||||
{ L"0.1", __res_loader_01::LoadJsonData },
|
||||
};
|
||||
|
||||
Map<String, Closure<bool(ResLoader*, tinyxml2::XMLElement*)>> load_xml_funcs = {
|
||||
Map<String, Closure<bool(ResourceCache*, tinyxml2::XMLElement*)>> load_xml_funcs = {
|
||||
{ L"latest", __res_loader_01::LoadXmlData },
|
||||
{ L"0.1", __res_loader_01::LoadXmlData },
|
||||
};
|
||||
}
|
||||
|
||||
bool ResLoader::LoadFromJsonFile(String const& file_path)
|
||||
bool ResourceCache::LoadFromJsonFile(String const& file_path)
|
||||
{
|
||||
Json json_data;
|
||||
std::wifstream ifs;
|
||||
|
|
@ -195,18 +195,18 @@ namespace kiwano
|
|||
}
|
||||
catch (std::wifstream::failure& e)
|
||||
{
|
||||
KGE_WARNING_LOG(L"ResLoader::LoadFromJsonFile failed: Cannot open file. (%s)", string_to_wide(e.what()).c_str());
|
||||
KGE_WARNING_LOG(L"ResourceCache::LoadFromJsonFile failed: Cannot open file. (%s)", string_to_wide(e.what()).c_str());
|
||||
return false;
|
||||
}
|
||||
catch (json_exception& e)
|
||||
{
|
||||
KGE_WARNING_LOG(L"ResLoader::LoadFromJsonFile failed: Cannot parse to JSON. (%s)", string_to_wide(e.what()).c_str());
|
||||
KGE_WARNING_LOG(L"ResourceCache::LoadFromJsonFile failed: Cannot parse to JSON. (%s)", string_to_wide(e.what()).c_str());
|
||||
return false;
|
||||
}
|
||||
return LoadFromJson(json_data);
|
||||
}
|
||||
|
||||
bool ResLoader::LoadFromJson(Json const& json_data)
|
||||
bool ResourceCache::LoadFromJson(Json const& json_data)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -228,13 +228,13 @@ namespace kiwano
|
|||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
KGE_WARNING_LOG(L"ResLoader::LoadFromJson failed: JSON data is invalid. (%s)", string_to_wide(e.what()).c_str());
|
||||
KGE_WARNING_LOG(L"ResourceCache::LoadFromJson failed: JSON data is invalid. (%s)", string_to_wide(e.what()).c_str());
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ResLoader::LoadFromXmlFile(String const& file_path)
|
||||
bool ResourceCache::LoadFromXmlFile(String const& file_path)
|
||||
{
|
||||
tinyxml2::XMLDocument doc;
|
||||
|
||||
|
|
@ -250,21 +250,21 @@ namespace kiwano
|
|||
|
||||
if (tinyxml2::XML_SUCCESS != doc.Parse(ss.str().c_str()))
|
||||
{
|
||||
KGE_WARNING_LOG(L"ResLoader::LoadFromXmlFile failed: %s (%s)",
|
||||
KGE_WARNING_LOG(L"ResourceCache::LoadFromXmlFile failed: %s (%s)",
|
||||
tinyxml2::XMLDocument::ErrorIDToName(doc.ErrorID()), doc.ErrorStr());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (std::wifstream::failure& e)
|
||||
{
|
||||
KGE_WARNING_LOG(L"ResLoader::LoadFromXmlFile failed: Cannot open file. (%s)", string_to_wide(e.what()).c_str());
|
||||
KGE_WARNING_LOG(L"ResourceCache::LoadFromXmlFile failed: Cannot open file. (%s)", string_to_wide(e.what()).c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
return LoadFromXml(&doc);
|
||||
}
|
||||
|
||||
bool ResLoader::LoadFromXml(tinyxml2::XMLDocument* doc)
|
||||
bool ResourceCache::LoadFromXml(tinyxml2::XMLDocument* doc)
|
||||
{
|
||||
if (doc)
|
||||
{
|
||||
|
|
@ -292,42 +292,42 @@ namespace kiwano
|
|||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
KGE_WARNING_LOG(L"ResLoader::LoadFromXml failed: %s", string_to_wide(e.what()).c_str());
|
||||
KGE_WARNING_LOG(L"ResourceCache::LoadFromXml failed: %s", string_to_wide(e.what()).c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ResLoader::AddImage(String const& id, Resource const& image)
|
||||
bool ResourceCache::AddFrame(String const& id, Resource const& res)
|
||||
{
|
||||
ImagePtr ptr = new (std::nothrow) Image;
|
||||
FramePtr ptr = new (std::nothrow) Frame;
|
||||
if (ptr)
|
||||
{
|
||||
if (ptr->Load(image))
|
||||
if (ptr->Load(res))
|
||||
{
|
||||
return AddImage(id, ptr);
|
||||
return AddFrame(id, ptr);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ResLoader::AddImage(String const & id, ImagePtr image)
|
||||
bool ResourceCache::AddFrame(String const & id, FramePtr frame)
|
||||
{
|
||||
if (image)
|
||||
if (frame)
|
||||
{
|
||||
res_.insert(std::make_pair(id, image));
|
||||
cache_.insert(std::make_pair(id, frame));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ResLoader::AddGifImage(String const& id, Resource const& image)
|
||||
bool ResourceCache::AddGifImage(String const& id, Resource const& res)
|
||||
{
|
||||
GifImagePtr ptr = new (std::nothrow) GifImage;
|
||||
if (ptr)
|
||||
{
|
||||
if (ptr->Load(image))
|
||||
if (ptr->Load(res))
|
||||
{
|
||||
return AddGifImage(id, ptr);
|
||||
}
|
||||
|
|
@ -335,27 +335,27 @@ namespace kiwano
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ResLoader::AddGifImage(String const& id, GifImagePtr image)
|
||||
bool ResourceCache::AddGifImage(String const& id, GifImagePtr image)
|
||||
{
|
||||
if (image)
|
||||
{
|
||||
res_.insert(std::make_pair(id, image));
|
||||
cache_.insert(std::make_pair(id, image));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t ResLoader::AddFrames(String const& id, Array<Resource> const& images)
|
||||
size_t ResourceCache::AddFrameSequence(String const& id, Array<Resource> const& images)
|
||||
{
|
||||
if (images.empty())
|
||||
return 0;
|
||||
|
||||
Array<ImagePtr> image_arr;
|
||||
Array<FramePtr> image_arr;
|
||||
image_arr.reserve(images.size());
|
||||
|
||||
for (const auto& image : images)
|
||||
{
|
||||
ImagePtr ptr = new (std::nothrow) Image;
|
||||
FramePtr ptr = new (std::nothrow) Frame;
|
||||
if (ptr)
|
||||
{
|
||||
if (ptr->Load(image))
|
||||
|
|
@ -367,43 +367,43 @@ namespace kiwano
|
|||
|
||||
if (!image_arr.empty())
|
||||
{
|
||||
FramesPtr frames = new (std::nothrow) Frames(image_arr);
|
||||
return AddFrames(id, frames);
|
||||
FrameSequencePtr frames = new (std::nothrow) FrameSequence(image_arr);
|
||||
return AddFrameSequence(id, frames);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t ResLoader::AddFrames(String const& id, Array<ImagePtr> const& images)
|
||||
size_t ResourceCache::AddFrameSequence(String const& id, Array<FramePtr> const& images)
|
||||
{
|
||||
if (images.empty())
|
||||
return 0;
|
||||
|
||||
FramesPtr frames = new (std::nothrow) Frames(images);
|
||||
return AddFrames(id, frames);
|
||||
FrameSequencePtr frames = new (std::nothrow) FrameSequence(images);
|
||||
return AddFrameSequence(id, frames);
|
||||
}
|
||||
|
||||
size_t ResLoader::AddFrames(String const & id, Resource const & image, int cols, int rows)
|
||||
size_t ResourceCache::AddFrameSequence(String const & id, Resource const & image, int cols, int rows)
|
||||
{
|
||||
if (cols <= 0 || rows <= 0)
|
||||
return 0;
|
||||
|
||||
ImagePtr raw = new (std::nothrow) Image;
|
||||
FramePtr raw = new (std::nothrow) Frame;
|
||||
if (!raw || !raw->Load(image))
|
||||
return false;
|
||||
|
||||
float raw_width = raw->GetSourceWidth();
|
||||
float raw_height = raw->GetSourceHeight();
|
||||
float raw_width = raw->GetWidth();
|
||||
float raw_height = raw->GetHeight();
|
||||
float width = raw_width / cols;
|
||||
float height = raw_height / rows;
|
||||
|
||||
Array<ImagePtr> image_arr;
|
||||
Array<FramePtr> image_arr;
|
||||
image_arr.reserve(rows * cols);
|
||||
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
ImagePtr ptr = new (std::nothrow) Image(raw->GetBitmap());
|
||||
FramePtr ptr = new (std::nothrow) Frame(raw->GetImage());
|
||||
if (ptr)
|
||||
{
|
||||
ptr->Crop(Rect{ j * width, i * height, width, height });
|
||||
|
|
@ -412,22 +412,22 @@ namespace kiwano
|
|||
}
|
||||
}
|
||||
|
||||
FramesPtr frames = new (std::nothrow) Frames(image_arr);
|
||||
return AddFrames(id, frames);
|
||||
FrameSequencePtr frames = new (std::nothrow) FrameSequence(image_arr);
|
||||
return AddFrameSequence(id, frames);
|
||||
}
|
||||
|
||||
size_t ResLoader::AddFrames(String const & id, Resource const & image, Array<Rect> const & crop_rects)
|
||||
size_t ResourceCache::AddFrameSequence(String const & id, Resource const & image, Array<Rect> const & crop_rects)
|
||||
{
|
||||
ImagePtr raw = new (std::nothrow) Image;
|
||||
FramePtr raw = new (std::nothrow) Frame;
|
||||
if (!raw || !raw->Load(image))
|
||||
return 0;
|
||||
|
||||
Array<ImagePtr> image_arr;
|
||||
Array<FramePtr> image_arr;
|
||||
image_arr.reserve(crop_rects.size());
|
||||
|
||||
for (const auto& rect : crop_rects)
|
||||
{
|
||||
ImagePtr ptr = new (std::nothrow) Image(raw->GetBitmap());
|
||||
FramePtr ptr = new (std::nothrow) Frame(raw->GetImage());
|
||||
if (ptr)
|
||||
{
|
||||
ptr->Crop(rect);
|
||||
|
|
@ -435,60 +435,60 @@ namespace kiwano
|
|||
}
|
||||
}
|
||||
|
||||
FramesPtr frames = new (std::nothrow) Frames(image_arr);
|
||||
return AddFrames(id, frames);
|
||||
FrameSequencePtr frames = new (std::nothrow) FrameSequence(image_arr);
|
||||
return AddFrameSequence(id, frames);
|
||||
}
|
||||
|
||||
size_t ResLoader::AddFrames(String const & id, FramesPtr frames)
|
||||
size_t ResourceCache::AddFrameSequence(String const & id, FrameSequencePtr frames)
|
||||
{
|
||||
if (frames)
|
||||
{
|
||||
res_.insert(std::make_pair(id, frames));
|
||||
cache_.insert(std::make_pair(id, frames));
|
||||
return frames->GetFrames().size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool ResLoader::AddObj(String const& id, ObjectPtr obj)
|
||||
bool ResourceCache::AddObj(String const& id, ObjectPtr obj)
|
||||
{
|
||||
if (obj)
|
||||
{
|
||||
res_.insert(std::make_pair(id, obj));
|
||||
cache_.insert(std::make_pair(id, obj));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
ImagePtr ResLoader::GetImage(String const & id) const
|
||||
FramePtr ResourceCache::GetFrame(String const & id) const
|
||||
{
|
||||
return Get<Image>(id);
|
||||
return Get<Frame>(id);
|
||||
}
|
||||
|
||||
GifImagePtr ResLoader::GetGifImage(String const& id) const
|
||||
GifImagePtr ResourceCache::GetGifImage(String const& id) const
|
||||
{
|
||||
return Get<GifImage>(id);
|
||||
}
|
||||
|
||||
FramesPtr ResLoader::GetFrames(String const & id) const
|
||||
FrameSequencePtr ResourceCache::GetFrameSequence(String const & id) const
|
||||
{
|
||||
return Get<Frames>(id);
|
||||
return Get<FrameSequence>(id);
|
||||
}
|
||||
|
||||
void ResLoader::Delete(String const & id)
|
||||
void ResourceCache::Delete(String const & id)
|
||||
{
|
||||
res_.erase(id);
|
||||
cache_.erase(id);
|
||||
}
|
||||
|
||||
void ResLoader::Destroy()
|
||||
void ResourceCache::Destroy()
|
||||
{
|
||||
res_.clear();
|
||||
cache_.clear();
|
||||
}
|
||||
|
||||
ResLoader::ResLoader()
|
||||
ResourceCache::ResourceCache()
|
||||
{
|
||||
}
|
||||
|
||||
ResLoader::~ResLoader()
|
||||
ResourceCache::~ResourceCache()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
|
@ -24,12 +24,13 @@
|
|||
#include "../common/Json.hpp"
|
||||
#include "../base/Resource.h"
|
||||
#include "../2d/include-forwards.h"
|
||||
#include "../renderer/GifImage.h"
|
||||
#include "../third-party/tinyxml2/tinyxml2.h"
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
// ×ÊÔ´¼ÓÔØÆ÷
|
||||
class KGE_API ResLoader
|
||||
// ×ÊÔ´»º´æ
|
||||
class KGE_API ResourceCache
|
||||
{
|
||||
public:
|
||||
// 从 JSON 文件加载资源信息
|
||||
|
|
@ -45,45 +46,45 @@ namespace kiwano
|
|||
bool LoadFromXml(tinyxml2::XMLDocument* doc);
|
||||
|
||||
// 添加图片
|
||||
bool AddImage(String const& id, Resource const& image);
|
||||
bool AddFrame(String const& id, Resource const& res);
|
||||
|
||||
// 添加图片
|
||||
bool AddImage(String const& id, ImagePtr image);
|
||||
bool AddFrame(String const& id, FramePtr frame);
|
||||
|
||||
// 添加 GIF 图片
|
||||
bool AddGifImage(String const& id, Resource const& image);
|
||||
bool AddGifImage(String const& id, Resource const& res);
|
||||
|
||||
// 添加 GIF 图片
|
||||
bool AddGifImage(String const& id, GifImagePtr image);
|
||||
|
||||
// Ìí¼ÓÖ¡¼¯ºÏ
|
||||
size_t AddFrames(String const& id, Array<Resource> const& images);
|
||||
// Ìí¼ÓÐòÁÐÖ¡
|
||||
size_t AddFrameSequence(String const& id, Array<Resource> const& frames);
|
||||
|
||||
// Ìí¼ÓÖ¡¼¯ºÏ
|
||||
size_t AddFrames(String const& id, Array<ImagePtr> const& images);
|
||||
// Ìí¼ÓÐòÁÐÖ¡
|
||||
size_t AddFrameSequence(String const& id, Array<FramePtr> const& frames);
|
||||
|
||||
// Ìí¼ÓÖ¡¼¯ºÏ
|
||||
// Ìí¼ÓÐòÁÐÖ¡
|
||||
// 按行列数裁剪图片
|
||||
size_t AddFrames(String const& id, Resource const& image, int cols, int rows = 1);
|
||||
size_t AddFrameSequence(String const& id, Resource const& frame, int cols, int rows = 1);
|
||||
|
||||
// Ìí¼ÓÖ¡¼¯ºÏ
|
||||
// Ìí¼ÓÐòÁÐÖ¡
|
||||
// 按指定裁剪矩形裁剪图片
|
||||
size_t AddFrames(String const& id, Resource const& image, Array<Rect> const& crop_rects);
|
||||
size_t AddFrameSequence(String const& id, Resource const& frame, Array<Rect> const& crop_rects);
|
||||
|
||||
// Ìí¼ÓÖ¡¼¯ºÏ
|
||||
size_t AddFrames(String const& id, FramesPtr frames);
|
||||
// Ìí¼ÓÐòÁÐÖ¡
|
||||
size_t AddFrameSequence(String const& id, FrameSequencePtr frames);
|
||||
|
||||
// 添加对象
|
||||
bool AddObj(String const& id, ObjectPtr obj);
|
||||
|
||||
// 获取图片资源
|
||||
ImagePtr GetImage(String const& id) const;
|
||||
FramePtr GetFrame(String const& id) const;
|
||||
|
||||
// 获取 GIF 图片资源
|
||||
GifImagePtr GetGifImage(String const& id) const;
|
||||
|
||||
// 获取序列帧
|
||||
FramesPtr GetFrames(String const& id) const;
|
||||
FrameSequencePtr GetFrameSequence(String const& id) const;
|
||||
|
||||
// 删除指定资源
|
||||
void Delete(String const& id);
|
||||
|
|
@ -94,18 +95,18 @@ namespace kiwano
|
|||
template<typename _Ty>
|
||||
_Ty* Get(String const& id) const
|
||||
{
|
||||
auto iter = res_.find(id);
|
||||
if (iter == res_.end())
|
||||
auto iter = cache_.find(id);
|
||||
if (iter == cache_.end())
|
||||
return nullptr;
|
||||
return dynamic_cast<_Ty*>((*iter).second.Get());
|
||||
}
|
||||
|
||||
public:
|
||||
ResLoader();
|
||||
ResourceCache();
|
||||
|
||||
virtual ~ResLoader();
|
||||
virtual ~ResourceCache();
|
||||
|
||||
protected:
|
||||
UnorderedMap<String, ObjectPtr> res_;
|
||||
UnorderedMap<String, ObjectPtr> cache_;
|
||||
};
|
||||
}
|
||||
Loading…
Reference in New Issue