<html>
    <head>
      <base href="https://bugs.freedesktop.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Issue with multiple-monitor setup with the desktop DC."
   href="https://bugs.freedesktop.org/show_bug.cgi?id=100793">100793</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Issue with multiple-monitor setup with the desktop DC.
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>cairo
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Other
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>medium
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>win32 backend
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>cairo-bugs@cairographics.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>ehoffman@videotron.ca
          </td>
        </tr>

        <tr>
          <th>QA Contact</th>
          <td>cairo-bugs@cairographics.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=131034" name="attach_131034" title="Multi-monitor issue with negative extent patch">attachment 131034</a> <a href="attachment.cgi?id=131034&action=edit" title="Multi-monitor issue with negative extent patch">[details]</a></span> <a href='page.cgi?id=splinter.html&bug=100793&attachment=131034'>[review]</a>
Multi-monitor issue with negative extent patch

Hi

I was actually initially investigating an issue with Gimp, but the root of the
issue really is with cairo.

Under Win32, when you have multiple-monitor setup, Windows create a 'virtual
desktop', which is a rectangle surface that extend all monitors.

The primary monitor always start with the top-left corner at coordinate (0,0). 
If you have any other monitors which extends to the left, or above the primary
monitor, the virtual desktop top-left corner will actually have coordinates
which are negative.

This create an issue in cairo when you use the desktop DC, i.e. when you use a
DC from the function GetDC(NULL).  The same think occur with other third party
libraries like GTK, when you access the cairo surface from the root window.

In GIMP, I did apply a patch for the color picker, by using Windows native code
for the affected function, but past that, I have investigated cairo and did a
patch for this issue.

Basically, when the _cairo_win32_save_initial_clip() function is called with a
DC, it get and save the extent.  When (and only when) the provided DC is the
desktop DC, it is possible that the extent starts with a negative x,y.  In this
case, and since the desktop DC will not be clipped, we can check if the extents
x,y are negative.  In this case, make the extents start at (0,0), and record
the offset.

Then, when performing image map/unmap, the BitBlt function has to take this
offset into account.  For example, the fallback DC, even though it's created
with CreateCompatibleDC, will have it's extents x,y at (0,0).  For a one to one
copy between the original DC, and the fallback DC, the translation has to be
taken into account.

That is what this patch does.  So basically, under Win32, the desktop DC will
always start at (0,0).  This is in like with other libraries, like GTK, which
return screen coordinates starting at (0,0).

That is also probably the root cause of <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Cairo 1.15.2: Crash in cairo_fill if target surface is created with cairo_win32_surface_create"
   href="show_bug.cgi?id=96482">bug 96482</a> (Cairo 1.15.2: Crash in
cairo_fill if target surface is created with cairo_win32_surface_create), since
in that bug, when the author apply a positive viewport transform, the DC most
probably return a negative offset.

That may be the the root cause of <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [PATCH] GIMP's color picker of color dialog not work, returns black"
   href="show_bug.cgi?id=69617">bug 69617</a> too, although I'm not sure...
(GIMP's color picker of color dialog not work, returns black).

Regards,
Eric Hoffman</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are the assignee for the bug.</li>
          <li>You are the QA Contact for the bug.</li>
      </ul>
    </body>
</html>