normal-grain-merge 0.1.0__cp311-cp311-win_amd64.whl → 0.1.1__cp311-cp311-win_amd64.whl
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.
Potentially problematic release.
This version of normal-grain-merge might be problematic. Click here for more details.
- normal_grain_merge/normal_grain_merge.c +103 -82
- normal_grain_merge/normal_grain_merge.cp311-win_amd64.pyd +0 -0
- {normal_grain_merge-0.1.0.dist-info → normal_grain_merge-0.1.1.dist-info}/METADATA +13 -13
- normal_grain_merge-0.1.1.dist-info/RECORD +10 -0
- normal_grain_merge-0.1.0.dist-info/RECORD +0 -10
- {normal_grain_merge-0.1.0.dist-info → normal_grain_merge-0.1.1.dist-info}/WHEEL +0 -0
- {normal_grain_merge-0.1.0.dist-info → normal_grain_merge-0.1.1.dist-info}/licenses/LICENSE +0 -0
- {normal_grain_merge-0.1.0.dist-info → normal_grain_merge-0.1.1.dist-info}/top_level.txt +0 -0
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
#include <stdio.h>
|
|
3
3
|
#include <math.h>
|
|
4
4
|
#include <float.h>
|
|
5
|
+
#include <stdint.h>
|
|
6
|
+
#include <string.h>
|
|
5
7
|
#include <Python.h>
|
|
6
8
|
#include <numpy/arrayobject.h>
|
|
7
9
|
#include <smmintrin.h>
|
|
@@ -339,19 +341,25 @@ static void kernel_scalar_rgba(const uint8_t *base, const uint8_t *texture,
|
|
|
339
341
|
}
|
|
340
342
|
|
|
341
343
|
/* ---------- AVX2 helpers ----------
|
|
342
|
-
Interleaved RGB(A) is awkward for SIMD.
|
|
343
|
-
|
|
344
|
-
You can later replace gathers with better deinterleaving if needed.
|
|
344
|
+
Interleaved RGB(A) is awkward for SIMD. We build 8-lane vectors per channel by
|
|
345
|
+
reusing the scalar u8x4 -> f32 helpers instead of relying on gathers.
|
|
345
346
|
*/
|
|
346
347
|
|
|
347
|
-
/*
|
|
348
|
-
static inline
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
348
|
+
/* Forward declaration; definition shared with the SSE helpers later in the file. */
|
|
349
|
+
static inline __m128 u8x4_to_unit_f32(uint8_t a, uint8_t b, uint8_t c, uint8_t d);
|
|
350
|
+
|
|
351
|
+
/* Build 8-lane [0,1] floats for one channel from interleaved RGB. No gathers. */
|
|
352
|
+
static inline __m256 load8_rgb_channel_to_unit_f32(const uint8_t *p, int ch /*0,1,2*/) {
|
|
353
|
+
/* pixel i, channel ch is at p[3*i + ch] */
|
|
354
|
+
__m128 lo = u8x4_to_unit_f32(p[3*0 + ch], p[3*1 + ch], p[3*2 + ch], p[3*3 + ch]);
|
|
355
|
+
__m128 hi = u8x4_to_unit_f32(p[3*4 + ch], p[3*5 + ch], p[3*6 + ch], p[3*7 + ch]);
|
|
356
|
+
return _mm256_set_m128(hi, lo);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
static inline __m256 load8_rgba_channel_to_unit_f32(const uint8_t *p, int ch /*0..3*/) {
|
|
360
|
+
__m128 lo = u8x4_to_unit_f32(p[4*0 + ch], p[4*1 + ch], p[4*2 + ch], p[4*3 + ch]);
|
|
361
|
+
__m128 hi = u8x4_to_unit_f32(p[4*4 + ch], p[4*5 + ch], p[4*6 + ch], p[4*7 + ch]);
|
|
362
|
+
return _mm256_set_m128(hi, lo);
|
|
355
363
|
}
|
|
356
364
|
|
|
357
365
|
static inline __m256 mul_add_ps256(__m256 a, __m256 b, __m256 c) {
|
|
@@ -387,25 +395,67 @@ static inline __m256 nan_to_num_ps(__m256 x) {
|
|
|
387
395
|
return _mm256_blendv_ps(_mm256_set1_ps(0.0f), x, cmp);
|
|
388
396
|
}
|
|
389
397
|
|
|
390
|
-
/*
|
|
391
|
-
static inline void
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
398
|
+
/* Convert 4 float32 RGB vectors in [0,1] to uint8_t RGBRGBRGBRGB without branches. */
|
|
399
|
+
static inline void store_unit_f32_to_u8_rgb4(__m128 fr, __m128 fg, __m128 fb,
|
|
400
|
+
uint8_t *out_ptr) {
|
|
401
|
+
const __m128 scale = _mm_set1_ps(255.0f);
|
|
402
|
+
const __m128i zero = _mm_setzero_si128();
|
|
403
|
+
const __m128i max255 = _mm_set1_epi32(255);
|
|
404
|
+
|
|
405
|
+
__m128i ir = _mm_cvttps_epi32(_mm_mul_ps(fr, scale));
|
|
406
|
+
__m128i ig = _mm_cvttps_epi32(_mm_mul_ps(fg, scale));
|
|
407
|
+
__m128i ib = _mm_cvttps_epi32(_mm_mul_ps(fb, scale));
|
|
408
|
+
|
|
409
|
+
ir = _mm_min_epi32(_mm_max_epi32(ir, zero), max255);
|
|
410
|
+
ig = _mm_min_epi32(_mm_max_epi32(ig, zero), max255);
|
|
411
|
+
ib = _mm_min_epi32(_mm_max_epi32(ib, zero), max255);
|
|
412
|
+
|
|
413
|
+
__m128i ir16 = _mm_packus_epi32(ir, zero);
|
|
414
|
+
__m128i ig16 = _mm_packus_epi32(ig, zero);
|
|
415
|
+
__m128i ib16 = _mm_packus_epi32(ib, zero);
|
|
416
|
+
|
|
417
|
+
__m128i ir8 = _mm_packus_epi16(ir16, zero);
|
|
418
|
+
__m128i ig8 = _mm_packus_epi16(ig16, zero);
|
|
419
|
+
__m128i ib8 = _mm_packus_epi16(ib16, zero);
|
|
420
|
+
|
|
421
|
+
const __m128i mask_r = _mm_setr_epi8(
|
|
422
|
+
0, (char)0x80, (char)0x80, 1,
|
|
423
|
+
(char)0x80, (char)0x80, 2, (char)0x80,
|
|
424
|
+
(char)0x80, 3, (char)0x80, (char)0x80,
|
|
425
|
+
(char)0x80, (char)0x80, (char)0x80, (char)0x80);
|
|
426
|
+
const __m128i mask_g = _mm_setr_epi8(
|
|
427
|
+
(char)0x80, 0, (char)0x80, (char)0x80,
|
|
428
|
+
1, (char)0x80, (char)0x80, 2,
|
|
429
|
+
(char)0x80, (char)0x80, 3, (char)0x80,
|
|
430
|
+
(char)0x80, (char)0x80, (char)0x80, (char)0x80);
|
|
431
|
+
const __m128i mask_b = _mm_setr_epi8(
|
|
432
|
+
(char)0x80, (char)0x80, 0, (char)0x80,
|
|
433
|
+
(char)0x80, 1, (char)0x80, (char)0x80,
|
|
434
|
+
2, (char)0x80, (char)0x80, 3,
|
|
435
|
+
(char)0x80, (char)0x80, (char)0x80, (char)0x80);
|
|
436
|
+
|
|
437
|
+
__m128i packed = _mm_or_si128(
|
|
438
|
+
_mm_or_si128(_mm_shuffle_epi8(ir8, mask_r),
|
|
439
|
+
_mm_shuffle_epi8(ig8, mask_g)),
|
|
440
|
+
_mm_shuffle_epi8(ib8, mask_b));
|
|
441
|
+
|
|
442
|
+
_mm_storel_epi64((__m128i*)out_ptr, packed);
|
|
443
|
+
__m128i tail_vec = _mm_srli_si128(packed, 8);
|
|
444
|
+
uint32_t tail = (uint32_t)_mm_cvtsi128_si32(tail_vec);
|
|
445
|
+
memcpy(out_ptr + 8, &tail, sizeof(tail));
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/* Pack 8 lanes of fr/fg/fb in [0,1] to 24 bytes RGBRGB... and store. */
|
|
449
|
+
static inline void store8_unit_f32_to_u8_rgb(__m256 fr, __m256 fg, __m256 fb, uint8_t *out) {
|
|
450
|
+
__m128 fr_lo = _mm256_castps256_ps128(fr);
|
|
451
|
+
__m128 fg_lo = _mm256_castps256_ps128(fg);
|
|
452
|
+
__m128 fb_lo = _mm256_castps256_ps128(fb);
|
|
453
|
+
store_unit_f32_to_u8_rgb4(fr_lo, fg_lo, fb_lo, out);
|
|
454
|
+
|
|
455
|
+
__m128 fr_hi = _mm256_extractf128_ps(fr, 1);
|
|
456
|
+
__m128 fg_hi = _mm256_extractf128_ps(fg, 1);
|
|
457
|
+
__m128 fb_hi = _mm256_extractf128_ps(fb, 1);
|
|
458
|
+
store_unit_f32_to_u8_rgb4(fr_hi, fg_hi, fb_hi, out + 12);
|
|
409
459
|
}
|
|
410
460
|
|
|
411
461
|
/* texture is RGB: texture_alpha = im_alpha broadcast, inverse_tpa = 1 - texture_alpha */
|
|
@@ -413,8 +463,6 @@ static void kernel_avx2_rgb(const uint8_t *base, const uint8_t *texture,
|
|
|
413
463
|
const uint8_t *skin, const uint8_t *im_alpha,
|
|
414
464
|
uint8_t *out, npy_intp pixels) {
|
|
415
465
|
const __m256 inv255 = _mm256_set1_ps(1.0f/255.0f);
|
|
416
|
-
const __m256i mask_ff = _mm256_set1_epi32(0xFF);
|
|
417
|
-
const __m256i idx_rgb = _mm256_setr_epi32(0, 3, 6, 9, 12, 15, 18, 21);
|
|
418
466
|
const __m256 half = _mm256_set1_ps(0.5f);
|
|
419
467
|
const __m256 one = _mm256_set1_ps(1.0f);
|
|
420
468
|
const __m256 w = _mm256_set1_ps((float)SKIN_WEIGHT);
|
|
@@ -427,19 +475,19 @@ static void kernel_avx2_rgb(const uint8_t *base, const uint8_t *texture,
|
|
|
427
475
|
const uint8_t *skin_blk = skin + 3*i;
|
|
428
476
|
|
|
429
477
|
/* base RGB in [0,1] */
|
|
430
|
-
__m256 fb_r =
|
|
431
|
-
__m256 fb_g =
|
|
432
|
-
__m256 fb_b =
|
|
478
|
+
__m256 fb_r = load8_rgb_channel_to_unit_f32(base_blk, 0);
|
|
479
|
+
__m256 fb_g = load8_rgb_channel_to_unit_f32(base_blk, 1);
|
|
480
|
+
__m256 fb_b = load8_rgb_channel_to_unit_f32(base_blk, 2);
|
|
433
481
|
|
|
434
482
|
/* texture RGB in [0,1] */
|
|
435
|
-
__m256 ft_r =
|
|
436
|
-
__m256 ft_g =
|
|
437
|
-
__m256 ft_b =
|
|
483
|
+
__m256 ft_r = load8_rgb_channel_to_unit_f32(tex_blk, 0);
|
|
484
|
+
__m256 ft_g = load8_rgb_channel_to_unit_f32(tex_blk, 1);
|
|
485
|
+
__m256 ft_b = load8_rgb_channel_to_unit_f32(tex_blk, 2);
|
|
438
486
|
|
|
439
487
|
/* skin RGB in [0,1] */
|
|
440
|
-
__m256 fs_r =
|
|
441
|
-
__m256 fs_g =
|
|
442
|
-
__m256 fs_b =
|
|
488
|
+
__m256 fs_r = load8_rgb_channel_to_unit_f32(skin_blk, 0);
|
|
489
|
+
__m256 fs_g = load8_rgb_channel_to_unit_f32(skin_blk, 1);
|
|
490
|
+
__m256 fs_b = load8_rgb_channel_to_unit_f32(skin_blk, 2);
|
|
443
491
|
|
|
444
492
|
/* texture_alpha = im_alpha */
|
|
445
493
|
__m256 fa_im = load8_u8_to_unit_f32_avx2(im_alpha + i, inv255);
|
|
@@ -470,7 +518,7 @@ static void kernel_avx2_rgb(const uint8_t *base, const uint8_t *texture,
|
|
|
470
518
|
__m256 fg = mul_add_ps256(gm_g, fa_im, _mm256_mul_ps(fb_g, fit_a));
|
|
471
519
|
__m256 fb = mul_add_ps256(gm_b, fa_im, _mm256_mul_ps(fb_b, fit_a));
|
|
472
520
|
|
|
473
|
-
|
|
521
|
+
store8_unit_f32_to_u8_rgb(fr, fg, fb, out + 3*i);
|
|
474
522
|
}
|
|
475
523
|
|
|
476
524
|
if (i < pixels) {
|
|
@@ -484,9 +532,6 @@ static void kernel_avx2_rgba(const uint8_t *base, const uint8_t *texture,
|
|
|
484
532
|
const uint8_t *skin, const uint8_t *im_alpha,
|
|
485
533
|
uint8_t *out, npy_intp pixels) {
|
|
486
534
|
const __m256 inv255 = _mm256_set1_ps(1.0f/255.0f);
|
|
487
|
-
const __m256i mask_ff = _mm256_set1_epi32(0xFF);
|
|
488
|
-
const __m256i idx_rgb = _mm256_setr_epi32(0, 3, 6, 9, 12, 15, 18, 21);
|
|
489
|
-
const __m256i idx_rgba = _mm256_setr_epi32(0, 4, 8, 12, 16, 20, 24, 28);
|
|
490
535
|
const __m256 half = _mm256_set1_ps(0.5f);
|
|
491
536
|
const __m256 one = _mm256_set1_ps(1.0f);
|
|
492
537
|
const __m256 w = _mm256_set1_ps((float)SKIN_WEIGHT);
|
|
@@ -498,18 +543,18 @@ static void kernel_avx2_rgba(const uint8_t *base, const uint8_t *texture,
|
|
|
498
543
|
const uint8_t *tex_blk = texture + 4*i;
|
|
499
544
|
const uint8_t *skin_blk = skin + 3*i;
|
|
500
545
|
|
|
501
|
-
__m256 fb_r =
|
|
502
|
-
__m256 fb_g =
|
|
503
|
-
__m256 fb_b =
|
|
546
|
+
__m256 fb_r = load8_rgb_channel_to_unit_f32(base_blk, 0);
|
|
547
|
+
__m256 fb_g = load8_rgb_channel_to_unit_f32(base_blk, 1);
|
|
548
|
+
__m256 fb_b = load8_rgb_channel_to_unit_f32(base_blk, 2);
|
|
504
549
|
|
|
505
|
-
__m256 ft_r =
|
|
506
|
-
__m256 ft_g =
|
|
507
|
-
__m256 ft_b =
|
|
508
|
-
__m256 ft_a =
|
|
550
|
+
__m256 ft_r = load8_rgba_channel_to_unit_f32(tex_blk, 0);
|
|
551
|
+
__m256 ft_g = load8_rgba_channel_to_unit_f32(tex_blk, 1);
|
|
552
|
+
__m256 ft_b = load8_rgba_channel_to_unit_f32(tex_blk, 2);
|
|
553
|
+
__m256 ft_a = load8_rgba_channel_to_unit_f32(tex_blk, 3); /* texture alpha */
|
|
509
554
|
|
|
510
|
-
__m256 fs_r =
|
|
511
|
-
__m256 fs_g =
|
|
512
|
-
__m256 fs_b =
|
|
555
|
+
__m256 fs_r = load8_rgb_channel_to_unit_f32(skin_blk, 0);
|
|
556
|
+
__m256 fs_g = load8_rgb_channel_to_unit_f32(skin_blk, 1);
|
|
557
|
+
__m256 fs_b = load8_rgb_channel_to_unit_f32(skin_blk, 2);
|
|
513
558
|
|
|
514
559
|
__m256 fa_im = load8_u8_to_unit_f32_avx2(im_alpha + i, inv255);
|
|
515
560
|
__m256 fta = _mm256_mul_ps(ft_a, fa_im); /* texture_alpha */
|
|
@@ -535,7 +580,7 @@ static void kernel_avx2_rgba(const uint8_t *base, const uint8_t *texture,
|
|
|
535
580
|
__m256 fg = mul_add_ps256(gm_g, fta, _mm256_mul_ps(fb_g, fit_a));
|
|
536
581
|
__m256 fb = mul_add_ps256(gm_b, fta, _mm256_mul_ps(fb_b, fit_a));
|
|
537
582
|
|
|
538
|
-
|
|
583
|
+
store8_unit_f32_to_u8_rgb(fr, fg, fb, out + 3*i);
|
|
539
584
|
}
|
|
540
585
|
|
|
541
586
|
if (i < pixels) {
|
|
@@ -631,19 +676,7 @@ static void kernel_sse42_rgb(const uint8_t *base, const uint8_t *texture,
|
|
|
631
676
|
__m128 fg = mul_add_ps128(gm_g, fa_im, _mm_mul_ps(fb_g, fit_a));
|
|
632
677
|
__m128 fb = mul_add_ps128(gm_b, fa_im, _mm_mul_ps(fb_b, fit_a));
|
|
633
678
|
|
|
634
|
-
|
|
635
|
-
_mm_storeu_ps(rr, fr);
|
|
636
|
-
_mm_storeu_ps(gg, fg);
|
|
637
|
-
_mm_storeu_ps(bb, fb);
|
|
638
|
-
|
|
639
|
-
for (int k = 0; k < 4; ++k) {
|
|
640
|
-
int r = (int)(rr[k] * 255.0f);
|
|
641
|
-
int g = (int)(gg[k] * 255.0f);
|
|
642
|
-
int b = (int)(bb[k] * 255.0f);
|
|
643
|
-
out[3*(i+k)+0] = (uint8_t)(r < 0 ? 0 : r > 255 ? 255 : r);
|
|
644
|
-
out[3*(i+k)+1] = (uint8_t)(g < 0 ? 0 : g > 255 ? 255 : g);
|
|
645
|
-
out[3*(i+k)+2] = (uint8_t)(b < 0 ? 0 : b > 255 ? 255 : b);
|
|
646
|
-
}
|
|
679
|
+
store_unit_f32_to_u8_rgb4(fr, fg, fb, out + 3*i);
|
|
647
680
|
}
|
|
648
681
|
|
|
649
682
|
if (i < pixels) {
|
|
@@ -709,19 +742,7 @@ static void kernel_sse42_rgba(const uint8_t *base, const uint8_t *texture,
|
|
|
709
742
|
__m128 fg = mul_add_ps128(gm_g, fta, _mm_mul_ps(fb_g, fit_a));
|
|
710
743
|
__m128 fb = mul_add_ps128(gm_b, fta, _mm_mul_ps(fb_b, fit_a));
|
|
711
744
|
|
|
712
|
-
|
|
713
|
-
_mm_storeu_ps(rr, fr);
|
|
714
|
-
_mm_storeu_ps(gg, fg);
|
|
715
|
-
_mm_storeu_ps(bb, fb);
|
|
716
|
-
|
|
717
|
-
for (int k = 0; k < 4; ++k) {
|
|
718
|
-
int r = (int)(rr[k] * 255.0f);
|
|
719
|
-
int g = (int)(gg[k] * 255.0f);
|
|
720
|
-
int b = (int)(bb[k] * 255.0f);
|
|
721
|
-
out[3*(i+k)+0] = (uint8_t)(r < 0 ? 0 : r > 255 ? 255 : r);
|
|
722
|
-
out[3*(i+k)+1] = (uint8_t)(g < 0 ? 0 : g > 255 ? 255 : g);
|
|
723
|
-
out[3*(i+k)+2] = (uint8_t)(b < 0 ? 0 : b > 255 ? 255 : b);
|
|
724
|
-
}
|
|
745
|
+
store_unit_f32_to_u8_rgb4(fr, fg, fb, out + 3*i);
|
|
725
746
|
}
|
|
726
747
|
|
|
727
748
|
if (i < pixels) {
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: normal_grain_merge
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Fused normal and grain merge C extension
|
|
5
5
|
Author: Samuel Howard
|
|
6
6
|
License: MIT
|
|
@@ -92,18 +92,18 @@ How much of a speedup is this? All numbers are from a Ryzen 7 4800H running Ubun
|
|
|
92
92
|
|
|
93
93
|
| Method/Kernel | Average Iteration Time |
|
|
94
94
|
|-------------------|------------------------|
|
|
95
|
-
| C scalar kernel | 0.
|
|
96
|
-
| C SSE4.2 kernel | 0.
|
|
97
|
-
| C AVX2 kernel | 0.
|
|
98
|
-
| NumPy version | 0.
|
|
99
|
-
| Old NumPy version | 0.
|
|
95
|
+
| C scalar kernel | 0.016076s |
|
|
96
|
+
| C SSE4.2 kernel | 0.007300s |
|
|
97
|
+
| C AVX2 kernel | 0.007113s |
|
|
98
|
+
| NumPy version | 0.169621s |
|
|
99
|
+
| Old NumPy version | 0.254648s |
|
|
100
100
|
|
|
101
101
|
| Method Comparison | Speedup |
|
|
102
102
|
|--------------------|----------|
|
|
103
|
-
| NumPy -> scalar |
|
|
104
|
-
| NumPy -> SSE4.2 |
|
|
105
|
-
| NumPy -> AVX2 |
|
|
106
|
-
| Old np -> SSE4.2 |
|
|
107
|
-
| Old np -> AVX2 |
|
|
108
|
-
| C scalar -> SSE4.2 |
|
|
109
|
-
| C scalar -> AVX2 |
|
|
103
|
+
| NumPy -> scalar | 90.5223% |
|
|
104
|
+
| NumPy -> SSE4.2 | 95.6965% |
|
|
105
|
+
| NumPy -> AVX2 | 95.8063% |
|
|
106
|
+
| Old np -> SSE4.2 | 97.1334% |
|
|
107
|
+
| Old np -> AVX2 | 97.2066% |
|
|
108
|
+
| C scalar -> SSE4.2 | 54.5933% |
|
|
109
|
+
| C scalar -> AVX2 | 55.7525% |
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
normal_grain_merge/__init__.py,sha256=Roc1wQ7_13LG_Z3Bd82zhk8wn7R1BrcO63fCdsvnnJU,89
|
|
2
|
+
normal_grain_merge/kernel_kind.py,sha256=3cP4WRQSG9ZZeHsrXpXJ5Kcc8wABsmRSgex0rwRT8K4,162
|
|
3
|
+
normal_grain_merge/normal_grain_merge.c,sha256=6bwB2LgwW6jzENlRuZVpzXCdQhsnjYSqIcWb0ua0948,37118
|
|
4
|
+
normal_grain_merge/normal_grain_merge.cp311-win_amd64.pyd,sha256=BSHqoawfSkO9QDg3_-vlruLQ--ljYnSBYMbHPaj-2Oc,24576
|
|
5
|
+
normal_grain_merge/normal_grain_merge.pyi,sha256=HXa55A0wdcmzPpJzi7qgJws5y2q_uGjdJZQXzTkw9vc,1089
|
|
6
|
+
normal_grain_merge-0.1.1.dist-info/licenses/LICENSE,sha256=qbUDFP46iOpV1ouBhpqjX-kS_cCVMHgrLBNcdTlq7Qc,1089
|
|
7
|
+
normal_grain_merge-0.1.1.dist-info/METADATA,sha256=iyQQ6xdYZSd_NxoT9s1yQ4ZvtlsJm8f2cUw8mG7a_30,3597
|
|
8
|
+
normal_grain_merge-0.1.1.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
|
|
9
|
+
normal_grain_merge-0.1.1.dist-info/top_level.txt,sha256=jfUAUKWrxBshHvZ0xTu3uF5VJsUpbWp5NkxUj8OXqu8,19
|
|
10
|
+
normal_grain_merge-0.1.1.dist-info/RECORD,,
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
normal_grain_merge/__init__.py,sha256=Roc1wQ7_13LG_Z3Bd82zhk8wn7R1BrcO63fCdsvnnJU,89
|
|
2
|
-
normal_grain_merge/kernel_kind.py,sha256=3cP4WRQSG9ZZeHsrXpXJ5Kcc8wABsmRSgex0rwRT8K4,162
|
|
3
|
-
normal_grain_merge/normal_grain_merge.c,sha256=QKMkKq10Q66x0pYZpocDGvtGN2XOl81Or1VJ_Pz9oyY,36906
|
|
4
|
-
normal_grain_merge/normal_grain_merge.cp311-win_amd64.pyd,sha256=gYo094j-HY2uOboPX-aYypaP_uCS80UdfBDvCuFL_7Y,24576
|
|
5
|
-
normal_grain_merge/normal_grain_merge.pyi,sha256=HXa55A0wdcmzPpJzi7qgJws5y2q_uGjdJZQXzTkw9vc,1089
|
|
6
|
-
normal_grain_merge-0.1.0.dist-info/licenses/LICENSE,sha256=qbUDFP46iOpV1ouBhpqjX-kS_cCVMHgrLBNcdTlq7Qc,1089
|
|
7
|
-
normal_grain_merge-0.1.0.dist-info/METADATA,sha256=-wcYnjNnihzu7IeJkzbjB1hE0PFgS-wFuMbiebyaxOA,3597
|
|
8
|
-
normal_grain_merge-0.1.0.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
|
|
9
|
-
normal_grain_merge-0.1.0.dist-info/top_level.txt,sha256=jfUAUKWrxBshHvZ0xTu3uF5VJsUpbWp5NkxUj8OXqu8,19
|
|
10
|
-
normal_grain_merge-0.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|