common fill: implement duplicate() method.

This commit is contained in:
Hermet Park 2020-09-21 19:20:51 +09:00 committed by GitHub
parent e60c948e3a
commit 12cd858d72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 136 additions and 29 deletions

View file

@ -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);

View file

@ -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();
}

View file

@ -14,6 +14,7 @@ source_file = [
'tvgCanvasImpl.h',
'tvgCommon.h',
'tvgBezier.h',
'tvgFill.h',
'tvgLoader.h',
'tvgLoaderMgr.h',
'tvgPictureImpl.h',

View file

@ -22,7 +22,7 @@
#ifndef _TVG_CANVAS_IMPL_H_
#define _TVG_CANVAS_IMPL_H_
#include "tvgCommon.h"
#include "tvgPaint.h"
/************************************************************************/
/* Internal Class Implementation */

View file

@ -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_

View file

@ -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
View 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_

View file

@ -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));
}

View file

@ -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();
}

View file

@ -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();
}
};

View file

@ -19,6 +19,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "tvgPictureImpl.h"
/************************************************************************/

View file

@ -22,7 +22,7 @@
#ifndef _TVG_PICTURE_IMPL_H_
#define _TVG_PICTURE_IMPL_H_
#include "tvgCommon.h"
#include "tvgPaint.h"
/************************************************************************/
/* Internal Class Implementation */

View file

@ -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));
}

View file

@ -22,7 +22,7 @@
#ifndef _TVG_SCENE_IMPL_H_
#define _TVG_SCENE_IMPL_H_
#include "tvgCommon.h"
#include "tvgPaint.h"
/************************************************************************/
/* Internal Class Implementation */

View file

@ -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;
}