summaryrefslogtreecommitdiff
path: root/sfntly/table/font_data_table.h
diff options
context:
space:
mode:
Diffstat (limited to 'sfntly/table/font_data_table.h')
-rw-r--r--sfntly/table/font_data_table.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/sfntly/table/font_data_table.h b/sfntly/table/font_data_table.h
new file mode 100644
index 0000000..a2b026f
--- /dev/null
+++ b/sfntly/table/font_data_table.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2011 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_FONT_DATA_TABLE_H_
+#define SFNTLY_CPP_SRC_SFNTLY_TABLE_FONT_DATA_TABLE_H_
+
+#include "sfntly/data/readable_font_data.h"
+#include "sfntly/font_data_table_builder_container.h"
+#include "sfntly/port/refcount.h"
+
+namespace sfntly {
+
+class FontDataTable : virtual public RefCount {
+ public:
+ // Note: original version is abstract Builder<T extends FontDataTable>
+ // C++ template is not designed that way so plain class is chosen.
+ class Builder : virtual public RefCount {
+ public:
+ // Get a snapshot copy of the internal data of the builder.
+ // This causes any internal data structures to be serialized to a new data
+ // object. This data object belongs to the caller and must be properly
+ // disposed of. No changes are made to the builder and any changes to the
+ // data directly do not affect the internal state. To do that a subsequent
+ // call must be made to {@link #SetData(WritableFontData)}.
+ // @return a copy of the internal data of the builder
+ CALLER_ATTACH WritableFontData* Data();
+ virtual void SetData(ReadableFontData* data);
+
+ // Note: changed from protected to avoid accessibility error in C++
+ virtual CALLER_ATTACH FontDataTable* Build();
+ virtual bool ReadyToBuild();
+
+ ReadableFontData* InternalReadData();
+ WritableFontData* InternalWriteData();
+ CALLER_ATTACH WritableFontData* InternalNewData(int32_t size);
+
+ bool data_changed() { return data_changed_; }
+ bool model_changed() { return model_changed_; }
+ bool set_model_changed() { return set_model_changed(true); }
+ bool set_model_changed(bool changed) {
+ bool old = model_changed_;
+ model_changed_ = changed;
+ return old;
+ }
+
+ protected:
+ explicit Builder(FontDataTableBuilderContainer* container);
+ Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
+ virtual ~Builder();
+
+ void Init(FontDataTableBuilderContainer* container);
+
+ // subclass API
+ virtual void NotifyPostTableBuild(FontDataTable* table);
+ virtual int32_t SubSerialize(WritableFontData* new_data) = 0;
+ virtual bool SubReadyToSerialize() = 0;
+ virtual int32_t SubDataSizeToSerialize() = 0;
+ virtual void SubDataSet() = 0;
+ virtual CALLER_ATTACH FontDataTable*
+ SubBuildTable(ReadableFontData* data) = 0;
+
+ private:
+ void InternalSetData(WritableFontData* data, bool data_changed);
+ void InternalSetData(ReadableFontData* data, bool data_changed);
+
+ FontDataTableBuilderContainer* container_; // avoid circular ref-counting
+ WritableFontDataPtr w_data_;
+ ReadableFontDataPtr r_data_;
+ bool model_changed_;
+ bool data_changed_;
+ };
+
+ explicit FontDataTable(ReadableFontData* data);
+ virtual ~FontDataTable();
+
+ // Get the readable font data for this table.
+ ReadableFontData* ReadFontData();
+
+ // Get the length of the data for this table in bytes. This is the full
+ // allocated length of the data and may or may not include any padding.
+ virtual int32_t Length();
+
+ // Get the number of bytes of padding used in the table. The padding bytes are
+ // used to align the table length to a 4 byte boundary.
+ virtual int32_t Padding();
+
+ // Return the number of bytes of non-padded data in the table. If the padding
+ // is unknown or unknowable then the total number of bytes of data in the
+ // tables is returned.
+ virtual int32_t DataLength();
+
+ virtual int32_t Serialize(OutputStream* os);
+
+ protected:
+ // TODO(arthurhsu): style guide violation: protected member, need refactoring
+ ReadableFontDataPtr data_;
+};
+typedef Ptr<FontDataTable> FontDataTablePtr;
+typedef Ptr<FontDataTable::Builder> FontDataTableBuilderPtr;
+
+} // namespace sfntly
+
+#endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_FONT_DATA_TABLE_H_