27
27
28
28
#include <stdio.h>
29
29
#include <stdbool.h>
30
+ #include <sys/types.h>
30
31
31
32
/*
32
33
* Don't use khrplatform.h in order not to break apps existing
@@ -202,6 +203,8 @@ typedef enum ktx_error_code_e {
202
203
*/
203
204
typedef struct ktxKVListEntry * ktxHashList ;
204
205
206
+ typedef struct ktxStream ktxStream ;
207
+
205
208
#define KTX_APIENTRYP KTX_APIENTRY *
206
209
/**
207
210
* @class ktxHashListEntry
@@ -477,6 +480,9 @@ typedef KTX_error_code
477
480
typedef KTX_error_code
478
481
(KTX_APIENTRY * PFNKTEXWRITETOMEMORY )(ktxTexture * This ,
479
482
ktx_uint8_t * * bytes , ktx_size_t * size );
483
+ typedef KTX_error_code
484
+ (KTX_APIENTRY * PFNKTEXWRITETOSTREAM )(ktxTexture * This ,
485
+ ktxStream * dststr );
480
486
481
487
/**
482
488
* @memberof ktxTexture
@@ -497,6 +503,7 @@ typedef KTX_error_code
497
503
PFNKTEXWRITETOSTDIOSTREAM WriteToStdioStream ;
498
504
PFNKTEXWRITETONAMEDFILE WriteToNamedFile ;
499
505
PFNKTEXWRITETOMEMORY WriteToMemory ;
506
+ PFNKTEXWRITETOSTREAM WriteToStream ;
500
507
};
501
508
502
509
/****************************************************************
@@ -617,6 +624,14 @@ typedef KTX_error_code
617
624
#define ktxTexture_WriteToMemory (This , ppDstBytes , pSize ) \
618
625
(This)->vtbl->WriteToMemory(This, ppDstBytes, pSize)
619
626
627
+ /**
628
+ * @~English
629
+ * @brief Helper for calling the WriteToStream virtual method of a ktxTexture.
630
+ * @copydoc ktxTexture2_WriteToStream
631
+ */
632
+ #define ktxTexture_WriteToStream (This , dststr ) \
633
+ (This)->vtbl->WriteToStream(This, dststr)
634
+
620
635
621
636
/**
622
637
* @class ktxTexture1
@@ -755,13 +770,120 @@ enum ktxTextureCreateFlagBits {
755
770
*/
756
771
typedef ktx_uint32_t ktxTextureCreateFlags ;
757
772
773
+ /*===========================================================*
774
+ * ktxStream
775
+ *===========================================================*/
776
+
777
+ /*
778
+ * This is unsigned to allow ktxmemstreams to use the
779
+ * full amount of memory available. Platforms will
780
+ * limit the size of ktxfilestreams to, e.g, MAX_LONG
781
+ * on 32-bit and ktxfilestreams raises errors if
782
+ * offset values exceed the limits. This choice may
783
+ * need to be revisited if we ever start needing -ve
784
+ * offsets.
785
+ *
786
+ * Should the 2GB file size handling limit on 32-bit
787
+ * platforms become a problem, ktxfilestream will have
788
+ * to be changed to explicitly handle large files by
789
+ * using the 64-bit stream functions.
790
+ */
791
+ #if defined(_MSC_VER ) && defined(_WIN64 )
792
+ typedef unsigned __int64 ktx_off_t ;
793
+ #else
794
+ typedef off_t ktx_off_t ;
795
+ #endif
796
+ typedef struct ktxMem ktxMem ;
797
+ typedef struct ktxStream ktxStream ;
798
+
799
+ enum streamType { eStreamTypeFile = 1 , eStreamTypeMemory = 2 , eStreamTypeCustom = 3 };
800
+
801
+ /**
802
+ * @~English
803
+ * @brief type for a pointer to a stream reading function
804
+ */
805
+ typedef KTX_error_code (* ktxStream_read )(ktxStream * str , void * dst ,
806
+ const ktx_size_t count );
807
+ /**
808
+ * @~English
809
+ * @brief type for a pointer to a stream skipping function
810
+ */
811
+ typedef KTX_error_code (* ktxStream_skip )(ktxStream * str ,
812
+ const ktx_size_t count );
813
+
814
+ /**
815
+ * @~English
816
+ * @brief type for a pointer to a stream reading function
817
+ */
818
+ typedef KTX_error_code (* ktxStream_write )(ktxStream * str , const void * src ,
819
+ const ktx_size_t size ,
820
+ const ktx_size_t count );
821
+
822
+ /**
823
+ * @~English
824
+ * @brief type for a pointer to a stream position query function
825
+ */
826
+ typedef KTX_error_code (* ktxStream_getpos )(ktxStream * str , ktx_off_t * const offset );
827
+
828
+ /**
829
+ * @~English
830
+ * @brief type for a pointer to a stream position query function
831
+ */
832
+ typedef KTX_error_code (* ktxStream_setpos )(ktxStream * str , const ktx_off_t offset );
833
+
834
+ /**
835
+ * @~English
836
+ * @brief type for a pointer to a stream size query function
837
+ */
838
+ typedef KTX_error_code (* ktxStream_getsize )(ktxStream * str , ktx_size_t * const size );
839
+
840
+ /**
841
+ * @~English
842
+ * @brief Destruct a stream
843
+ */
844
+ typedef void (* ktxStream_destruct )(ktxStream * str );
845
+
846
+ /**
847
+ * @~English
848
+ *
849
+ * @brief Interface of ktxStream.
850
+ *
851
+ * @author Maksim Kolesin
852
+ * @author Georg Kolling, Imagination Technology
853
+ * @author Mark Callow, HI Corporation
854
+ */
855
+ struct ktxStream
856
+ {
857
+ ktxStream_read read ; /*!< @internal pointer to function for reading bytes. */
858
+ ktxStream_skip skip ; /*!< @internal pointer to function for skipping bytes. */
859
+ ktxStream_write write ; /*!< @internal pointer to function for writing bytes. */
860
+ ktxStream_getpos getpos ; /*!< @internal pointer to function for getting current position in stream. */
861
+ ktxStream_setpos setpos ; /*!< @internal pointer to function for setting current position in stream. */
862
+ ktxStream_getsize getsize ; /*!< @internal pointer to function for querying size. */
863
+ ktxStream_destruct destruct ; /*!< @internal destruct the stream. */
864
+
865
+ enum streamType type ;
866
+ union {
867
+ FILE * file ;
868
+ ktxMem * mem ;
869
+ struct
870
+ {
871
+ void * address ;
872
+ void * allocatorAddress ;
873
+ ktx_size_t size ;
874
+ } custom_ptr ;
875
+ } data ; /**< @internal pointer to the stream data. */
876
+ ktx_off_t readpos ; /**< @internal used by FileStream for stdin. */
877
+ ktx_bool_t closeOnDestruct ; /**< @internal Close FILE* or dispose of memory on destruct. */
878
+ };
879
+
758
880
/*
759
881
* See the implementation files for the full documentation of the following
760
882
* functions.
761
883
*/
762
884
763
885
/*
764
- * These three create a ktxTexture1 or ktxTexture2 according to the data
886
+ * These four create a ktxTexture1 or ktxTexture2 according to the data
765
887
* header, and return a pointer to the base ktxTexture class.
766
888
*/
767
889
KTX_API KTX_error_code KTX_APIENTRY
@@ -779,6 +901,11 @@ ktxTexture_CreateFromMemory(const ktx_uint8_t* bytes, ktx_size_t size,
779
901
ktxTextureCreateFlags createFlags ,
780
902
ktxTexture * * newTex );
781
903
904
+ KTX_API KTX_error_code KTX_APIENTRY
905
+ ktxTexture_CreateFromStream (ktxStream * stream ,
906
+ ktxTextureCreateFlags createFlags ,
907
+ ktxTexture * * newTex );
908
+
782
909
/*
783
910
* Returns a pointer to the image data of a ktxTexture object.
784
911
*/
@@ -824,7 +951,7 @@ ktxTexture1_Create(ktxTextureCreateInfo* createInfo,
824
951
ktxTexture1 * * newTex );
825
952
826
953
/*
827
- * These three create a ktxTexture1 provided the data is in KTX format.
954
+ * These four create a ktxTexture1 provided the data is in KTX format.
828
955
*/
829
956
KTX_API KTX_error_code KTX_APIENTRY
830
957
ktxTexture1_CreateFromStdioStream (FILE * stdioStream ,
@@ -841,6 +968,11 @@ ktxTexture1_CreateFromMemory(const ktx_uint8_t* bytes, ktx_size_t size,
841
968
ktxTextureCreateFlags createFlags ,
842
969
ktxTexture1 * * newTex );
843
970
971
+ KTX_API KTX_error_code KTX_APIENTRY
972
+ ktxTexture1_CreateFromStream (ktxStream * stream ,
973
+ ktxTextureCreateFlags createFlags ,
974
+ ktxTexture1 * * newTex );
975
+
844
976
KTX_API ktx_bool_t KTX_APIENTRY
845
977
ktxTexture1_NeedsTranscoding (ktxTexture1 * This );
846
978
@@ -863,6 +995,12 @@ KTX_API KTX_error_code KTX_APIENTRY
863
995
ktxTexture1_WriteKTX2ToMemory (ktxTexture1 * This ,
864
996
ktx_uint8_t * * bytes , ktx_size_t * size );
865
997
998
+ /*
999
+ * Write a ktxTexture object to a ktxStream in KTX format.
1000
+ */
1001
+ KTX_API KTX_error_code KTX_APIENTRY
1002
+ ktxTexture1_WriteKTX2ToStream (ktxTexture1 * This , ktxStream * dststr );
1003
+
866
1004
/*
867
1005
* Create a new ktxTexture2.
868
1006
*/
@@ -878,7 +1016,7 @@ KTX_API KTX_error_code KTX_APIENTRY
878
1016
ktxTexture2_CreateCopy (ktxTexture2 * orig , ktxTexture2 * * newTex );
879
1017
880
1018
/*
881
- * These three create a ktxTexture2 provided the data is in KTX2 format.
1019
+ * These four create a ktxTexture2 provided the data is in KTX2 format.
882
1020
*/
883
1021
KTX_API KTX_error_code KTX_APIENTRY
884
1022
ktxTexture2_CreateFromStdioStream (FILE * stdioStream ,
@@ -895,6 +1033,11 @@ ktxTexture2_CreateFromMemory(const ktx_uint8_t* bytes, ktx_size_t size,
895
1033
ktxTextureCreateFlags createFlags ,
896
1034
ktxTexture2 * * newTex );
897
1035
1036
+ KTX_API KTX_error_code KTX_APIENTRY
1037
+ ktxTexture2_CreateFromStream (ktxStream * stream ,
1038
+ ktxTextureCreateFlags createFlags ,
1039
+ ktxTexture2 * * newTex );
1040
+
898
1041
KTX_API KTX_error_code KTX_APIENTRY
899
1042
ktxTexture2_CompressBasis (ktxTexture2 * This , ktx_uint32_t quality );
900
1043
0 commit comments