Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  common.glsl   Sprache: unbekannt

 
Spracherkennung für: .glsl vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

#ifndef _COMMON_
#define _COMMON_

void            main_clip_none                  (void);
void            main_clip_rect                  (void);
void            main_clip_rounded               (void);

#include "enums.glsl"

/* Needs to be exactly like this and not use #else
 * because our include script is too dumb
 */
#ifdef VULKAN
#include "common-vulkan.glsl"
#endif /* VULKAN */
#ifndef VULKAN
#include "common-gl.glsl"
#endif

#define GSK_SHADER_CLIP (GSK_FLAGS & 3u)
/* Defined by the shader compilers directly */
/* #define GSK_TEXTURE0_IS_EXTERNAL ((GSK_FLAGS >> 4u) & 1u) */
/* #define GSK_TEXTURE1_IS_EXTERNAL ((GSK_FLAGS >> 5u) & 1u) */
#define GSK_TEXTURE0_SAMPLE_OP ((GSK_FLAGS >> 6u) & 7u)
#define GSK_TEXTURE1_SAMPLE_OP ((GSK_FLAGS >> 10u) & 7u)

#include "color.glsl"
#include "rect.glsl"
#include "roundedrect.glsl"

#define PI 3.1415926535897932384626433832795
#define SQRT1_2 1.4142135623730951

Rect
rect_clip (Rect r)
{
  if (GSK_SHADER_CLIP == GSK_GPU_SHADER_CLIP_NONE)
    return r;
  else
    return rect_intersect (r, rect_from_gsk (GSK_GLOBAL_CLIP_RECT));
}

#ifdef GSK_VERTEX_SHADER

const vec2 offsets[6] = vec2[6](vec2(0.00.0),
                                vec2(1.00.0),
                                vec2(0.01.0),
                                vec2(0.01.0),
                                vec2(1.00.0),
                                vec2(1.01.0));

void
gsk_set_position (vec2 pos)
{
  gl_Position = GSK_GLOBAL_MVP * vec4 (pos, 0.01.0);
}

vec2
rect_get_position (Rect rect)
{
  Rect r = rect_snap (rect_clip (rect), GSK_RECT_SNAP_GROW);

  vec2 pos = mix (rect_bounds (r).xy, rect_bounds (r).zw, offsets[GSK_VERTEX_INDEX]);

  return pos;
}

vec2
border_get_position (RoundedRect outside,
                     RoundedRect inside)
{
  uint slice_index = uint (GSK_VERTEX_INDEX) / 6u;
  uint vert_index = uint (GSK_VERTEX_INDEX) % 6u;

  Rect rect = rounded_rect_intersection_slice (outside, inside, slice_index, true);

  switch (slice_index)
    {
    case SLICE_TOP_LEFT:
      rect = rect_snap (rect, GSK_RECT_SNAP_GROW);
      rect = Rect (rect_bounds (rect).xwzy);
      break;
    case SLICE_TOP:
      rect = rect_snap (rect, GSK_RECT_SNAP_SHRINK_GROW);
      break;
    case SLICE_TOP_RIGHT:
      rect = rect_snap (rect, GSK_RECT_SNAP_GROW);
      break;
    case SLICE_RIGHT:
      rect = rect_snap (rect, GSK_RECT_SNAP_GROW_SHRINK);
      break;
    case SLICE_BOTTOM_RIGHT:
      rect = rect_snap (rect, GSK_RECT_SNAP_GROW);
      rect = Rect (rect_bounds (rect).zyxw);
      break;
    case SLICE_BOTTOM:
      rect = rect_snap (rect, GSK_RECT_SNAP_SHRINK_GROW);
      break;
    case SLICE_BOTTOM_LEFT:
      rect = rect_snap (rect, GSK_RECT_SNAP_GROW);
      rect = Rect (rect_bounds (rect).zwxy);
      break;
    case SLICE_LEFT:
      rect = rect_snap (rect, GSK_RECT_SNAP_GROW_SHRINK);
      break;
    }

  vec2 pos = mix (rect_bounds (rect).xy, rect_bounds (rect).zw, offsets[vert_index]);

  return pos;
}

vec2
scale_tex_coord (vec2 in_pos,
                 Rect in_rect,
                 vec4 tex_rect)
{
  return tex_rect.xy + (in_pos - rect_pos (in_rect)) / rect_size (in_rect) * tex_rect.zw;
}

void            run                             (out vec2 pos);

void
main (void)
{
  vec2 pos;

  run (pos);

  gsk_set_position (pos);
}

#endif /* GSK_VERTEX_SHADER */


#ifdef GSK_FRAGMENT_SHADER

vec4
gsk_texture_straight_alpha (sampler2D tex,
                            vec2      pos)
{
  vec2 size = vec2 (textureSize (tex, 0));
  pos *= size;
  size -= vec2 (1.0);
  /* GL_CLAMP_TO_EDGE */
  pos = clamp (pos - 0.5, vec2 (0.0), size);
  ivec2 ipos = ivec2 (pos);
  pos = fract (pos);
  vec4 tl = texelFetch (tex, ipos, 0);
  tl.rgb *= tl.a;
  vec4 tr = texelFetch (tex, ipos + ivec2(10), 0);
  tr.rgb *= tr.a;
  vec4 bl = texelFetch (tex, ipos + ivec2(01), 0);
  bl.rgb *= bl.a;
  vec4 br = texelFetch (tex, ipos + ivec2(11), 0);
  br.rgb *= br.a;
  return mix (mix (tl, tr, pos.x), mix (bl, br, pos.x), pos.y);
}

#if GSK_N_TEXTURES > 0
vec4
gsk_texture0 (vec2 pos)
{
  if (GSK_TEXTURE0_SAMPLE_OP == GDK_SHADER_DEFAULT)
    return texture (GSK_TEXTURE0, pos);
  else if (GSK_TEXTURE0_SAMPLE_OP == GDK_SHADER_STRAIGHT)
    return gsk_texture_straight_alpha (GSK_TEXTURE0, pos);
  else if (GSK_TEXTURE0_SAMPLE_OP == GDK_SHADER_2_PLANES)
    return vec4 (texture (GSK_TEXTURE0, pos).x, texture (GSK_TEXTURE0_1, pos).xy, 1.0).brga;
  else if (GSK_TEXTURE0_SAMPLE_OP == GDK_SHADER_3_PLANES)
    return vec4 (texture (GSK_TEXTURE0_2, pos).x, texture (GSK_TEXTURE0, pos).x, texture (GSK_TEXTURE0_1, pos).x, 1.0);
  else if (GSK_TEXTURE0_SAMPLE_OP == GDK_SHADER_3_PLANES_10BIT_LSB)
    /* 65535.0 / 1023.0 ~= 64.061583578 */
    return vec4 (clamp (texture (GSK_TEXTURE0_2, pos).x * 64.0615835780.01.0),
                 clamp (texture (GSK_TEXTURE0, pos).x * 64.0615835780.01.0),
                 clamp (texture (GSK_TEXTURE0_1, pos).x * 64.0615835780.01.0),
                 1.0);
  else if (GSK_TEXTURE0_SAMPLE_OP == GDK_SHADER_3_PLANES_12BIT_LSB)
    /* 65535.0 / 4095.0 ~= 16.003663004 */
    return vec4 (clamp (texture (GSK_TEXTURE0_2, pos).x * 16.0036630040.01.0),
                 clamp (texture (GSK_TEXTURE0, pos).x * 16.0036630040.01.0),
                 clamp (texture (GSK_TEXTURE0_1, pos).x * 16.0036630040.01.0),
                 1.0);
}
#endif

#if GSK_N_TEXTURES > 1
vec4
gsk_texture1 (vec2 pos)
{
  if (GSK_TEXTURE1_SAMPLE_OP == GDK_SHADER_DEFAULT)
    return texture (GSK_TEXTURE1, pos);
  else if (GSK_TEXTURE1_SAMPLE_OP == GDK_SHADER_STRAIGHT)
    return gsk_texture_straight_alpha (GSK_TEXTURE1, pos);
  else if (GSK_TEXTURE1_SAMPLE_OP == GDK_SHADER_2_PLANES)
    return vec4 (texture (GSK_TEXTURE1, pos).x, texture (GSK_TEXTURE1_1, pos).xy, 1.0).brga;
  else if (GSK_TEXTURE1_SAMPLE_OP == GDK_SHADER_3_PLANES)
    return vec4 (texture (GSK_TEXTURE1_2, pos).x, texture (GSK_TEXTURE1, pos).x, texture (GSK_TEXTURE1_1, pos).x, 1.0);
  else if (GSK_TEXTURE1_SAMPLE_OP == GDK_SHADER_3_PLANES_10BIT_LSB)
    /* 65535.0 / 1023.0 ~= 64.061583578 */
    return vec4 (clamp (texture (GSK_TEXTURE1_2, pos).x * 64.0615835780.01.0),
                 clamp (texture (GSK_TEXTURE1, pos).x * 64.0615835780.01.0),
                 clamp (texture (GSK_TEXTURE1_1, pos).x * 64.0615835780.01.0),
                 1.0);
  else if (GSK_TEXTURE1_SAMPLE_OP == GDK_SHADER_3_PLANES_12BIT_LSB)
    /* 65535.0 / 4095.0 ~= 16.003663004 */
    return vec4 (clamp (texture (GSK_TEXTURE1_2, pos).x * 16.0036630040.01.0),
                 clamp (texture (GSK_TEXTURE1, pos).x * 16.0036630040.01.0),
                 clamp (texture (GSK_TEXTURE1_1, pos).x * 16.0036630040.01.0),
                 1.0);
}
#endif

void            run                             (out vec4 color,
#ifdef GSK_DUAL_BLEND
                                                 out vec4 mask,
#endif
                                                 out vec2 pos);

void
main_clip_none (void)
{
  vec4 color;
#ifdef GSK_DUAL_BLEND
  vec4 mask;
#endif
  vec2 pos;

#ifdef GSK_DUAL_BLEND
  run (color, mask, pos);
#else
  run (color, pos);
#endif

  float coverage = gsk_clip_mask_coverage ();
  color *= coverage;

  gsk_set_output_color (color);
#ifdef GSK_DUAL_BLEND
  gsk_set_output_mask (mask);
#endif
}

void
main_clip_rect (void)
{
  vec4 color;
#ifdef GSK_DUAL_BLEND
  vec4 mask;
#endif
  vec2 pos;

#ifdef GSK_DUAL_BLEND
  run (color, mask, pos);
#else
  run (color, pos);
#endif

  Rect clip = rect_from_gsk (GSK_GLOBAL_CLIP_RECT);

  float coverage = rect_coverage (clip, pos) * gsk_clip_mask_coverage ();
  color *= coverage;

  gsk_set_output_color (color);
#ifdef GSK_DUAL_BLEND
  mask *= coverage;
  gsk_set_output_mask (mask);
#endif
}

void
main_clip_rounded (void)
{
  vec4 color;
#ifdef GSK_DUAL_BLEND
  vec4 mask;
#endif
  vec2 pos;

#ifdef GSK_DUAL_BLEND
  run (color, mask, pos);
#else
  run (color, pos);
#endif

  RoundedRect clip = rounded_rect_from_gsk (GSK_GLOBAL_CLIP);

  float coverage = rounded_rect_coverage (clip, pos) * gsk_clip_mask_coverage ();
  color *= coverage;

  gsk_set_output_color (color);
#ifdef GSK_DUAL_BLEND
  mask *= coverage;
  gsk_set_output_mask (mask);
#endif
}

void
main (void)
{
  if (GSK_SHADER_CLIP == GSK_GPU_SHADER_CLIP_NONE)
    main_clip_none ();
  else if (GSK_SHADER_CLIP == GSK_GPU_SHADER_CLIP_RECT)
    main_clip_rect ();
  else if (GSK_SHADER_CLIP == GSK_GPU_SHADER_CLIP_ROUNDED)
    main_clip_rounded ();
}

#endif /* GSK_FRAGMENT_SHADER */

#endif


[Dauer der Verarbeitung: 0.13 Sekunden, vorverarbeitet 2026-07-02]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik