Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* cairo - a vector graphics library with display and print output
  2.  *
  3.  * Copyright © 2009 Intel Corporation
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it either under the terms of the GNU Lesser General Public
  7.  * License version 2.1 as published by the Free Software Foundation
  8.  * (the "LGPL") or, at your option, under the terms of the Mozilla
  9.  * Public License Version 1.1 (the "MPL"). If you do not alter this
  10.  * notice, a recipient may use your version of this file under either
  11.  * the MPL or the LGPL.
  12.  *
  13.  * You should have received a copy of the LGPL along with this library
  14.  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
  16.  * You should have received a copy of the MPL along with this library
  17.  * in the file COPYING-MPL-1.1
  18.  *
  19.  * The contents of this file are subject to the Mozilla Public License
  20.  * Version 1.1 (the "License"); you may not use this file except in
  21.  * compliance with the License. You may obtain a copy of the License at
  22.  * http://www.mozilla.org/MPL/
  23.  *
  24.  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
  25.  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
  26.  * the specific language governing rights and limitations.
  27.  *
  28.  * Contributor(s):
  29.  *      Chris Wilson <chris@chris-wilson.co.uk>
  30.  */
  31.  
  32. #include "cairoint.h"
  33.  
  34. #if CAIRO_HAS_XCB_SHM_FUNCTIONS
  35.  
  36. #include "cairo-xcb-private.h"
  37.  
  38. #include <xcb/xcbext.h>
  39. #include <xcb/shm.h>
  40.  
  41. uint32_t
  42. _cairo_xcb_connection_shm_attach (cairo_xcb_connection_t *connection,
  43.                                   uint32_t id,
  44.                                   cairo_bool_t readonly)
  45. {
  46.     uint32_t segment = _cairo_xcb_connection_get_xid (connection);
  47.     assert (connection->flags & CAIRO_XCB_HAS_SHM);
  48.     xcb_shm_attach (connection->xcb_connection, segment, id, readonly);
  49.     return segment;
  50. }
  51.  
  52. void
  53. _cairo_xcb_connection_shm_put_image (cairo_xcb_connection_t *connection,
  54.                                      xcb_drawable_t dst,
  55.                                      xcb_gcontext_t gc,
  56.                                      uint16_t total_width,
  57.                                      uint16_t total_height,
  58.                                      int16_t src_x,
  59.                                      int16_t src_y,
  60.                                      uint16_t width,
  61.                                      uint16_t height,
  62.                                      int16_t dst_x,
  63.                                      int16_t dst_y,
  64.                                      uint8_t depth,
  65.                                      uint32_t shm,
  66.                                      uint32_t offset)
  67. {
  68.     assert (connection->flags & CAIRO_XCB_HAS_SHM);
  69.     xcb_shm_put_image (connection->xcb_connection, dst, gc, total_width, total_height,
  70.                        src_x, src_y, width, height, dst_x, dst_y, depth,
  71.                        XCB_IMAGE_FORMAT_Z_PIXMAP, 0, shm, offset);
  72. }
  73.  
  74. cairo_status_t
  75. _cairo_xcb_connection_shm_get_image (cairo_xcb_connection_t *connection,
  76.                                      xcb_drawable_t src,
  77.                                      int16_t src_x,
  78.                                      int16_t src_y,
  79.                                      uint16_t width,
  80.                                      uint16_t height,
  81.                                      uint32_t shmseg,
  82.                                      uint32_t offset)
  83. {
  84.     xcb_shm_get_image_reply_t *reply;
  85.     xcb_generic_error_t *error;
  86.  
  87.     assert (connection->flags & CAIRO_XCB_HAS_SHM);
  88.     reply = xcb_shm_get_image_reply (connection->xcb_connection,
  89.                                      xcb_shm_get_image (connection->xcb_connection,
  90.                                                         src,
  91.                                                         src_x, src_y,
  92.                                                         width, height,
  93.                                                         (uint32_t) -1,
  94.                                                         XCB_IMAGE_FORMAT_Z_PIXMAP,
  95.                                                         shmseg, offset),
  96.                                      &error);
  97.     free (reply);
  98.  
  99.     if (error) {
  100.         /* an error here should be impossible */
  101.         free (error);
  102.         return _cairo_error (CAIRO_STATUS_READ_ERROR);
  103.     }
  104.  
  105.     return CAIRO_STATUS_SUCCESS;
  106. }
  107.  
  108. void
  109. _cairo_xcb_connection_shm_detach (cairo_xcb_connection_t *connection,
  110.                                   uint32_t segment)
  111. {
  112.     assert (connection->flags & CAIRO_XCB_HAS_SHM);
  113.     xcb_shm_detach (connection->xcb_connection, segment);
  114.     _cairo_xcb_connection_put_xid (connection, segment);
  115. }
  116.  
  117. #endif /* CAIRO_HAS_XCB_SHM_FUNCTIONS */
  118.