static int TileX = 1280;
static int TileY = 1024;
static DisplayState *lds = NULL;
+static unsigned char *old_data = NULL;
+
+static void set_data_mappings(void);
+static void unset_data_mappings(void);
+static void set_data_pointer(void);
static inline unsigned int intel_get_reg(unsigned int reg)
{
static void intel_update(DisplayState *ds, int x, int y, int w, int h)
{
if (intel_have_focus) {
- if (!is_linear())
- intel_force_linear();
- intel_update_linear(ds, x, y, w, h);
+ if (!old_data)
+ intel_update_linear(ds, x, y, w, h);
}
}
ds->height = h;
ds->depth = 32;
ds->linesize = intel_get_pitch();
- ds->data = realloc(ds->data, h * ds->linesize);
+ if (!old_data)
+ ds->data = realloc(ds->data, h * ds->linesize);
+ else
+ set_data_pointer();
}
static void intel_refresh(DisplayState *ds)
}
}
+static void set_data_pointer(void)
+{
+ lds->data = (unsigned char *)(intel_mem + intel_get_reg(REG_DR_DSPASURF));
+ lds->data = lds->data +
+ lds->linesize * ((1024 - lds->height) / 2) +
+ 4 * ((1280 - lds->width) / 2);
+}
+
+static void set_data_mappings(void)
+{
+ old_data = lds->data;
+ set_data_pointer();
+ memcpy(lds->data, old_data, lds->linesize * lds->height);
+}
+
+static void unset_data_mappings(void)
+{
+ lds->data = old_data;
+ old_data = NULL;
+ lds->data = realloc(lds->data, lds->linesize * lds->height);
+}
+
void intel_focus(int focus)
{
intel_have_focus = focus;
}
intel_force_linear();
}
- intel_update(lds, 0, 0, lds->width, lds->height);
+ set_data_mappings();
+ } else {
+ unset_data_mappings();
}
}