]> git.sesse.net Git - casparcg/commitdiff
* added parsing of text-layer data
authorniklaspandersson <niklas.p.andersson@svt.se>
Wed, 24 Jul 2013 09:33:56 +0000 (11:33 +0200)
committerniklaspandersson <niklas.p.andersson@svt.se>
Wed, 24 Jul 2013 09:33:56 +0000 (11:33 +0200)
modules/psd/descriptor.cpp
modules/psd/descriptor.h
modules/psd/layer.cpp
modules/psd/layer.h
modules/psd/psd.cpp

index deabf6250eb74b9b862fea070a9df4daf102a03e..82dd18a26f1d7968e3c4cb49b9bcd759308d13a4 100644 (file)
 
 namespace caspar { namespace psd {
 
+bool descriptor::has_item(const std::wstring& key) const
+{
+       return (items_.find(key) != items_.end());
+}
+
+const descriptor_item& descriptor::get_item(const std::wstring& key) const
+{
+       return (*(items_.find(key))).second;
+}
+
 bool descriptor::populate(BEFileInputStream& stream)
 {
        bool result = true;
index 61e37b0fe6c5b1a6d52a4dd19c0936130914887f..fb2d0f4ca73265480af9316f5e087cd9aa6d2ed8 100644 (file)
@@ -49,7 +49,8 @@ class descriptor
 
 public:
        bool populate(BEFileInputStream& stream);
-
+       const descriptor_item& get_item(const std::wstring& key) const;
+       bool has_item(const std::wstring& key) const;
 private:
        items_map items_;
 };
index 7b1aeccee738272912ab392be7e60fff35210503..b225407cdb730140a9ff4f026df0dd5e99d016dd 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "layer.h"
 #include "descriptor.h"
-//#include <iostream>
+#include "util\pdf_reader.h"
 
 typedef unsigned char uint8_t;
 #include <algorithm>
@@ -103,6 +103,14 @@ layer_ptr layer::create(BEFileInputStream& stream)
                                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
@@ -126,7 +134,7 @@ layer_ptr layer::create(BEFileInputStream& stream)
        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)
@@ -135,24 +143,24 @@ void layer::read_mask_data(BEFileInputStream& stream)
                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:
@@ -161,6 +169,11 @@ void layer::read_mask_data(BEFileInputStream& stream)
        };
 }
 
+bool layer::is_text() const
+{
+       return !text_layer_info_.empty();
+}
+
 //TODO: implement
 void layer::read_blending_ranges(BEFileInputStream& stream)
 {
index 1deea9bab7ece96fe7b8aefd27dfb0d7a130e426..4b976b4059586273f5c66729faacecbd864c9790 100644 (file)
@@ -32,6 +32,7 @@
 #include "image.h"
 #include "misc.h"
 #include "channel.h"
+#include <boost/property_tree/ptree.hpp>
 
 namespace caspar { namespace psd {
 
@@ -46,10 +47,12 @@ public:
                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_;
@@ -76,9 +79,20 @@ public:
        {
                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:
@@ -97,6 +111,8 @@ private:
        layer_mask                                              mask_;
 
        image8bit_ptr                                   image_;
+
+       boost::property_tree::wptree    text_layer_info_;
 };
 
 }      //namespace psd
index 4140efaf09551b2987aa1bb6848185950a902af6..fabc629e95273df33324072e2423f4fb8d66db12 100644 (file)
@@ -56,7 +56,10 @@ spl::shared_ptr<core::frame_producer> create_producer(const spl::shared_ptr<core
        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));
@@ -65,6 +68,7 @@ spl::shared_ptr<core::frame_producer> create_producer(const spl::shared_ptr<core
                        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());