xref: /haiku/src/add-ons/screen_savers/debugnow/DebugNow.cpp (revision 74252cefbcf266291fb069466189b4734eb05455)
1 /*
2  * Copyright 2007-2009, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Ryan Leavengood, leavengood@gmail.com
7  */
8 
9 
10 #include <Catalog.h>
11 #include <Font.h>
12 #include <ScreenSaver.h>
13 #include <StringView.h>
14 #include <View.h>
15 
16 #include <BuildScreenSaverDefaultSettingsView.h>
17 
18 #undef B_TRANSLATION_CONTEXT
19 #define B_TRANSLATION_CONTEXT "Screensaver DebugNow"
20 
21 
22 const rgb_color kMediumBlue = {0, 0, 100};
23 const rgb_color kWhite = {255, 255, 255};
24 
25 
26 // Inspired by the classic BeOS BuyNow screensaver, of course
27 class DebugNow : public BScreenSaver
28 {
29 	public:
30 							DebugNow(BMessage *archive, image_id);
31 		void				Draw(BView *view, int32 frame);
32 		void				StartConfig(BView *view);
33 		status_t			StartSaver(BView *view, bool preview);
34 
35 	private:
36 		const char* 		fLine1;
37 		const char*			fLine2;
38 		BPoint				fLine1Start;
39 		BPoint				fLine2Start;
40 		escapement_delta	fDelta;
41 };
42 
43 
44 BScreenSaver* instantiate_screen_saver(BMessage *msg, image_id image)
45 {
46 	return new DebugNow(msg, image);
47 }
48 
49 
50 DebugNow::DebugNow(BMessage *archive, image_id id)
51 	:
52 	BScreenSaver(archive, id),
53 	fLine1("DEBUG"),
54 	fLine2("NOW")
55 {
56 }
57 
58 
59 void
60 DebugNow::StartConfig(BView *view)
61 {
62 	BPrivate::BuildScreenSaverDefaultSettingsView(view, "DEBUG NOW",
63 		B_TRANSLATE("by Ryan Leavengood"));
64 }
65 
66 
67 status_t
68 DebugNow::StartSaver(BView *view, bool preview)
69 {
70 	float viewWidth = view->Bounds().Width();
71 	float viewHeight = view->Bounds().Height();
72 
73 	BFont font;
74 	view->GetFont(&font);
75 	font.SetSize(viewHeight / 2.5);
76 	view->SetFont(&font);
77 
78 	fDelta.nonspace = 0;
79 	fDelta.space = 0;
80 	BRect stringRect;
81 	font.GetBoundingBoxesForStrings(&fLine1, 1, B_SCREEN_METRIC, &fDelta,
82 		&stringRect);
83 	float y = ((viewHeight - (stringRect.Height() * 2 + viewHeight / 10)) / 2)
84 		+ stringRect.Height();
85 	fLine1Start.Set(((viewWidth - stringRect.Width()) / 2) - stringRect.left, y);
86 	font.GetBoundingBoxesForStrings(&fLine2, 1, B_SCREEN_METRIC, &fDelta,
87 		&stringRect);
88 	fLine2Start.Set(((viewWidth - stringRect.Width()) / 2) - stringRect.left,
89 		y + stringRect.Height() + viewHeight / 10);
90 
91 	// Set tick size to 500,000 microseconds = 0.5 second
92 	SetTickSize(500000);
93 
94 	return B_OK;
95 }
96 
97 
98 void
99 DebugNow::Draw(BView *view, int32 frame)
100 {
101 	// On first frame set the low color to make the text rendering correct
102 	if (frame == 0)
103 		view->SetLowColor(kMediumBlue);
104 
105 	// Draw the background color every frame
106 	view->SetHighColor(kMediumBlue);
107 	view->FillRect(view->Bounds());
108 
109 	// Draw the text every other frame to make the it blink
110 	if (frame % 2 == 1) {
111 		view->SetHighColor(kWhite);
112 		view->DrawString(fLine1, fLine1Start, &fDelta);
113 		view->DrawString(fLine2, fLine2Start, &fDelta);
114 	}
115 }
116 
117