mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-13 19:44:28 +00:00
common fill: implement duplicate() method.
This commit is contained in:
parent
e60c948e3a
commit
12cd858d72
15 changed files with 136 additions and 29 deletions
|
@ -91,7 +91,7 @@ public:
|
|||
Result translate(float x, float y) noexcept;
|
||||
Result transform(const Matrix& m) noexcept;
|
||||
Result bounds(float* x, float* y, float* w, float* h) const noexcept;
|
||||
std::unique_ptr<Paint> duplicate() const noexcept;
|
||||
Paint* duplicate() const noexcept;
|
||||
|
||||
_TVG_DECLARE_ACCESSOR();
|
||||
_TVG_DECLARE_PRIVATE(Paint);
|
||||
|
@ -122,6 +122,7 @@ public:
|
|||
|
||||
uint32_t colorStops(const ColorStop** colorStops) const noexcept;
|
||||
FillSpread spread() const noexcept;
|
||||
std::unique_ptr<Fill> duplicate() const noexcept;
|
||||
|
||||
_TVG_DECALRE_IDENTIFIER();
|
||||
_TVG_DECLARE_PRIVATE(Fill);
|
||||
|
|
|
@ -166,7 +166,7 @@ TVG_EXPORT Tvg_Result tvg_paint_transform(Tvg_Paint* paint, const Tvg_Matrix* m)
|
|||
TVG_EXPORT Tvg_Paint* tvg_paint_duplicate(Tvg_Paint* paint)
|
||||
{
|
||||
if (!paint) return NULL;
|
||||
return (Tvg_Paint*) reinterpret_cast<Paint*>(paint)->duplicate().release();
|
||||
return (Tvg_Paint*) reinterpret_cast<Paint*>(paint)->duplicate();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ source_file = [
|
|||
'tvgCanvasImpl.h',
|
||||
'tvgCommon.h',
|
||||
'tvgBezier.h',
|
||||
'tvgFill.h',
|
||||
'tvgLoader.h',
|
||||
'tvgLoaderMgr.h',
|
||||
'tvgPictureImpl.h',
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#ifndef _TVG_CANVAS_IMPL_H_
|
||||
#define _TVG_CANVAS_IMPL_H_
|
||||
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgPaint.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
|
|
|
@ -46,7 +46,6 @@ using namespace tvg;
|
|||
#include "tvgLoader.h"
|
||||
#include "tvgLoaderMgr.h"
|
||||
#include "tvgRender.h"
|
||||
#include "tvgPaint.h"
|
||||
#include "tvgTaskScheduler.h"
|
||||
|
||||
#endif //_TVG_COMMON_H_
|
||||
|
|
|
@ -19,25 +19,12 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
#include "tvgCommon.h"
|
||||
|
||||
#include "tvgFill.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
/************************************************************************/
|
||||
|
||||
struct Fill::Impl
|
||||
{
|
||||
ColorStop* colorStops = nullptr;
|
||||
uint32_t cnt = 0;
|
||||
FillSpread spread;
|
||||
|
||||
~Impl()
|
||||
{
|
||||
if (colorStops) free(colorStops);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* External Class Implementation */
|
||||
|
@ -95,4 +82,10 @@ Result Fill::spread(FillSpread s) noexcept
|
|||
FillSpread Fill::spread() const noexcept
|
||||
{
|
||||
return pImpl->spread;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unique_ptr<Fill> Fill::duplicate() const noexcept
|
||||
{
|
||||
return pImpl->duplicate();
|
||||
}
|
||||
|
|
80
src/lib/tvgFill.h
Normal file
80
src/lib/tvgFill.h
Normal file
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved.
|
||||
|
||||
* 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.
|
||||
*/
|
||||
#ifndef _TVG_FILL_H_
|
||||
#define _TVG_FILL_H_
|
||||
|
||||
#include "tvgCommon.h"
|
||||
|
||||
template<typename T>
|
||||
struct DuplicateMethod
|
||||
{
|
||||
virtual ~DuplicateMethod(){}
|
||||
virtual unique_ptr<T> duplicate() = 0;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct FillDup : DuplicateMethod<Fill>
|
||||
{
|
||||
T* inst = nullptr;
|
||||
|
||||
FillDup(T* _inst) : inst(_inst) {}
|
||||
~FillDup(){}
|
||||
|
||||
unique_ptr<Fill> duplicate() override
|
||||
{
|
||||
return inst->duplicate();
|
||||
}
|
||||
};
|
||||
|
||||
struct Fill::Impl
|
||||
{
|
||||
ColorStop* colorStops = nullptr;
|
||||
uint32_t cnt = 0;
|
||||
FillSpread spread;
|
||||
DuplicateMethod<Fill>* dup = nullptr;
|
||||
|
||||
~Impl()
|
||||
{
|
||||
if (dup) delete(dup);
|
||||
if (colorStops) free(colorStops);
|
||||
}
|
||||
|
||||
void method(DuplicateMethod<Fill>* dup)
|
||||
{
|
||||
this->dup = dup;
|
||||
}
|
||||
|
||||
unique_ptr<Fill> duplicate()
|
||||
{
|
||||
auto ret = dup->duplicate();
|
||||
if (!ret) return nullptr;
|
||||
|
||||
ret->pImpl->cnt = cnt;
|
||||
ret->pImpl->spread = spread;
|
||||
ret->pImpl->colorStops = static_cast<ColorStop*>(malloc(sizeof(ColorStop) * cnt));
|
||||
memcpy(ret->pImpl->colorStops, colorStops, sizeof(ColorStop) * cnt);
|
||||
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
#endif //_TVG_FILL_H_
|
|
@ -19,7 +19,7 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgFill.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
|
@ -31,6 +31,19 @@ struct LinearGradient::Impl
|
|||
float y1 = 0;
|
||||
float x2 = 0;
|
||||
float y2 = 0;
|
||||
|
||||
unique_ptr<Fill> duplicate()
|
||||
{
|
||||
auto ret = LinearGradient::gen();
|
||||
if (!ret) return nullptr;
|
||||
|
||||
ret->pImpl->x1 = x1;
|
||||
ret->pImpl->y1 = y1;
|
||||
ret->pImpl->x2 = x2;
|
||||
ret->pImpl->y2 = y2;
|
||||
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
/************************************************************************/
|
||||
|
@ -40,6 +53,7 @@ struct LinearGradient::Impl
|
|||
LinearGradient::LinearGradient():pImpl(new Impl())
|
||||
{
|
||||
_id = FILL_ID_LINEAR;
|
||||
Fill::pImpl->method(new FillDup<LinearGradient::Impl>(pImpl));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgPaint.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
|
@ -74,7 +74,7 @@ Result Paint::bounds(float* x, float* y, float* w, float* h) const noexcept
|
|||
return Result::InsufficientCondition;
|
||||
}
|
||||
|
||||
unique_ptr<Paint> Paint::duplicate() const noexcept
|
||||
Paint* Paint::duplicate() const noexcept
|
||||
{
|
||||
return pImpl->duplicate();
|
||||
}
|
|
@ -22,6 +22,8 @@
|
|||
#ifndef _TVG_PAINT_H_
|
||||
#define _TVG_PAINT_H_
|
||||
|
||||
#include "tvgCommon.h"
|
||||
|
||||
namespace tvg
|
||||
{
|
||||
struct StrategyMethod
|
||||
|
@ -146,9 +148,9 @@ namespace tvg
|
|||
return smethod->render(renderer);
|
||||
}
|
||||
|
||||
unique_ptr<Paint> duplicate()
|
||||
Paint* duplicate()
|
||||
{
|
||||
return smethod->duplicate();
|
||||
return smethod->duplicate().release();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "tvgPictureImpl.h"
|
||||
|
||||
/************************************************************************/
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#ifndef _TVG_PICTURE_IMPL_H_
|
||||
#define _TVG_PICTURE_IMPL_H_
|
||||
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgPaint.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgFill.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
|
@ -30,6 +30,18 @@ struct RadialGradient::Impl
|
|||
float cx = 0;
|
||||
float cy = 0;
|
||||
float radius = 0;
|
||||
|
||||
unique_ptr<Fill> duplicate()
|
||||
{
|
||||
auto ret = RadialGradient::gen();
|
||||
if (!ret) return nullptr;
|
||||
|
||||
ret->pImpl->cx = cx;
|
||||
ret->pImpl->cy = cy;
|
||||
ret->pImpl->radius = radius;
|
||||
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -40,6 +52,7 @@ struct RadialGradient::Impl
|
|||
RadialGradient::RadialGradient():pImpl(new Impl())
|
||||
{
|
||||
_id = FILL_ID_RADIAL;
|
||||
Fill::pImpl->method(new FillDup<RadialGradient::Impl>(pImpl));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#ifndef _TVG_SCENE_IMPL_H_
|
||||
#define _TVG_SCENE_IMPL_H_
|
||||
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgPaint.h"
|
||||
|
||||
/************************************************************************/
|
||||
/* Internal Class Implementation */
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#ifndef _TVG_SHAPE_IMPL_H_
|
||||
#define _TVG_SHAPE_IMPL_H_
|
||||
|
||||
#include "tvgCommon.h"
|
||||
#include "tvgPaint.h"
|
||||
#include "tvgShapePath.h"
|
||||
|
||||
/************************************************************************/
|
||||
|
@ -199,7 +199,10 @@ struct Shape::Impl
|
|||
dup->flag |= RenderUpdateFlag::Stroke;
|
||||
}
|
||||
|
||||
//TODO: Fill
|
||||
if (fill) {
|
||||
dup->fill = fill->duplicate().release();
|
||||
dup->flag |= RenderUpdateFlag::Gradient;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue