Drawing routines for teletext for vector based osd
authorMarten Richter <marten.richter@freenet.de>
Sat, 6 Oct 2012 17:02:04 +0000 (19:02 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sat, 6 Oct 2012 17:02:04 +0000 (19:02 +0200)
osdopenvg.cc
osdopenvg.h
osdvector.h
surface.h
surfacevector.cc
teletextdecodervbiebu.h
videoomx.cc

index 46bc4a13de9de05f174780fdd6463094f7b408d0..955f78b6afd41a0164a67b425b008e051b0e02c8 100644 (file)
 #include "osdopenvg.h"\r
 #include "mtd.h"\r
 #include "videoomx.h"\r
+#include "surface.h"\r
 #include <Magick++.h>\r
 \r
 #include "message.h"\r
 #include "command.h"\r
+#include "teletxt/txtfont.h"\r
 \r
 #include <sys/syscall.h>\r
 #include <vector>\r
@@ -210,19 +212,15 @@ int OsdOpenVG::init(void* device)
    if (query_str) Log::getInstance()->logLongString("OSD", Log::NOTICE, query_str);\r
    else Log::getInstance()->log("OSD", Log::WARN, "Could not query display %x",vgGetError());\r
 \r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
   aspect_correction= ((float)BACKBUFFER_HEIGHT)/576.f/(((float)BACKBUFFER_WIDTH)/720.f);\r
   initPaths();\r
   if (!loadFont()) {\r
          return 0;\r
   }\r
+  vgttfont=vgCreateFont(0);\r
+  vgttpaint=vgCreatePaint();\r
+  vgSetParameteri( vgttpaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);\r
+  vgSetColor(vgttpaint,0xffffffff);\r
 \r
   eglSwapInterval(egl_display, 1 );\r
 \r
@@ -313,6 +311,8 @@ int OsdOpenVG::shutdown()
 \r
   FT_Done_Face(ft_face);\r
   vgDestroyFont(vgfont);\r
+  vgDestroyFont(vgttfont);\r
+  vgDestroyPaint(vgttpaint);\r
   destroyPaths();\r
   vgClear(0,0,BACKBUFFER_WIDTH,BACKBUFFER_HEIGHT);\r
   eglSwapBuffers(egl_display, egl_surface);\r
@@ -419,6 +419,42 @@ float OsdOpenVG::getCharWidth(wchar_t c)
        return font_exp_x[glyph_index];\r
 }\r
 \r
+unsigned int OsdOpenVG::loadTTchar(cTeletextChar c)\r
+{\r
+       unsigned int glyph_index=c.getGlyphIndex();\r
+       if (tt_font_chars.find(glyph_index)!=tt_font_chars.end())\r
+       {\r
+               return glyph_index;\r
+       }\r
+\r
+       unsigned int buffer[10];\r
+       const VGfloat glyphOrigin[] = { 0.f, 0.f };\r
+       const VGfloat escapement[] = { 12.f, 0.f };\r
+       unsigned int * charmap = GetFontChar(c, buffer);\r
+       if (!charmap) { //invalid char\r
+               return 0;\r
+       }\r
+       for (int i=0;i<10;i++) {\r
+               buffer[i]=charmap[i]>>4;\r
+       }\r
+\r
+       VGImage handle = vgCreateImage(\r
+                       VG_A_8,\r
+                       12,\r
+                       10,\r
+                       VG_IMAGE_QUALITY_NONANTIALIASED | VG_IMAGE_QUALITY_FASTER\r
+                                       | VG_IMAGE_QUALITY_BETTER);\r
+       vgImageSubData(handle, buffer, 4, VG_A_1, 0, 0, 12, 10);\r
+       vgSetGlyphToImage(\r
+                       vgttfont,\r
+                       glyph_index,\r
+                       handle, glyphOrigin, escapement);\r
+       vgDestroyImage(handle);\r
+       tt_font_chars[glyph_index]=1;\r
+\r
+       return glyph_index;\r
+}\r
+\r
 int  OsdOpenVG::loadFont()\r
 {\r
        int error=FT_Init_FreeType(&ft_library);\r
@@ -646,9 +682,6 @@ void OsdOpenVG::executeDrawCommand(SVGCommand & command)
                vgSetPaint((VGPaint) command.reference,VG_FILL_PATH);\r
                vgSetPaint((VGPaint) command.reference,VG_STROKE_PATH);\r
                vgTranslate(command.x,command.y);\r
-       //      vgLoadIdentity();\r
-       //      vgTranslate(500.,500.);\r
-               //vgScale(18.f,18.f);\r
                VGfloat gori[]={0.,0.};\r
                vgSetfv(VG_GLYPH_ORIGIN,2,gori);\r
 \r
@@ -661,6 +694,51 @@ void OsdOpenVG::executeDrawCommand(SVGCommand & command)
                vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);\r
        } break;\r
        case DrawTTchar:{\r
+               cTeletextChar tchar;\r
+               tchar.setInternal(command.target.ttchar);\r
+               vgSeti(VG_MATRIX_MODE, VG_MATRIX_GLYPH_USER_TO_SURFACE);\r
+               vgGetMatrix(save_matrix);\r
+               enumTeletextColor ttforegcolour=tchar.GetFGColor();\r
+               enumTeletextColor ttbackgcolour=tchar.GetBGColor();\r
+           if (tchar.GetBoxedOut()) {\r
+               ttforegcolour=ttcTransparent;\r
+               ttbackgcolour=ttcTransparent;\r
+           }\r
+           vgSeti(VG_IMAGE_MODE,VG_DRAW_IMAGE_STENCIL);\r
+           vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);\r
+\r
+\r
+               vgTranslate(command.x+command.w*11.95f*1.4f,command.y+command.h*19.95f);\r
+               VGfloat gori[]={0.,0.};\r
+               vgSetfv(VG_GLYPH_ORIGIN,2,gori);\r
+\r
+               vgScale(-1.4f,2.f);\r
+               unsigned int color=Surface::enumTeletextColorToCoulour(ttbackgcolour).rgba();\r
+               color=color<<8 | (color &0xff000000)>>24;\r
+               vgSetColor(vgttpaint,color);\r
+               vgSetPaint((VGPaint) vgttpaint,VG_FILL_PATH);\r
+               vgSetPaint((VGPaint) vgttpaint,VG_STROKE_PATH);\r
+               cTeletextChar filled;\r
+               filled.setInternal(0x187f);\r
+               unsigned int glyph_index=loadTTchar(filled);\r
+               vgDrawGlyph(vgttfont,glyph_index,VG_FILL_PATH,VG_FALSE);\r
+\r
+               color=Surface::enumTeletextColorToCoulour(ttforegcolour).rgba();\r
+               color=color<<8 | (color &0xff000000)>>24;\r
+               vgSetColor(vgttpaint,color);\r
+               vgSetPaint((VGPaint) vgttpaint,VG_FILL_PATH);\r
+               vgSetPaint((VGPaint) vgttpaint,VG_STROKE_PATH);\r
+               glyph_index=loadTTchar(tchar);\r
+               vgDrawGlyph(vgttfont,glyph_index,VG_FILL_PATH,VG_FALSE);\r
+\r
+               /*      Log::getInstance()->log("OSD", Log::DEBUG, "Draw TTchar %x %x %x %x",glyph_index,ttforegcolour,Surface::enumTeletextColorToCoulour(ttforegcolour).rgba(),\r
+                                       vgGetColor(vgttpaint));*/\r
+\r
+\r
+               vgLoadMatrix(save_matrix);\r
+               vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);\r
+               vgSeti(VG_IMAGE_MODE,VG_DRAW_IMAGE_NORMAL);\r
+               vgSeti(VG_BLEND_MODE, VG_BLEND_SRC);\r
 \r
        }break;\r
        }\r
index 3d4e5f44e9fbd68dc3def570c05a79e3ce38b187..3769d73241151d4cbbfe72013a16f72bf062025d 100644 (file)
@@ -118,9 +118,14 @@ protected:
     FT_Library  ft_library;\r
     FT_Face     ft_face;\r
     VGFont vgfont;\r
+    VGFont vgttfont;\r
+    VGPaint vgttpaint;\r
     int  loadFont();\r
     map<unsigned int,float> font_exp_x;\r
 \r
+    unsigned int loadTTchar(cTeletextChar c);\r
+    map<unsigned int,int> tt_font_chars;\r
+\r
 \r
 \r
        void threadMethod();\r
index 13b49c485f5b32b9e7b71311dc78cd85113f7392..963bbf2ec3e9bbe7f3a658238b558c0bef14d92f 100644 (file)
@@ -92,6 +92,10 @@ public:
        {\r
                return (x>=tx) && (y>=ty) && ((x+w)<=(tx+tw)) && ((y+h)<=(ty+th));\r
        }\r
+       bool TTTest(float tox,float toy,float tx, float ty)\r
+       {\r
+               return (x==tox) && (toy==y) && (w==tx) && (h==ty);\r
+       }\r
        unsigned int getRef(){return reference;};\r
        ImageIndex getImageIndex() {\r
                if (instr!=DrawImage) return 0;\r
index 5777d9c88aff3b09da83c0843b94726d7207064c..d92994bc7d49b5413cdcb51406ab624ccf82b89b 100644 (file)
--- a/surface.h
+++ b/surface.h
@@ -85,6 +85,7 @@ class Surface
 \r
 \r
     virtual void drawTTChar(int ox, int oy,int x, int y, cTeletextChar c);\r
+    static Colour enumTeletextColorToCoulour(enumTeletextColor ttcol);\r
 \r
 \r
   \r
@@ -97,7 +98,7 @@ class Surface
   protected:\r
     static Surface* screen;\r
     static osd_font_t* font;\r
-    Colour enumTeletextColorToCoulour(enumTeletextColor ttcol);\r
+\r
 \r
     virtual void drawPixel(int x, int y, unsigned int c, bool fastdraw=false)=0; // deprecated preparation for vector based drawing, only allowed to be called inside implementation\r
     virtual void drawPixel(int x, int y, Colour& c, bool fastdraw=false)=0; // deprecated preparation for vector based drawing, only allowed to be called inside implementation\r
index 6637aa45eff0dd50e44fc090951aaeab4a4457fe..9bec0aa9f67d08990d81bd33ac4a216c83adf76c 100644 (file)
@@ -273,6 +273,16 @@ void SurfaceVector::endFastDraw() {
 void SurfaceVector::drawTTChar(int ox, int oy,int x, int y, cTeletextChar c)\r
 {\r
        command_mutex.Lock();\r
+       list<SVGCommand>::iterator itty=commands.begin();\r
+       while (itty!=commands.end())\r
+       {\r
+               if ((*itty).TTTest(ox,oy,x,y) ) {\r
+                       itty=commands.erase(itty);\r
+                       break;\r
+               } else {\r
+                       itty++;\r
+               }\r
+       }\r
        commands.push_back(SVGCommand(ox,oy,x,y,c.getInternal()));\r
        command_mutex.Unlock();\r
 }\r
index 124ba83156ae4c778267898df811693dc0d7bcb5..54a1d860885a7173752add39dc85c90870720b21 100644 (file)
@@ -234,6 +234,9 @@ public:
         { c=(Blink)?(c|BLINK):(c&~BLINK); }
     inline cTeletextChar ToBlink(bool Blink) 
         { return cTeletextChar((Blink)?(c|BLINK):(c&~BLINK)); }
+    inline unsigned int getGlyphIndex() {
+       return c & (CHAR | CHARSET | DBLHEIGHT | DBLWIDTH);
+    };
 
     inline void setInternal(unsigned int cc) {c=cc;};
     inline unsigned int getInternal() {return c;};
index 3a219e95901fa59f108e1eab7cfafd27013a9461..50da6791a503f9f2d24db17b235d26e0aef34f3b 100644 (file)
@@ -799,7 +799,7 @@ int VideoOMX::AllocateCodecsOMX()
        Log::getInstance()->log("Video", Log::NOTICE, "Allocate Codecs OMX");
        //Clock, move later to audio including events
 
-       if (deinterlace!=0 && demux->getHorizontalSize()<=720) { //only deinterlace SD material
+       if (deinterlace!=0 && (demux->getHorizontalSize()<=720 /*|| demux->getHorizontalSize()==1920*/)) { //only deinterlace SD material
                dodeint=true;
                deint_first_frame=true;