rngine 0.11.2 → 0.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/shared/utils/AssetUtils.cpp +77 -62
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include "AssetUtils.hpp"
|
|
2
2
|
#include "FitTransform.hpp"
|
|
3
3
|
#include "GameRenderer.hpp"
|
|
4
|
+
#include "include/core/SkPictureRecorder.h"
|
|
4
5
|
#include <variant>
|
|
5
6
|
|
|
6
7
|
namespace margelo::nitro::rngine::AssetUtils {
|
|
@@ -84,7 +85,10 @@ static void drawSVG(SkCanvas *canvas, const sk_sp<SkSVGDOM> &svg,
|
|
|
84
85
|
|
|
85
86
|
SkAutoCanvasRestore restore(canvas, true);
|
|
86
87
|
|
|
87
|
-
bool isRepeating = (repeat != Repeat::NO_REPEAT)
|
|
88
|
+
bool isRepeating = (repeat != Repeat::NO_REPEAT) &&
|
|
89
|
+
(objectFit != ObjectFit::FILL) &&
|
|
90
|
+
(objectFit != ObjectFit::COVER);
|
|
91
|
+
|
|
88
92
|
bool shouldClip = clip && (objectFit == ObjectFit::COVER ||
|
|
89
93
|
objectFit == ObjectFit::NONE || isRepeating);
|
|
90
94
|
|
|
@@ -99,30 +103,35 @@ static void drawSVG(SkCanvas *canvas, const sk_sp<SkSVGDOM> &svg,
|
|
|
99
103
|
return;
|
|
100
104
|
}
|
|
101
105
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
SkPictureRecorder recorder;
|
|
107
|
+
SkCanvas *recordingCanvas =
|
|
108
|
+
recorder.beginRecording(intrinsicSize.width(), intrinsicSize.height());
|
|
109
|
+
svg->render(recordingCanvas);
|
|
110
|
+
sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
|
|
105
111
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
: tf.translateY;
|
|
112
|
+
bool repX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X);
|
|
113
|
+
bool repY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y);
|
|
109
114
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
: (startX + tileW);
|
|
115
|
+
SkTileMode tileX = repX ? SkTileMode::kRepeat : SkTileMode::kDecal;
|
|
116
|
+
SkTileMode tileY = repY ? SkTileMode::kRepeat : SkTileMode::kDecal;
|
|
113
117
|
|
|
114
|
-
float
|
|
115
|
-
|
|
116
|
-
|
|
118
|
+
float offsetX =
|
|
119
|
+
repX ? computeCenteredTileStart(targetWidth, tileW) : tf.translateX;
|
|
120
|
+
float offsetY =
|
|
121
|
+
repY ? computeCenteredTileStart(targetHeight, tileH) : tf.translateY;
|
|
117
122
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
123
|
+
SkMatrix localMatrix;
|
|
124
|
+
localMatrix.setScale(tf.scaleX, tf.scaleY);
|
|
125
|
+
localMatrix.postTranslate(offsetX, offsetY);
|
|
126
|
+
|
|
127
|
+
SkRect tileBounds =
|
|
128
|
+
SkRect::MakeWH(intrinsicSize.width(), intrinsicSize.height());
|
|
129
|
+
sk_sp<SkShader> shader = picture->makeShader(
|
|
130
|
+
tileX, tileY, SkFilterMode::kLinear, &localMatrix, &tileBounds);
|
|
131
|
+
|
|
132
|
+
SkPaint paint;
|
|
133
|
+
paint.setShader(shader);
|
|
134
|
+
canvas->drawRect(SkRect::MakeWH(targetWidth, targetHeight), paint);
|
|
126
135
|
}
|
|
127
136
|
|
|
128
137
|
static void drawRaster(SkCanvas *canvas, const sk_sp<SkImage> &raster,
|
|
@@ -138,7 +147,10 @@ static void drawRaster(SkCanvas *canvas, const sk_sp<SkImage> &raster,
|
|
|
138
147
|
|
|
139
148
|
SkAutoCanvasRestore restore(canvas, true);
|
|
140
149
|
|
|
141
|
-
bool isRepeating = (repeat != Repeat::NO_REPEAT)
|
|
150
|
+
bool isRepeating = (repeat != Repeat::NO_REPEAT) &&
|
|
151
|
+
(objectFit != ObjectFit::FILL) &&
|
|
152
|
+
(objectFit != ObjectFit::COVER);
|
|
153
|
+
|
|
142
154
|
bool shouldClip = clip && (objectFit == ObjectFit::COVER ||
|
|
143
155
|
objectFit == ObjectFit::NONE || isRepeating);
|
|
144
156
|
|
|
@@ -155,31 +167,25 @@ static void drawRaster(SkCanvas *canvas, const sk_sp<SkImage> &raster,
|
|
|
155
167
|
return;
|
|
156
168
|
}
|
|
157
169
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
SkTileMode
|
|
162
|
-
|
|
163
|
-
: SkTileMode::kClamp;
|
|
170
|
+
bool repX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X);
|
|
171
|
+
bool repY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y);
|
|
172
|
+
|
|
173
|
+
SkTileMode tileX = repX ? SkTileMode::kRepeat : SkTileMode::kDecal;
|
|
174
|
+
SkTileMode tileY = repY ? SkTileMode::kRepeat : SkTileMode::kDecal;
|
|
164
175
|
|
|
165
176
|
float tileW = intrinsicW * tf.scaleX;
|
|
166
177
|
float tileH = intrinsicH * tf.scaleY;
|
|
167
178
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
float
|
|
171
|
-
|
|
172
|
-
: tf.translateX;
|
|
173
|
-
float offsetY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y)
|
|
174
|
-
? computeCenteredTileStart(targetHeight, tileH)
|
|
175
|
-
: tf.translateY;
|
|
179
|
+
float offsetX =
|
|
180
|
+
repX ? computeCenteredTileStart(targetWidth, tileW) : tf.translateX;
|
|
181
|
+
float offsetY =
|
|
182
|
+
repY ? computeCenteredTileStart(targetHeight, tileH) : tf.translateY;
|
|
176
183
|
|
|
184
|
+
SkMatrix localMatrix = SkMatrix::Scale(tf.scaleX, tf.scaleY);
|
|
177
185
|
localMatrix.postTranslate(offsetX, offsetY);
|
|
178
186
|
|
|
179
|
-
auto shader = raster->makeShader(tileX, tileY, sampling, localMatrix);
|
|
180
|
-
|
|
181
187
|
SkPaint paint;
|
|
182
|
-
paint.setShader(
|
|
188
|
+
paint.setShader(raster->makeShader(tileX, tileY, sampling, localMatrix));
|
|
183
189
|
canvas->drawRect(SkRect::MakeWH(targetWidth, targetHeight), paint);
|
|
184
190
|
}
|
|
185
191
|
|
|
@@ -207,7 +213,10 @@ static void drawLottie(SkCanvas *canvas,
|
|
|
207
213
|
|
|
208
214
|
SkAutoCanvasRestore restore(canvas, true);
|
|
209
215
|
|
|
210
|
-
bool isRepeating = (repeat != Repeat::NO_REPEAT)
|
|
216
|
+
bool isRepeating = (repeat != Repeat::NO_REPEAT) &&
|
|
217
|
+
(objectFit != ObjectFit::FILL) &&
|
|
218
|
+
(objectFit != ObjectFit::COVER);
|
|
219
|
+
|
|
211
220
|
bool shouldClip = clip && (objectFit == ObjectFit::COVER ||
|
|
212
221
|
objectFit == ObjectFit::NONE || isRepeating);
|
|
213
222
|
|
|
@@ -224,28 +233,34 @@ static void drawLottie(SkCanvas *canvas,
|
|
|
224
233
|
return;
|
|
225
234
|
}
|
|
226
235
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
236
|
+
SkPictureRecorder recorder;
|
|
237
|
+
SkCanvas *recordingCanvas =
|
|
238
|
+
recorder.beginRecording(intrinsicWidth, intrinsicHeight);
|
|
239
|
+
lottie->render(recordingCanvas, &dstBounds);
|
|
240
|
+
sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
|
|
241
|
+
|
|
242
|
+
bool repX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X);
|
|
243
|
+
bool repY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y);
|
|
244
|
+
|
|
245
|
+
SkTileMode tileX = repX ? SkTileMode::kRepeat : SkTileMode::kDecal;
|
|
246
|
+
SkTileMode tileY = repY ? SkTileMode::kRepeat : SkTileMode::kDecal;
|
|
247
|
+
|
|
248
|
+
float offsetX =
|
|
249
|
+
repX ? computeCenteredTileStart(targetWidth, tileW) : tf.translateX;
|
|
250
|
+
float offsetY =
|
|
251
|
+
repY ? computeCenteredTileStart(targetHeight, tileH) : tf.translateY;
|
|
252
|
+
|
|
253
|
+
SkMatrix localMatrix;
|
|
254
|
+
localMatrix.setScale(tf.scaleX, tf.scaleY);
|
|
255
|
+
localMatrix.postTranslate(offsetX, offsetY);
|
|
256
|
+
|
|
257
|
+
SkRect tileBounds = SkRect::MakeWH(intrinsicWidth, intrinsicHeight);
|
|
258
|
+
sk_sp<SkShader> shader = picture->makeShader(
|
|
259
|
+
tileX, tileY, SkFilterMode::kLinear, &localMatrix, &tileBounds);
|
|
260
|
+
|
|
261
|
+
SkPaint paint;
|
|
262
|
+
paint.setShader(shader);
|
|
263
|
+
canvas->drawRect(SkRect::MakeWH(targetWidth, targetHeight), paint);
|
|
249
264
|
}
|
|
250
265
|
|
|
251
266
|
void drawAsset(SkCanvas *canvas, double asset, float targetWidth,
|