@shopify/react-native-skia 2.4.3 → 2.4.5

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.
@@ -224,6 +224,19 @@ export interface SkiaPictureViewHandle {
224
224
  getSize(): { width: number; height: number };
225
225
  redraw(): void;
226
226
  makeImageSnapshot(rect?: SkRect): SkImage | null;
227
+ measure(
228
+ callback: (
229
+ x: number,
230
+ y: number,
231
+ width: number,
232
+ height: number,
233
+ pageX: number,
234
+ pageY: number
235
+ ) => void
236
+ ): void;
237
+ measureInWindow(
238
+ callback: (x: number, y: number, width: number, height: number) => void
239
+ ): void;
227
240
  }
228
241
 
229
242
  export const SkiaPictureView = forwardRef<
@@ -264,6 +277,56 @@ export const SkiaPictureView = forwardRef<
264
277
  return null;
265
278
  }, []);
266
279
 
280
+ const measure = useCallback(
281
+ (
282
+ callback: (
283
+ x: number,
284
+ y: number,
285
+ width: number,
286
+ height: number,
287
+ pageX: number,
288
+ pageY: number
289
+ ) => void
290
+ ) => {
291
+ if (canvasRef.current) {
292
+ const rect = canvasRef.current.getBoundingClientRect();
293
+ const parentElement = canvasRef.current.offsetParent as HTMLElement;
294
+ const parentRect = parentElement?.getBoundingClientRect() || {
295
+ left: 0,
296
+ top: 0,
297
+ };
298
+
299
+ // x, y are relative to the parent
300
+ const x = rect.left - parentRect.left;
301
+ const y = rect.top - parentRect.top;
302
+
303
+ // pageX, pageY are absolute screen coordinates
304
+ const pageX = rect.left + window.scrollX;
305
+ const pageY = rect.top + window.scrollY;
306
+
307
+ callback(x, y, rect.width, rect.height, pageX, pageY);
308
+ }
309
+ },
310
+ []
311
+ );
312
+
313
+ const measureInWindow = useCallback(
314
+ (
315
+ callback: (x: number, y: number, width: number, height: number) => void
316
+ ) => {
317
+ if (canvasRef.current) {
318
+ const rect = canvasRef.current.getBoundingClientRect();
319
+
320
+ // x, y are the absolute coordinates in the window
321
+ const x = rect.left;
322
+ const y = rect.top;
323
+
324
+ callback(x, y, rect.width, rect.height);
325
+ }
326
+ },
327
+ []
328
+ );
329
+
267
330
  const tick = useCallback(() => {
268
331
  if (redrawRequestsRef.current > 0) {
269
332
  redrawRequestsRef.current = 0;
@@ -300,8 +363,13 @@ export const SkiaPictureView = forwardRef<
300
363
  getSize,
301
364
  redraw,
302
365
  makeImageSnapshot,
366
+ measure,
367
+ measureInWindow,
368
+ get canvasRef() {
369
+ return () => canvasRef.current;
370
+ },
303
371
  }),
304
- [setPicture, getSize, redraw, makeImageSnapshot]
372
+ [setPicture, getSize, redraw, makeImageSnapshot, measure, measureInWindow]
305
373
  );
306
374
 
307
375
  useEffect(() => {
@@ -311,8 +379,18 @@ export const SkiaPictureView = forwardRef<
311
379
  getSize,
312
380
  redraw,
313
381
  makeImageSnapshot,
382
+ measure,
383
+ measureInWindow,
314
384
  } as SkiaPictureViewHandle);
315
- }, [setPicture, getSize, redraw, makeImageSnapshot, props.nativeID]);
385
+ }, [
386
+ setPicture,
387
+ getSize,
388
+ redraw,
389
+ makeImageSnapshot,
390
+ measure,
391
+ measureInWindow,
392
+ props.nativeID,
393
+ ]);
316
394
 
317
395
  useEffect(() => {
318
396
  if (props.picture) {