<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://forums.xna.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>General</title><link>http://forums.xna.com/forums/50.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 0.0)</generator><item><title>Direct2D</title><link>http://forums.xna.com/forums/thread/193277.aspx</link><pubDate>Thu, 25 Jun 2009 13:03:34 GMT</pubDate><guid isPermaLink="false">4aa5dbf6-357b-46b2-b5b2-1b660a6dc370:193277</guid><dc:creator>zodX</dc:creator><slash:comments>0</slash:comments><comments>http://forums.xna.com/forums/thread/193277.aspx</comments><wfw:commentRss>http://forums.xna.com/forums/commentrss.aspx?SectionID=50&amp;PostID=193277</wfw:commentRss><description>&lt;p&gt;Hi, there !&lt;br /&gt;
&lt;br /&gt;
I´ve tried the Bitmap Opacity Masking Example.&lt;/p&gt;
&lt;p&gt;Get it from here:&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/dd372307(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd372307(VS.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &amp;gt;Bitmap-Opacity-Mask&amp;lt; is always opaque and not transparent, I see no checkerboard thru.&lt;br /&gt;
e.g. tried loading 8bit,32bit,straight,premueltiplied,tif,bmp  for it.&lt;/p&gt;
&lt;p&gt;Maybe you know how to fix this, it´s nearly the original sample.&lt;br /&gt;
Do I have to specially load any exotic-prepared bitmaps ? Or are any exotic parameters wrong ?&lt;br /&gt;
I couldn´t understand why this sample mustn´t work.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;My Opacity Mask Sample I´ve changed this little bit:&lt;br /&gt;
Changed BitmaploadfromResource into BitmaploadfromFile (beneath identical).&lt;/p&gt;
&lt;p&gt;// THIS CODE AND INFORMATION IS PROVIDED &amp;quot;AS IS&amp;quot; WITHOUT WARRANTY OF&lt;br /&gt;
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO&lt;br /&gt;
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A&lt;br /&gt;
// PARTICULAR PURPOSE.&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) Microsoft Corporation. All rights reserved&lt;br /&gt;
//+-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
//  $Description:&lt;br /&gt;
//      Sample DirectWrite Application&lt;br /&gt;
//&lt;br /&gt;
//  $ENDTAG&lt;br /&gt;
//&lt;br /&gt;
//------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;#include &amp;quot;stdafx.h&amp;quot;&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  WinMain                                                        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Application entrypoint                                         *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;int WINAPI WinMain(&lt;br /&gt;
    HINSTANCE hInstance,&lt;br /&gt;
    HINSTANCE hPrevInstance,&lt;br /&gt;
    LPSTR lpCmdLine,&lt;br /&gt;
    int nCmdShow)&lt;br /&gt;
{&lt;br /&gt;
    HRESULT hr;&lt;br /&gt;
    if (SUCCEEDED(CoInitialize(NULL)))&lt;br /&gt;
    {&lt;br /&gt;
        {&lt;br /&gt;
            DemoApp app;&lt;/p&gt;
&lt;p&gt;            if (SUCCEEDED(hr = app.Initialize()))&lt;br /&gt;
            {&lt;br /&gt;
                app.RunMessageLoop();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        CoUninitialize();&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    return SUCCEEDED(hr) ? EXIT_SUCCESS : EXIT_FAILURE;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::DemoApp constructor                                   *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Initialize member data                                         *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;DemoApp::DemoApp() :&lt;br /&gt;
    m_hwnd(NULL)&lt;br /&gt;
{&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::~DemoApp destructor                                   *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Tear down resources                                            *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;DemoApp::~DemoApp()&lt;br /&gt;
{&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::Initialize                                            *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Create application window and device-independent resources     *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;br /&gt;
HRESULT DemoApp::Initialize()&lt;br /&gt;
{&lt;br /&gt;
 WNDCLASSEX wcex;&lt;br /&gt;
    HRESULT hr;&lt;br /&gt;
    ATOM atom;&lt;/p&gt;
&lt;p&gt;    IFR(CreateDeviceIndependentResources());&lt;/p&gt;
&lt;p&gt;    // Register window class&lt;br /&gt;
    wcex.cbSize        = sizeof(WNDCLASSEX);&lt;br /&gt;
    wcex.style         = CS_HREDRAW | CS_VREDRAW;&lt;br /&gt;
    wcex.lpfnWndProc   = DemoApp::WndProc;&lt;br /&gt;
    wcex.cbClsExtra    = 0;&lt;br /&gt;
    wcex.cbWndExtra    = sizeof(LONG_PTR);&lt;br /&gt;
    wcex.hInstance     = HINST_THISCOMPONENT;&lt;br /&gt;
    wcex.hbrBackground = NULL;&lt;br /&gt;
    wcex.lpszMenuName  = NULL;&lt;br /&gt;
    wcex.hIcon         = LoadIcon(&lt;br /&gt;
        NULL,&lt;br /&gt;
        IDI_APPLICATION&lt;br /&gt;
        );&lt;br /&gt;
    wcex.hCursor       = LoadCursor(&lt;br /&gt;
        NULL,&lt;br /&gt;
        IDC_ARROW&lt;br /&gt;
        );&lt;br /&gt;
    wcex.lpszClassName = TEXT(&amp;quot;D2DDemoApp&amp;quot;);&lt;br /&gt;
    wcex.hIconSm       = LoadIcon(&lt;br /&gt;
        NULL,&lt;br /&gt;
        IDI_APPLICATION&lt;br /&gt;
        );&lt;/p&gt;
&lt;p&gt;    atom = RegisterClassEx(&lt;br /&gt;
        &amp;amp;wcex&lt;br /&gt;
        );&lt;/p&gt;
&lt;p&gt;    IFR(atom ? S_OK : E_FAIL);&lt;/p&gt;
&lt;p&gt;    //&lt;br /&gt;
    // Create Window takes its size in Pixels, so, to have a consistent DIP size, you &lt;br /&gt;
    // obtain the DPI and use it to scale the window size. &lt;br /&gt;
    FLOAT dpiX, dpiY;&lt;/p&gt;
&lt;p&gt;    //&lt;br /&gt;
    // The factory returns the current system DPI. This is also the value it will use&lt;br /&gt;
    // to create its own windows.&lt;br /&gt;
    // &lt;br /&gt;
    m_spD2DFactory-&amp;gt;GetDesktopDpi(&amp;amp;dpiX, &amp;amp;dpiY);&lt;/p&gt;
&lt;p&gt;    // Create window&lt;br /&gt;
    m_hwnd = CreateWindow(&lt;br /&gt;
        TEXT(&amp;quot;D2DDemoApp&amp;quot;),&lt;br /&gt;
        TEXT(&amp;quot;Direct2D Demo App&amp;quot;),&lt;br /&gt;
        WS_OVERLAPPEDWINDOW,&lt;br /&gt;
        CW_USEDEFAULT,&lt;br /&gt;
        CW_USEDEFAULT,&lt;br /&gt;
        static_cast&amp;lt;UINT&amp;gt;(dpiX * 800.f / 96.f),&lt;br /&gt;
        static_cast&amp;lt;UINT&amp;gt;(dpiY * 800.f / 96.f),&lt;br /&gt;
        NULL,&lt;br /&gt;
        NULL,&lt;br /&gt;
        HINST_THISCOMPONENT,&lt;br /&gt;
        this&lt;br /&gt;
        );&lt;/p&gt;
&lt;p&gt;    IFR(m_hwnd ? S_OK : E_FAIL);&lt;/p&gt;
&lt;p&gt;    ShowWindow(m_hwnd, SW_SHOWNORMAL);&lt;/p&gt;
&lt;p&gt;    UpdateWindow(m_hwnd);&lt;/p&gt;
&lt;p&gt;    return hr;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::CreateDeviceIndependentResources                      *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  This method is used to create resources which are not bound    *&lt;br /&gt;
*  to any device. Their lifetime effectively extends for the      *&lt;br /&gt;
*  duration of the app.                                           *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;HRESULT DemoApp::CreateDeviceIndependentResources()&lt;br /&gt;
{&lt;br /&gt;
    HRESULT hr = S_OK;&lt;br /&gt;
    &lt;br /&gt;
    // Create WIC factory&lt;br /&gt;
    IFR(CoCreateInstance(&lt;br /&gt;
        CLSID_WICImagingFactory,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CLSCTX_INPROC_SERVER,&lt;br /&gt;
        IID_IWICImagingFactory,&lt;br /&gt;
        reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;m_spWICFactory)&lt;br /&gt;
        ));&lt;/p&gt;
&lt;p&gt;    // Create Direct2D factory&lt;br /&gt;
    IFR(D2D1CreateFactory(&lt;br /&gt;
        D2D1_FACTORY_TYPE_SINGLE_THREADED,&lt;br /&gt;
        &amp;amp;m_spD2DFactory&lt;br /&gt;
        ));&lt;/p&gt;
&lt;p&gt;    // Create a shared DirectWrite factory&lt;br /&gt;
    IFR(DWriteCreateFactory(&lt;br /&gt;
        DWRITE_FACTORY_TYPE_SHARED,&lt;br /&gt;
        __uuidof(IDWriteFactory),&lt;br /&gt;
        reinterpret_cast&amp;lt;IUnknown**&amp;gt;(&amp;amp;m_spDWriteFactory)&lt;br /&gt;
        ));&lt;/p&gt;
&lt;p&gt;    m_spD2DFactory-&amp;gt;CreateRectangleGeometry(D2D1::RectF(0,5,200,195),&amp;amp;m_spRectGeo);&lt;br /&gt;
    &lt;br /&gt;
    m_wszOriginalBitmapText=L&amp;quot;Original Bitmap&amp;quot;;&lt;br /&gt;
    m_wszBitmapBrushOpacityMaskText=L&amp;quot;Bitmap Opacity Mask&amp;quot;;&lt;br /&gt;
    m_wszLinearGradientOpacityMaskText=L&amp;quot;Linear Gradient Opacity Mask&amp;quot;;&lt;br /&gt;
    m_wszRadialGradientOpacityMaskText=L&amp;quot;Radial Gradient Opacity Mask&amp;quot;;&lt;br /&gt;
    m_wszWithBitmapBrushOpacityMaskText=L&amp;quot;Bitmap With Bitmap Opacity Mask Applied&amp;quot;;&lt;br /&gt;
    m_wszWithLinearGradientOpacityMaskText=L&amp;quot;Bitmap With Linear Gradient Opacity Mask Applied&amp;quot;;&lt;br /&gt;
    m_wszWithRadialGradientOpacityMaskText=L&amp;quot;Bitmap With Radial Gradient Opacity Mask Applied&amp;quot;;&lt;/p&gt;
&lt;p&gt;    // Create a text format.&lt;br /&gt;
    IFR(m_spDWriteFactory-&amp;gt;CreateTextFormat(&lt;br /&gt;
        L&amp;quot;Verdana&amp;quot;, //font family name&lt;br /&gt;
        NULL, //font collection (NULL sets it to use the system font collection)&lt;br /&gt;
        DWRITE_FONT_WEIGHT_REGULAR,&lt;br /&gt;
        DWRITE_FONT_STYLE_NORMAL,&lt;br /&gt;
        DWRITE_FONT_STRETCH_NORMAL,&lt;br /&gt;
        12.0f,&lt;br /&gt;
        L&amp;quot;en-us&amp;quot;,&lt;br /&gt;
        &amp;amp;m_spTextFormat&lt;br /&gt;
        ));&lt;/p&gt;
&lt;p&gt;    return hr;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::CreateDeviceResources                                 *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  This method creates resources which are bound to a particular  *&lt;br /&gt;
*  D3D device. It&amp;#39;s all centralized here, in case the resources   *&lt;br /&gt;
*  need to be recreated in case of D3D device loss (eg. display   *&lt;br /&gt;
*  change, remoting, removal of video card, etc).                 *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;HRESULT DemoApp::CreateDeviceResources()&lt;br /&gt;
{&lt;br /&gt;
    HRESULT hr = S_OK;&lt;/p&gt;
&lt;p&gt;    if (!m_spRT)&lt;br /&gt;
    {&lt;/p&gt;
&lt;p&gt;        RECT rc;&lt;br /&gt;
        GetClientRect(m_hwnd, &amp;amp;rc);&lt;/p&gt;
&lt;p&gt;        D2D1_SIZE_U size = D2D1::SizeU(&lt;br /&gt;
            rc.right - rc.left,&lt;br /&gt;
            rc.bottom - rc.top&lt;br /&gt;
        );&lt;/p&gt;
&lt;p&gt;        // Create a Direct2D render target&lt;br /&gt;
        IFR(m_spD2DFactory-&amp;gt;CreateHwndRenderTarget(&lt;br /&gt;
            D2D1::RenderTargetProperties(),&lt;br /&gt;
            D2D1::HwndRenderTargetProperties(&lt;br /&gt;
                m_hwnd,&lt;br /&gt;
                size&lt;br /&gt;
                ),&lt;br /&gt;
            &amp;amp;m_spRT&lt;br /&gt;
            ));&lt;/p&gt;
&lt;p&gt;        IFR(m_spRT-&amp;gt;CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black),&amp;amp;m_spBlackBrush));&lt;/p&gt;
&lt;p&gt;        //Create the bitmap to be used by the bitmap brush&lt;/p&gt;
&lt;p&gt;   // Instead of loadingFromResource this is the only part I changed in this sample&lt;br /&gt;
   // But unlikely the official text-samples haven´t got the images with it&lt;br /&gt;
   LoadBitmapFromFile(m_spRT,&lt;br /&gt;
            m_spWICFactory,&lt;br /&gt;
            L&amp;quot;V:\\GRAPHIK space 4D\\Masking Test.bmp&amp;quot;,&lt;br /&gt;
            0,&lt;br /&gt;
            0,&lt;br /&gt;
            &amp;amp;m_spBitmap&lt;br /&gt;
            );&lt;/p&gt;
&lt;p&gt;   LoadBitmapFromFile(m_spRT,&lt;br /&gt;
            m_spWICFactory,&lt;br /&gt;
            L&amp;quot;V:\\GRAPHIK space 4D\\Masking Test2.bmp&amp;quot;,&lt;br /&gt;
            0,&lt;br /&gt;
            0,&lt;br /&gt;
            &amp;amp;m_spBitmapMask&lt;br /&gt;
            );&lt;/p&gt;
&lt;p&gt;        D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp = { D2D1_EXTEND_MODE_CLAMP, D2D1_EXTEND_MODE_CLAMP, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR };&lt;br /&gt;
        &lt;br /&gt;
  IFR(m_spRT-&amp;gt;CreateBitmapBrush(&lt;br /&gt;
            m_spBitmap,&lt;br /&gt;
            propertiesXClampYClamp,&lt;br /&gt;
            &amp;amp;m_spOriginalBitmapBrush));&lt;br /&gt;
        &lt;br /&gt;
        IFR(m_spRT-&amp;gt;CreateBitmapBrush(&lt;br /&gt;
            m_spBitmapMask,&lt;br /&gt;
            propertiesXClampYClamp,&lt;br /&gt;
            &amp;amp;m_spBitmapMaskBrush));&lt;br /&gt;
        &lt;br /&gt;
         &lt;br /&gt;
        //Create an array of gradient stops to put in the gradient stop collection which will be used in the linear gradient brush&lt;br /&gt;
        &lt;br /&gt;
        D2D1_GRADIENT_STOP gradientStops[2];&lt;br /&gt;
        gradientStops[0].color = D2D1::ColorF(D2D1::ColorF::Black,1.0f);&lt;br /&gt;
        gradientStops[0].position = 0.0f;&lt;br /&gt;
        gradientStops[1].color = D2D1::ColorF(D2D1::ColorF::White,0.0f);&lt;br /&gt;
        gradientStops[1].position = 1.0f;&lt;br /&gt;
        &lt;br /&gt;
        //Create the ID2D1GradientStopCollection from a previously declared array of D2D1_GRADIENT_STOP structs&lt;br /&gt;
        IFR(m_spRT-&amp;gt;CreateGradientStopCollection(gradientStops, &lt;br /&gt;
            2,&lt;br /&gt;
            D2D1_GAMMA_2_2,&lt;br /&gt;
            D2D1_EXTEND_MODE_CLAMP,&lt;br /&gt;
            &amp;amp;m_spGradientStopCollection));&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        //The line that determines the direction of the gradient starts at the top left corner of the box to the bottom right corner&lt;br /&gt;
        IFR(m_spRT-&amp;gt;CreateLinearGradientBrush(D2D1::LinearGradientBrushProperties(D2D1::Point2F(0,0),D2D1::Point2F(200,200)),&lt;br /&gt;
            m_spGradientStopCollection,&lt;br /&gt;
            &amp;amp;m_spLinearGradientBrush));&lt;br /&gt;
        &lt;br /&gt;
        //The center of the gradient is in the center of the box. The gradient origin offset was set to zero(0,0) or center in this case. &lt;br /&gt;
        IFR(m_spRT-&amp;gt;CreateRadialGradientBrush(D2D1::RadialGradientBrushProperties(D2D1::Point2F(100,100), D2D1::Point2F(0,0), 100,100),&lt;br /&gt;
            m_spGradientStopCollection,&lt;br /&gt;
            &amp;amp;m_spRadialGradientBrush));&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        // Create the compatible render target&lt;br /&gt;
        ID2D1BitmapRenderTargetPtr spCompatibleRenderTarget;&lt;br /&gt;
        IFR(m_spRT-&amp;gt;CreateCompatibleRenderTarget(D2D1::SizeF(20.0f, 20.0f),&lt;br /&gt;
            &amp;amp;spCompatibleRenderTarget));&lt;/p&gt;
&lt;p&gt;        // Create the pattern&lt;br /&gt;
        ID2D1SolidColorBrushPtr spWhiteBrush;&lt;br /&gt;
        IFR(spCompatibleRenderTarget-&amp;gt;CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White),&lt;br /&gt;
            &amp;amp;spWhiteBrush));&lt;/p&gt;
&lt;p&gt;        ID2D1SolidColorBrushPtr spGrayBrush;&lt;br /&gt;
        IFR(spCompatibleRenderTarget-&amp;gt;CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::LightGray),&lt;br /&gt;
            &amp;amp;spGrayBrush));&lt;/p&gt;
&lt;p&gt;        //Draw filled rectangles onto the render target&lt;br /&gt;
        spCompatibleRenderTarget-&amp;gt;BeginDraw();&lt;br /&gt;
        spCompatibleRenderTarget-&amp;gt;FillRectangle(D2D1::RectF(0.0f, 0.0f, 10.0f, 10.0f), spGrayBrush);&lt;br /&gt;
        spCompatibleRenderTarget-&amp;gt;FillRectangle(D2D1::RectF(10.0f, 0.0f, 20.0f, 10.0f), spWhiteBrush);&lt;br /&gt;
        spCompatibleRenderTarget-&amp;gt;FillRectangle(D2D1::RectF(10.0f, 10.0f, 20.0f, 20.0f), spGrayBrush);&lt;br /&gt;
        spCompatibleRenderTarget-&amp;gt;FillRectangle(D2D1::RectF(0.0f, 10.0f, 10.0f, 20.0f), spWhiteBrush);&lt;br /&gt;
        spCompatibleRenderTarget-&amp;gt;EndDraw();&lt;/p&gt;
&lt;p&gt;        //Get the bitmap from the render target.&lt;br /&gt;
        IFR(spCompatibleRenderTarget-&amp;gt;GetBitmap(&amp;amp;m_spCheckeredBitmap));&lt;/p&gt;
&lt;p&gt;        //Choose the tiling mode for the bitmap brush&lt;br /&gt;
        D2D1_BITMAP_BRUSH_PROPERTIES brushProperties = D2D1::BitmapBrushProperties(D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP);&lt;br /&gt;
        &lt;br /&gt;
        //Create the bitmap brush&lt;br /&gt;
        IFR(m_spRT-&amp;gt;CreateBitmapBrush(m_spCheckeredBitmap, brushProperties, &amp;amp;m_spCheckerPatternBitmapBrush));&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    return hr;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::DiscardDeviceResources                                *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Discard device-specific resources which need to be recreated   *&lt;br /&gt;
*  when a D3D device is lost                                      *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;void DemoApp::DiscardDeviceResources()&lt;br /&gt;
{&lt;br /&gt;
    m_spRT = NULL;&lt;br /&gt;
    m_spBlackBrush = NULL;&lt;br /&gt;
    m_spLinearGradientBrush = NULL;&lt;br /&gt;
    m_spRadialGradientBrush = NULL;&lt;br /&gt;
    m_spOriginalBitmapBrush = NULL;&lt;br /&gt;
    m_spGradientStopCollection = NULL;&lt;br /&gt;
    m_spCheckerPatternBitmapBrush = NULL;&lt;br /&gt;
    &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::RunMessageLoop                                        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Main window message loop                                       *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;void DemoApp::RunMessageLoop()&lt;br /&gt;
{&lt;br /&gt;
    MSG msg;&lt;/p&gt;
&lt;p&gt;    while (GetMessage(&amp;amp;msg, NULL, 0, 0)&amp;gt;0)&lt;br /&gt;
    {&lt;br /&gt;
        TranslateMessage(&amp;amp;msg);&lt;br /&gt;
        DispatchMessage(&amp;amp;msg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt; &lt;br /&gt;
/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::OnRender                                              *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Called whenever the application needs to display the client    *&lt;br /&gt;
*  window.                                                        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Note that this function will not render anything if the window *&lt;br /&gt;
*  is occluded (eg. obscured by other windows or off monitor).    *&lt;br /&gt;
*  Also, this function will automatically discard device-specific *&lt;br /&gt;
*  resources if the D3D device disappears during execution, and   *&lt;br /&gt;
*  will recreate the resources the next time it&amp;#39;s invoked.        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;HRESULT DemoApp::OnRender(const PAINTSTRUCT &amp;amp;ps)&lt;br /&gt;
{&lt;br /&gt;
    HRESULT hr;&lt;/p&gt;
&lt;p&gt;    IFR(DrawD2DContent(ps));&lt;/p&gt;
&lt;p&gt;    return hr;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::DrawD2DContent                                        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  This method draws blocks demonstrating different opacity       *&lt;br /&gt;
*  masks.                                                         *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Note that this function will not render anything if the window *&lt;br /&gt;
*  is occluded (eg. obscured by other windows or off monitor).    *&lt;br /&gt;
*  Also, this function will automatically discard device-specific *&lt;br /&gt;
*  resources if the D3D device disappears during execution, and   *&lt;br /&gt;
*  will recreate the resources the next time it&amp;#39;s invoked.        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;HRESULT DemoApp::DrawD2DContent(const PAINTSTRUCT &amp;amp;ps)&lt;br /&gt;
{&lt;br /&gt;
    HRESULT hr = S_OK;&lt;/p&gt;
&lt;p&gt;    CreateDeviceResources();&lt;/p&gt;
&lt;p&gt;    if (!(m_spRT-&amp;gt;CheckWindowState() &amp;amp; D2D1_WINDOW_STATE_OCCLUDED))&lt;br /&gt;
    {&lt;br /&gt;
        m_spRT-&amp;gt;BeginDraw();&lt;/p&gt;
&lt;p&gt;        m_spRT-&amp;gt;SetTransform(&lt;br /&gt;
            D2D1::Matrix3x2F::Identity()&lt;br /&gt;
            );&lt;br /&gt;
        //Rectangle that holds the shape of rectangles to be filled with brushes&lt;br /&gt;
        D2D1_RECT_F rcBrushRect = D2D1::RectF(0,5, 200, 195);&lt;/p&gt;
&lt;p&gt;        //Rectangle that holds the shape of rectangles where captions are drawn with DrawText&lt;br /&gt;
        D2D1_RECT_F rcTextRect = D2D1::RectF(5,205,200,300);&lt;/p&gt;
&lt;p&gt;        //Starting with a white background&lt;br /&gt;
        m_spRT-&amp;gt;Clear(D2D1::ColorF(D2D1::ColorF::Blue));&lt;br /&gt;
    &lt;br /&gt;
        ////Original Bitmap&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(5, 5)));&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spOriginalBitmapBrush);&lt;br /&gt;
        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;br /&gt;
  &lt;/p&gt;
&lt;p&gt;  //&lt;br /&gt;
//  m_spRT-&amp;gt;DrawBitmap(m_spOpacityMask);&lt;br /&gt;
        //&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;  //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszOriginalBitmapText,&lt;br /&gt;
            wcslen(m_wszOriginalBitmapText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;/p&gt;
&lt;p&gt;        //Linear Gradient Opacity Mask&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(255, 5)));&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spCheckerPatternBitmapBrush);&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spLinearGradientBrush);&lt;br /&gt;
        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;/p&gt;
&lt;p&gt;        //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszLinearGradientOpacityMaskText,&lt;br /&gt;
            wcslen(m_wszLinearGradientOpacityMaskText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;/p&gt;
&lt;p&gt;        //Radial Gradient Opacity Mask&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(255, 255)));&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spCheckerPatternBitmapBrush);&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spRadialGradientBrush);&lt;br /&gt;
        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;/p&gt;
&lt;p&gt;        //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszRadialGradientOpacityMaskText,&lt;br /&gt;
            wcslen(m_wszRadialGradientOpacityMaskText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;/p&gt;
&lt;p&gt;        //Bitmap Opacity Mask&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(255, 505)));&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spCheckerPatternBitmapBrush);&lt;br /&gt;
        m_spRT-&amp;gt;FillRectangle(&amp;amp;rcBrushRect,m_spBitmapMaskBrush);&lt;br /&gt;
        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;/p&gt;
&lt;p&gt;        //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszBitmapBrushOpacityMaskText,&lt;br /&gt;
            wcslen(m_wszBitmapBrushOpacityMaskText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;br /&gt;
        &lt;br /&gt;
        //Bitmap with Linear Gradient Opacity Brush&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(505, 5)));    &lt;br /&gt;
        m_spRT-&amp;gt;FillGeometry(m_spRectGeo,m_spOriginalBitmapBrush,m_spLinearGradientBrush);&lt;br /&gt;
        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;br /&gt;
        &lt;br /&gt;
        //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszWithLinearGradientOpacityMaskText,&lt;br /&gt;
            wcslen(m_wszWithLinearGradientOpacityMaskText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;/p&gt;
&lt;p&gt;        //Bitmap with Radial Gradient Opacity Brush&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(505, 255)));    &lt;br /&gt;
        m_spRT-&amp;gt;FillGeometry(m_spRectGeo,m_spOriginalBitmapBrush,m_spRadialGradientBrush);&lt;br /&gt;
        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;br /&gt;
        &lt;br /&gt;
        //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszWithRadialGradientOpacityMaskText,&lt;br /&gt;
            wcslen(m_wszWithRadialGradientOpacityMaskText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;br /&gt;
    &lt;/p&gt;
&lt;p&gt;        //Bitmap with Bitmap Opacity Brush&lt;br /&gt;
        m_spRT-&amp;gt;SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(505, 505)));    &lt;/p&gt;
&lt;p&gt;        //D2D1_ANTIALIAS_MODE_ALIASED must be set for FillOpacityMask to function properly&lt;br /&gt;
        m_spRT-&amp;gt;SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);&lt;br /&gt;
       &lt;br /&gt;
  m_spRT-&amp;gt;FillOpacityMask(&lt;br /&gt;
   m_spBitmap,&lt;br /&gt;
            m_spBitmapMaskBrush,&lt;br /&gt;
   D2D1_OPACITY_MASK_CONTENT_GRAPHICS,&lt;br /&gt;
            0,&lt;br /&gt;
   0);&lt;/p&gt;
&lt;p&gt;        m_spRT-&amp;gt;DrawRectangle(&amp;amp;rcBrushRect,m_spBlackBrush,1,NULL);&lt;/p&gt;
&lt;p&gt;        //Caption using a DirectWrite format from m_spDWriteFactory-&amp;gt;CreateTextFormat&lt;br /&gt;
        m_spRT-&amp;gt;DrawText(m_wszWithBitmapBrushOpacityMaskText,&lt;br /&gt;
            wcslen(m_wszWithBitmapBrushOpacityMaskText),&lt;br /&gt;
            m_spTextFormat,&lt;br /&gt;
            &amp;amp;rcTextRect,&lt;br /&gt;
            m_spBlackBrush);&lt;/p&gt;
&lt;p&gt;    &lt;br /&gt;
        hr = m_spRT-&amp;gt;EndDraw();&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    if (hr == D2DERR_RECREATE_TARGET)&lt;br /&gt;
    {&lt;br /&gt;
        DiscardDeviceResources();&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    return S_OK;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::OnResize                                              *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  If the application receives a WM_SIZE message, this method     *&lt;br /&gt;
*  resize the render target appropriately.                        *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;void DemoApp::OnResize(UINT width, UINT height)&lt;br /&gt;
{&lt;br /&gt;
    if (m_spRT)&lt;br /&gt;
    {&lt;br /&gt;
        D2D1_SIZE_U size;&lt;br /&gt;
        size.width = width;&lt;br /&gt;
        size.height = height;&lt;br /&gt;
        HRESULT hr = m_spRT-&amp;gt;Resize(size);&lt;/p&gt;
&lt;p&gt;        // If we couldn&amp;#39;t resize, release it and we&amp;#39;ll recreate it&lt;br /&gt;
        // during the next render pass.&lt;br /&gt;
        if (FAILED(hr))&lt;br /&gt;
        {&lt;br /&gt;
            DiscardDeviceResources();&lt;br /&gt;
            InvalidateRect(m_hwnd, NULL, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;/******************************************************************&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  DemoApp::WndProc                                               *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
*  Window message handler                                         *&lt;br /&gt;
*                                                                 *&lt;br /&gt;
******************************************************************/&lt;/p&gt;
&lt;p&gt;LRESULT CALLBACK DemoApp::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)&lt;br /&gt;
{&lt;br /&gt;
    if (message == WM_CREATE)&lt;br /&gt;
    {&lt;br /&gt;
        LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;&lt;br /&gt;
        DemoApp *pDemoApp = (DemoApp *)pcs-&amp;gt;lpCreateParams;&lt;/p&gt;
&lt;p&gt;        ::SetWindowLongPtrW(&lt;br /&gt;
            hwnd,&lt;br /&gt;
            GWLP_USERDATA,&lt;br /&gt;
            PtrToUlong(pDemoApp));&lt;/p&gt;
&lt;p&gt;        return 1;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    DemoApp *pDemoApp = reinterpret_cast&amp;lt;DemoApp *&amp;gt;(static_cast&amp;lt;LONG_PTR&amp;gt;(&lt;br /&gt;
                ::GetWindowLongPtrW(hwnd, GWLP_USERDATA)));&lt;/p&gt;
&lt;p&gt;    if (pDemoApp)&lt;br /&gt;
    {&lt;br /&gt;
        switch(message)&lt;br /&gt;
        {&lt;br /&gt;
        case WM_SIZE:&lt;br /&gt;
            {&lt;br /&gt;
                UINT width = LOWORD(lParam);&lt;br /&gt;
                UINT height = HIWORD(lParam);&lt;br /&gt;
                pDemoApp-&amp;gt;OnResize(width, height);&lt;br /&gt;
                //InvalidateRect(hwnd, NULL, true); &lt;br /&gt;
            }&lt;br /&gt;
            return 0;&lt;/p&gt;
&lt;p&gt;        case WM_PAINT:&lt;br /&gt;
        case WM_DISPLAYCHANGE:&lt;br /&gt;
            {&lt;br /&gt;
                Sleep(200);&lt;br /&gt;
    PAINTSTRUCT ps;&lt;br /&gt;
                BeginPaint(hwnd, &amp;amp;ps);&lt;br /&gt;
                pDemoApp-&amp;gt;OnRender(ps);&lt;br /&gt;
                EndPaint(hwnd, &amp;amp;ps);&lt;br /&gt;
            }&lt;br /&gt;
            return 0;&lt;/p&gt;
&lt;p&gt;        case WM_DESTROY:&lt;br /&gt;
            {&lt;br /&gt;
                PostQuitMessage(0);&lt;br /&gt;
            }&lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return DefWindowProc(hwnd, message, wParam, lParam);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;//&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Creates a Direct2D bitmap from the specified &lt;br /&gt;
// file name.&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
HRESULT DemoApp::LoadBitmapFromFile(&lt;br /&gt;
    ID2D1RenderTarget *pRenderTarget,&lt;br /&gt;
    IWICImagingFactory *pIWICFactory,&lt;br /&gt;
    PCWSTR uri,&lt;br /&gt;
    UINT destinationWidth,&lt;br /&gt;
    UINT destinationHeight,&lt;br /&gt;
    __deref_out ID2D1Bitmap **ppBitmap&lt;br /&gt;
    )&lt;br /&gt;
{&lt;br /&gt;
    HRESULT hr = S_OK;&lt;br /&gt;
   &lt;br /&gt;
    IWICBitmapDecoderPtr spDecoder;&lt;br /&gt;
    IWICBitmapFrameDecodePtr spSource;&lt;br /&gt;
    IWICStreamPtr spStream;&lt;br /&gt;
    IWICFormatConverterPtr spConverter;&lt;br /&gt;
    IWICBitmapScalerPtr spScaler;&lt;/p&gt;
&lt;p&gt;    IFR(pIWICFactory-&amp;gt;CreateDecoderFromFilename(&lt;br /&gt;
        uri, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &amp;amp;spDecoder&lt;br /&gt;
        )); &lt;br /&gt;
    &lt;br /&gt;
    // Create the initial frame.&lt;br /&gt;
    IFR(spDecoder-&amp;gt;GetFrame(0, &amp;amp;spSource));&lt;/p&gt;
&lt;p&gt;    // Convert the image format to 32bppPBGRA -- which Direct2D expects.&lt;br /&gt;
    IFR(pIWICFactory-&amp;gt;CreateFormatConverter(&amp;amp;spConverter));&lt;/p&gt;
&lt;p&gt;    // If a new width or height was specified, create an &lt;br /&gt;
    // IWICBitmapScaler and use it to resize the image.&lt;br /&gt;
    if (destinationWidth != 0 || destinationHeight != 0){&lt;/p&gt;
&lt;p&gt;        UINT originalWidth, originalHeight;&lt;br /&gt;
        spSource-&amp;gt;GetSize(&amp;amp;originalWidth, &amp;amp;originalHeight);&lt;/p&gt;
&lt;p&gt;        if (destinationWidth == 0){&lt;br /&gt;
            FLOAT scalar = static_cast&amp;lt;FLOAT&amp;gt;(destinationHeight) / static_cast&amp;lt;FLOAT&amp;gt;(originalHeight);&lt;br /&gt;
            destinationWidth = static_cast&amp;lt;UINT&amp;gt;(scalar * static_cast&amp;lt;FLOAT&amp;gt;(originalWidth));&lt;br /&gt;
        }&lt;br /&gt;
        else if (destinationHeight == 0) {&lt;br /&gt;
            FLOAT scalar = static_cast&amp;lt;FLOAT&amp;gt;(destinationWidth) / static_cast&amp;lt;FLOAT&amp;gt;(originalWidth);&lt;br /&gt;
            destinationHeight = static_cast&amp;lt;UINT&amp;gt;(scalar * static_cast&amp;lt;FLOAT&amp;gt;(originalHeight));&lt;br /&gt;
        }&lt;/p&gt;
&lt;p&gt;        IFR(pIWICFactory-&amp;gt;CreateBitmapScaler(&amp;amp;spScaler));&lt;br /&gt;
        IFR(spScaler-&amp;gt;Initialize(&lt;br /&gt;
                spSource, &lt;br /&gt;
                destinationWidth, &lt;br /&gt;
                destinationHeight, &lt;br /&gt;
                WICBitmapInterpolationModeCubic&lt;br /&gt;
                ));&lt;br /&gt;
    &lt;br /&gt;
        IFR(spConverter-&amp;gt;Initialize(&lt;br /&gt;
            spScaler,&lt;br /&gt;
            GUID_WICPixelFormat32bppPBGRA,&lt;br /&gt;
            WICBitmapDitherTypeNone,&lt;br /&gt;
            NULL,&lt;br /&gt;
            0.f,&lt;br /&gt;
            WICBitmapPaletteTypeMedianCut&lt;br /&gt;
            ));&lt;br /&gt;
    }&lt;br /&gt;
    else // Don&amp;#39;t scale the image.&lt;br /&gt;
    {&lt;/p&gt;
&lt;p&gt;        IFR(spConverter-&amp;gt;Initialize(&lt;br /&gt;
            spSource,&lt;br /&gt;
            GUID_WICPixelFormat32bppPBGRA,&lt;br /&gt;
            WICBitmapDitherTypeNone,&lt;br /&gt;
            NULL,&lt;br /&gt;
            0.f,&lt;br /&gt;
            WICBitmapPaletteTypeMedianCut&lt;br /&gt;
            ));&lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;    // Create a Direct2D bitmap from the WIC bitmap.&lt;br /&gt;
    IFR(pRenderTarget-&amp;gt;CreateBitmapFromWicBitmap(&lt;br /&gt;
        spConverter,&lt;br /&gt;
        NULL,&lt;br /&gt;
        ppBitmap&lt;br /&gt;
        ));&lt;/p&gt;
&lt;p&gt;    return hr;&lt;br /&gt;
}&lt;/p&gt;</description></item></channel></rss>