/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * yuv_draw.cc * * Thu Sep 22 12:35:28 CEST 2005 * Copyright 2005 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of MIaV. * * MIaV is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MIaV is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "yuv_draw.h" //#include "font.h" #include #define TEXT_MARGIN 10 #include "mainwindow.h" static QImage *loadIcon(const char *name, int height ) { QImage scaled; QImage *img; img = new QImage(); img->load( name ); int h = height; int w = (int)((float)img->width() / (float)(img->height() / (float)h)); scaled = img->scaled(w, h, Qt::KeepAspectRatio, Qt::SmoothTransformation); delete img; img = new QImage(scaled); return img; } YUVDraw::YUVDraw() { overlay = NULL; // One line of text! top_pixmap = new QPixmap(720 - TEXT_MARGIN, 20); bottom_pixmap = new QPixmap(720 - TEXT_MARGIN, 20); for(int x = 0; x < 720 - TEXT_MARGIN; x++) { for(int y = 0; y < 20; y++) { top_grey[x][y] = 255; } } for(int x = 0; x < 720 - TEXT_MARGIN; x++) { for(int y = 0; y < 20; y++) { bottom_grey[x][y] = 255; } } img_muted = loadIcon(PIXMAP_MUTE, ICON_HEIGHT); img_unmuted = loadIcon(PIXMAP_UNMUTE, ICON_HEIGHT); } YUVDraw::~YUVDraw() { delete top_pixmap; delete bottom_pixmap; } void YUVDraw::setOverlay(SDL_Overlay* o) { overlay = o; } void YUVDraw::addPixel(int x, int y, int val) { if(overlay->w < x) return; // Out of range if(overlay->h < y) return; // Out of range Uint8 **pixels = overlay->pixels; Uint16 *pitches = overlay->pitches; Uint8* pixel = &pixels[0][(2 * x) + (y * pitches[0])]; if(val > 0) *pixel = (255<*pixel+val?255:*pixel+val); else *pixel = (0>*pixel+val?0:*pixel+val); } void YUVDraw::setTopText(const char* text) { // miav_app->lock(); // TODO top_pixmap->fill(); QPainter painter; painter.begin(top_pixmap); painter.setFont( QFont( "Arial", 12, QFont::Bold ) ); painter.setPen( Qt::black ); painter.drawText(64, 15, text); painter.end(); QImage image = top_pixmap->toImage(); for(int x = 64; x < 720 - TEXT_MARGIN; x++) { for(int y = 0; y < 20; y++) { top_grey[x][y] = qGray(image.pixel(x, y)); } } // miav_app->unlock();// TODO } void YUVDraw::setBottomText(const char* text) { //miav_app->lock(); // TODO bottom_pixmap->fill(); QPainter painter; painter.begin(bottom_pixmap); painter.setFont( QFont( "Arial", 12, QFont::Bold ) ); painter.setPen( Qt::black ); painter.drawText(0, 15, text); painter.end(); QImage image = bottom_pixmap->toImage(); for(int x = 0; x < 720 - TEXT_MARGIN; x++) { for(int y = 0; y < 20; y++) { bottom_grey[x][y] = qGray(image.pixel(x, y)); } } // miav_app->unlock(); // TODO } void YUVDraw::draw() { for(int x = 0; x < 720 - TEXT_MARGIN; x++) { for(int y = 0; y < 20; y++) { if(top_grey[x][y] != 255) addPixel(x + TEXT_MARGIN, y + TEXT_MARGIN, 255 - top_grey[x][y]); } } for(int x = 0; x < 720 - TEXT_MARGIN; x++) { for(int y = 0; y < 20; y++) { if(bottom_grey[x][y] != 255) addPixel(x + TEXT_MARGIN, (556 - TEXT_MARGIN)+ y, 255 - bottom_grey[x][y]); } } } void YUVDraw::mute(bool muted) { int xoffset = 0; int yoffset = 0; QImage *img; if(muted) img = img_muted; else img = img_unmuted; // Swicth the bool and draw an mute/unmute symbol float alpha, color; for(int x = 0; x < ICON_WIDTH; x++) { for(int y = 0; y < ICON_HEIGHT; y++) { alpha = ((float)qAlpha(img->pixel(x, y)) / 255.0); color = (float)qGray(img->pixel(x, y)) * alpha; addPixel(x + xoffset, y + yoffset, (unsigned char)color); } } } /* void YUVDraw::setText(int xoffset, int yoffset, char* text, int val) { for(unsigned int i = 0; i < strlen(text); i++) { for(int x = 0; x < FONT_WIDTH; x++) { for(int y = 0; y < FONT_HEIGHT; y++) { unsigned char col = palette[letter[(int)text[i]][y][x]]; if(col) col += val; addPixel(i * FONT_WIDTH + x + xoffset, y + yoffset, col); } } } } */ /* typedef struct{ Uint32 format; int w, h; int planes; Uint16 *pitches; Uint8 **pixels; Uint32 hw_overlay:1; } SDL_Overlay; */