From: reed@google.com Date: Fri, 11 Mar 2011 20:08:25 +0000 (+0000) Subject: add tristate toggle 'l' for lcd text drawing X-Git-Tag: submit/tizen/20180928.044319~18852 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f0b5f68807cfa18cce0647d275778147901945cd;p=platform%2Fupstream%2FlibSkiaSharp.git add tristate toggle 'l' for lcd text drawing git-svn-id: http://skia.googlecode.com/svn/trunk@925 2bbb7eff-a529-9590-31e7-b0007b416f81 --- diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index 45cb2bbcde..23ee27fb3f 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -41,6 +41,84 @@ SkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) { #define SK_USE_SHADERS #endif +#if 1 +#include +#include + +static void testpdf() { + CFStringRef path = CFStringCreateWithCString(NULL, "/test.pdf", + kCFStringEncodingUTF8); + CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, + kCFURLPOSIXPathStyle, + false); + CFRelease(path); + CGRect box = CGRectMake(0, 0, 8*72, 10*72); + CGContextRef cg = CGPDFContextCreateWithURL(url, &box, NULL); + CFRelease(url); + + CGContextBeginPage(cg, &box); + CGRect r = CGRectMake(10, 10, 40 + 0.5, 50 + 0.5); + CGContextFillEllipseInRect(cg, r); + CGContextEndPage(cg); + CGContextRelease(cg); + + if (false) { + SkBitmap bm; + bm.setConfig(SkBitmap::kA8_Config, 64, 64); + bm.allocPixels(); + bm.eraseColor(0); + + SkCanvas canvas(bm); + + } +} +#endif + +////////////////////////////////////////////////////////////////////////////// + +#include "SkDrawFilter.h" + +class LCDTextDrawFilter : public SkDrawFilter { +public: + enum Mode { + kNeutral_Mode, + kForceOn_Mode, + kForceOff_Mode + }; + + LCDTextDrawFilter(Mode mode) : fMode(mode) {} + + virtual bool filter(SkCanvas*, SkPaint* paint, Type t) { + if (kText_Type == t && kNeutral_Mode != fMode) { + fPrevLCD = paint->isLCDRenderText(); + paint->setLCDRenderText(kForceOn_Mode == fMode); + } + return true; + } + + /** If filter() returned true, then restore() will be called to restore the + canvas/paint to their previous states + */ + virtual void restore(SkCanvas*, SkPaint* paint, Type t) { + if (kText_Type == t && kNeutral_Mode != fMode) { + paint->setLCDRenderText(fPrevLCD); + } + } + +private: + Mode fMode; + bool fPrevLCD; +}; + +LCDTextDrawFilter::Mode cycle_lcdmode(LCDTextDrawFilter::Mode mode) { + static const LCDTextDrawFilter::Mode gCycle[] = { + /* kNeutral_Mode -> */ LCDTextDrawFilter::kForceOn_Mode, + /* kForceOn_Mode -> */ LCDTextDrawFilter::kForceOff_Mode, + /* kForceOff_Mode -> */ LCDTextDrawFilter::kNeutral_Mode + }; + return gCycle[mode]; +} + ////////////////////////////////////////////////////////////////////////////// static const char gCharEvtName[] = "SampleCode_Char_Event"; @@ -180,6 +258,8 @@ private: bool fScale; bool fRequestGrabImage; + LCDTextDrawFilter::Mode fLCDMode; + int fScrollTestX, fScrollTestY; bool make3DReady(); @@ -251,7 +331,7 @@ SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) { fRotate = false; fScale = false; fRequestGrabImage = false; - + fLCDMode = LCDTextDrawFilter::kNeutral_Mode; fScrollTestX = fScrollTestY = 0; // this->setConfig(SkBitmap::kRGB_565_Config); @@ -268,6 +348,8 @@ SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) { } fCurrIndex = 0; this->loadView(fSamples[fCurrIndex]()); + + testpdf(); } SampleWindow::~SampleWindow() { @@ -512,9 +594,14 @@ void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) { canvas->rotate(SkIntToScalar(30)); canvas->translate(-cx, -cy); } + + if (LCDTextDrawFilter::kNeutral_Mode != fLCDMode) { + canvas->setDrawFilter(new LCDTextDrawFilter(fLCDMode))->unref(); + } } void SampleWindow::afterChild(SkView* child, SkCanvas* canvas) { + canvas->setDrawFilter(NULL); } static SkBitmap::Config gConfigCycle[] = { @@ -669,6 +756,11 @@ bool SampleWindow::onHandleChar(SkUnichar uni) { fRequestGrabImage = true; this->inval(NULL); break; + case 'l': + fLCDMode = cycle_lcdmode(fLCDMode); + this->updateTitle(); + this->inval(NULL); + break; default: break; } @@ -799,6 +891,11 @@ void SampleWindow::updateTitle() { if (fNClip) { title.prepend(" "); } + if (LCDTextDrawFilter::kForceOn_Mode == fLCDMode) { + title.prepend("LCD "); + } else if (LCDTextDrawFilter::kForceOff_Mode == fLCDMode) { + title.prepend("lcd "); + } this->setTitle(title.c_str()); }