#include "layer.h"
#include "descriptor.h"
-//#include <iostream>
+#include "util\pdf_reader.h"
typedef unsigned char uint8_t;
#include <algorithm>
descriptor text_descriptor;
if(!text_descriptor.populate(stream))
throw PSDFileFormatException();
+ else
+ {
+ if(text_descriptor.has_item(L"EngineData"))
+ {
+ const descriptor_item& text_data = text_descriptor.get_item(L"EngineData");
+ read_pdf(result->text_layer_info_, text_data.rawdata_data);
+ }
+ }
stream.read_short(); //"warp version" should be 1
stream.read_long(); //"descriptor version" should be 16
return result;
}
-void layer::read_mask_data(BEFileInputStream& stream)
+void layer::layer_mask::read_mask_data(BEFileInputStream& stream)
{
unsigned long length = stream.read_long();
switch(length)
break;
case 20:
- mask_.rect_.top = stream.read_long();
- mask_.rect_.left = stream.read_long();
- mask_.rect_.bottom = stream.read_long();
- mask_.rect_.right = stream.read_long();
+ rect_.top = stream.read_long();
+ rect_.left = stream.read_long();
+ rect_.bottom = stream.read_long();
+ rect_.right = stream.read_long();
- mask_.default_value_ = stream.read_byte();
- mask_.flags_ = stream.read_byte();
+ default_value_ = stream.read_byte();
+ flags_ = stream.read_byte();
stream.discard_bytes(2);
break;
case 36:
stream.discard_bytes(18); //we don't care about the user mask if there is a "total user mask"
- mask_.flags_ = stream.read_byte();
- mask_.default_value_ = stream.read_byte();
- mask_.rect_.top = stream.read_long();
- mask_.rect_.left = stream.read_long();
- mask_.rect_.bottom = stream.read_long();
- mask_.rect_.right = stream.read_long();
+ flags_ = stream.read_byte();
+ default_value_ = stream.read_byte();
+ rect_.top = stream.read_long();
+ rect_.left = stream.read_long();
+ rect_.bottom = stream.read_long();
+ rect_.right = stream.read_long();
break;
default:
};
}
+bool layer::is_text() const
+{
+ return !text_layer_info_.empty();
+}
+
//TODO: implement
void layer::read_blending_ranges(BEFileInputStream& stream)
{
#include "image.h"
#include "misc.h"
#include "channel.h"
+#include <boost/property_tree/ptree.hpp>
namespace caspar { namespace psd {
friend class layer;
public:
- bool enabled() { return !((flags_ & 2) == 2); }
+ bool enabled() { return (flags_ & 2) == 0; }
+ bool linked() { return (flags_ & 1) == 0; }
+ bool inverted() { return (flags_ & 4) == 4; }
+
void read_mask_data(BEFileInputStream&);
- private:
char mask_id_;
image8bit_ptr mask_;
psd::rect<long> rect_;
{
return opacity_;
}
- bool visible() { return (flags_ & 2) == 2; }
+
+ unsigned short flags() const
+ {
+ return flags_;
+ }
+
+ bool visible() { return (flags_ & 2) == 0; } //the (PSD file-format) documentation is is saying the opposite but what the heck
+ bool is_text() const;
+
+ const boost::property_tree::wptree& text_data() const { return text_layer_info_; }
const image8bit_ptr& image() const { return image_; }
+
+ const layer_mask& mask_info() const { return mask_; }
const image8bit_ptr& mask() const { return mask_.mask_; }
private:
layer_mask mask_;
image8bit_ptr image_;
+
+ boost::property_tree::wptree text_layer_info_;
};
} //namespace psd
auto layers_end = doc.layers().end();
for(auto it = doc.layers().begin(); it != layers_end; ++it)
{
- if((*it)->image())
+ if((*it)->is_text())
+ {
+ }
+ else if((*it)->image())
{
core::pixel_format_desc pfd(core::pixel_format::bgra);
pfd.planes.push_back(core::pixel_format_desc::plane((*it)->rect().width(), (*it)->rect().height(), 4));
memcpy(frame.image_data().data(), (*it)->image()->data(), frame.image_data().size());
auto layer_producer = core::create_const_producer(core::draw_frame(std::move(frame)), (*it)->rect().width(), (*it)->rect().height());
+
auto& new_layer = root->create_layer(layer_producer, (*it)->rect().left, (*it)->rect().top);
new_layer.adjustments.opacity.set((*it)->opacity() / 255.0);
new_layer.hidden.set(!(*it)->visible());