Skip to content

Commit

Permalink
common fill: implement duplicate() method.
Browse files Browse the repository at this point in the history
  • Loading branch information
hermet committed Sep 21, 2020
1 parent e60c948 commit 12cd858
Show file tree
Hide file tree
Showing 15 changed files with 136 additions and 29 deletions.
3 changes: 2 additions & 1 deletion inc/thorvg.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class TVG_EXPORT Paint
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);
Expand Down Expand Up @@ -122,6 +122,7 @@ class TVG_EXPORT Fill

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);
Expand Down
2 changes: 1 addition & 1 deletion src/bindings/capi/tvgCapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}


Expand Down
1 change: 1 addition & 0 deletions src/lib/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ source_file = [
'tvgCanvasImpl.h',
'tvgCommon.h',
'tvgBezier.h',
'tvgFill.h',
'tvgLoader.h',
'tvgLoaderMgr.h',
'tvgPictureImpl.h',
Expand Down
2 changes: 1 addition & 1 deletion src/lib/tvgCanvasImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#ifndef _TVG_CANVAS_IMPL_H_
#define _TVG_CANVAS_IMPL_H_

#include "tvgCommon.h"
#include "tvgPaint.h"

/************************************************************************/
/* Internal Class Implementation */
Expand Down
1 change: 0 additions & 1 deletion src/lib/tvgCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_
23 changes: 8 additions & 15 deletions src/lib/tvgFill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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 changes: 80 additions & 0 deletions src/lib/tvgFill.h
Original file line number Diff line number Diff line change
@@ -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_
16 changes: 15 additions & 1 deletion src/lib/tvgLinearGradient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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;
}
};

/************************************************************************/
Expand All @@ -40,6 +53,7 @@ struct LinearGradient::Impl
LinearGradient::LinearGradient():pImpl(new Impl())
{
_id = FILL_ID_LINEAR;
Fill::pImpl->method(new FillDup<LinearGradient::Impl>(pImpl));
}


Expand Down
4 changes: 2 additions & 2 deletions src/lib/tvgPaint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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();
}
6 changes: 4 additions & 2 deletions src/lib/tvgPaint.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#ifndef _TVG_PAINT_H_
#define _TVG_PAINT_H_

#include "tvgCommon.h"

namespace tvg
{
struct StrategyMethod
Expand Down Expand Up @@ -146,9 +148,9 @@ namespace tvg
return smethod->render(renderer);
}

unique_ptr<Paint> duplicate()
Paint* duplicate()
{
return smethod->duplicate();
return smethod->duplicate().release();
}
};

Expand Down
1 change: 1 addition & 0 deletions src/lib/tvgPicture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

#include "tvgPictureImpl.h"

/************************************************************************/
Expand Down
2 changes: 1 addition & 1 deletion src/lib/tvgPictureImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#ifndef _TVG_PICTURE_IMPL_H_
#define _TVG_PICTURE_IMPL_H_

#include "tvgCommon.h"
#include "tvgPaint.h"

/************************************************************************/
/* Internal Class Implementation */
Expand Down
15 changes: 14 additions & 1 deletion src/lib/tvgRadialGradient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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;
}
};


Expand All @@ -40,6 +52,7 @@ struct RadialGradient::Impl
RadialGradient::RadialGradient():pImpl(new Impl())
{
_id = FILL_ID_RADIAL;
Fill::pImpl->method(new FillDup<RadialGradient::Impl>(pImpl));
}


Expand Down
2 changes: 1 addition & 1 deletion src/lib/tvgSceneImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#ifndef _TVG_SCENE_IMPL_H_
#define _TVG_SCENE_IMPL_H_

#include "tvgCommon.h"
#include "tvgPaint.h"

/************************************************************************/
/* Internal Class Implementation */
Expand Down
7 changes: 5 additions & 2 deletions src/lib/tvgShapeImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#ifndef _TVG_SHAPE_IMPL_H_
#define _TVG_SHAPE_IMPL_H_

#include "tvgCommon.h"
#include "tvgPaint.h"
#include "tvgShapePath.h"

/************************************************************************/
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 12cd858

Please sign in to comment.