Added CreateWritableFontData factory methods to WritableFontData.



git-svn-id: http://sfntly.googlecode.com/svn/trunk/cpp/src@46 672e30a5-4c29-85ac-ac6d-611c735e0a51
diff --git a/sfntly/data/writable_font_data.cc b/sfntly/data/writable_font_data.cc
index 586acc1..bf03516 100644
--- a/sfntly/data/writable_font_data.cc
+++ b/sfntly/data/writable_font_data.cc
@@ -16,6 +16,9 @@
 
 #include "sfntly/data/writable_font_data.h"
 
+#include "sfntly/data/memory_byte_array.h"
+#include "sfntly/data/growable_memory_byte_array.h"
+
 namespace sfntly {
 
 WritableFontData::WritableFontData(ByteArray* ba) : ReadableFontData(ba) {
@@ -23,6 +26,29 @@
 
 WritableFontData::~WritableFontData() {}
 
+// static
+CALLER_ATTACH
+WritableFontData* WritableFontData::CreateWritableFontData(int32_t length) {
+  ByteArrayPtr ba;
+  if (length > 0) {
+    ba = new MemoryByteArray(length);
+    ba->SetFilledLength(length);
+  } else {
+    ba = new GrowableMemoryByteArray();
+  }
+  WritableFontDataPtr wfd = new WritableFontData(ba);
+  return wfd.Detach();
+}
+
+// static
+CALLER_ATTACH
+WritableFontData* WritableFontData::CreateWritableFontData(ByteVector* b) {
+  ByteArrayPtr ba = new GrowableMemoryByteArray();
+  ba->Put(0, b);
+  WritableFontDataPtr wfd = new WritableFontData(ba);
+  return wfd.Detach();
+}
+
 int32_t WritableFontData::WriteByte(int32_t index, byte_t b) {
   array_->Put(BoundOffset(index), b);
   return 1;
diff --git a/sfntly/data/writable_font_data.h b/sfntly/data/writable_font_data.h
index 98c9204..ec74da7 100644
--- a/sfntly/data/writable_font_data.h
+++ b/sfntly/data/writable_font_data.h
@@ -26,6 +26,24 @@
   explicit WritableFontData(ByteArray* ba);
   virtual ~WritableFontData();
 
+  // Constructs a writable font data object. If the length is specified as
+  // positive then a fixed size font data object will be created. If the length
+  // is zero or less then a growable font data object will be created and the
+  // size will be used as an estimate to help in allocating the original space.
+  //
+  // @param length if length > 0 create a fixed length font data; otherwise
+  //        create a growable font data
+  // @return a new writable font data
+  static CALLER_ATTACH WritableFontData* CreateWritableFontData(int32_t length);
+
+  // Constructs a writable font data object. The new font data object will wrap
+  // the bytes passed in to the factory and it will take make a copy of those
+  // bytes.
+  //
+  // @param b the byte vector to wrap
+  // @return a new writable font data
+  static CALLER_ATTACH WritableFontData* CreateWritableFontData(ByteVector* b);
+
   virtual int32_t WriteByte(int32_t index, byte_t b);
   virtual int32_t WriteBytes(int32_t offset,
                              ByteVector* b,