Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* -*- Mode: c; c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t; -*- */
  2. /*
  3.  * Copyright © 2011 Red Hat, Inc.
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the next
  13.  * paragraph) shall be included in all copies or substantial portions of the
  14.  * Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  */
  24. #ifdef HAVE_CONFIG_H
  25. #include <config.h>
  26. #endif
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include "pixman-private.h"
  30. #include "pixman-combine32.h"
  31. #include "pixman-inlines.h"
  32.  
  33. static void
  34. noop_composite (pixman_implementation_t *imp,
  35.                 pixman_composite_info_t *info)
  36. {
  37.     return;
  38. }
  39.  
  40. static void
  41. dest_write_back_direct (pixman_iter_t *iter)
  42. {
  43.     iter->buffer += iter->image->bits.rowstride;
  44. }
  45.  
  46. static uint32_t *
  47. noop_get_scanline (pixman_iter_t *iter, const uint32_t *mask)
  48. {
  49.     uint32_t *result = iter->buffer;
  50.  
  51.     iter->buffer += iter->image->bits.rowstride;
  52.  
  53.     return result;
  54. }
  55.  
  56. static uint32_t *
  57. get_scanline_null (pixman_iter_t *iter, const uint32_t *mask)
  58. {
  59.     return NULL;
  60. }
  61.  
  62. static pixman_bool_t
  63. noop_src_iter_init (pixman_implementation_t *imp, pixman_iter_t *iter)
  64. {
  65.     pixman_image_t *image = iter->image;
  66.  
  67. #define FLAGS                                           \
  68.     (FAST_PATH_STANDARD_FLAGS | FAST_PATH_ID_TRANSFORM)
  69.  
  70.     if (!image)
  71.     {
  72.         iter->get_scanline = get_scanline_null;
  73.     }
  74.     else if ((iter->iter_flags & (ITER_IGNORE_ALPHA | ITER_IGNORE_RGB)) ==
  75.              (ITER_IGNORE_ALPHA | ITER_IGNORE_RGB))
  76.     {
  77.         iter->get_scanline = _pixman_iter_get_scanline_noop;
  78.     }
  79.     else if (image->common.extended_format_code == PIXMAN_solid         &&
  80.              (iter->image->type == SOLID ||
  81.               (iter->image_flags & FAST_PATH_NO_ALPHA_MAP)))
  82.     {
  83.         if (iter->iter_flags & ITER_NARROW)
  84.         {
  85.             uint32_t *buffer = iter->buffer;
  86.             uint32_t *end = buffer + iter->width;
  87.             uint32_t color;
  88.  
  89.             if (image->type == SOLID)
  90.                 color = image->solid.color_32;
  91.             else
  92.                 color = image->bits.fetch_pixel_32 (&image->bits, 0, 0);
  93.  
  94.             while (buffer < end)
  95.                 *(buffer++) = color;
  96.         }
  97.         else
  98.         {
  99.             argb_t *buffer = (argb_t *)iter->buffer;
  100.             argb_t *end = buffer + iter->width;
  101.             argb_t color;
  102.  
  103.             if (image->type == SOLID)
  104.                 color = image->solid.color_float;
  105.             else
  106.                 color = image->bits.fetch_pixel_float (&image->bits, 0, 0);
  107.  
  108.             while (buffer < end)
  109.                 *(buffer++) = color;
  110.         }
  111.  
  112.         iter->get_scanline = _pixman_iter_get_scanline_noop;
  113.     }
  114.     else if (image->common.extended_format_code == PIXMAN_a8r8g8b8      &&
  115.              (iter->iter_flags & ITER_NARROW)                           &&
  116.              (iter->image_flags & FLAGS) == FLAGS                       &&
  117.              iter->x >= 0 && iter->y >= 0                               &&
  118.              iter->x + iter->width <= image->bits.width                 &&
  119.              iter->y + iter->height <= image->bits.height)
  120.     {
  121.         iter->buffer =
  122.             image->bits.bits + iter->y * image->bits.rowstride + iter->x;
  123.  
  124.         iter->get_scanline = noop_get_scanline;
  125.     }
  126.     else
  127.     {
  128.         return FALSE;
  129.     }
  130.  
  131.     return TRUE;
  132. }
  133.  
  134. static pixman_bool_t
  135. noop_dest_iter_init (pixman_implementation_t *imp, pixman_iter_t *iter)
  136. {
  137.     pixman_image_t *image = iter->image;
  138.     uint32_t image_flags = iter->image_flags;
  139.     uint32_t iter_flags = iter->iter_flags;
  140.    
  141.     if ((image_flags & FAST_PATH_STD_DEST_FLAGS) == FAST_PATH_STD_DEST_FLAGS    &&
  142.         (iter_flags & ITER_NARROW) == ITER_NARROW                               &&
  143.         ((image->common.extended_format_code == PIXMAN_a8r8g8b8)        ||
  144.          (image->common.extended_format_code == PIXMAN_x8r8g8b8 &&
  145.           (iter_flags & (ITER_LOCALIZED_ALPHA)))))
  146.     {
  147.         iter->buffer = image->bits.bits + iter->y * image->bits.rowstride + iter->x;
  148.  
  149.         iter->get_scanline = _pixman_iter_get_scanline_noop;
  150.         iter->write_back = dest_write_back_direct;
  151.  
  152.         return TRUE;
  153.     }
  154.     else
  155.     {
  156.         return FALSE;
  157.     }
  158. }
  159.  
  160. static const pixman_fast_path_t noop_fast_paths[] =
  161. {
  162.     { PIXMAN_OP_DST, PIXMAN_any, 0, PIXMAN_any, 0, PIXMAN_any, 0, noop_composite },
  163.     { PIXMAN_OP_NONE },
  164. };
  165.  
  166. pixman_implementation_t *
  167. _pixman_implementation_create_noop (pixman_implementation_t *fallback)
  168. {
  169.     pixman_implementation_t *imp =
  170.         _pixman_implementation_create (fallback, noop_fast_paths);
  171.  
  172.     imp->src_iter_init = noop_src_iter_init;
  173.     imp->dest_iter_init = noop_dest_iter_init;
  174.  
  175.     return imp;
  176. }
  177.