/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you 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 .
 */

#include <algorithm>
#include <filter/msfilter/dffpropset.hxx>
#include <filter/msfilter/dffrecordheader.hxx>
#include <sal/log.hxx>
#include <svx/msdffdef.hxx>
#include <rtl/ustrbuf.hxx>
#include <tools/stream.hxx>

const DffPropSetEntry mso_PropSetDefaults[] = {

// 0
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },

// 64
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0 },           // DFF_Prop_LockAgainstGrouping

// 128
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x0010 },      // DFF_Prop_FitTextToShape

// 192
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0 },           // DFF_Prop_gtextFStrikethrough

//256
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0 },           // DFF_Prop_pictureActive

// 320
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x0039 },      // DFF_Prop_fFillOK

// 384
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0xffffff },    // DFF_Prop_fillColor
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x001c },      // DFF_Prop_fNoFillHitTest

// 448
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x001e },      // DFF_Prop_fNoLineDrawDash

// 512
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0 },           // DFF_Prop_fshadowObscured

// 576
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0 },           // DFF_Prop_fPerspective

// 640
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x0001 },      // DFF_Prop_fc3DLightFace

// 704
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x0016 },      // DFF_Prop_fc3DFillHarsh

// 768
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0 },           // DFF_Prop_fBackground

// 832
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x0010 },      // DFF_Prop_fCalloutLengthSpecified

// 896
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ {  true, false, false,  true }, 0, 0x0001 },      // DFF_Prop_fPrint

// 960
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 },
{ { false, false, false, false }, 0, 0 }

};

DffPropSet::DffPropSet()
{
    mpPropSetEntries = reinterpret_cast< DffPropSetEntry* >( new sal_uInt8[ 1024 * sizeof( DffPropSetEntry ) ] );
}

DffPropSet::~DffPropSet()
{
    delete[] reinterpret_cast< sal_uInt8* >( mpPropSetEntries );
}

void DffPropSet::ReadPropSet( SvStream& rIn, bool bSetUninitializedOnly )
{
    DffRecordHeader aHd;
    ReadDffRecordHeader( rIn, aHd );

    if ( !bSetUninitializedOnly )
    {
        InitializePropSet( aHd.nRecType );
        maOffsets.clear();
    }

    sal_uInt32 nPropCount = aHd.nRecInstance;

    sal_uInt64 nComplexDataFilePos = rIn.Tell() + ( nPropCount * 6 );

    const size_t nMaxPossibleRecords = rIn.remainingSize() / (sizeof(sal_uInt16) + sizeof(sal_uInt32));
    if (nPropCount > nMaxPossibleRecords)
    {
        SAL_WARN("filter.ms", "Parsing error: " << nMaxPossibleRecords <<
                 " max possible entries, but " << nPropCount << " claimed, truncating");
        nPropCount = nMaxPossibleRecords;
    }

    for (sal_uInt32 nPropNum = 0; nPropNum < nPropCount; ++nPropNum)
    {
        sal_uInt16 nTmp(0);
        sal_uInt32 nContent(0);
        rIn.ReadUInt16( nTmp )
           .ReadUInt32( nContent );

        sal_uInt32 nRecType = nTmp & 0x3fff;

        if ( nRecType > 0x3ff )
            break;
        if ( ( nRecType & 0x3f ) == 0x3f )
        {
            if ( bSetUninitializedOnly )
            {
                sal_uInt32 nCurrentFlags = mpPropSetEntries[ nRecType ].nContent;
                sal_uInt32 nMergeFlags = nContent;

                nMergeFlags &=  ( nMergeFlags >> 16 ) | 0xffff0000;             // clearing low word
                nMergeFlags &= ( ( nCurrentFlags & 0xffff0000 )                 // remove already hard set
                                | ( nCurrentFlags >> 16 ) ) ^ 0xffffffff;       // attributes from mergeflags
                nCurrentFlags &= ( ( nMergeFlags & 0xffff0000 )                 // apply zero master bits
                                | ( nMergeFlags >> 16 ) ) ^ 0xffffffff;
                nCurrentFlags |= static_cast<sal_uInt16>(nMergeFlags);                       // apply filled master bits
                mpPropSetEntries[ nRecType ].nContent = nCurrentFlags;
                mpPropSetEntries[ nRecType ].nComplexIndexOrFlagsHAttr |= static_cast< sal_uInt16 >( nContent >> 16 );
            }
            else
            {
                // clear flags that have to be cleared
                mpPropSetEntries[ nRecType ].nContent &= ( ( nContent >> 16 ) ^ 0xffffffff );
                // set flags that have to be set
                mpPropSetEntries[ nRecType ].nContent |= nContent;
                mpPropSetEntries[ nRecType ].nComplexIndexOrFlagsHAttr = static_cast< sal_uInt16 >( nContent >> 16 );
            }
        }
        else
        {
            bool bSetProperty = !bSetUninitializedOnly || ( !IsProperty( nRecType ) || !IsHardAttribute( nRecType ) );

            DffPropFlags aPropFlag = { true, false, false, false };
            if ( nTmp & 0x4000 )
                aPropFlag.bBlip = true;
            if ( nTmp & 0x8000 )
                aPropFlag.bComplex = true;
            if ( aPropFlag.bComplex && nContent && ( nComplexDataFilePos < aHd.GetRecEndFilePos() ) )
            {
                // normally nContent is the complete size of the complex property,
                // but this is not always true for IMsoArrays ( what the hell is a IMsoArray ? )

                // I love special treatments :-(
                if ( ( nRecType == DFF_Prop_pVertices ) || ( nRecType == DFF_Prop_pSegmentInfo )
                    || ( nRecType == DFF_Prop_fillShadeColors ) || ( nRecType == DFF_Prop_lineDashStyle )
                        || ( nRecType == DFF_Prop_pWrapPolygonVertices ) || ( nRecType == DFF_Prop_connectorPoints )
                            || ( nRecType == DFF_Prop_Handles ) || ( nRecType == DFF_Prop_pFormulas )
                                || ( nRecType == DFF_Prop_textRectangles ) )
                {
                    // now check if the current content size is possible, or 6 bytes too small
                    sal_uInt64  nOldPos = rIn.Tell();

                    sal_Int16 nNumElem(0), nNumElemReserved(0), nSize(0);
                    if (checkSeek(rIn, nComplexDataFilePos))
                        rIn.ReadInt16(nNumElem).ReadInt16(nNumElemReserved).ReadInt16(nSize);
                    if (nNumElemReserved >= nNumElem)
                    {
                        // the size of these array elements is nowhere defined,
                        // what if the size is negative ?
                        // ok, we will make it positive and shift it.
                        // for -16 this works
                        if ( nSize < 0 )
                            nSize = ( -nSize ) >> 2;
                        sal_uInt32 nDataSize = static_cast<sal_uInt32>( nSize * nNumElem );

                        // sometimes the content size is 6 bytes too small (array header information is missing )
                        if ( nDataSize == nContent )
                            nContent += 6;

                        // check if array fits into the PropertyContainer
                        if ( ( nComplexDataFilePos + nContent ) > aHd.GetRecEndFilePos() )
                            nContent = 0;
                    }
                    else
                        nContent = 0;
                    rIn.Seek( nOldPos );
                }
                if ( nContent )
                {
                    if ( bSetProperty )
                    {
                        mpPropSetEntries[ nRecType ].nComplexIndexOrFlagsHAttr = static_cast< sal_uInt16 >( maOffsets.size() );
                        maOffsets.push_back( nComplexDataFilePos );     // insert the filepos of this property;
                    }
                    nComplexDataFilePos += nContent;                    // store filepos, that is used for the next complex property
                }
                else                                                    // a complex property needs content
                    aPropFlag.bSet = false;                             // otherwise something is wrong
            }
            if ( bSetProperty )
            {
                // tdf#130262: ignore negative values for distances (maybe this list needs to be extended)
                // LO does not allow negative values but [MS-ODRAW] does not forbid them
                if (    nRecType == DFF_Prop_dxWrapDistLeft || nRecType == DFF_Prop_dxWrapDistRight
                     || nRecType == DFF_Prop_dyWrapDistTop  || nRecType == DFF_Prop_dyWrapDistBottom )
                {
                    if ( static_cast<sal_Int32>(nContent) < 0 )
                    {
                        break;
                    }
                }

                mpPropSetEntries[ nRecType ].nContent = nContent;
                mpPropSetEntries[ nRecType ].aFlags = aPropFlag;
            }
        }
    }
    aHd.SeekToEndOfRecord( rIn );
}

SvStream& ReadDffPropSet( SvStream& rIn, DffPropSet& rRec )
{
    rRec.ReadPropSet( rIn, false );
    return rIn;
}

SvStream& operator|=( SvStream& rIn, DffPropSet& rRec )
{
    rRec.ReadPropSet( rIn, true );
    return rIn;
}

void DffPropSet::InitializePropSet( sal_uInt16 nPropSetType ) const
{
    /*
    cmc:
    " Boolean properties are grouped in bitfields by property set; note that
    the Boolean properties in each property set are contiguous. They are saved
    under the property ID of the last Boolean property in the set, and are
    placed in the value field in reverse order starting with the last property
    in the low bit. "

    e.g.

    fEditedWrap
    fBehindDocument
    fOnDblClickNotify
    fIsButton
    fOneD
    fHidden
    fPrint

    are all part of a group and all are by default false except for fPrint,
    which equates to a default bit sequence for the group of 0000001 -> 0x1

    If at a later stage word sets fBehindDocument away from the default it
    will be done by having a property named fPrint whose bitsequence will have
    the fBehindDocument bit set. e.g. a DFF_Prop_fPrint with value 0x200020
    has set bit 6 on so as to enable fBehindDocument (as well as disabling
    everything else)
    */
    if ( nPropSetType == DFF_msofbtOPT )
    {
        memcpy( mpPropSetEntries, mso_PropSetDefaults, 0x400 * sizeof( DffPropSetEntry ) );
    }
    else
    {
        memset( mpPropSetEntries, 0, 0x400 * sizeof( DffPropSetEntry ) );
    }
}

bool DffPropSet::IsHardAttribute( sal_uInt32 nId ) const
{
    bool bRetValue = true;
    nId &= 0x3ff;
    if ( ( nId & 0x3f ) >= 48 ) // is this a flag id
        bRetValue = (mpPropSetEntries[nId | 0x3f].nComplexIndexOrFlagsHAttr
                        & (1 << (0xf - (nId & 0xf)))) != 0;
    else
        bRetValue = !mpPropSetEntries[ nId ].aFlags.bSoftAttr;
    return bRetValue;
};

sal_uInt32 DffPropSet::GetPropertyValue( sal_uInt32 nId, sal_uInt32 nDefault ) const
{
    nId &= 0x3ff;
    return ( mpPropSetEntries[ nId ].aFlags.bSet ) ? mpPropSetEntries[ nId ].nContent : nDefault;
};

bool DffPropSet::GetPropertyBool( sal_uInt32 nId ) const
{
    sal_uInt32 nBaseId = nId | 31;              // base ID to get the sal_uInt32 property value
    sal_uInt32 nMask = 1 << (nBaseId - nId);    // bit mask of the boolean property

    sal_uInt32 nPropValue = GetPropertyValue( nBaseId, 0 );
    return (nPropValue & nMask) != 0;
}

OUString DffPropSet::GetPropertyString( sal_uInt32 nId, SvStream& rStrm ) const
{
    sal_uInt64 const nOldPos = rStrm.Tell();
    OUStringBuffer aBuffer;
    sal_uInt32 nBufferSize = GetPropertyValue( nId, 0 );
    if( (nBufferSize > 0) && SeekToContent( nId, rStrm ) )
    {
        sal_Int32 nStrLen = static_cast< sal_Int32 >( nBufferSize / 2 );
        //clip initial size of buffer to something sane in case of silly length
        //strings. If there really is a silly amount of data available it still
        //works out ok of course
        aBuffer.ensureCapacity(std::min(nStrLen,static_cast<sal_Int32>(8192)));
        for( sal_Int32 nCharIdx = 0; nCharIdx < nStrLen; ++nCharIdx )
        {
            sal_uInt16 nChar = 0;
            rStrm.ReadUInt16( nChar );
            if( nChar > 0 )
                aBuffer.append( static_cast< sal_Unicode >( nChar ) );
            else
                break;
        }
    }
    rStrm.Seek( nOldPos );
    return aBuffer.makeStringAndClear();
}

bool DffPropSet::SeekToContent( sal_uInt32 nRecType, SvStream& rStrm ) const
{
    nRecType &= 0x3ff;
    if ( mpPropSetEntries[ nRecType ].aFlags.bSet )
    {
        if ( mpPropSetEntries[ nRecType ].aFlags.bComplex )
        {
            sal_uInt16 nIndex = mpPropSetEntries[ nRecType ].nComplexIndexOrFlagsHAttr;
            if ( nIndex < maOffsets.size() )
            {
                return checkSeek(rStrm, maOffsets[nIndex]);
            }
        }
    }
    return false;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
