@@ -134,6 +134,44 @@ create_texture(SDL_Renderer *renderer, struct size frame_size) {
134
134
frame_size .width , frame_size .height );
135
135
}
136
136
137
+ static void
138
+ screen_get_sizes (struct screen * screen , struct screen_sizes * out ) {
139
+ int ww , wh , dw , dh ;
140
+ SDL_GetWindowSize (screen -> window , & ww , & wh );
141
+ SDL_GL_GetDrawableSize (screen -> window , & dw , & dh );
142
+ out -> window .width = ww ;
143
+ out -> window .height = wh ;
144
+ out -> window .width = dw ;
145
+ out -> window .height = dh ;
146
+ }
147
+
148
+ // This may be called more than once to work around SDL bugs
149
+ static bool
150
+ screen_init_renderer_and_texture (struct screen * screen ) {
151
+ screen -> renderer = SDL_CreateRenderer (screen -> window , -1 ,
152
+ SDL_RENDERER_ACCELERATED );
153
+ if (!screen -> renderer ) {
154
+ LOGC ("Could not create renderer: %s" , SDL_GetError ());
155
+ return false;
156
+ }
157
+
158
+ if (SDL_RenderSetLogicalSize (screen -> renderer , screen -> frame_size .width ,
159
+ screen -> frame_size .height )) {
160
+ LOGE ("Could not set renderer logical size: %s" , SDL_GetError ());
161
+ return false;
162
+ }
163
+
164
+ screen -> texture = create_texture (screen -> renderer , screen -> frame_size );
165
+ if (!screen -> texture ) {
166
+ LOGC ("Could not create texture: %s" , SDL_GetError ());
167
+ return false;
168
+ }
169
+
170
+ screen_get_sizes (screen , & screen -> sizes );
171
+
172
+ return true;
173
+ }
174
+
137
175
bool
138
176
screen_init_rendering (struct screen * screen , const char * window_title ,
139
177
struct size frame_size , bool always_on_top ) {
@@ -161,21 +199,6 @@ screen_init_rendering(struct screen *screen, const char *window_title,
161
199
return false;
162
200
}
163
201
164
- screen -> renderer = SDL_CreateRenderer (screen -> window , -1 ,
165
- SDL_RENDERER_ACCELERATED );
166
- if (!screen -> renderer ) {
167
- LOGC ("Could not create renderer: %s" , SDL_GetError ());
168
- screen_destroy (screen );
169
- return false;
170
- }
171
-
172
- if (SDL_RenderSetLogicalSize (screen -> renderer , frame_size .width ,
173
- frame_size .height )) {
174
- LOGE ("Could not set renderer logical size: %s" , SDL_GetError ());
175
- screen_destroy (screen );
176
- return false;
177
- }
178
-
179
202
SDL_Surface * icon = read_xpm (icon_xpm );
180
203
if (icon ) {
181
204
SDL_SetWindowIcon (screen -> window , icon );
@@ -186,9 +209,7 @@ screen_init_rendering(struct screen *screen, const char *window_title,
186
209
187
210
LOGI ("Initial texture: %" PRIu16 "x%" PRIu16 , frame_size .width ,
188
211
frame_size .height );
189
- screen -> texture = create_texture (screen -> renderer , frame_size );
190
- if (!screen -> texture ) {
191
- LOGC ("Could not create texture: %s" , SDL_GetError ());
212
+ if (!screen_init_renderer_and_texture (screen )) {
192
213
screen_destroy (screen );
193
214
return false;
194
215
}
@@ -277,8 +298,34 @@ screen_update_frame(struct screen *screen, struct video_buffer *vb) {
277
298
return true;
278
299
}
279
300
301
+ // workaround for <https://github.com/Genymobile/scrcpy/issues/15>
302
+ static inline bool
303
+ screen_fix_hidpi (struct screen * screen ) {
304
+ struct screen_sizes cur ;
305
+ screen_get_sizes (screen , & cur );
306
+
307
+ struct screen_sizes * prev = & screen -> sizes ;
308
+
309
+ bool width_ratio_changed = cur .window .width * prev -> drawable .width !=
310
+ cur .drawable .width * prev -> window .width ;
311
+ bool height_ratio_changed = cur .window .height * prev -> drawable .height !=
312
+ cur .drawable .height * prev -> window .height ;
313
+ if (width_ratio_changed || height_ratio_changed ) {
314
+ SDL_DestroyTexture (screen -> texture );
315
+ SDL_DestroyRenderer (screen -> renderer );
316
+ if (!screen_init_renderer_and_texture (screen )) {
317
+ screen -> texture = NULL ;
318
+ screen -> renderer = NULL ;
319
+ return false;
320
+ }
321
+ }
322
+
323
+ return true;
324
+ }
325
+
280
326
void
281
327
screen_window_resized (struct screen * screen ) {
328
+ screen_fix_hidpi (screen );
282
329
screen_render (screen );
283
330
}
284
331
0 commit comments