| 96 | } |
| 97 | |
| 98 | SDL_bool |
| 99 | DrawComposite(DrawState *s) |
| 100 | { |
| 101 | SDL_Rect viewport, R; |
| 102 | SDL_Texture *target; |
| 103 | |
| 104 | static SDL_bool blend_tested = SDL_FALSE; |
| 105 | if (!blend_tested) { |
| 106 | SDL_Texture *A, *B; |
| 107 | Uint32 P; |
| 108 | |
| 109 | A = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1, 1); |
| 110 | SDL_SetTextureBlendMode(A, SDL_BLENDMODE_BLEND); |
| 111 | |
| 112 | B = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1, 1); |
| 113 | SDL_SetTextureBlendMode(B, SDL_BLENDMODE_BLEND); |
| 114 | |
| 115 | SDL_SetRenderTarget(s->renderer, A); |
| 116 | SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x80); |
| 117 | SDL_RenderFillRect(s->renderer, NULL); |
| 118 | |
| 119 | SDL_SetRenderTarget(s->renderer, B); |
| 120 | SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00); |
| 121 | SDL_RenderFillRect(s->renderer, NULL); |
| 122 | SDL_RenderCopy(s->renderer, A, NULL, NULL); |
| 123 | SDL_RenderReadPixels(s->renderer, NULL, SDL_PIXELFORMAT_ARGB8888, &P, sizeof(P)); |
| 124 | |
| 125 | SDL_Log("Blended pixel: 0x%8.8X\n", P); |
| 126 | |
| 127 | SDL_DestroyTexture(A); |
| 128 | SDL_DestroyTexture(B); |
| 129 | blend_tested = SDL_TRUE; |
| 130 | } |
| 131 | |
| 132 | SDL_RenderGetViewport(s->renderer, &viewport); |
| 133 | |
| 134 | target = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, viewport.w, viewport.h); |
| 135 | SDL_SetTextureBlendMode(target, SDL_BLENDMODE_BLEND); |
| 136 | SDL_SetRenderTarget(s->renderer, target); |
| 137 | |
| 138 | /* Draw the background. |
| 139 | This is solid black so when the sprite is copied to it, any per-pixel alpha will be blended through. |
| 140 | */ |
| 141 | SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00); |
| 142 | SDL_RenderFillRect(s->renderer, NULL); |
| 143 | |
| 144 | /* Scale and draw the sprite */ |
| 145 | s->sprite_rect.w += s->scale_direction; |
| 146 | s->sprite_rect.h += s->scale_direction; |
| 147 | if (s->scale_direction > 0) { |
| 148 | if (s->sprite_rect.w >= viewport.w || s->sprite_rect.h >= viewport.h) { |
| 149 | s->scale_direction = -1; |
| 150 | } |
| 151 | } else { |
| 152 | if (s->sprite_rect.w <= 1 || s->sprite_rect.h <= 1) { |
| 153 | s->scale_direction = 1; |
| 154 | } |
| 155 | } |
no test coverage detected