summaryrefslogtreecommitdiff
path: root/core/src/fxcodec/codec/fx_codec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/fxcodec/codec/fx_codec.cpp')
-rw-r--r--core/src/fxcodec/codec/fx_codec.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp
index d7c7c4eeb4..6998114f83 100644
--- a/core/src/fxcodec/codec/fx_codec.cpp
+++ b/core/src/fxcodec/codec/fx_codec.cpp
@@ -142,6 +142,121 @@ void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height) {
m_pDataCache = nonstd::move(cache);
}
+FX_BOOL CCodec_BasicModule::RunLengthEncode(const uint8_t* src_buf,
+ FX_DWORD src_size,
+ uint8_t*& dest_buf,
+ FX_DWORD& dest_size) {
+ return FALSE;
+}
+
+#define EXPONENT_DETECT(ptr) \
+ for (;; ptr++) { \
+ if (!std::isdigit(*ptr)) { \
+ if (endptr) \
+ *endptr = (char*)ptr; \
+ break; \
+ } else { \
+ exp_ret *= 10; \
+ exp_ret += FXSYS_toDecimalDigit(*ptr); \
+ continue; \
+ } \
+ }
+
+extern "C" double FXstrtod(const char* nptr, char** endptr) {
+ double ret = 0.0;
+ const char* ptr = nptr;
+ const char* exp_ptr = NULL;
+ int e_number = 0, e_signal = 0, e_point = 0, is_negative = 0;
+ int exp_ret = 0, exp_sig = 1, fra_ret = 0, fra_count = 0, fra_base = 1;
+ if (!nptr) {
+ return 0.0;
+ }
+ for (;; ptr++) {
+ if (!e_number && !e_point && (*ptr == '\t' || *ptr == ' '))
+ continue;
+
+ if (std::isdigit(*ptr)) {
+ if (!e_number)
+ e_number = 1;
+
+ if (!e_point) {
+ ret *= 10;
+ ret += FXSYS_toDecimalDigit(*ptr);
+ } else {
+ fra_count++;
+ fra_ret *= 10;
+ fra_ret += FXSYS_toDecimalDigit(*ptr);
+ }
+ continue;
+ }
+ if (!e_point && *ptr == '.') {
+ e_point = 1;
+ continue;
+ }
+ if (!e_number && !e_point && !e_signal) {
+ switch (*ptr) {
+ case '-':
+ is_negative = 1;
+ case '+':
+ e_signal = 1;
+ continue;
+ }
+ }
+ if (e_number && (*ptr == 'e' || *ptr == 'E')) {
+ exp_ptr = ptr++;
+ if (*ptr == '+' || *ptr == '-') {
+ exp_sig = (*ptr++ == '+') ? 1 : -1;
+ if (!std::isdigit(*ptr)) {
+ if (endptr) {
+ *endptr = (char*)exp_ptr;
+ }
+ break;
+ }
+ EXPONENT_DETECT(ptr);
+ } else if (std::isdigit(*ptr)) {
+ EXPONENT_DETECT(ptr);
+ } else {
+ if (endptr) {
+ *endptr = (char*)exp_ptr;
+ }
+ break;
+ }
+ break;
+ }
+ if (ptr != nptr && !e_number) {
+ if (endptr) {
+ *endptr = (char*)nptr;
+ }
+ break;
+ }
+ if (endptr) {
+ *endptr = (char*)ptr;
+ }
+ break;
+ }
+ while (fra_count--) {
+ fra_base *= 10;
+ }
+ ret += (double)fra_ret / (double)fra_base;
+ if (exp_sig == 1) {
+ while (exp_ret--) {
+ ret *= 10.0;
+ }
+ } else {
+ while (exp_ret--) {
+ ret /= 10.0;
+ }
+ }
+ return is_negative ? -ret : ret;
+}
+#undef EXPONENT_DETECT
+
+FX_BOOL CCodec_BasicModule::A85Encode(const uint8_t* src_buf,
+ FX_DWORD src_size,
+ uint8_t*& dest_buf,
+ FX_DWORD& dest_size) {
+ return FALSE;
+}
class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder {
public:
CCodec_RLScanlineDecoder();