summaryrefslogtreecommitdiff
path: root/fluid/Fl_Function_Type.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'fluid/Fl_Function_Type.cxx')
-rw-r--r--fluid/Fl_Function_Type.cxx57
1 files changed, 52 insertions, 5 deletions
diff --git a/fluid/Fl_Function_Type.cxx b/fluid/Fl_Function_Type.cxx
index 557947e93..cce44b5d6 100644
--- a/fluid/Fl_Function_Type.cxx
+++ b/fluid/Fl_Function_Type.cxx
@@ -25,12 +25,16 @@
#include "function_panel.h"
#include "comments.h"
#include "mergeback.h"
+#include "undo.h"
#include <FL/fl_string_functions.h>
#include <FL/Fl_File_Chooser.H>
#include <FL/fl_ask.H>
#include "../src/flstring.h"
+#include <zlib.h>
+
+
/// Set a current class, so that the code of the children is generated correctly.
Fl_Class_Type *current_class = NULL;
@@ -1128,9 +1132,12 @@ void Fl_Data_Type::write_properties(Fd_Project_Writer &f) {
f.write_string("filename");
f.write_word(filename_);
}
- if (text_mode_) {
+ if (text_mode_ == 1) {
f.write_string("textmode");
}
+ if (text_mode_ == 2) {
+ f.write_string("compressed");
+ }
}
/**
@@ -1141,6 +1148,8 @@ void Fl_Data_Type::read_property(Fd_Project_Reader &f, const char *c) {
storestring(f.read_word(), filename_, 1);
} else if (!strcmp(c,"textmode")) {
text_mode_ = 1;
+ } else if (!strcmp(c,"compressed")) {
+ text_mode_ = 2;
} else {
Fl_Decl_Type::read_property(f, c);
}
@@ -1209,6 +1218,7 @@ void Fl_Data_Type::open() {
if (v==0) { free(s); continue; } // Continue Editing
//if (v==1) { } // Ignore Error and close dialog
}
+ undo_checkpoint();
name(n);
free(s);
// store flags
@@ -1228,6 +1238,8 @@ void Fl_Data_Type::open() {
}
}
text_mode_ = data_mode->value();
+ if (text_mode_ < 0) text_mode_ = 0;
+ if (text_mode_ > 2) text_mode_ = 2;
// store the filename
c = data_filename->value();
if (filename_ && strcmp(filename_, data_filename->value()))
@@ -1246,6 +1258,7 @@ void Fl_Data_Type::open() {
comment(0);
}
if (c) free((void*)c);
+ set_modflag(1);
break;
}
BREAK2:
@@ -1262,6 +1275,7 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
const char *fn = filename_;
char *data = 0;
int nData = -1;
+ int uncompressedDataSize = 0;
// path should be set correctly already
if (filename_ && !f.write_sourceview) {
enter_project_dir();
@@ -1276,6 +1290,15 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
if (nData) {
data = (char*)calloc(nData, 1);
if (fread(data, nData, 1, f)==0) { /* use default */ }
+ if (text_mode_ == 2) {
+ uncompressedDataSize = nData;
+ uLong nzData = compressBound(nData);
+ Bytef *zdata = (Bytef*)::malloc(nzData);
+ if (compress(zdata, &nzData, (Bytef*)data, nData) != Z_OK) { /* error */ }
+ ::free(data);
+ data = (char*)zdata;
+ nData = (int)nzData;
+ }
}
fclose(f);
}
@@ -1284,13 +1307,22 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
}
if (is_in_class()) {
f.write_public(public_);
- if (text_mode_) {
+ if (text_mode_ == 1) {
f.write_h("%sstatic const char *%s;\n", f.indent(1), c);
f.write_c("\n");
write_comment_c(f);
f.write_c("const char *%s::%s = /* text inlined from %s */\n", class_name(1), c, fn);
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cstring(data, nData);
+ } else if (text_mode_ == 2) {
+ f.write_h("%sstatic int %s_size;\n", f.indent(1), c);
+ f.write_h("%sstatic unsigned char %s[%d];\n", f.indent(1), c, nData);
+ f.write_c("\n");
+ write_comment_c(f);
+ f.write_c("int %s::%s_size = %d;\n", class_name(1), c, uncompressedDataSize);
+ f.write_c("unsigned char %s::%s[%d] = /* data compressed and inlined from %s */\n", class_name(1), c, nData, fn);
+ if (message) f.write_c("#error %s %s\n", message, fn);
+ f.write_cdata(data, nData);
} else {
f.write_h("%sstatic unsigned char %s[%d];\n", f.indent(1), c, nData);
f.write_c("\n");
@@ -1304,13 +1336,22 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
// the "header only" option does not apply here!
if (public_) {
if (static_) {
- if (text_mode_) {
+ if (text_mode_ == 1) {
f.write_h("extern const char *%s;\n", c);
f.write_c("\n");
write_comment_c(f);
f.write_c("const char *%s = /* text inlined from %s */\n", c, fn);
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cstring(data, nData);
+ } else if (text_mode_ == 2) {
+ f.write_h("extern int %s_size;\n", c);
+ f.write_h("extern unsigned char %s[%d];\n", c, nData);
+ f.write_c("\n");
+ write_comment_c(f);
+ f.write_c("int %s_size = %d;\n", c, uncompressedDataSize);
+ f.write_c("unsigned char %s[%d] = /* data compressed and inlined from %s */\n", c, nData, fn);
+ if (message) f.write_c("#error %s %s\n", message, fn);
+ f.write_cdata(data, nData);
} else {
f.write_h("extern unsigned char %s[%d];\n", c, nData);
f.write_c("\n");
@@ -1323,7 +1364,7 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
} else {
write_comment_h(f);
f.write_h("#error Unsupported declaration loading inline data %s\n", fn);
- if (text_mode_)
+ if (text_mode_ == 1)
f.write_h("const char *%s = \"abc...\";\n", c);
else
f.write_h("unsigned char %s[3] = { 1, 2, 3 };\n", c);
@@ -1333,10 +1374,16 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
write_comment_c(f);
if (static_)
f.write_c("static ");
- if (text_mode_) {
+ if (text_mode_ == 1) {
f.write_c("const char *%s = /* text inlined from %s */\n", c, fn);
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cstring(data, nData);
+ } else if (text_mode_ == 2) {
+ f.write_c("int %s_size = %d;\n", c, uncompressedDataSize);
+ if (static_) f.write_c("static ");
+ f.write_c("unsigned char %s[%d] = /* data compressed and inlined from %s */\n", c, nData, fn);
+ if (message) f.write_c("#error %s %s\n", message, fn);
+ f.write_cdata(data, nData);
} else {
f.write_c("unsigned char %s[%d] = /* data inlined from %s */\n", c, nData, fn);
if (message) f.write_c("#error %s %s\n", message, fn);