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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rngine",
3
- "version": "0.11.2",
3
+ "version": "0.11.3",
4
4
  "description": "React Native 2D game engine powered by Nitro Modules",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -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
- float startX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X)
103
- ? computeCenteredTileStart(targetWidth, tileW)
104
- : tf.translateX;
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
- float startY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y)
107
- ? computeCenteredTileStart(targetHeight, tileH)
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
- float endX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X)
111
- ? targetWidth
112
- : (startX + tileW);
115
+ SkTileMode tileX = repX ? SkTileMode::kRepeat : SkTileMode::kDecal;
116
+ SkTileMode tileY = repY ? SkTileMode::kRepeat : SkTileMode::kDecal;
113
117
 
114
- float endY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y)
115
- ? targetHeight
116
- : (startY + tileH);
118
+ float offsetX =
119
+ repX ? computeCenteredTileStart(targetWidth, tileW) : tf.translateX;
120
+ float offsetY =
121
+ repY ? computeCenteredTileStart(targetHeight, tileH) : tf.translateY;
117
122
 
118
- for (float y = startY; y < endY; y += tileH) {
119
- for (float x = startX; x < endX; x += tileW) {
120
- SkAutoCanvasRestore tileRestore(canvas, true);
121
- canvas->translate(x, y);
122
- canvas->scale(tf.scaleX, tf.scaleY);
123
- svg->render(canvas);
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
- SkTileMode tileX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X)
159
- ? SkTileMode::kRepeat
160
- : SkTileMode::kClamp;
161
- SkTileMode tileY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y)
162
- ? SkTileMode::kRepeat
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
- SkMatrix localMatrix = SkMatrix::Scale(tf.scaleX, tf.scaleY);
169
-
170
- float offsetX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X)
171
- ? computeCenteredTileStart(targetWidth, tileW)
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(shader);
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
- float startX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X)
228
- ? computeCenteredTileStart(targetWidth, tileW)
229
- : tf.translateX;
230
- float startY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y)
231
- ? computeCenteredTileStart(targetHeight, tileH)
232
- : tf.translateY;
233
-
234
- float endX = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_X)
235
- ? targetWidth
236
- : (startX + tileW);
237
- float endY = (repeat == Repeat::REPEAT || repeat == Repeat::REPEAT_Y)
238
- ? targetHeight
239
- : (startY + tileH);
240
-
241
- for (float y = startY; y < endY; y += tileH) {
242
- for (float x = startX; x < endX; x += tileW) {
243
- SkAutoCanvasRestore tileRestore(canvas, true);
244
- canvas->translate(x, y);
245
- canvas->scale(tf.scaleX, tf.scaleY);
246
- lottie->render(canvas, &dstBounds);
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,