mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
libfreerdp-cache: moving glyph to a graphical object
This commit is contained in:
14
include/freerdp/cache/glyph.h
vendored
14
include/freerdp/cache/glyph.h
vendored
@@ -30,12 +30,6 @@ typedef struct _FRAGMENT_CACHE_ENTRY FRAGMENT_CACHE_ENTRY;
|
||||
typedef struct _FRAGMENT_CACHE FRAGMENT_CACHE;
|
||||
typedef struct rdp_glyph_cache rdpGlyphCache;
|
||||
|
||||
typedef void (*pGlyphNew)(rdpContext* context, rdpGlyph* glyph);
|
||||
typedef void (*pGlyphFree)(rdpContext* context, rdpGlyph* glyph);
|
||||
typedef void (*pDrawGlyph)(rdpContext* context, rdpGlyph* glyph, int x, int y);
|
||||
typedef void (*pBeginDrawText)(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
|
||||
typedef void (*pEndDrawText)(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
|
||||
|
||||
#include <freerdp/cache/cache.h>
|
||||
|
||||
struct _GLYPH_CACHE
|
||||
@@ -58,13 +52,7 @@ struct _FRAGMENT_CACHE
|
||||
|
||||
struct rdp_glyph_cache
|
||||
{
|
||||
int glyph_size;
|
||||
pGlyphNew GlyphNew;
|
||||
pGlyphFree GlyphFree;
|
||||
pDrawGlyph DrawGlyph;
|
||||
pBeginDrawText BeginDrawText;
|
||||
pEndDrawText EndDrawText;
|
||||
|
||||
rdpContext* context;
|
||||
rdpSettings* settings;
|
||||
GLYPH_CACHE glyphCache[10];
|
||||
FRAGMENT_CACHE fragCache;
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
typedef struct rdp_bitmap rdpBitmap;
|
||||
typedef struct rdp_pointer rdpPointer;
|
||||
typedef struct rdp_glyph rdpGlyph;
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <freerdp/api.h>
|
||||
@@ -104,6 +105,39 @@ FREERDP_API void Pointer_New(rdpContext* context, rdpPointer* pointer);
|
||||
FREERDP_API void Pointer_Free(rdpContext* context, rdpPointer* pointer);
|
||||
FREERDP_API void Pointer_Set(rdpContext* context, rdpPointer* pointer);
|
||||
|
||||
/* Glyph Class */
|
||||
|
||||
typedef void (*pGlyph_New)(rdpContext* context, rdpGlyph* glyph);
|
||||
typedef void (*pGlyph_Free)(rdpContext* context, rdpGlyph* glyph);
|
||||
typedef void (*pGlyph_Draw)(rdpContext* context, rdpGlyph* glyph, int x, int y);
|
||||
typedef void (*pGlyph_BeginDraw)(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
|
||||
typedef void (*pGlyph_EndDraw)(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
|
||||
|
||||
struct rdp_glyph
|
||||
{
|
||||
size_t size;
|
||||
|
||||
sint16 x;
|
||||
sint16 y;
|
||||
uint16 cx;
|
||||
uint16 cy;
|
||||
uint16 cb;
|
||||
uint8* aj;
|
||||
|
||||
pGlyph_New New;
|
||||
pGlyph_Free Free;
|
||||
pGlyph_Draw Draw;
|
||||
pGlyph_BeginDraw BeginDraw;
|
||||
pGlyph_EndDraw EndDraw;
|
||||
};
|
||||
|
||||
FREERDP_API rdpGlyph* Glyph_Alloc(rdpContext* context);
|
||||
FREERDP_API void Glyph_New(rdpContext* context, rdpGlyph* glyph);
|
||||
FREERDP_API void Glyph_Free(rdpContext* context, rdpGlyph* glyph);
|
||||
FREERDP_API void Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y);
|
||||
FREERDP_API void Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
|
||||
FREERDP_API void Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
|
||||
|
||||
/* Graphics Module */
|
||||
|
||||
struct rdp_graphics
|
||||
@@ -111,10 +145,12 @@ struct rdp_graphics
|
||||
rdpContext* context;
|
||||
rdpBitmap* Bitmap_Prototype;
|
||||
rdpPointer* Pointer_Prototype;
|
||||
rdpGlyph* Glyph_Prototype;
|
||||
};
|
||||
|
||||
FREERDP_API void graphics_register_bitmap(rdpGraphics* graphics, rdpBitmap* bitmap);
|
||||
FREERDP_API void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer);
|
||||
FREERDP_API void graphics_register_glyph(rdpGraphics* graphics, rdpGlyph* glyph);
|
||||
|
||||
FREERDP_API rdpGraphics* graphics_new(rdpContext* context);
|
||||
FREERDP_API void graphics_free(rdpGraphics* graphics);
|
||||
|
||||
@@ -57,17 +57,6 @@ struct rdp_brush
|
||||
};
|
||||
typedef struct rdp_brush rdpBrush;
|
||||
|
||||
struct rdp_glyph
|
||||
{
|
||||
sint16 x;
|
||||
sint16 y;
|
||||
uint16 cx;
|
||||
uint16 cy;
|
||||
uint16 cb;
|
||||
uint8* aj;
|
||||
};
|
||||
typedef struct rdp_glyph rdpGlyph;
|
||||
|
||||
/* Bitmap Updates */
|
||||
|
||||
struct _BITMAP_DATA
|
||||
|
||||
@@ -28,15 +28,17 @@ void update_process_glyph(rdpUpdate* update, uint8* data, int* index,
|
||||
{
|
||||
int offset;
|
||||
rdpGlyph* glyph;
|
||||
rdpGraphics* graphics;
|
||||
rdpGlyphCache* glyph_cache;
|
||||
|
||||
graphics = update->context->graphics;
|
||||
glyph_cache = update->context->cache->glyph;
|
||||
|
||||
glyph = glyph_cache_get(glyph_cache, cacheId, data[(*index)++]);
|
||||
|
||||
if (glyph != NULL)
|
||||
{
|
||||
IFCALL(glyph_cache->DrawGlyph, update->context, glyph, *x, *y);
|
||||
Glyph_Draw(update->context, glyph, *x, *y);
|
||||
}
|
||||
|
||||
offset = data[(*index)++];
|
||||
@@ -61,8 +63,7 @@ void update_process_glyph(rdpUpdate* update, uint8* data, int* index,
|
||||
}
|
||||
|
||||
void update_process_glyph_fragments(rdpUpdate* update, uint8* data, uint8 length,
|
||||
uint8 cacheId, boolean delta, boolean vertical,
|
||||
uint32 bgcolor, uint32 fgcolor, int x, int y,
|
||||
uint8 cacheId, boolean delta, boolean vertical, uint32 bgcolor, uint32 fgcolor, int x, int y,
|
||||
int bkX, int bkY, int bkWidth, int bkHeight, int opX, int opY, int opWidth, int opHeight)
|
||||
{
|
||||
int n;
|
||||
@@ -70,12 +71,14 @@ void update_process_glyph_fragments(rdpUpdate* update, uint8* data, uint8 length
|
||||
uint8 size;
|
||||
int index = 0;
|
||||
uint8* fragments;
|
||||
rdpGraphics* graphics;
|
||||
rdpGlyphCache* glyph_cache;
|
||||
|
||||
graphics = update->context->graphics;
|
||||
glyph_cache = update->context->cache->glyph;
|
||||
|
||||
if (opWidth > 1)
|
||||
IFCALL(glyph_cache->BeginDrawText, update->context, opX, opY, opWidth, opHeight, bgcolor, fgcolor);
|
||||
Glyph_BeginDraw(update->context, opX, opY, opWidth, opHeight, bgcolor, fgcolor);
|
||||
|
||||
while (index < length)
|
||||
{
|
||||
@@ -135,9 +138,9 @@ void update_process_glyph_fragments(rdpUpdate* update, uint8* data, uint8 length
|
||||
}
|
||||
|
||||
if (opWidth > 1)
|
||||
IFCALL(glyph_cache->EndDrawText, update->context, opX, opY, opWidth, opHeight, bgcolor, fgcolor);
|
||||
Glyph_EndDraw(update->context, opX, opY, opWidth, opHeight, bgcolor, fgcolor);
|
||||
else
|
||||
IFCALL(glyph_cache->EndDrawText, update->context, bkX, bkY, bkWidth, bkHeight, bgcolor, fgcolor);
|
||||
Glyph_EndDraw(update->context, bkX, bkY, bkWidth, bkHeight, bgcolor, fgcolor);
|
||||
}
|
||||
|
||||
void update_gdi_glyph_index(rdpUpdate* update, GLYPH_INDEX_ORDER* glyph_index)
|
||||
@@ -179,14 +182,15 @@ void update_gdi_cache_glyph(rdpUpdate* update, CACHE_GLYPH_ORDER* cache_glyph)
|
||||
{
|
||||
glyph_data = cache_glyph->glyphData[i];
|
||||
|
||||
glyph = (rdpGlyph*) xzalloc(cache->glyph->glyph_size);
|
||||
glyph = Glyph_Alloc(update->context);
|
||||
|
||||
glyph->x = glyph_data->x;
|
||||
glyph->y = glyph_data->y;
|
||||
glyph->cx = glyph_data->cx;
|
||||
glyph->cy = glyph_data->cy;
|
||||
glyph->aj = glyph_data->aj;
|
||||
glyph->cb = glyph_data->cb;
|
||||
IFCALL(cache->glyph->GlyphNew, update->context, glyph);
|
||||
Glyph_New(update->context, glyph);
|
||||
|
||||
glyph_cache_put(cache->glyph, cache_glyph->cacheId, glyph_data->cacheIndex, glyph);
|
||||
}
|
||||
@@ -218,8 +222,10 @@ rdpGlyph* glyph_cache_get(rdpGlyphCache* glyph_cache, uint8 id, uint16 index)
|
||||
return entry;
|
||||
}
|
||||
|
||||
void glyph_cache_put(rdpGlyphCache* glyph_cache, uint8 id, uint16 index, rdpGlyph* entry)
|
||||
void glyph_cache_put(rdpGlyphCache* glyph_cache, uint8 id, uint16 index, rdpGlyph* glyph)
|
||||
{
|
||||
rdpGlyph* prevGlyph;
|
||||
|
||||
if (id > 9)
|
||||
{
|
||||
printf("invalid glyph cache id: %d\n", id);
|
||||
@@ -232,7 +238,16 @@ void glyph_cache_put(rdpGlyphCache* glyph_cache, uint8 id, uint16 index, rdpGlyp
|
||||
return;
|
||||
}
|
||||
|
||||
glyph_cache->glyphCache[id].entries[index] = entry;
|
||||
prevGlyph = glyph_cache->glyphCache[id].entries[index];
|
||||
|
||||
if (prevGlyph != NULL)
|
||||
{
|
||||
xfree(prevGlyph->aj);
|
||||
Glyph_Free(glyph_cache->context, prevGlyph);
|
||||
xfree(prevGlyph);
|
||||
}
|
||||
|
||||
glyph_cache->glyphCache[id].entries[index] = glyph;
|
||||
}
|
||||
|
||||
void* glyph_cache_fragment_get(rdpGlyphCache* glyph_cache, uint8 index, uint8* size)
|
||||
@@ -270,6 +285,7 @@ rdpGlyphCache* glyph_cache_new(rdpSettings* settings)
|
||||
int i;
|
||||
|
||||
glyph->settings = settings;
|
||||
glyph->context = ((freerdp*) settings->instance)->update->context;
|
||||
|
||||
settings->glyphSupportLevel = GLYPH_SUPPORT_FULL;
|
||||
|
||||
|
||||
@@ -122,6 +122,54 @@ void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer)
|
||||
memcpy(graphics->Pointer_Prototype, pointer, sizeof(rdpPointer));
|
||||
}
|
||||
|
||||
/* Glyph Class */
|
||||
|
||||
rdpGlyph* Glyph_Alloc(rdpContext* context)
|
||||
{
|
||||
rdpGlyph* glyph;
|
||||
rdpGraphics* graphics;
|
||||
|
||||
graphics = context->graphics;
|
||||
glyph = (rdpGlyph*) xmalloc(graphics->Glyph_Prototype->size);
|
||||
|
||||
if (glyph != NULL)
|
||||
{
|
||||
memcpy(glyph, context->graphics->Glyph_Prototype, sizeof(rdpGlyph));
|
||||
}
|
||||
|
||||
return glyph;
|
||||
}
|
||||
|
||||
void Glyph_New(rdpContext* context, rdpGlyph* glyph)
|
||||
{
|
||||
context->graphics->Glyph_Prototype->New(context, glyph);
|
||||
}
|
||||
|
||||
void Glyph_Free(rdpContext* context, rdpGlyph* glyph)
|
||||
{
|
||||
context->graphics->Glyph_Prototype->Free(context, glyph);
|
||||
}
|
||||
|
||||
void Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y)
|
||||
{
|
||||
context->graphics->Glyph_Prototype->Draw(context, glyph, x, y);
|
||||
}
|
||||
|
||||
void Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
|
||||
{
|
||||
context->graphics->Glyph_Prototype->BeginDraw(context, x, y, width, height, bgcolor, fgcolor);
|
||||
}
|
||||
|
||||
void Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
|
||||
{
|
||||
context->graphics->Glyph_Prototype->EndDraw(context, x, y, width, height, bgcolor, fgcolor);
|
||||
}
|
||||
|
||||
void graphics_register_glyph(rdpGraphics* graphics, rdpGlyph* glyph)
|
||||
{
|
||||
memcpy(graphics->Glyph_Prototype, glyph, sizeof(rdpGlyph));
|
||||
}
|
||||
|
||||
/* Graphics Module */
|
||||
|
||||
rdpGraphics* graphics_new(rdpContext* context)
|
||||
@@ -134,15 +182,20 @@ rdpGraphics* graphics_new(rdpContext* context)
|
||||
{
|
||||
graphics->context = context;
|
||||
|
||||
graphics->Bitmap_Prototype = (rdpBitmap*) xmalloc(sizeof(rdpBitmap));
|
||||
graphics->Bitmap_Prototype = (rdpBitmap*) xzalloc(sizeof(rdpBitmap));
|
||||
graphics->Bitmap_Prototype->size = sizeof(rdpBitmap);
|
||||
graphics->Bitmap_Prototype->New = Bitmap_New;
|
||||
graphics->Bitmap_Prototype->Free = Bitmap_Free;
|
||||
|
||||
graphics->Pointer_Prototype = (rdpPointer*) xmalloc(sizeof(rdpPointer));
|
||||
graphics->Pointer_Prototype = (rdpPointer*) xzalloc(sizeof(rdpPointer));
|
||||
graphics->Pointer_Prototype->size = sizeof(rdpPointer);
|
||||
graphics->Pointer_Prototype->New = Pointer_New;
|
||||
graphics->Pointer_Prototype->Free = Pointer_Free;
|
||||
|
||||
graphics->Glyph_Prototype = (rdpGlyph*) xzalloc(sizeof(rdpGlyph));
|
||||
graphics->Glyph_Prototype->size = sizeof(rdpGlyph);
|
||||
graphics->Glyph_Prototype->New = Glyph_New;
|
||||
graphics->Glyph_Prototype->Free = Glyph_Free;
|
||||
}
|
||||
|
||||
return graphics;
|
||||
|
||||
@@ -129,7 +129,7 @@ void gdi_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean prima
|
||||
gdi->drawing = (gdiBitmap*) bitmap;
|
||||
}
|
||||
|
||||
void gdi_GlyphNew(rdpContext* context, rdpGlyph* glyph)
|
||||
void gdi_Glyph_New(rdpContext* context, rdpGlyph* glyph)
|
||||
{
|
||||
uint8* data;
|
||||
gdiGlyph* gdi_glyph;
|
||||
@@ -149,7 +149,7 @@ void gdi_GlyphNew(rdpContext* context, rdpGlyph* glyph)
|
||||
gdi_glyph->org_bitmap = NULL;
|
||||
}
|
||||
|
||||
void gdi_GlyphFree(rdpContext* context, rdpGlyph* glyph)
|
||||
void gdi_Glyph_Free(rdpContext* context, rdpGlyph* glyph)
|
||||
{
|
||||
gdiGlyph* gdi_glyph;
|
||||
|
||||
@@ -164,7 +164,7 @@ void gdi_GlyphFree(rdpContext* context, rdpGlyph* glyph)
|
||||
}
|
||||
}
|
||||
|
||||
void gdi_DrawGlyph(rdpContext* context, rdpGlyph* glyph, int x, int y)
|
||||
void gdi_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y)
|
||||
{
|
||||
gdiGlyph* gdi_glyph;
|
||||
rdpGdi* gdi = context->gdi;
|
||||
@@ -175,15 +175,12 @@ void gdi_DrawGlyph(rdpContext* context, rdpGlyph* glyph, int x, int y)
|
||||
gdi_glyph->bitmap->height, gdi_glyph->hdc, 0, 0, GDI_DSPDxax);
|
||||
}
|
||||
|
||||
void gdi_BeginDrawText(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
|
||||
void gdi_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
|
||||
{
|
||||
GDI_RECT rect;
|
||||
HGDI_BRUSH brush;
|
||||
rdpGdi* gdi = context->gdi;
|
||||
|
||||
printf("BeginDrawText x:%d y:%d width:%d height:%d bgcolor: 0x%04X fgcolor: 0x%04X\n",
|
||||
x, y, width, height, bgcolor, fgcolor);
|
||||
|
||||
fgcolor = freerdp_color_convert(fgcolor, gdi->srcBpp, 32, gdi->clrconv);
|
||||
gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor);
|
||||
|
||||
@@ -193,22 +190,18 @@ void gdi_BeginDrawText(rdpContext* context, int x, int y, int width, int height,
|
||||
gdi_FillRect(gdi->drawing->hdc, &rect, brush);
|
||||
}
|
||||
|
||||
void gdi_EndDrawText(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
|
||||
void gdi_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
|
||||
{
|
||||
rdpGdi* gdi = context->gdi;
|
||||
|
||||
printf("EndDrawText x:%d y:%d width:%d height:%d bgcolor: 0x%04X fgcolor: 0x%04X\n",
|
||||
x, y, width, height, bgcolor, fgcolor);
|
||||
|
||||
gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor);
|
||||
}
|
||||
|
||||
void gdi_register_graphics(rdpGraphics* graphics)
|
||||
{
|
||||
rdpCache* cache;
|
||||
rdpBitmap bitmap;
|
||||
rdpGlyph glyph;
|
||||
|
||||
memset(&bitmap, 0, sizeof(rdpBitmap));
|
||||
bitmap.size = sizeof(gdiBitmap);
|
||||
|
||||
bitmap.New = gdi_Bitmap_New;
|
||||
@@ -219,13 +212,14 @@ void gdi_register_graphics(rdpGraphics* graphics)
|
||||
|
||||
graphics_register_bitmap(graphics, &bitmap);
|
||||
|
||||
cache = graphics->context->cache;
|
||||
glyph.size = sizeof(gdiGlyph);
|
||||
|
||||
cache->glyph->glyph_size = sizeof(gdiGlyph);
|
||||
cache->glyph->GlyphNew = gdi_GlyphNew;
|
||||
cache->glyph->GlyphFree = gdi_GlyphFree;
|
||||
cache->glyph->DrawGlyph = gdi_DrawGlyph;
|
||||
cache->glyph->BeginDrawText = gdi_BeginDrawText;
|
||||
cache->glyph->EndDrawText = gdi_EndDrawText;
|
||||
glyph.New = gdi_Glyph_New;
|
||||
glyph.Free = gdi_Glyph_Free;
|
||||
glyph.Draw = gdi_Glyph_Draw;
|
||||
glyph.BeginDraw = gdi_Glyph_BeginDraw;
|
||||
glyph.EndDraw = gdi_Glyph_EndDraw;
|
||||
|
||||
graphics_register_glyph(graphics, &glyph);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user