정보통신산업경쟁력강화사업 최종연구개발결과보고서 전자종이디스플레이의특성에맞는 GUI 시스템개발 A Development on the GUI System Customized for E-Paper Display 주관연구기관 : 주식회사인투텍 참여연구

Similar documents
Microsoft PowerPoint - Flexible Display 인쇄본

Ⅰ 개요 1 기술개요 1. OLED OLED(Organic Light Emitting Diodes),,,, LCD, [ 그림 ] OLED 의구조 자료 : TechNavio, Global Organic Light-emitting Diode (OLED) Materials

PowerPoint Presentation

<464B4949B8AEC6F7C6AE2DC0AFBAF1C4F5C5CDBDBABBEABEF7C8AD28C3D6C1BE5FBCD5BFACB1B8BFF8BCF6C1A4292E687770>

LG Business Insight 1142

Microsoft PowerPoint - OLED_vs_LCD.ppt [호환 모드]

서현수

1

<31312EC0FCC0DAC1BEC0CCBFCD20C0AFB8C1B1E2BCFA2E687770>


<342D312E20B9AEC8ADBCD3C0C7B0FAC7D02DB1E8C3B6BECF2E687770>

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

ePapyrus PDF Document

슬라이드 1

Ⅰ. 디스플레이개념및범위 1. 디스플레이산업의개념및범위 디스플레이는다양한정보를인간이볼수있도록화면으로구현해주는영상표시장치를 통칭하며전자기기와사람과의인터페이스로, 각종전자기기로부터출력되는전기적정보 신호를광정보신호로변환하여인간이시각을통해인식할수있는숫자, 문자, 도형, 화상등


BN H-00Kor_001,160

열거형 교차형 전개형 상승형 외주형 회전형 도해패턴 계층형 구분형 확산형 합류형 대비형 상관형 (C) 2010, BENESO All Rights Reserved 2

KEIT PD(15-8)-8.26.indd

농림축산식품부장관귀하 본보고서를 미생물을활용한친환경작물보호제및비료의제형화와현장적용매뉴 얼개발 ( 개발기간 : ~ ) 과제의최종보고서로제출합니다 주관연구기관명 : 고려바이오주식회사 ( 대표자 ) 김영권 (

실험 5

태양광산업 경쟁력조사.hwp

<BFACBDC0B9AEC1A6C7AEC0CC5F F E687770>

ePapyrus PDF Document

BS-K1217-M□□-3012_ProductGuide_KR_PDF

Microsoft PowerPoint - 30.ppt [호환 모드]


Visual Studio online Limited preview 간략하게살펴보기

歯4Q01_실적

Microsoft Word - PEB08_USER_GUIDE.doc

Microsoft Word - PLC제어응용-2차시.doc

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

디지털영상처리3

융합WEEKTIP data_up

- 2 -

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

Microsoft PowerPoint - chap01-C언어개요.pptx

Basic CMYK

[Brochure] KOR_TunA

istay

No Slide Title

..,. Job Flow,. PC,.., (Drag & Drop),.,. PC,, Windows PC Mac,.,.,. NAS(Network Attached Storage),,,., Amazon Web Services*.,, (redundancy), SSL.,. * A

성능 감성 감성요구곡선 평균사용자가만족하는수준 성능요구곡선 성능보다감성가치에대한니즈가증대 시간 - 1 -

Camel_C

PowerPoint Presentation

- 2 -

OCW_C언어 기초

I. 회사의 개요 1. 회사의 개요 (1) 회사의 법적ㆍ상업적 명칭 당사의 명칭은 주식회사 이그잭스라고 표기합니다. 영문으로는 exax Inc.라 표기합니다. (2) 설립일자 당사는 1999년 장("KOSDAQ")에 상장하였습니다. 12월 22일에 설립되었으며, 200

나. 드라이버 IC 종류별세계시장현황및전망 데이터드라이버가스캔드라이버보다규모및성장률에서약간앞서있 으나, 큰차이는아닌것으로나타남 6, 5, 드라이버IC( 데이터드라이버 ) 5.% 드라이버IC( 스캔드라이버 ) 4.3% 드라이버IC( 중소형 ).% 드라이버IC( 대형 )

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지

(2) 설립일자 당사는 1999년 장("KOSDAQ")에 상장하였습니다. 12월 22일에 설립되었으며, 2002년 6월 25일에 한국거래소 코스닥시 (3) 본사의 주소, 전화번호, 홈페이지 주소 가. 본사의 주소 : 경상북도 구미시 공단동 310 나. 전화번호 : 05

U.Tu System Application DW Service AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

가. 도트매트릭스제어하기 단일 LED와는다르게도트매트릭스를구동시는구동전류가프로세서에서출력되는전류보다사용량을더많이필요하기때문에 TTL 계열의 IC로구동시키기에는무리가따른다. 이러한문제를해결하기위해서사용전압, 전류정격이높은달링턴트랜지스터가어레이형태로들어있는 ULN2803을

mobile_guide_SA

±èÇö¿í Ãâ·Â

(SW3704) Gingerbread Source Build & Working Guide

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

<5BB0EDB3ADB5B55D B3E2B4EBBAF12DB0ED312D312DC1DFB0A32DC0B6C7D5B0FAC7D02D28312E BAF2B9F0B0FA20BFF8C0DAC0C720C7FCBCBA2D D3135B9AEC7D72E687770>

ICT À¶ÇÕÃÖÁ¾

6_5상 스테핑 모터_ _OK.indd

전기전자뉴스레터-여름호수정2

API 매뉴얼

* pb61۲õðÀÚÀ̳ʸ

[ 물리 ] 과학고 R&E 결과보고서 유체내에서물체의마찰력에미치는 표면무늬에대한연구 연구기간 : ~ 연구책임자 : 홍순철 ( 울산대학교 ) 지도교사 : 김영미 ( 울산과학고 ) 참여학생 : 김형규 ( 울산과학고 ) 노준영 (

BMP 파일 처리

활력있는경제 튼튼한재정 안정된미래 년세법개정안 기획재정부

(연합뉴스) 마이더스

제8장 자바 GUI 프로그래밍 II

<C3E6B3B2B1B3C0B C8A32DC5BEC0E7BFEB28C0DBB0D4292D332E706466>

16<C624><D22C><ACFC><D0D0> <ACE0><B4F1><BB3C><B9AC><2160>_<BCF8><CC45>.pdf

슬라이드 1

3월 온라인 교육

PowerPoint 프레젠테이션

제목 차례

<322D303720C2F7BCBCB4EBBCBAC0E5B5BFB7C2BBEABEF7C0B0BCBA2E687770>

기관별 공동 Template

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론


<C1A1C1A2C2F8C1A6BDC3C0E55F E786C7378>

DE1-SoC Board


C# Programming Guide - Types

Windows 10 General Announcement v1.0-KO

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

디스플레이 패널 기술 설명 - LCD 모드

- 2 -

How we create value? 안전경영 조직 및 시스템 강화 위원장 위원 간사 CEO 전략사장, CFO, 인사지원실장, 사업부장, 사업장장 안전환경인프라팀장 삼성SDI는 안전사고의 위험성에 대비하고 안전한 근무환경을 조성하기 위해 전담부서 개 편과 업무 관리범위

커버콘텐츠

지능정보연구제 16 권제 1 호 2010 년 3 월 (pp.71~92),.,.,., Support Vector Machines,,., KOSPI200.,. * 지능정보연구제 16 권제 1 호 2010 년 3 월

오토10. 8/9월호 내지8/5

- 2 -

1_12-53(김동희)_.hwp

Windows Live Hotmail Custom Domains Korea

PowerPoint 프레젠테이션

SIGIL 완벽입문

Microsoft Word MetOne237Bmanual

ISP and CodeVisionAVR C Compiler.hwp

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Transcription:

정보통신산업경쟁력강화사업 최종연구개발결과보고서 전자종이디스플레이의특성에맞는 GUI 시스템개발 A Development on the GUI System Customized for E-Paper Display 2008. 05. 30. 주관연구기관 : 주식회사인투텍 참여연구기관 : 주식회사블루비스 지식경제부

정보통신산업경쟁력강화사업 최종연구개발결과보고서 전자종이디스플레이의특성에맞는 GUI 시스템개발 A Development on the GUI System Customized for E-Paper Display 2008. 05. 30. 주관연구기관 : 주식회사인투텍 참여연구기관 : 주식회사블루비스 지식경제부

제출문 정보통신부장관귀하 본보고서를 정보통신산업경쟁력강화사업 전자종이디스플레이의특성에맞는 GUI 시스템개발과 제의연구개발결과보고서로제출합니다. 2008 년 05 월 30 일 주관연구기관 : 주식회사인투텍참여연구기관 : 주식회사블루비스연구책임자 : 류양선참여연구원 : 김정, 장선순, 김재완, 강승일, 민욱기, 이정한, 이재성, 이동식, 김요섭, 이지훈, 안성민, 염진섭, 이원경 - 1 -

요약문 1. 제목 IT 산업경쟁력강화사업전자종이디스플레이의특성에맞는 GUI 시스템개발기술과제 2. 연구개발의목적및중요성 본과제의목표는전자종이디스플레이의특징에맞는 GUI 시스템의개발이며, 이를위해전자종이특성에맞는전용 OS가탑재된전자종이디스플레이장치를개발하고해당 GUI 시스템을적용하였으며부가적으로관련하드웨어 SDK 개발과윈도우즈용시뮬레이션프로그램개발도진행하였다. 전자종이의특징에맞는 GUI 시스템이미들웨어형태로개발된다면전자종이의대중화에따라그파급은전자기기, 광고및출판, 홍보, 인테리어산업에이르는산업분야에서효과적으로이용될수있다. 3. 연구개발의내용및범위 전자종이의디스플레이화면에데이터를출력시, Response Time의최소화 전자종이의잔상의잔상을최소화. 전자종이의데이터를 1차데이터와 2차데이터로구분하여, 1 차데이터는주요시각정보를처리하고, 2차데이터를주위의잔상 - 2 -

을처리하기위한데이터로구분하여, 시각적인인지과정에서빠르 다고느끼도록함. 전자종이출력을위한논리적 Display 설계 - 논리적인계층구조의 Display 처리알고리즘을통해,Depth 개 념으로 Drawing 전자종이디스플레이를위한, Custom Library 개발 - 메뉴, 리스트, 옵션등을처리하기위한 Custom Library 개발 전자종이를구성하기위한가볍고빠른 OS 개발 - Linux 를 Customizing 하여빠르고가벼운전자종이용 OS 플랫 폼개발 4. 시제품개발결과및활용에대한건의 시제품결과는개인용, 가정용, 사무용, 공용으로분류할수있고, 세부적으로는책, 장식, 신문, 벽지장식, 문서뷰어, 모바일단말기, 게시물, 선전물, 간판현수막, 안내표시, 시간표시판등으로응용이가능하다. 우리나라의경우기존의디스플레이산업분야에서의기술축적, 성공경험을바탕으로기술개발이진행되고있다. - 3 -

5. 기대효과 본시제품의개발기술을이용하여다음과같은기대효과를얻을 수있다. GUI 시스템 Library를활용한, 전자종이단말기개발의일정단축 GUI 시스템 Library를, 전자종이단말기의기능의다양화 전자종이응용제품의활성화 - 전자종이의가독성과휴대성을이용한단말기의보급활성화 전자종이사용방법의표준화 - GUI System을일반화하며, 각기다른기기에서도동일란인터페이스를사용함 해당기술의수입대체효과와수출을통한무역경쟁력확보 전자종이디스플레이응용기술의국내보급화 - 과제의공동진행을통해, 해당분양의국내기술력향상 - 4 -

SUMMARY 1. Title A Development on the GUI System Customized for E-Paper Display 2. Project Objective & Importance This proposal reseach is to develop on GUI system customized for E-Paper display. In order to complete this research, development should be done for E-Paper display device loading OS is customized for E-Paper and proposed GUI system was adopted. In addition, development was progressed of hardware SDK and simulator based on the Windows. if the GUI system customized for E-Paper display develops like some kinds of middleware, it will be use on the electronic machine, the advertisement, the publication, the public information and the interior effectively. - 5 -

3. Proposed Contents & Scope minimizing response time when data displays on screen minimizing ghost image of E-paper design of logical display module for displaying the E-Paper development of the Custom Library for the E-Paper display module development of the Tiny OS for the E-Paper display module 4. Proposal about Result and Application of the Prototype Application of this proposal reseach can be classified the personal, the home, the business and the public and can be applied book, decoration, newspaper, wallpaper, document viewer, mobile, announcement product, signboard, guide map and time plate in detail. in our country, E-Paper research of the E-Paper is progressing based on accumulation of technology and experience of success in existing display industry. 5. Project Effect we can get effect like below using this proposal reseach. Reducing period of development of the E-Paper device using proposed GUI system Library. - 6 -

Variousness of function of the E-Paper device using proposed GUI system Library. Revitalization of the E-Paper application Standardization of how to do the E-Paper assurance of competitive trade taking advantage of exports and exchanging imports of this proposed research Internal popularization of the E-Paper application - 7 -

CONTENTS Chapter 1. Introduction 1 1.1. Outline 1 1.2. Background 2 1.2.1. Concept of the E-Paper 2 1.2.1.1. Appearance of the E-Paper 2 1.2.1.2. Construction and principal of the E-Paper 4 - Construction of the E-Paper 5 - Driver layer 5 - Display layer and principal 6 - Other E-Paper type 22 1.3. Recent research tendency 23 1.3.1. Outlook for the E-Paper market 23 1.3.2. E-Paper technique road map 26 1.3.3. Domestic research/market tendency 35 1.3.4. Abroad market tendency 40 1.3.4.1. Japanese tendency 40 1.3.4.2. European tendency 43 1.3.4.3. American tendency 45 1.4. Objective of Proposed research 46-8 -

1.5. Importance of Proposed research 47 1.6. Market of Proposed research 58 Chapter 2. Main subject 59 2.1. Contents of Proposed research 59 2.1.1. Classification and display type of the E-Paper 59 2.1.2. Comparing with other display 62 2.1.3. Particle Method E-Paper 63 2.1.4. Electrophoretic E-Paper 78 2.2. Scope of proposed research 79 2.2.1. Target goal 79 2.2.2. Specification and performance 81 2.3. Manufacturing Technology 82 2.3.1. Algorithm of performance improvement 82 2.3.2. Analysis of source code 90 2.3.3. Design and construction of case 161 2.3.4. Design and construction of hardward 166 2.4. Comparison and Estimation of performance 181 2.4.1. Comparing with existing technology 181 2.4.2. Estimation of performance 192 Chapter 3. Conclusion 193 3.1. Arrangement of proposed research 193 3.2. Proposal for Application of the Prototype 194 3.3. Expected Effect 198 3.4. Commercial Plan 203-9 -

목 차 제 1 장서론 1 제 1 절개요 1 제 2 절배경 2 1. 전자종이의개념 2 가. 전자종이의등장 2 나. 전자종이의구조와표시원리 4 - 전자종이의구조 5 - 드라이버층 5 - 표시층과표시원리 6 - 그외의전자종이방식 22 제 3 절최근연구동향 23 1. 전자종이시장전망 23 2. 전자종이기술로드맵 26 3. 국내연구. 시장동향 35 4. 국외시장동향 40 가. 일본동향 40 나. 유럽동향 43 다. 미국동향 45 제 4 절기술개발의목적 46-10 -

제 5 절기술개발의중요성 47 제 6 절기술개발의시장 58 제 2 장본론 59 제 1 절기술개발의내용 59 1. 전자종이기술의분류와표시형태 59 2. 타디스플레이와비교 62 3. 입자기술전자종이 63 4. 전기영동방식의전자종이 78 제 2 절기술개발의범위 79 1. 최종목표 79 2. 기능및성능 81 제 3 절기술개발의구현 82 1. 제안된성능개선알고리즘 82 2. 구현된소스코드분석 90 3. 기구디자인설계및구성 161 3. 하드웨어설계및구성 166 제 4 절기존기술과의비교및성능평가 181 1. 기존기술과의비교 181 2. 성능평가 192 제 3 장결론 193 제 1 절기술개발의정리 193 제 2 절기술개발의활용에대한건의 194 제 3 절기술개발의기대효과 198 제 4 절상용화계획 203-11 -

참고문헌 [1] 유선희, 기술가치평가, 한국과학기술정보연구원, 2002 [2] 한국전자부품연구원, e-paper 기술로드맵, 2004 6, p13 [3] KISTI 글로벌동향브리핑 (GTB) 2007 [4] 전자부품연구원전자정보센터사업기획개발센터 [5] EInk 사 http://www.eink.com/ [6] Nikkei Electronics Asia http://techon.nikkeibp.co.jp/nea/ [7] Monthly 'DISPLAY' July 2005, TechnoTimes of Japan [8] SID2007 http://www.sid.org/conf/sid2007/sid2007.html [9] LG Philips LCD http://www.lgphilips-lcd.com/ [10] Bridgestone 사 http://www.bridgestone.com/ [11] 삼성 SDI http://www.samsungsdi.co.kr/ [12] ETRI CEO Information, 차세대휴먼인터페이스 Flexible Display, 2004. 6. 30, p.5. [13] MOST, KISTEP, 과학기술예측조사 (2005-2030) 미래사회전망과 한국의과학기술, 2005. 5 [14] 經濟産業省, 經濟産業省技術評價指針, 2002. 4. [15] 新エネルギー産業技術總合開發機構, 硏究開發の經濟 社會効果に關する調査, 2002. 3. [16] 新エネルギー産業技術總合開發機構, NEDO プロジェクトマネジメントにおける技術評價システムの構築調査, 2002. 3. [17] 서경수, 전자종이기술동향세미나자료, 한국전자통신연구원, 2004. 6. 10. [18] 일본경제산업성, 기술전략맵 : 정보통신분야, 2002. 3, p.7. [19] 김대희, E-Paper 산업동향, KETI 주간전자정보, Vol. 7, No. 8,2004, p.11. - 12 -

제 1 장서론 제 1 절개요 종이인쇄물과기존의디스플레이매체를대신할수있는새로운표시소자인전자종이의상용화와시장형성을위한기술개발경쟁이치열해지는가운데, 종이와같이장기간휴대하기용이하며, 우수한시각적특성을제공하는몇몇전자종이가세계시장에소개가되고있다. 전자종이의장점으로는넓은시야각, 밝은흰색배경등을특징으로하는가독성과, 저전력및경량화를특징으로하는휴대성이있다. 이러한장점의부각으로인해전자종이의활용분야와그가치는, 유비쿼터스의주요디스플레이어의장치의목표가될만큼뛰어나다. 하지만전자종이의보급화및대중화에걸림돌이될만한문제가아직남아있으며, 본과제에서는이런문제점에대한정의와개선을제안하려고한다. 아래의도표를통해, 전자종이의문제점에대한본제안의솔루션 - 1 -

을설명한다. < 표 1.1> 전자종이의특징과한계 전자종이의특징과한계 주요증상 본제안을통한해결방안 낮은응답성 -E-Ink사,100ms 불안한응답성휴대용장치기기범용적인 Library 부족 전체화면의갱신을위해 Drawing Response Time이큼 부분화면 Drawing시에는기존데이터잔상이발생 범용적인 OS 사용시, 그용도에있어서부적절하다. 전자종이응용개발회사에서독자적인 GUI를만들어개발해야함. 부분 Drawing 알고리즘적용 ( 빠른데이터처리 ) 1차 Drawing => 이미지변경 2차 Drawing => 잔상제거 ( 시각적인지가능시간의축소 ) 전자종이에특화된 OS Platform 개발 Custom Library를 SDK 형태로개발및배포 전자종이가가지고있는가독성과휴대성의장점을살리기위해서는, 전자종이매체가지니고있는특징을올바르게이해해야하며, 곧다가올전자종이의보급화와대중화이이전에전자종이의제약에대한솔루션이선행되어야한다. 또한, LCD 및 PDP 기술에관한한세계적인경쟁력을가지고있는한국이미래디스플레이장치인전자종이에대한경쟁력확보및강화의필요성을갖고있기에, 본과제의결과물의공유를통한국내디스플레이기술경쟁력을높이려고한다. - 1 -

제 2 절배경 제 1 항 전자종이의개념 가. 전자종이의등장 나무를재료로하는종이가등장하면서종이는수백년동안우리 사회속깊은속까지파고지금까지가장중요한정보전달수단과 기록의용도로사용되고있다. 종이를이용하여정보를전달하던우리들은반세기정도전에브라운관을개발하게되었다. 브라운관을이용하여영상을볼수있었고영상으로기록을하고영상으로정보를전달하게되었고우리들은그것에이제는익숙해진상태이다. 브라운관은이후에 LCD와 PDP와같은평판디스플레이가등장하면서이제역사의끝자락으로사라지려하고있다. 하지만아직도종이는수백년을그렇듯아직도건제하고있다. 현재의디스플레이는평판디스플레이가지배하고있는실정으로 고화질, 경량, 박형, 저소비전략등을무기로앞으로도수십년은계 - 2 -

속주요디스플레이로성장하리라예상된다. 하지만 2010년경에는 Ubiquitous Electronics, Humanoid robot 및 Bio 관련분야의비약적인발전으로우리들은새로운디스플레이디바이스가필요한시점이올것이다. 2004년 2월 Nikkei Electronics Asia에게재된기사 Next Generation Innovative Devices 를살펴보면유비쿼터스환경을위하여디스플레이가추구해야할 3가지연구방향을제시하였는데, 그중의하나가종이를대체하는디바이스의개발필요성이다. 현재호황을누리고있는 LCD와 PDP는과거 CRT에비하면많은장점을가지고있지만종이를대체하기에는역부족인면이있다. CRT에비하면많이가벼워지고부피도줄었지만종이와비교할수는없을정도이다. 이러한이유로많은연구소와기업들은종이처럼적은부피를가지며휴대하기도쉽고또한접을수도있는 E-PAPER를개발하게되었다. 초기의 E-PAPER는 1975년 Gyricon 프로토타이프를개발하여알파벳 X' 한글자를나타내는단계에서시작했다. 그러다 1996년 MIT공대의미디어랩실에있던학생들이전자종이를상업화하기위한 E Ink 사설립되면서발전하기시작하였다. 지금도 E Ink사는 E-PAPER의독보적인존재로많은기술개발과연구로발전시키고 - 3 -

있다. 2007 년 10 월경에는 LG 필립스 LCD 에서 A4 사이즈의칼라전자 종이를개발하였다고기사가났다. < 그림 1.1>Eink 사의전자잉크를사용한 E-PAPER 나. 전자종이의구조와표시원리 (1) 전자종이의구조 전자종이의일반적인구조는그림 3.1 에나타낸샌드위치구조로 되어있다. 그림에서알수있듯이마이크로캡슐과실리콘비즈의 - 4 -

표시층과이것을제어하는드라이버층이두장의플라스틱시트로 끼워진구조로되어있다. (2) 드라이버층드라이버층이라는것은액티브매트릭스액정디스플레이와마찬가지로 TFT(Thin Film Transistor) 로이루어져있으며, 이로써전자종이의자기인자기능이가능해진다. 기존의 TFT에는아몰퍼스실리콘과폴리실리콘등이사용되었지만, 이것을전자종이의드라이버층에이용한경우디스플레이를접거나굽힐수는없다. 그런데최근에는유기분자를사용한플렉시블트랜지스터도실용화단계에가까워지고있어향후에는전자종이의 TFT에이유기트랜지스터가사용될것으로예상된다. 그렇게되면플렉시블디스플레이가실현되는것이다. 단, TFT 드라이버를장착하는경우아무래도가격이상승하기때문에전자종이본래의간편성을잃게된다. 이때문에드라이버층을없애고외부장치를이용해서재기록을수행하는타입의간단한전자종이가고려되고있다. (3) 표시층과표시원리 전자종이로의접근방법으로는액정, 전계발광소자, 미세한프리 즘 시트에의한반사형표시소자등을이용한디스플레이로부터의 접근법과전기영동법, Gyricon 볼, 토너등을이용한종이로부터의 - 5 -

접근법등크게두가지경로가있다. 1) 마이크로캡슐전기영동디스플레이 < 그림 1.2> 입자형구동모식도 전기영동이란전하를띠고있는입자가유체내에분산된상태에 서인가된전기장에의해이동하는현상으로전기영동디스플레이 - 6 -

는투명한현탁액에부유하고있는입자의정전기적이동에의존하는소자로서양의전압이부과되면양전하가대전된흰색입자들은관찰자쪽전극으로정전기적으로이동한다. 이때흰색광산란입자는 near-lambertain 반사를제공한다. < 그림 1.3> E-Ink 사디스플레이의모식도 반대로음의전압이부과되면관찰자에서먼쪽의전극으로흰색입자들이이동하고, 캡슐상부로검은색입자들이이동하여빛을흡수하므로검은색이관찰되게된다. 일단어떤극에서든이동이일어난후전압을제거해도입자들은그자리에그대로머물러있 - 7 -

게되고, 결국쌍안정성을지니는메모리디바이스를제공하게된다. 이와는다르게단일입자를이용한전기영동캡슐도있는데, 이것은투명한고분자캡슐내부에흰색의대전된입자가어두운색으로염색된유체에부유하고있는형태로구성되어있다. 종이와같은외관을가지고, 광반사효율이 40% 이상으로신문과비슷하거나오히려약간높은수치를나타낸다. 인가된전압의세기를이용하여입자의이동을조절함으로써회색스케일의구현이또한가능하다. 구동전압은약 90V이고대조비는약 10:1 이상이다. 전기영동입자가캡슐의한쪽면에서다른쪽면으로이동하는데걸리는시간은 100ms 대에이르며, 이것은비디오매체로의응용에는너무느린편이다. E-Ink 재료는천만번의스위칭사이클에도디바이스구현의감쇠가없이디스플레이신뢰도와안정성을보여주었다. 그러나 Gyricon 디스플레이와마찬가지로 E-Ink도수동형구동원리에기초하면 threshold가없어도그해상도에한계를나타내고있다. 그러므로직접구동은낮은정보콘텐트용응용장치에는효율적이지만고해상도이미지를위해서는능동형매트릭스가사용되어야한다. E-Ink의캡슐은직경이최소 30μm까지작게만들수있고매우가까이밀착시켜패킹할수있으므로볼의크기와공동의공간에의해해상도가제한을받는제록스의디스플레이보다훨씬높은해상도구현이가능하다. 이를바탕으로 2000년 E-Ink의마이크로캡슐전기영동디스플레이와루센트테크놀로지 (Lucent Technology) 의소 - 8 -

프트리소그래피 (Soft-lithograhpy) 방법으로제작한유기트랜지스터를결합하여능동구동형의전자종이가발표되어가볍고, 얇고, 구부림이가능한전자종이제조의전환점을마련했다. 특히제조에있어서상판 ( 마이크로캡슐 ) 과하판 ( 트랜지스터 ) 모두대량생산이용이한프린팅기술을이용함으로써저가의디스플레이제조에크게기여할수있게되었다. < 그림 1.4> E-ink 사마이크로캡슐형 대표적인전기영동디스플레이패널은염료유체에전하입자들이분산된입자분산액이투명한전극판 (front electrode) 과픽셀전극들로이루어진후면전극판 (back-plan) 사이에채워진형태로수십볼트내지수백볼트의 DC 볼트를인가함으로써구동된다. 전기영동디스플레이패널의스위칭속도는기본적인전기영동현 상학가정으로부터계산된다. 전기장이인가된상태에서유체내의 전하를띤안료입자는인가된전기장 (E) 에비례하며속도 (v) 로움직 - 9 -

인다. 그비례상수를 μ로가정하고이를전기영동이동도 (electrophorestic mobility) 라하면, v = μe (1) Smoluchowski는다음과같이전기영동이동도를나타내었다. μ = ζε/η (2) 여기서 ε는전기영동유체의절연상수, η는전기영동유체의점도, ζ는전기영동유체의제타전위 (zeta potential) 다. 제타전위는전하입자를둘러싼전단층 (shear plane) 에서의정전하준위 (electrostatic potential) 다. 제타전위는다음과같이나타낼수있다. ζ=gλd/ε (3) 여기서 g는입자의전하량, λd는입자가전기영동유체내에서차지하는디바이 (Debye) 길이이다. 따라서셀간격이 h에서 v속도로움직이는전기영동입자의스위칭시간은다음과같이정량화된다. total=h/μe = h2/μv (4) 여기서 V는인가된전압 (voltage) 이다. 이식들은스위칭시간을줄이기위해서입자와유체의물리적특성을어떻게조정해야하는지알려준다. 한편, 전자종이의표시원리로서연구개발되고있는것은이것 만은아니어서, 가령캐논은영동입자를수형방향이동시키는인 플레인 (in-plane) 형과브리지스톤의전자분류체등이있다. In-Plane - 10 -

형전기영동디스플레이는격벽으로방을만들고각방에전기영동분산액을분사시키고상분리고분자물질로투명한프론트전극을밀봉시키는공정을연속적으로할수있는롤투롤 (Roll-to-roll) 방식이가능한장점을갖는흑 / 백전자종이의유력한후보중의하나이다. 롤투롤방식으로제조된전기영동디스플레이필름은구동판넬을붙이는공정도연속적으로함께적용함으로써제품의양산성이뛰어나다. 특히 In-Plane( 평면정렬 ) 형전기영동디스플레이의선두주자로서미국의 SiPix는격벽의방으로서자체개발한 microcup을바탕으로시제품을선보이고있다. 특히 microcup짋은양각의형태를지닌몰드를감광성고분자층에압축하면서동시에 UV를조사하여경화된미세패턴을형성하는방식으로, 격벽의형상을자유자재로변화시킬수있는장점을갖고있으며그두께는모듈형태로 150μm 이다. - 11 -

참조 실리콘비즈 이것은원래 Xerox의파로알토연구소에서연구돼온것으로, 지금은실리콘미디어사가주도하고있으며두가지색으로나누어칠한고체입자를이용하고있다. 필름사이에들어있는실리콘비즈는색별로대전이달라드라이버층의전하에의해서이입자를회전시킨다. 이렇게해서백색의반구가앞에나타나면백이표시되고흑색의반구가앞에나타나면흑이표시되는것이다. 두방법모두해상도를올리기위해서는마이크로캡슐혹은실리콘비즈의크기를작게할필요가있다. SiPix에서개발된다이렉트드라이버 (Direct Driver) 전자종이와액티브매트릭스 (Active Matrix) 전자종이는전자레벨, 전자표시장치, 시계및스마트카드등다양한용도로사용된다. 그러나영상을액티브매트릭스전자종이의경우영상을어드레싱 (addressing) 할때로-어드레싱 (row-addressing) 이기때문에전체업데이트시간은영상을어드레싱하는시간과로 (row) 라인의수의곱으로나타내어지기때문에전자잉크의반응시간이느리면화면을업데이트하는시간이매우길어지는단점이있다. 2) 입자형전기영동디스플레이 - 12 -

< 그림 1.5> 입자형전기영동디스플레이동작원리 캐논사에의하면이디스플레이는보기가용이하며, 시안, 마젠다, 엘로를적층함으로써하나의픽셀로컬러표시가가능하기때문에고해상도에유리하지만, 그러나표시의안정성향상에대한문제점들을해결해야하는것으로알려져있다. 상기입자형의경우미립자들의클러스터화및응집형성이상용화에큰걸림돌이되어왔다. 1997년미국 MIT Media Lab. 에서분리되어 Jacobson의주도하에설립된 E-Ink사에서는마이크로캡슐을사용하여이러한문제점들을해결하였다. - 13 -

3) 토너디스플레이플러스대전성흑색토너와마이너스대전성백색토너를봉인한투명전극이부착된 2장의유리판사이에전압을인가하면백색토너는상부전극인플러스전하와의사이에작용하는쿨론힘에의해상부전극을향해이동해서부착하고그와동시에흑색토너는하부전극인마이너스극성에인가한전극으로이동한다. 상부전극측에서이셀을관찰하면백색으로보여외부전압을차단한후에도쿨론힘은유지되므로장시간표시가지속된다. 다음에는전극에인가하는전압의극성을반전하면흑색토너는상부전극으로이동하고그와동시에백색토너는하부전극으로이동해상부전극측에서보면흑색으로보인다. 이와같이인가전압의극성을전환함으로써흑색과백색을표시할수있다. 흑색토너와백색토너는처음에혼합해교반할때서로의마찰로 인해대전하고또다시표시셀에내포된다음에교류전압을인가 함으로써일정한대전량에도달할때까지마찰대전을한다. 그러므로두입자를혼합했을때는양자간에작용하는쿨론인력 ( 引力 ) 에의해응집한다. 이같은전기적인응집구조에대해서는외부전압을인가함으로써서로떼어놓는조작을할필요가있다. 흑색토너는카본블랙을, 백색토너는산화티탄미립자를각각내포하고있어대전성을제어하기위한연구가이뤄지고있다. 또한입자는유동성이좋아야하는데입자유동성의지침이기도한안식각 - 14 -

으로 30 도이하가요망된다. 인가전압과표시셀반사농도와의관계를나타내는것은, 약 200V 에서흑색토너와백색토너는분리되기시작한다. 그리고약 500V 에서양쪽은완전히분리돼표시하게됨을알수있다. 이높은구동전압은전극간거리를짧게함으로써줄일수있고전극간거리 30μm에서는구동전압이약 150V이다. 이표시셀은백색으로표시될때의백색반사농도 0.3, 백색반사율 50% 이고흑색으로표시될때의흑색반사농도 1.4, 흑색반사율 4% 이다. 그리고백색반사율과흑색반사율의비율로나타내는콘트라스트는 12.5이다. 백색표시에서흑색표시혹은흑색표시에서백색표시로전환할때그전압에대한응답시간은약 1밀리초이다. 이런현상을보이는것은입자가대기중에서이동하는속도가빠르기때문이다. 마찬가지의기본원리에기초하는표시방법으로는전자분말유체를사용한입자이동형표시가보고되어있다. 마이너스전하를가진백색입자와플러스전하를가진흑색입자를사용했으며어느쪽의분말이든모두액체와같은유동성을보인다. 격벽을둔 2장의투명전극사이에두입자를봉인하고인가전압에의해상하로이동시켜서표시한다. 응답시간은약 0.2밀리초이고고속으로바꿔쓸수있다. 크기는 3.1인치, 화소수 160 160, 해상도 66dpi의패널을시험제작했다. 백색반사율은 41%, 화상을개서하는시간은 67 밀리초이다. 4계조로중간조를표시할수있음을확인했다. - 15 -

입자이동형전자페이퍼의플렉시블화에있어서문제점은셀벽을 작성하는방법이다. 일례로포토리소그래픽으로작성되어있지만 더욱간단한방법으로작성할수있는그어떤방법이요망된다. 4) 콜레스테롤액정을이용한디스플레이 Kent Display 사의콜레스테롤액정디스플레이는 1993년에개발되어 LCD 기술에기초하여작동되고있다. 이기술은랩탑컴퓨터에주로사용되는 twisted nematic(tn) LCD와그제조법에서매우흡사하다할수있지만실제로콜레스테롤 LCD는완전히다르게작동한다. TN LCD는무수히많은완전칼라픽셀들로구성되고, 각픽셀은세개의서브픽셀, 즉적색, 녹색, 청색요소를포함한다. 각서브픽셀은두개의편광필터사이에액정이채워진샌드위치형태이고편광필터는서로 90 로편향되어있다. 편광판을통과한편향된빛은액정의꼬인구조를통과한후 90 로회전하게됨으로써결국 2차편광판을통과할수있게된다. 그러나전기장이부과되면액정은자체적으로전장에평행하게배열하고, 따라서빛은완전히 2차편광판에의해흡수된다. 이는액정을꼬이거나배열된상태로스위칭함으로써 LCD 뒤의백라이트빛을투과또는차단하는원리다. 완전칼라 TN 디스플레이에서는각서브픽셀위에세가지색의필터를두어서하나의픽셀을만들고, 각서브픽셀에다양한크기의전압을인가하면적색, 녹색, 청색광은혼합하여다양한색조와톤을발현하게된다. TN LCD처럼콜레스테롤 LCD도 - 16 -

색첨가의원리에기초하여동작하고마찬가지로투명한 ITO 전극을각픽셀의아래 위에사용한다. 그러나콜레스테롤디스플레이는빛을서브픽셀에통과시키기보다는반사시킨다. 다시말해서로다른파장을선택적으로반사함으로써색을발현하는것이다. < 그림 1.6> 콜레스테롤액정디스플레이픽셀에서의 3가지상태 전도성전극사이에끼워져있을때콜레스테롤액정은 focal conic과 planar 상태의두안정한상태사이에서스위칭될수있다. Focal conic 상태에서 helical 구조는배열되지않거나뒤섞여있고, 액정은투명하므로빛은그것을통과하여검은기판에흡수된다. Planar 상태에서는 helical 구조축들이모두디스플레이표면과직각을이루고있다. 그러므로 helical 구조의꼬임정도를조절하면, - 17 -

즉 helical pitch의길이를조절하면콜레스테롤액정이적색, 녹색, 청색과같이서로다른색깔을반사하게만들수있다. 콜레스테롤액정은한색깔만반사하고나머지두색깔에대해서는투명하기때문에적색, 녹색, 청색은각각겹쳐지게되어밝은색상을보이거나흰색을반사할수있다. 그리고검은색의흡수층은검은색을제공한다. Planar 반사상태의픽셀은 10~20V를인가함으로써 focal conic 투명상태로스위칭될수있다. 그후전압을제거해도 focal conic 상태는무한하게유지될것이다. 그러나 focal conic 상태에서다시 planar 상태로돌아가려면두단계가필요하다. 이디스플레이는우선 homeotropic 상태라고알려진매우정렬된상태를거쳐야하며이과정은 30~40V를요구한다. 만약이전압이갑자기제거되면액정은그자리에서영원히 planar 상태로계속남아있을것이다. 그러나전압을서서히감소시키면액정은뒤섞인 focal conic 상태로돌아갈것이다. 종이와같이모든방향에서의가독성을지니기위해서액정구조는약하게파괴되는데, 다시말해서 helical 구조의열이약간비틀어져서정렬되도록한다. Kent 디스플레이는매우넓은시야각에서반사가가능하도록하는독보적인정렬기술로이구조를만든다. 이기술이종이에비해서가지는또하나의장점은비디오디스플레이가가능하다는것이다. 콜레스테롤액정의동적반응시간은 30~100ms로비디오를보는데필요한스위칭속도 ( 약 20ms) 에가깝다. 비록이기술이많은전력을소비하는단점이있지만이미지 - 18 -

를삭제하지않으면적어도 1 년은디스플레이에이미지가지속되는 저장능력또한가지고있다. 5) Two-color ball을이용한 Gyricon 디스플레이 1970년대제록스의팔로알토연구센터는종이를대체할만한새로운디스플레이를제안하였다. Gyricon 디스플레이라고불리는이디스플레이는복사기에사용되는것과비슷한수백만개의작은비드가오일이채워진엘라스토머매트릭스공동 (cavity) 에분산되어있고양쪽으로플라스틱시트가붙들고있는형태로되어있다. < 그림 1.7> Two-color ball( 왼쪽 ) 과원리 ( 중간 ) 이유연한디스플레이는플라스틱랩과같이긴롤로제조될수있다. 여기서볼은양쪽이강하게대조되는반구형태로, 한쪽은빛을흡수하는검은색이고다른한쪽은빛에매우반사적인흰색이다. 이이색성볼은그제조방법이매우간단하므로제조단가가매우저렴하다. 볼은흰색과검은색의왁스같은플라스틱용융체를가까이밀착시킨스핀디스크의반대편에서각각스프레이함으로써각용융체줄기들이한면에서접합되고재빠르게파괴 분리되어 - 19 -

< 그림 1.8> Gyricon 디스플레이의모식도 이색성접합체를형성하고이것은공기중에서식어서비드로고화된다. 이때디스크의스피닝속도가볼의크기를결정한다. 볼과오일의비중은거의비슷하게일치하므로전장에의해서볼의위치가정해지면볼은쉽게움직이지않는다. 따라서전장을제거하더라도 Gyricon 이미지는, 디스플레이장치가어떻게조작되느냐에달렸지만, 몇시간혹은며칠동안지속될수있는쌍안정성 (bi-stability) 을나타낸다. 양면의플라스틱시트에전기장을부가하기위해서 ITO 전극을두시트의내면에코팅하게되고, 전극에가해진전압은유체가채워진공동안에서볼을떠올려회전하고이동하게만든다. Gyricon 볼은서로다른면의대조를통하여디스플레이를구현하게되는데, 각각의면의극성은전극에가해진전압의세기와볼이 - 20 -

함유하고있는전하의양에의존하고이것은볼의회전과이동의 속도를결정하는중요한인자이다. < 그림 1.9> QR-LPD 모식도와디스플레이 6) Bridgestone의 QR-LP(quick response-liquid powder display) 일본의브릿지스톤 (Bridgestone) 사는디스플레이사업의다각화를위한일환으로, ' 종이같은디스플레이 ' 모델을일본요코하마전시회에서선보였다. QR-LPD( 신속응답액체가루디스플레이 : quick response-liquid powder display) 장치 ' 액체가루 ' 를주된요소로사용하고있다. 액체가루는일종의폴리머로서, 전기장에따라입자와액체사이를오간다. - 21 -

이디스플레이는얇고간단한구조를지니고있으며, 전원이끊어진경우에도그림을유지할수있는일종의 ' 메모리 ' 기능이있어저전력소비특징을지니고있다. 반사형디스플레이장치는이러한액정가루를두개의기판사이에샌드위치형태로끼워놓은구조를가지고있다. (4) 그외의전자종이방식여기에소개한표시방법이외에도많은기술이보고돼있다. 예를들면카이랄네마틱 (Chiral Nematic) 액정방식의전자북이실용화돼단행본크기의좌우양페이지책자형으로 XGA(1024 768 도트 ) 모노크로표시를할수있다. 그리고 2장의투명전극사이에마이크로캡슐화한코레스테릭과유기광전도층을적층한구조이고, 전압을인가하면서조광 ( 調光 ) 패널에서빛의패턴을조사 ( 照射 ) 함으로써화상을그리는액정 / 광전도층복합방식이보고돼있다. 다음은나일론을합성할때실리카원 ( 源 ) 인규산나트륨을공존시킨유기무기나노복합물질 (Nano-composit) 을사용해비스마스이온등의금속이온을전극상에서산화환원에의한일렉트로크로믹방식의발색 ( 發色 ) 소색 ( 消色 ) 을이용한전자페이퍼도보고돼있다. 실리카미립자가나일론에미 ( 微 ) 분산되어있는것으로순백색의펄프형상을띠고있다. 백색반사율 60% 이상, 콘트라스트 10, 응답시간 500밀리초라는표시특성을나타낸다. 전자누출효과 (Electro-wetting 방식 ) 를이용한표시방식이보고돼있다. - 22 -

21세기유비쿼터스네트워크시대에는종이와같은유연성을지녀자유롭게갖고다닐수있는전자페이퍼가출현할것으로기대되는데, 우선실용화제 1단계가시작됐다. 그리고이용하는재료에따라서는전자페이퍼의향상을더한층기대할수있다. 특히플렉시블화를진행함에있어표시기능을가진기능성재료인동시에기판이나벽재료등의고분자재료가수행해야할역할은점점커지고있다. 제 3 절최근연구동향 제 1 항 전자종이시장전망 플렉시블디스플레이시장은 e-paper 기술중심의다양한신규어 플리케이션시장과기존에존재하는시장등 2 개의큰시장영역에 서성장해나아갈것이다. - 23 -

< 그림 1.10> Flexible Display Market-수요전망 ( 금액기준 ) e-paper 기술기반의 7인치급이하의플렉시블디스플레이는기존의 TFT-LCD 대비하여화질과색상등품질면에서경쟁적이지는않지만얇고, 가볍고, 전력소모가극단적으로적은등의이유로 e-book 이라는형태의신규어플리케이션영역에서 2008년부터는새로운시장을창출할것으로전망된다. 2011년부터는 3인치급이하의 LCD와 OLED기반의플렉시블디스플레이를채용한 high- end의모바일폰이등장하고, 2013년에는 4인치에서 9인치급의 OLED기반의모바일폰이외의다양한어플리케이션에도플렉시블디스플레이가채용될것으로전망한다. 기본적으로기존의 TFT-LCD 와동등한수준의품질을구현한플 - 24 -

렉시블디스플레이가출현한다면, 전체어플리케이션을대체하는 속도는매우빠르게진전될것으로확신한다. 2016년부터는 LCD, OLED기반의 10인치이상급의대형디스플레이시장, 즉기존의노트북, TV, 모니터등도기존과는전혀다른디자인과컨셉을담은신제품들이개발되고상품화될것으로전망된다. 기존어플리케이션의대체시장분야에서는단기시장 (5년이내 ) 에서는모바일폰이그대세이고, 장기시장 (9년이후 ) 에서는 10인치이상의대형디스플레이시장에서 TV, 노트북, 모니터등이대체되는플렉시블디스플레이가적용될것으로본다. 플렉시블디스플레이시장은 2010년약2.8억불에서, 2015년약 59억불, 2017년약122억불의시장을형성할것으로전망된다. 플렉시블시장은장기적인관점에서는기존의다양한디스플레이 가궁극적으로가장효율적인 1,2 개의디스플레이기반기술로단 순화되고통합되는과정을거칠것으로예상된다. 또한지금까지의개념과는완전히차별화되고다른개념의노트북, 모니터, TV 혹은이러한기능들을통합한새로운개념의디자인과기능을가진디스플레이어플리케이션이등장할것으로보인다. - 25 -

제 2 항 전자종이기술수준및기술로드맵 국내에서전자종이에대한연구는선진국에비해매우짧은편으로 1990년대말한국전자통신연구원, 한국전자부품연구원등정부출연연구소를중심으로연구가시작되었고, 산업계에서관심을갖고연구개발을시작한것은최근부터이다. 한국과학기술기획평가원 (KISTEP) 에서조사한과학기술예측조사 (2005-2030) 자료에따르면전자종이기술에대한주요선진국대비국내기술수준은전체적으로 58.1% 정도로서전체산업분야의평균인 52.2% 보다는높지만선진국에비해기술격차가큰실정이다. 특히, 실제촉감까지전달되는입체디스플레이기술과휴대용공간디스플레이시스템, 완전컬러가가능한 e-paper 기술등은기술격차가매우큰것으로나타났다. - 26 -

< 그림 1.11> 선진국대비국내기술수준및중요도지수 자료 : MOST, KISTEP, 과학기술예측조사 (2005-2030) 미래사회전망과한국의과학기술, 2005. 5, KISTI 재구성 또한, 연구개발의중요도측면에서는완전컬러가가능한 e-paper기술을비롯하여유기물질로이루어진대형플렉시블디스플레이, 휴대용공간디스플레이시스템, 롤러벌휴대용디스플레이등이높은것으로나타나이에대한투자의우선순위를높일필요가있는것으로조사되었다. - 27 -

< 표 1.2> 세계연구개발중요도 자료 : MOST, KISTEP, 과학기술예측조사 (2005-2030) 미래사회전망과한국의과학기술, 2005. 5, 조사방법 : Delphi법 그리고, 국가과학기술위원회가발표한자료에따르면차세대디스플레이기술평판디스플레이기술에대한우리나라의기술경쟁력은 LCD TV, PDP TV, 업무용 TFT LCD, 프로젝션부문에서세계적으로리더그룹에속해있으며, 가전및업무용 AMOLED분야는경쟁력이있는것으로보고있으나, 전자종이분야는우리나라의경쟁력이매우취약한것으로분석하고있다. - 28 -

< 그림 1.12> 우리나라의기술경쟁력및기술성숙도분석 자료 : 국가과학기술위원회, 차세대디스플레이기술, 2002. 10, p.32. 또한, 기술의성숙도측면에서는 LCD TV, PDP TV, 업무용 TFT LCD, 프로젝션부문은성장단계에진입하였으며, OLED 는도입단 계, 전자종이는초기단계인것으로조사되었다. < 그림 1.13> 은선진국과우리나라의기술수준및격차를반영하여 전자종이기술에대한미래기술연표를작성한것이다. - 29 -

< 그림 1.13> 전자종이기술에대한미래기술연표 자료 : MOST, KISTEP, 과학기술예측조사 (2005-2030) 미래사회전망과한국의과학기술, 2005. 5, 조사방법 : Delphi법 전자종이는 1960년대에초기연구가시작된이래, 1975년 Xerox에서초보적인프로토타입의전자종이를구현하여영문자 X를표시하였으며, 1999년에는 E-ink사에서 Immedia라는최초의전자종이제품을출시하였다. 현재많은업체에서다양한모드의전자종이를구현하여발표하고있으며, 지속적인기술및제품개발을통하여 2010년에는충분한유연성과디스플레이로서의기능을완전히갖춘전자종이가대량생산체제에접어들것으로전망하고있다. - 30 -

< 그림 1.14> 전자종이기술로드맵 자료 : 한국전자부품연구원, e-paper 기술로드맵, 2004. 6, p.13. 전자종이는 1960년대에초기연구가시작된이래, 1975년 Xerox에서초보적인전자종이의잉크는컬러화, 적정응답시간의확보및고해상도실현에관건이되는핵심재료이며, 컬러화기술은조기달성이가능할것으로예상하고있고, 적정응답시간을확보하기위해서는잉크의질량을줄이면서하전량을키워야하며, 고해상도구현을위해서는나노크기의잉크개발이요구된다. - 31 -

종래의종이를대체한다는개념에서전자종이는플라스틱기판을사용해야하고, 플라스틱기판에의투명전극형성및기판의가스차단성문제해결이요구되며, 2006년부터플라스틱기판을이용한전자종이가구체화될것으로보인다. 낮은그레이드의전자종이제품에는단순매트릭스타입이적용되고, e-book, e-paper 등에는 a-si TFT가채택될것으로전망된다. TFT 어레이가모두유기물로구성된 Organic TFT는 2010년경제품에적용될것으로예상된다. 전자종이제품의성능과관련된해상도, 응답속도, 대조비, 수명은 2007년을기점으로그성능이한단계향상되고, 2010년에는풀컬러제품에의적용이가능한수준으로향상될것으로기대된다. 초기전자종이의적용분야로는게시판, 가판대, 가격표등에응용되고, e-book, e-newspaper 제품의경우는 2005년부터소규모시장이형성되어 2008년부터본격화될것으로예상되며, 2010년에는초대면적전자종이제품의출시가예상된다. 또한, 일본의경제산업성이작성한기술전략맵에의하면일본에서는 2010년까지능동방식 LCD를이용한플렉시블디스플레이를개발하고, 2010년이후에는능동유기 EL을이용한플렉시블디스플레이를개발할계획이다 (< 그림 1.15> 참조 ). 그리고, 나노기술을이용한전자종이는 2007년까지자색도 80%, 콘트라스트 15:1의캡 - 32 -

슐 입자재료를개발할계획이며, 그이후에는자색도 90%, 콘트 라스트 20:1 의캡슐 입자재료를개발해나갈계획이다. < 그림 1.15> 일본디스플레이기술전략맵 자료 : 일본경제산업성, 기술전략맵 : 정보통신분야, 2002. 3, p.7. 한편, 우리나라는기존의디스플레이기술을이용한전자종이의구현에역점을두고기술개발을추진하고있으며, 기판의경우기존의유리기판에서점차유리와플라스틱을같이사용하고, 2010년경에는플렉시블기판으로대체될것으로예상된다 (< 그림 1.16> 참조 ). 디스플레이는컬러반사형 LCD의고휘도화와, 유기 EL의고효율화를통해점차필름디스플레이형태를취하고, 전자회로인스위칭소자는저온 p-si TFT에서저온공정개발을통해고속응답이가능한초저온 p-si TFT나 OTFT를구현하여새로운형태의디스플레이가탄생할것으로보고있다. 또한, 배터리도기존의박막형폴 - 33 -

리머배터리에서고용량화를추구하며점차유연성이가미된종이 배터리로발전할것으로전망하고있다. < 그림 1.16> 플렉시블디스플레이기술로드맵 자료 : ETRI CEO Information, 차세대휴먼인터페이스 Flexible Display, 2004. 6.30, p.5. - 34 -

제 3 항 국내연구 시장동향 우리나라에서는 LG Philips LCD, 삼성전자, 삼성SDI, 소프트픽셀, 아이컴포넌트등의기업연구소를포함하여한국전자통신연구원 (ETRI), 전자부품연구원 (KETI), 경희대, 고려대, 동아대, 한양대등에서플렉시블 LCD, OLED, e-paper에대한연구를진행하고있다. 미국, 일본, 유럽에비해비교적늦게플렉시블디스플레이에관한연구를시작하였기때문에원천기술및특허, 핵심부품, 장비, 재료분야에걸쳐서많이뒤쳐져있으며플렉시블디스플레이관련연구개발이주로 LCD나 OLED, OTFT쪽으로집중하고있는것도사실이다. 한국과학기술연구원과전자통신연구원같은국책연구소에서마이크로캡슐형 e-ink 시스템개발연구가진행되고있으며, 경북대학교에서는마이크로캡슐제조기술및 e-ink 필름라미네이팅 (laminating) 기술및유기 TFT 기판을이용한전자종이개발을진행중이다. 인하대학교에서는컬러필터없이컬러를구현할수있는컬러 e-ink 입자를개발중이기도하다. 또한삼성 SDI, 삼성종합기술원, LG전자및 LG Philips LCD 등의기업체들도차세대산업의일환으로활발한연구를하고있다. 삼성전자에서는 a-si TFT 기판에 E-Ink의 e-ink 필름을이용한 5.7인치단색 e-book 시제품을개발한바있다. 전자종이가향후폭넓게상용화되기위해서진행되어야할연구과제가많이있다. 시장개척과프로세스단순화등 - 35 -

이그예이다. 또한차세대디스플레이로서의가능성은플렉시블한기판을사용하여휘거나구부리거나접을수있는디스플레이구현이가능하다는데그의미가있다. 그러나현재의무기물을이용한 TFT 구조로는불가능하기때문에유기물질을이용한 OTFT(organic TFT) 개발이선행되어야하며, 이에대한많은연구가전세계적으로진행되고있다. 화면유지에추가전력이필요없어매우낮은소비전력을갖고있는전자종이의경우한번화면을표시하면새로운화면으로바꾸어주기전까지는그화면을반영구적으로표시하는특성을갖고있기때문에한화면을오래표시해줘야만하는 ebook, 전자사전, 전자신문, 전자광고및식당의메뉴판까지넓은분야를잠재시장으로갖고있다. 닛케이일렉트로닉스아시아 (2001 년 9월 ) 에게재된기사 (Market Growth Hooped for organic EL, E-paper displays) 와디스플레이서치 (2003년 1월 ) 에의하면 2005년본격적인시장형성, 2010년대규모시장형성과함께연평균 300% 의성장을기록할것이라고예측했으나, 현재그성장은정체되고있다. LCD에비해백라이트가필요하지않으며종이와유사한콘트래스트를나타내고, 롤프로세서에의한양산성과잉크재료의쌍안정성 (bistability) 로저전력소모와그로인한경량화의용이성, 잉크재료특성으로인한유연성 (flexibility) 등의장점을갖는다. 단점으로낮은수명과배터리장착필요성, 소비자의종이사이의선호도에대한불확실성, 핵심응용분야의부재와그로인한모듈메이커의부재로이어지는등발전이더딘상황이다. - 36 -

DigitalPublishingNews.net(2005년 7월 ) 의보고서에따르면전자종이는 2008년에나시장에진입이가능할것으로전망했으며 2010년경에는 A4 크기의전자종이가대략 100달러의가격에팔릴것이라고한다. 그러나, 우리나라는이미 TFT-LCD 및 PDP, OLED와같은디스플레이산업에서전세계시장을주도하고있으므로이러한앞선기술및경험을이용한다면플렉시블디스플레이의개발이좀더쉬울수있을것이다. 이와관련해서정부를비롯하여학계및업계에서도플렉시블디스플레이연구에더많은힘을쏟아야만한다. - 37 -

< 그림 1.17> LG Philips LCD 의 14.1 인치형 VGA 급전자종이와 6 인치형 800x600 화소, 모노크로전자종이 미국롱비치에서개최된국제정보디스플레이학회 (SID2007) 에서는 LG Philips LCD와삼성전자가미국 E Ink사의기술을기반으로한시제품을전시했다. LG Philips LCD는 14.1인치형 VGA급전자종이와 6인치형 800x600화소의모노크로전자종이가선보였다. 삼성전자는칼라전자종이의제조를위해 LCD 패널용제조라인의전용을상정한제조기술을개발하고, 이기술로제작한시제품을전시했다. 보통의 LCD 제조라인은전자종이의지지기판으로사용되는플라스틱을취급하도록만들어져있지는않다. 삼성은 LCD 패널용제조설비를전자종이제조에사용할수있 - 38 -

도록플라스틱기판을지지기판에부착하여 TFT와칼라필터를형성하는공정을새로개발했다. 삼성이전시한전자종이는 14.3인치형칼라전자종이와 8.1인치형칼라전자종이이다. 또한일본의브릿지스톤도종래에비해밝기를두배로향상시킨 A4 사이즈의전자종이를개발하여전시했다. 브릿지스톤의기존전자종이개발품은 LCD용칼라필터를사용해왔으나, 이번에는전자종이전용칼라필터를채용함으로써색순도를확보하고밝기를크게향상시킨것이다. 정부의경우 21세기프론티어사업 의일환으로차세대정보디스플레이기술개발사업단 ( 단장박희동 ) 을중심으로전자종이연구를포괄하는플렉시블디스플레이기술개발을위한연구과제를추진하고있다. 또한정보통신부의주도하에전자통신연구원에서도선도기술개발사업으로플렉시블디스플레이연구개발과협력을진행하고있다. 2008년경에는 1-2개의플렉시블디스플레이주요기술을개발하는것을목표로하고있으며, 연간약 100억원씩연구개발비를투자하고있다. 경희대정보디스플레이학과장진교수는플렉시블디스플레이핵심기술의하나인플라스틱기판위에 OTFT를손쉽게제작하고, 높은해상도를구현하는패턴형성기술을개발했다. 또한, 디피아이솔루션스기술연구소의김철환박사는차세대평판디스플레이및플렉시블디스플레이용유기투명전극을개발했다. 그리고, 삼성전자가경희대와아몰포스실리콘 (a Si) TFT를기반으로한플렉시블디스플레이의후면판개발에나서고있고, 삼성SDI는 - 39 -

자사중앙연구소와독일베를린연구소에서 LITI(Laser induced thermalimaging) 로불리는레이저전사공정기반의플렉시블 OLED 후면판을개발중이다. 또국내벤처기업들도초기틈새시장공략을위해초기단계의플렉시블디스플레이상품을집중적으로연구중이다. 제 4 항 국외시장동향 가. 일본동향 일본에서는 Hitachi, 소니, AIST, Seiko-Epson 등의기업및국가 연구소에서 OTFT, Poly-Si TFT, 플렉시블 OLED 를연구중이다. 도시바는 Plastic TFT-LCD를이용한구부러지는디스플레이를개발했으며, Shimadzu는헤어밴드 Type의 EGD 상용화, SVGA(800 600) 급의고해상도실현, 30만엔정도로아직은고가로특수용도에적용하고있다. 일본에서는 Hitachi, Sony, AIST, Seiko-Epson 등의기업및국가 연구소가함께연계하여 OTFT, Poly-Si TFT, Flexible OLED 등에 대한연구가활발하게이루어지고있다. - 40 -

< 그림 1.18> 휴대전화의색은전자종이가구현할수있는다섯가지색에맞추어구성됨. 일본의소프트뱅크텔레콤은지난 2007 년 2 월공중무선랜에접 속할수있는전자종이를개발했다고밝혔다. 이러한시도는히타 치의전자종이기술과소프트뱅크텔레콤의무선랜인증기술을접 목한것이며, 공공장소에설치된전자종이단말기가자동적으로 무선랜에접속하여표시정보를정기적으로바꿀수있도록하고 있다. 이는네트워크서비스와전자종이의융합기술로서주목할만 하다. - 41 -

< 그림 1.19> 4cm 8cm 의전자종이위에키패드용수지를배치한 NTT 도코모의휴대전화 이외에도일본에서는다양한전자종이기술관련서비스솔루션에대한검증실험이진행되고있다. 일본미츠코시 ( 三越 ) 백화점은 2006년 1월 31일부터 2월 13일까지 2주동안긴자 ( 銀座 ) 점내의일부매장에서상품관리를위해전자종이와무선태그 (RF 태그 ) 를사용한점포운용실증실험을수행한바있다. 이점포에서는약 5000벌의청바지에 13.56MHz 대역의전파를사용하는무선태그를부착하여상품관리에사용하고, 각종정보기기와조합하여점포운영과접객에대한효과를검증하는실험이실시되었다. 구체적으로는, 컬러전자종이를사용한 [ 전자가격표 ] 를부착한진열대를준비하고, 시착실에놓여있는터치패널식단말기를사용하여고객 - 42 -

에게상품별가격과재고정보를바로알수있도록하였다 한편, 일본최대의휴대전화업체인 NTT 도코모는미국 SiPix imaging 사의 전자종이제품을이용조작키의표시부분에전자종 이를이용한휴대전화기를개발하였다. 키패드맨윗부분은투명수지가배치되었으며, 개별키아래에전자종이가설치되어있다. 전원이꺼져있을때는전원키만이표시된다. 전원키를눌러대기상태가되면보통의휴대전화처럼아이콘과숫자키가표시된다. 메뉴선택시에는키의표시가화살표모양으로변하며, 전자계산기모드에서는키표시가사칙연산용표시로변한다. 또한메일입력시에는일본어의히라가나, 가타가나, 영문, 숫자등이각각모드에따라키표시를바꾼다. SiPix imaging사의전자종이는수지기판위에제작된 [ 마이크로컵 ] 이라고불리는작은방에백색입자와착색액체를충전한구조를가지고있다. 백색입자의백색과착색한액체의색으로구성된두가지색을표시할수있다. 현재 SiPix imaging사가제공하고있는전자종이는청색, 적색, 녹색, 황색, 흑색의액체를이용한다섯종류의 2색표시제품이다. NTT 도코모는이들색을조합하는형태로다섯종류의휴대전화기를시작하였다. 나. 유럽동향 - 43 -

유럽의경우네덜란드의필립스가주축이되어플렉시블디스플레이의개발및상용화추진을위해 Polymer Vision을설립하고집중투자하여종이보다얇은 두루마리디스플레이 인리디우스개발했다. 영국의 Plastic Logic에서는 Ink-jet 기반의 OTFT와이를이용한플렉시블디스플레이용 Backplane을개발했다. 유럽은미국과함께유럽은플렉시블디스플레이에관해서많은 원천기술을보유하고있으며특히재료분야에서강세를띄고있 다. 최근프랑스의일간경제신문지인 [Les Echos] 가 2008년을목표로전자종이를사용한전용단말기로전자신문의배송서비스를시작할예정이다. 이를계기로북미, 유럽, 동남아시아에서도관련디바이스의개발을추진중이다. [Les Echos] 가제시하고있는전용단말기의가격은 12000원 (1500엔) 정도로비교적싼편이며향후수요의확대가기대된다. 현재전세계의신문발행부수는 4억 6000 만 ~8000만부로앞으로도이수준을유지할것으로예상되나, 이중전자신문이차지하는비율은 2010년에 10%, 2012년에는약 25% 를차지할것으로전망하고있다. 정보단말기의역할이외에도전자종이의특징을살린새로운시장이등장할가능성이높다. IC 카드는지금까지포인트의표시나잔고표시의기능대신에원타임패스워드의표시를위한디스플레이가장착될가능성이높다. 따라서기존의편리성과함께보안성을중시한수요가증가할전망이 - 44 -

다. 이러한 IC 카드분야는 ISO의구부림기준을만족하기위한기계적유연성, 지갑에서꺼내고넣는사용빈도를고려한내환경성, 현재의 20% 정도로의저비용화가요구되기때문에, 양산화를통한비용절감이가능한전자종이를채용하게될가능성이매우높다. 한편전자진열대시장은도입초기의비용이들기때문에중소형점포에서의조기도입이어려울것으로보인다. 시장규모로는현재약 4000만장정도이며, 2010년에는 1억장을상회할것으로예상되나, 앞으로전자종이의양산화에따라비용이내려간다면전자종이의저소비전력, 박형, 대형화가가능하고광시야각, 고콘트라스트비등의특징을충분히살릴수있을것으로보고있다. 또한휴대전화의경우전자종이의컬러화에따라신규디바이스로발전할가능성이있다. 특히메인디스플레이나서브디스플레이뿐만아니라, 키패드에전자종이를채용하고자하는움직임도나타나고있다. 이밖에도 USB 메모리등의잔량표시디바이스나디지털포토필름, 시계등의시장도전자종이가진출가능한응용시장으로주목을끌고있다. 전자종이전체의시장규모는 2007년에크게성장할것으로보이며, 2010년에는 500억엔, 2012년이후에는 1000억엔시장이될것으로예측했다. 다. 미국동향 - 45 -

미국은플렉시블디스플레이에관해서많은원천기술, 핵심기술및특허등을확보하고있으며정부와기업들의전폭적인지지로가장활발한투자가이루어지고있다. 주로, IBM, Sarnoff, UDC, E-ink, Bell Labs, Palo Alto Research Center(PARC) 등의기업연구소등을중심으로플렉시블 LCD, OLED, e-paper 등에대한전반적인연구가이루어지고있다. 특히, 플렉시블디스플레이의상용화속도를높이기위해미국육군연구소, Natick Soldier Systems Center 및 Universal Display Corporation (UDC) 등이 Flexible Display Initiative (FDI) 를발주하여반사형디스플레이와 TFT Backplane 관련기술등을집중적으로연구하고있다. 향후플렉시블디스플레이분야에있어미국은매우중요한위치를점할것으로예상된다. 제 4 절기술개발의목적 본과제의목표는전자종이디스플레이의특징에맞는 GUI 시스템의개발이며, 휴대가가능하도록설계된하드웨어위에터치스크린이가능한전자종이디스플레이장치를연결하여, 사용자가손가락을이용하여해당기기와의인터페이스가가능하도록하는 GUI 시스템을개발하는것이다. - 46 -

< 그림 1.20> 제안한시스템구성도 제 5 절기술개발의중요성 21세기멀티미디어를기반으로하는고도정보화사회에서요구되는제품의기본적인성능은인간과환경중심, 고도화, 고기능화로서인간과기계간의커뮤니케이션수단인디스플레이에도이러한추세에따라변화가왔다. 지난 40 여년동안디스플레이의대표자로자리잡아왔던브라운 관은평판디스플레이의등장으로대체되고있으며, 평판디스플레이 중에서 LCD(Liquid Crystal Display) 는기존의브라운관과거의동 - 47 -

등한화질성능을보유하면서도휴대가편리한경량, 초박형, 저소비전력등을실현하여급속히성장하고있으며, 그뒤를이어 PDP(Plasma Display Pannel) 및 OLED(Organic Light Emitting Diode) 가시장진입이이루어진상태이다. 인간에게있어서종이는먼과거에서부터사용되어온대표적인문명의상징이다. 그러나전자매체가등장하면서종이의용도가일부축소되고있다. 즉, 컴퓨터, 휴대폰의등장과더불어전자문서,e-mail, 문자메세지가사용되고있으며, 종이문서, 종이책의사용이줄어들고있다. 일본의경우를보면, 2002년전자사전의시장규모는 390억엔, 2003년에는 440억엔으로성장하는반면에, 종이매체사전은지난 10년동안 300억엔에서 250억엔으로시장이축소된것으로알려지고있다. 전자사전을전자종이와동일하게보기는어렵다. 그러나전자사전은전자종이의주요한용도가운데하나가될것이다. 전자종이는삼성경제연구소가세계경제및기술자료를바탕으로선정한차세대유망기술 50개중, 서비스로봇, Ad-hoc, RFID, Hybrid자동차, 임베디드소프트웨어등과더불어상위 10개가운데하나로선정되었을정도로, 그응용범위가커질기술이다. 전자종이의상용화는기존종이인쇄물에익숙한우리들에게커다란변화를보여줄것으로보인다. 우선기존종이나비닐이사용되던광고판, 안내판, 종이신문, 종이책등의비중이줄어들게될것이다. 특히, 일회성이거나잦은변경이필요한경우, 부가기능이필 - 48 -

요한경우에는시간이걸릴수은있겠지만, 전자종이의채택은어쩔수없는대세로여겨진다. 그리고장기적으로는문서저장기능이갖추어지면기존컴퓨터시장역시위협할수있을것으로보인다. 또한통신기능이부가되는경우에는휴대폰시장도전자종이의영향권안에들어가게될가능성도있다. 전자종이는기존의디스플레이의용도와는달리, 기존의종이와잉크처럼높은해상도, 넓은시야각, 밝은흰색배경, 전원을차단한후에도화상이유지되고백라이트 (back light) 전원이없어이동통신기기의배터리수명이오래유지되므로원가절감및경량화를쉽게적용할수있는것, 그리고대략 100ms에달하는낮은응답성, 제한적인컬러 (color) 를특징으로하는, 유비쿼터스환경을위한디스플레이장치이다. 이러한전자종이는 200년부터소규모시장이형성되어 2008년부터본격화가이루어질것으로예상되며, 2010년에는대중화가될것으로예상하고있다. 이상의전자디바이스들은과거 PC(Personal Computer), Mobile Phone,Digital Consumer Electronics 등의분야에적용되고있으며, 향후 2010년경에는 Ubiquitous Electronics, Humanoid robot 및 Bio 관련분야에의응용을위한새로운전자디바이스의등장이기대된다. - 49 -

전자종이는현재관련기술을개발하고있는단계이고, 2010년경에본격적인상용화가이루어질것으로전망되고있어지금상황에서대체기술을평가하기는어렵다. 따라서, 여기서는기존평판디스플레이중에서전자종이와경쟁관계에있다고볼수있는 TFT-LCD와유기 EL 기술을비교하기로한다. 즉, TFT-LCD와유기 EL 기술은기판과소자의플렉시블화를통한플렉시블디스플레이개발을목표로하고있다는측면에서전자종이와경쟁기술이라할수있다. 이들기술은현재양산단계에있는공정기술을기반으로하고기판, 소재및디바이스의플렉시블화기술을접목하는방법으로전자종이를구현하는것을목표로하고있다. 따라서, 이들기술은전자종이에비해컬러화, 장수명화및양산기술에많은장점을갖고있다. 반면, 전자종이는현재수명이짧고, 응답속도가느려동영상구현에어려움이있으며, 컬러화및양산기술을개발해야하는과제를갖고있으나, 향후이러한기술과제들을해결할경우에는기존디스플레이로구현하기어려운대면적, 저소비전력, 초박형두루마리디스플레이를구현할수있다는특징을갖고있다. 전자종이에대한최초의연구는 1970년대중반에시작되었으나그동안여러가지기술적인한계로인하여제품화가이루어지지못하다가 2000년에들어와서 E-Ink가최초의프로토타입전자종이를발표하였으며, 이밖에도 Xerox 등여러기업에서프로토타입전자종 - 50 -

이를발표하고있는상황이다. 이러한기술현황과기술예측에의거한실용화시기를감안할때, 전자종이의기술수명주기상의위치는현재초기단계의기술이라평가할수있으며, 5년후인 2010년경에본격적인도입기가될것으로예측하고있다. 경제적중요성 전자종이는현재미국과일본이주도적으로개발하고있는차세대디스플레이로서향후정부차원에서도많은 R&D 지원이예상되는분야이다. 산업정책적측면에서디스플레이는정보통신분야의연관산업으로서시장규모가계속증가하고있으며, 메모리소자다음의국가주력수출품목으로서국제경쟁우위를달성할수있는고부가가치산업이라할수있다. 디스플레이산업은통신, 정보, 가전의모든전자산업에서 10% 이상의비중을차지하고있으며, 동화상을제공하는 TV 등을비롯한가정용가전기기부터정보통신단말기기, 자동차용항법장치와같이이동중에사용되는정보화시대의필수적인도구로서, 그시장의잠재력은매우크다고할수있다. 즉, 디스플레이의경쟁력상실은가전및정보통신단말기기의경 쟁력상실과직접적으로연결될수있다. - 51 -

국가과학기술위원회의차세대디스플레이기술개발계획에따르면, 우리나라는정보디스플레이기술의개발로 2012년세계 1위디스플레이수출국으로면모를이어갈계획이며, 2012년 3,633억달러세계시장의 45% 를점유하는것을목표로하고있다. 이러한목표달성을위해서는국가전략산업으로서디스플레이산업을집중적으로육성할필요가있는것으로판단된다. 또한, 기술정책적측면에서우리나라는과기부와산자부가중심이되어 1995년부터 G7 사업의일환으로 차세대평판표시장치사업 을추진하였으며, 2001년까지 1,820억원 ( 정부 835억원, 민간 985억원 ) 의예산을투입하여 40인치 TV용 TFT-LCD를세계최초로개발하고, 세계최대크기의 63인치급 PDP-TV를개발하였다. 또한, 2002년부터는과기부의 21세기프론티어사업과산자부의산업기술개발사업의일환으로차세대정보디스플레이개발사업을진하고있으며, 2002년부터 2012년까지매년약 100억원의예산을투입하여플렉시블 TFT-LCD 핵심기술개발을비롯하여유기 EL, 3D, 전자종이등차세대디스플레이에대한핵심기술개발을추진하고있다. 기술적타당성 산자부가추진하고있는차세대정보디스플레이기술개발사업은 - 52 -

정보디스플레이산업을국가전략산업으로보호육성하고, 디스플레이의기술경쟁력 1위달성을위한고화질, 고정세, 초경량, 초박형, 저전력, 다기능의미래형정보디스플레이개발등을목적으로하고있으며, 2002년부터 2012년까지총 1,000억원의사업비를투자할계획이다. 이에대한구체적인사업내용은 < 표 1.3> 과같다. < 표 1.3> 차세대정보디스플레이기술개발사업 - 53 -

< 그림 1.21 Electronic Device 의적용분야 > 전자종이는종이와디스플레이 2가지시장을대체해나갈것으로여겨진다. 디스플레이의경우에는인간과기계혹은인간과인간과의대화매체로서정보화사회의발전과함께그중요성이더욱부각되고있으며, 특히최근컴퓨터및미디어산업의급격한진보로인하여경량, 박형의평판표시소자에대한수요자들의요구가증가하고있다. 기존의디스플레이매체로는 CRT( 브라운관 ) 가대표적이지만이는무게및부피가크다는단점을가지고있으므로대형또는휴대용디스플레이매체로는응용이매우어렵다. 이를보완하는방법으로최근개발이이루어지고있는디스플레이에는 FED - 54 -

( 전계방출디스플레이 ), PDP( 플라즈마디스플레이패널 ), TFT-LCD( 박막트랜지스터액정디스플레이 ), Organic TFT( 유기박막트랜지스터 ), OLED( 전계발광소자 ) 등이있다. 이중 TFT-LCD는가장널리상업화가되어있고, 당분간가장널리쓰일것이라고예상되는디스플레이다. TFT-LCD를비롯하여현재개발중인다양한표시소자들은 CRT에필적하는, 또는그보다우수한화질과적은소비전력, 경량, 박형등의특징으로인하여각종표시기기에폭넓게채택되고있으며전세계적으로연구개발의노력이집중되고있다. 위의디스플레이들은디지털정보의수정, 가필, 통신등에서기능상의이점을가지고있지만, 일반적으로가독성, 사용의편리성, 전력의사용등에서는인쇄된종이에비하여떨어지는단점을가지고있다. 그리고종이를대체할것으로여겨진다. 현재의종이를재료로하고있는책이나신문, 잡지등이대표적인대체대상이다. 현재상태에서종이의저가격, 취급용이성등을극복하기는힘들다고여겨진다. 그렇지만현재에도사전류나전자책과같은분야에서는극복이이루어지고있다. 향후성능이향상된전자종이가나타나면, 만화, 소설류와오디오나컬러가요망되는서적의경우전자종이가유용하게사용될것으로여겨진다. 전자종이 (electronic paper:e-paper) 는일종의반사형디스플레이 (reflective displat) 로서기존의종이와잉크처럼높은해상도, 넓은시야각, 밝은흰색배경으로우수한시각특성을가지며, 플라스틱, 금속, 종이등어떠한기판상에서도구현이가능하고, 전원을차단 - 55 -

한후에도화상이유지되고백라이트 (back light) 전원이없어이동 통신기기의배터리수명이오래유지되므로원가절감및경량화를 쉽게적용시킬수있다. 또한전자종이는종이인쇄물과기존의디스플레이매체를대신하는새로운표시소자로서신문, 잡지, 도서등을대체하는전자신문 (e-nespaper), 전자잡지 (e-magazine), 전자책 (e-book) 의개념으로응용이기대되고옥내, 옥외용실시간광고판등게시판용디스플레이뿐만아니라핸드폰, PDA(personal digital assistant),web pad 등과같은이동통신기기의정보표시매체로서의응용도기대된다. 2004년 2월 Nikkei Electronics Asia에게재된기사 (Next- Generation Innovative Devices) 를살펴보면유비쿼터스 (ubiquitous) 환경을위하여디스플레이가추구해야할 3가지연구방향을제시하고있으며, 그중의하나가종이를대체하는디바이스의개발필요성을제시한다. - 56 -

< 표 1.4> 디스플레이변화에따른파생기술및제품 Display 변화관련파생기술및제품 흑백 CRT Input/Output Device System. DOS Color CRT Windows System, Windows LCD Microsoft - ClearType Font (LCD 전용 Font) 전자종이전자종이전용 GUI System ( 본과제의제안 ) 위에서언급된내용처럼, 디스플레이매체는변화하고있으며, 디스플레이매체의변화는디스플레이의활용방법에도영향을미치게되었다. Microsoft에서는 LCD 모니터상에표시되는글씨의가독성향상을위해 ClearType 폰트를개발하여 LCD 화면상의글자들이종이에인쇄된것처럼선명하게보일수있도록하였으며이는 LCD 라는디바이스의특징을이용한기술이었다. 전자종이의경우도전자종이의특성에맞는사용방법과활용방법이있어야하며이는낮은응답성과흑백디스플레이또는낮은컬러표현력에도불구하고사용자에게시각적으로용이한방법을제공해야한다는것이다. 전자종이의특징에맞는 GUI 시스템이미들웨어형태로개발된다면전자종이의대중화에따라그파급은전자기기, 광고및출판, 홍보, 인테리어산업에이르는산업분야에서효과적으로이용될수있다. - 57 -

제 6 절기술개발의시장 아래도표를통해전자종이에대한세계시장규모를전망해보았 다. IDTechEx 에의하면, 2010 년에세계시장은 5.5 억불, 국내시장은 0.36 억불에이를것으로예상된다. < 표 1.5> 전자종이세계시장규모 년도 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 세계 0.5 0.8 1.0 2.0 5.5 6.5 8.0 10 14 20 국내 0.04 0.06 0.06 0.14 0.36 0.42 0.54 0.68 0.94 1.34 본과제를통해, 전자종이의특성에맞는 GUI 시스템의개발이이루어진다면, 전자종이의효과적인활용과보급에상당한기여가될것으로예상되며, 전자종이시장의확대와보급화과정과맞물려, 그가치가기대된다. - 58 -

제 2 장본론 제 1 절기술개발의내용 제 1 항 전자종이기술의분류와표시형태 많은업체와연구소에서전자종이의개발이동시에진행되고있고, 접근방식또한매우다양하다. 이러한기술들을전자종이를구성하는기본소재의형태에따라분류하고이를다시구동방식에따라분류하였다.< 표 2.1> - 59 -

< 표 2.1> 전자종이의타입에따른특성분류 - 60 -

전자종이에사용되는주된재료, 즉잉크에해당하는물질을어떤 종류를사용하고어떻게동작시키는가에따라분류된다. 우선, 잉크의소재로는입자형태와액정, OLED 등이커다란흐름을이루고있고그외에박막, 열감응물질, 액체, 산화환원물등을이용한기술등이제안되어연구되고있으며, 각분류내에서다시구동원리에따라방식이나누어진다. 또한, 전자페이퍼는 2가지형태를생각할수있다. 첫번째형태는현재종이처럼취급할수있고문자나화상을몇번이라도바꿔쓸수있는리라이터블페이퍼이다. 현재출시되어있는비충격식 (Non-impact type) 프린터로하드카피를작성하는것과동일한사용법으로이리라이터블페이퍼를사용할수있다. 프린터내에서는리라이터블페이퍼를급지 ( 給紙 ) 하면화상을소거하면서다른화상이그려지는데사용자는화상소거를의식하지않고기존의종이와마찬가지로사용한다. 즉플렉시블화가실현되는셈이다. 두번째형태는갖고다니기가자유로운박막디스플레이로, CPU 나반도체메모리및건전지를내장하고있어많은전자문서나전자서적을버튼하나의작동으로읽을수있다. 그리고네트워크에자유롭게액세스할수있어야하는점이요망된다. 이와같은사항들은사용목적과상황에따라구분해서사용하게된다. 이런형태의전자페이퍼플렉시블화는표시부분과마찬가지로기판전극의플렉시블화도필요하다. - 61 -

가. 표시시트, 기록소거장치분리형 바꿔쓸수있는표시층과기지 ( 基紙 ) 로구성되는리라이터블페이퍼그리고기록소거용프린터의조합으로되어있다. 기록소거에는서멀헤드 (Thermal head), 이온플로 (Ion flow), 핀전극, LCD 등이사용된다. 나. 표시시트, 제어전극일체형 표시층과제어기반박막을일체화한박막디스플레이이다. 버튼 으로조작해페이지를자유롭게넘길수있고, 또한컴퓨터나네트 워크와의정보입출력이가능한기능을갖는다. 제 2 항 타디스플레이와비교 전자종이는액정디스플레이와비교해서다음과같은이점이있다. 첫째, 소비전력이낮다. 둘째, 시야각이넓다. 셋째, 플렉시블하다. 액정디스플레이는에너지절약이라는것이강점인데, 전자종이는그이상으로에너지절약이가능하다고할수있을것이다. 가장큰이유는바로재기록의전기신호를보내지않는한한번표시한내용은전기를소비하지않고그대로계속표시되는데있다. 여기에높은시인성은액정디스플레이와는비교가안될정도로좋다. 유연성이있다는점도액정디스플레이에는없는응용분야를개척할수있는가능성이충분히있다. - 62 -

단, 전자종이가액정디스플레이를대신한다는것은우선생각할수없을것이다. 그이유는아무리액티브매트릭스구동전자종이를만들어도동영상표시에는아직적합하지않기때문이다. 여기에전자종이의장래를생각하는것은액정디스플레이만을생각하면되는것은아니다. 사실가장무서운라이벌은플렉시블하며표시속도도빠르고시인성도높은유기EL 디스플레이일것이다. 몇가지의성질에서전자종이와유기EL 디스플레이는경쟁할부분이있으며, 그대부분에서유기EL이더높은잠재력을지니고있는것이사실이다. 실제로연구개발에종사하고있는기업의수와투자규모도전자종이보다유기EL 쪽이훨씬많다. 제 3 항 입자기술전자종이 입자를이용한전자종이는구동원리에따라전기영동식, 입자회전식, 건식이동식, 자기영동식, 열감응식등이있다. 전기영동, 입자회전, 건식이동등은전기장을이용한방식이고, 자기영동과열감응식은각각자기장과열을이용하여화면을표시한다. 가. 전기영동방식전자종이 전기영동 (Electrophoresis) 이란콜로이드와같은유체내부에서전하를띠고있는입자가전기장에따라이동하는것을말한다. 양전하를띠고있는입자는음극으로음전하를띠고있는물질은양극으로이동하는특성을이용한방식이다. 다른전하를가진입자에각각흑색과백색을띠게하여전기적신호에따라입자의이동을일으켜문자와그림을표 - 63 -

시하는방법으로전자종이에이용한다. (1) E-ink 社 : Microcapsule 1997 년 MIT media lab 으로부터분리설립된 E-ink 는전기영동방식 을이용하여전자종이를개발하고있는대표적인주자이다. 전기영동방식에서가장큰문제가되었던콜로이드상에서입자간의 뭉침이나침전을해결하기위해비중을맞춘유체에전하를띤미립자 를분산시켜투명하게코팅하여 100~200 μm의투명한캡슐을제작한다. 초기에는푸른색유체에백색 TiO2 입자를분산시키는방법으로푸 른바탕에흰글자를표시하였으나현재는투명유체에흑색과백색의 다른전하를가진입자를분산시켜흰바탕에검은글씨를표시한다. < 그림 2.2> 전기영동방식을이용한 E-ink 의마이크로캡슐 - 64 -

마이크로캡슐을 30 μm크기까지제작하여높은해상도로표시가가능하 고약 40% 의반사율과 10:1 이상의고콘트라스트로가독성이뛰어나상 업적으로이용이가능하다. < 그림 2.3> 전자책에표시된이미지의확대사진 ( 좌 ), 일반종이문서와 E-ink를사용한전자책 (SONY) 의가독성비교 ( 우 ) 2000년 11월에 Lucent 사의 Bell lab 과의공동연구로인쇄기법을이용한유기트랜지스터를결합한전자종이를발표하여저가의공정으로제작이가능한구부림이가능한전자종이의가능성을보여준다. 이후 2004년에는영국의 Plastic logic 사와공동연구하여곡률반경이 5mm 까지구부러지며 50 dpi 급해상도를갖는전자종이를발표하였고향후 2006년까지 150dpi 해상도와 A4 크기의 flexible 전자종이개발을목표로하였다. - 65 -

< 그림 2.4> 2000년유기박막전자종이 ( 좌 ), 2004년 50dpi급전자종이 ( 우 ) E-ink 사는여러업체와공동연구개발을진행하고있으며 2004 년 3 월에는 E-ink 를이용한전자책 Librie(SONY) 를출시하였다. E-ink 가전자잉크를공급하고 Toppan Printing 사가잉크를담는전 면기판을제작하고, Philips 가능동구동후면기판의개발, Philips 와 Sony 가합작하여상업화에성공하였다. Librie 는 170 ppi(pixel per inch) 급해상도로 AAA 건전지를사용해 10,000 페이지를볼수있으며현재일본에서판매중이다. Toppan Printing 과는 2001 년컬러전자잉크의공동개발을시작하 여 2002 년 7 월에는 5 인치 80 ppi 급 4,096 컬러전자종이를발표하였다. 역시상업화를목표로개발중이다. Vossloh Information Technology 사는유럽의철도회사들에안내시 스템을공급하는회사로 E-ink 에전자잉크를공급받아철도, 버스, 공 - 66 -

항등에이용할예정이다. < 그림 2.5> 2001년컬러 ( 좌상 ), 2002년컬러전자종이 ( 우상 ), 전자책단말기 SONY Librie ( 좌하 ), 열차출발안내표시 ( 우하 ) Philips 는 E-ink 와공동개발하여 2005 년 3 월 QVGA (320x 240 pixel) 급 5 inch 크기의두루마기형 (Roll-up) 디스플레이를선보였다. 0.75 cm 의곡률반경까지구부러지며 2 년내에상업화를계획중에있다. Toppan printing 은 2005 년 3 월일본아이치현에서열린 EXPO 에서 가로 2.6m 세로 2.2 m 의벽크기의공공게시용전자신문을선보인다. - 67 -

이것은인쇄기법을이용한회로기판위에 272 개의전자종이타일을 배열하여만든것이고사진에보이는컬러부분은 LCD 모니터를삽입한 것이다. Seiko Epson 사와 Seiko 사는 2005 년 4 월전자종이를이용한손목시 계를선보였다. < 그림 2.6> Rollable e-paper, Philps ( 좌 ), wall-size e-paper, Toppan ( 가 운데 ), 전자종이손목시계, Seiko Epson ( 우 ) 국내기업중에는평판디스플레이를이용해 POP(Point of Purchase) 광고제품을취급하는 네오럭스 (Neolux) 사가전자잉크를이용해화면의글씨나이미지가순차적으로표시되는 Ink-in-motion 제품을개발하였다. 네오럭스의제품은 Microsoft 사의 XBOX 의신제품게임의홍보에 사용될것이며, AA 건전지 2 개로 6 개월간작동이가능하다. - 68 -

현재 E-ink는전자종이의상업화를주도하면서시장을형성중이다. 입자이동시유체의저항을받기때문에응답속도가필연적으로느릴수밖에없다는한계가있다. 많은개선이이루어졌으나응답속도가 100ms 이상으로동영상을구현하기에는무리이다. 또 threshold 전압이없어서능동구동을해야하므로 TFT 매트릭스가필요하다는단점이있다. (2) SiPix 社 : Microcup 또다른형태의전기영동방식디스플레이로 SiPix 사의 Microcup이있으며푸른유체에전하를띤백색입자를분산시켜전기장에따라이동하는원리는 E-ink와같다. 마이크로캡슐대신에격벽을제작하여 microcup을형성하고그속에입자와유체를주입하고투명한상판을덮어서제작. < 그림 10> Microcup EPD (Electrophoresis display) 의가장큰특징이자장점은 Roll-to-Roll process를이용하여낮은생산비용으로대량의전자종이를생산할수있다는점이다. - Roll-to-Roll 공정이란연속적이동벨트위에서각공정단계를순차적으로거치며제품을제작하는것을말함. - 먼저하판에격벽이될물질을코팅하고 microembossing roller로압착하여 microcup을형성한다. 그안에유체를채우고ITO전극이형성된투명상판을부착하여완성 - 69 -

< 그림 2.7> SiPix 사의 Microcup 구동원리 < 그림 2.8> Roll-to-Roll Process Microembossing은 Microcup을만들어내는핵심기술이다. - 기존에격벽을형성하는과정은노광과에칭이필요하거나여러번의프린팅과정렬조정을하거나고분자기판에는사용이불가능한샌드블라스팅등의복잡한방법이사용되었으나 Microembossin은스탬프방 - 70 -

식으로간단히제조할수있는장점을가짐. < 그림 2.9> Microembossing 으로 Microcup 을형성 < 그림 2.10> 마이크로컵의유연성, 광시야각 ( 좌 ), 마이크로컵의컬러화 ( 우 ) - 마이크로캡슐을사용하였을경우캡슐간의크기차이가있고구형캡 - 71 -

슐이므로캡슐간간격이 30μm이상인부분도생기는반면 Microcup은모양과크기가균일하고간격이 10~25μm로높은해상도로표시할수있음. - 플라스틱기판을사용하므로유연성이있고원하는크기와모양으로잘라도기능이유지. - 유체의색깔을달리하여컬러화하는연구가진행되고있으며직접구동, 수동구동방식도연구되고있으나고해상도에서는능동구동이필요. < 그림 2.12> Microcup EPD의활용예 : 스마트카드, 가격표시, 손목시계, 수중시계 - Microcup의활용예로는스마트카드, 가격표시등에사용가능하며, 물속에서도사용이가능. 그러나 E-ink와마찬가지로전기영동방식의응답속도에는한계가있음. - 72 -

나. 입자회전식전자종이 (1) Xerox 社 : Gyricon PARC에서발명한 Gyricon이라는twist ball을토대로 Xerox 사가개발중이며 Gyricon Media라는회사를설립하여개발중. - 입자회전식화상표시장치는각기다른전하와색깔을가진반구가합쳐진형태의볼 (bichromal bead) 이전기장에의해회전하는원리로동작. - 회전볼은 ITO 전극이입혀진두개의플라스틱투명기판사이에오일과함께분산되어있다. 볼의크기는 50~100μm이며 molten spray 법으로제조하므로싼가격에대량생산을할수있음. < 그림 2.13> 입자회전식 twist ball 의동작원리와 twist ball 의제작방 법 - 73 -

< 그림 2.14> Gyricon 전자종이의특징및장점 - twist ball이메모리성을가지고있으므로프린터를이용한입력뿐만아니라전기적으로대전된연필로도입력이가능. -다양한색깔의이색구를만들어컬러화를시도중. 2001년 Gyricon사는 3M과합작하여 twist ball을이용하여대량생산이가능한 Smart paper를개발. - 현재는 smart paper를이용한안내표시소자인 Syncro Sign을제작해판매중. - Syncro Sign 은공공장소의게시물표시로사용되면가로 16.7인치세로 15인치의크기로무선으로표시내용을입력할수있음. - 74 -

< 그림 2.15> Smart Paper ( 상 ), Syncro Sign ( 하 ) Gyricon 역시응답속도가 300ms 정도로느리다는점과해상도에문제가제기되었다. - 구동시전압이너무클경우에는볼이회전운동보다직진운동을먼저하게되어, 완전히흰색또는검은색이나타나지않고부분회전한상태로안정하게되어볼의단면이나타나콘트라스트를떨어뜨림. - 그러나이효과를조절할수있게되면계조표현을가능하게할수있음. - 또, 볼의회전에 threshold 전압이존재하지않아서능동구동매트릭스를사용해야함 다. 건식이동식전자종이 건식이동식은각각다른전하와색깔을띤입자를에어로졸상태로 - 75 -

기판사이에주입하고전기장에따라이동시켜영상을표시하는방법. 전기영동식에서는콜로이드에분산된입자가유체의저항으로갖게되는응답속도의한계를극복할수있는방법이다. - 이러한방식의표시소자로는 Fuji Xerox 사의토너디스플레이가있으나구동전압이 300V 이상으로대폭증가하고입자의대전량을조절하기어려워선명한이미지를안정적으로얻기어려움이있음. - Bridgestone사에서는이러한문제점들을해결하여 QR-LPD (Quick response-liquid powder display) 를개발. - 분산성이매우좋아액체와같은유동성을특징으로하는입자인분류체 (liquid powder) 를개발하여잉크소재로사용. < 그림 2.16> QR-LPD 의구동원리 ( 좌 ), QR-LPD 의실시이미지 ( 우 ) 이전자종이는응답속도가 0.2 ms로기존의전기영동식및입자회전식을이용한전자종이가 100 ms 이상의응답속도로시각적특성의한계를갖던것에비해확실한우월성을가짐. - 전기영동식을채택한 E-ink 사의상용화된전자책에서도응답속도가느려잔상이오래남는문제점이제기되고있으나분류체를이용할경 - 76 -

우이러한문제점을해결할수있음. - 그러나구동전압이 200 V 이상으로너무높아이를낮추기위한연구 개발이필요. < 그림 2.17> QR-LPD 의유연성 ( 좌상 ) 과광시야각 ( 우상, 우하 ) 그리고빠 른응답속도 ( 좌하 ) Bridgestone 사는 QR-LPD를가격표시소자로응용을시작으로시장에진출을시도하고있다. KETI( 전자부품연구원 ) 에서는차세대전자종이소자기반기술개발을위해건식이동식의장점인빠른응답속도를가지면서단점으로지적되는높은구동전압을개선한전자종이를개발중이다. - 높은분산도와전기장에민감하게반응하는새로운전자잉크소재를합성하여능동및수동구동소자구현을목표로연구. - 77 -

- 특히수동구동전자종이의개발은 TFT 매트릭스없이저가격의대량 생산이가능해상업적양산에매우유리할것. 제 4 항 전기영동방식의전자종이 2004년 SID(Society information display conference, Seattle, WA, USA) 전시회에이방식을채택하여 LIBRIe라는상품명으로소니에서발표했다. LIBRIe는 E-Ink의마이크로캡슐을적용하여 6인치크기에 800 600(170ppi) 해상도를나타내며, 마이크로캡슐을 ITO( 인듐 -틴-옥사이드) 전도성폴리에스터필름위에조밀하게코팅했다. 또한구동부는필립스의 a-si active matrix를유리위에형성하여구현한것이다. 이제품은 2비트그레이-스케일로써 4단계그레이를표현할수있다. 이후다양한제품들이소개되어 E-ink의마이크로캡슐을채용한손목시계를지난해 5월세이코엡손과세이코왓치공동으로세계최초로데모했다. 같은해 12월시티즌사와공동으로세계최대크기인 1.5m의구부릴수있는 (Bandabel) 시계를발표했다. 또한 10월세계최대크기인 10.1인치 SVGA(600 800) 급, 100:1의명암비를갖는전자종이의프로토타입을공개했다. 이는 E-ink의마이크로캡슐을이용했으며, 일본제강 (NIPPON Steel, co., Ltd.) 에서개발한플렉시블호일 (Flexible foil, 휘어지는얇은금속박 ) 을기판으로 LG Philips LCD에서조립되었다. - 78 -

한편마이크로캡슐형전기영동디스플레이의컬러화는컬러안료입자쌍을도입하거나다양한색을가지는염료유체에컬러안료입자를분산시키므로디자인할수있다고발표됐으나, 지난해 6월, 컬러필터제조회사인토판프린팅 (Toppan Printing) 의컬러필터를적용하여 12비트, 400 300 픽셀의풀컬러전자종이프로토타입을발표했다. 최근에는플라스틱로직에서듀퐁태진필름에서유연성을향상시킨 PET 필름을사용하여 E-ink의마이크로캡슐을적용한두께 400μm의 4레벨그레이스케일구현가능한전자종이를일본에서개최된 IDW 05(International Display Workshops, Takamatsu, Japan) 에서데모했다. 이는 10 인치크기로 SVGA 급 (600 800) 의 100ppi 의해상도를가지며 350mm 350mm 프로토타입라인에서제 작되었다. 또한프린팅공정을사용하여낮은단가로서제작되어 향후대량생산을목표로하고있다. 제 2 절기술개발의범위 제 1 항 최종목표 가. 전자종이의디스플레이화면에데이터를출력시, Response Time 의최소화 (1) 변경되는데이터에대해서만, 신호를처리하는알고리즘적용 - 79 -

현재의 Display 상태를분석하여, 변경이요구되는영역만을데이터갱신함 (2) 전자종이의잔상을처리하기위한, 알고리즘적용 변경된영역만을먼저 Drawing한후, 잔상제거를위해주변영역을 Drawing 나. 전자종이출력을위한논리적 Display 설계 (1) 논리적인계층구조의 Display 처리알고리즘을통해, Depth 개념으로 Drawing 물리적으로는 2차원구조의전자종이에, 시각적으로 3차원인 GUI를적용함. Microsoft의 Window과유사한개념으로서, 복수의 GUI를동시에운영토록함. 다. 전자종이디스플레이를위한, Custom Library 개발 (1) 메뉴, 리스트, 옵션등을처리하기위한 Custom Library 개발 흑백이나, 제한적컬러의사용에도불구하고, 시각적으로풍부한효과제공 손가락과같은범용입력방식의개발 복수의손가락을통한동시입력기능 예 ) 두개의손가락을입력한후, 벌리면 Zoom-In 으로동작하고하나의손가락을특정방향으로움직이면, 방향키로동작함 C 언어 Library 형태로제공되어, 다른업체에서활용가능하도록만듦 - 80 -

전자종이의낮은응답성을고려한, 빠른 Drawing 기법개발 (4) 전자종이를구성하기위한가볍고빠른 OS 개발 Linux를 Customizing하여빠르고가벼운전자종이용 OS 플랫폼개발 사용자와의복합적인인터페이스를위한 Multi Processing 처리 전력의효과적인사용을위한 Hibernation 기능 원가절감을위한, 낮은메모리 Dependency 제 2 항 기능및성능 가. 하드웨어플랫폼성능 CPU : ARM (Samsung 200 Mhz) Pannel : E-Ink 6 Inch Pannel Interface : USB 1.1 Support 나. 하드웨어플랫폼개발킷제작 RDK 형식으로제작할예정 다. 하드웨어에맞은 OS 이식 Linux OS 를 Modify 할예정 라. E-Paper 전용알고리즘이탑재된 GUI 시스템이식 - 81 -

자체제작된 GUI 시스템에대한이식 GUI 에대한 SDK 작성 마. 샘플프로그램제작 Image Viewer 만들기 Text Viewer 만들기 제 3 절기술개발의구현 제 1 항 제안된성능개선알고리즘 가. E-Paper 전용 GUI 시스템개발 내용 : Embedded System GUI를 Win32 환경에서개발할수있도록프로젝트개발 효과 : 개발환경의편리성과개발비용의절감을기대할수있다. 설명 : "Visual Studio" Microsoft Windows OS에서운영되는대표적인통합환경개발툴이다. 이를통해본연구에서제안하는 GUI 시스템이 Embedded System이아닌, OS에서도동작될수있다. GUI 시스템의동작상황과디버깅을한곳에서할수있기에, 개발자들이쉽게접근사용할수있도록지향하고있다. - 82 -

< 그림 2.18> visual studio 개발환경 아래 < 그림 2.18> 및 < 그림 2.19> 는Win32환경에서, 실제적으로 GUI 시스템이동작되는내용을설명하고있다. Win32에서는 RGB32BIT로운영되어지고, Embedded에서는각각의 Screen Device 특성에맞게해상도와컬러가결정되어진다. - 83 -

< 그림 2.19> Virtual Screen < 그림 2.20> 실제 GUI 를처리중인화면 - 84 -

나. E-Paper Device 에서의깜박임및잔상제거알고리즘개발 아래그림은 E-Ink Pannel 에영상패턴을넣고, 하얀바탕으로바 뀌게알고리즘을적용한결과를현미경을통해확인해본다. ( 현미 경 200 배율 ) < 그림 2.21> 0 m Seconds < 그림 2.22> 0.3 Seconds < 그림 2.23> 0.6 Seconds < 그림 2.24> 0.9 Seconds - 85 -

< 그림 2.25> 1.0 Seconds < 그림 2.26> 1.3 Seconds < 그림 2.27> 1.6 Seconds < 그림 2.28> 1.9 Seconds - 86 -

< 그림 2.29> 2.2 Seconds - 잔상이제거된하얀배경 기존의 E-Paper Panel 을사용하여, 화면갱신을할때에는화면깜 박임과화면잔상이문제가되고있는데, 이과제를통해적용한 알고리즘을통해, 화면잔상과깜박임을해결하였다. 다. 알고리즘구현을위한테스트환경위에적용된잔상제거및깜박임제거는아래의플랫폼위에서테스트되어졌다. - Target Embedded Platform - E-INK RDK - Spec : CPU : ARM Core 200MHz Display : E-Ink Device Panel Kernel : Linux Kernel - 87 -

< 그림 2.30> E-ink 사의전자종이 SDK < 그림 2.31> E-ink 사의전자종이 SDK 보드세부화면 - 88 -

< 그림 2.32> E-ink 사의전자종이 SDK 시스템구성도 - 89 -

< 그림 2.33> E-ink 사의전자종이 SDK 시스템흐름도 제 2 항 구현된알고리즘소스코드분석 다음의소스코드는본기술개발에서구현한전자종이드라이버와 어플리케이션의소스코드중제안한알고리즘및응용기능을적용 한내용을기재한것이다. - 90 -

/* specific driver entry points*/ static PSD pseud_win32_open(psd psd); //open device. static void pseud_win32_close(psd psd); //close device. static void pseud_win32_getscreeninfo(psd psd, PMWSCREENINFO psi); //get device screen informations.. static void pseud_win32_setpalette(psd psd, int first, int count, MWPALENTRY * pal); //get device bitmap palette. static void pseud_win32_drawpixel(psd psd, MWCOORD x, MWCOORD y, MWPIXELVAL c); //draw pixel. static MWPIXELVAL pseud_win32_readpixel(psd psd, MWCOORD x, MWCOORD y); //read pixel. static void pseud_win32_drawhline(psd psd, MWCOORD x1, MWCOORD x2, MWCOORD y,mwpixelval c); //draw horizental line. static void pseud_win32_drawvline(psd psd, MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c); //draw vertical line. static void pseud_win32_drawtext(psd psd,mwcoord x,mwcoord y,const MWUCHAR *str, int count); //draw text. static void pseud_win32_drawimage(psd psd,mwcoord x,mwcoord y,const MWUCHAR *str, int count); //draw image. static void pseud_win32_fillrect(psd psd, MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c); //fill rect. //static void pseud_win32_drawrect(psd psd, MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c); //draw rect. - 91 -

SCREENDEVICE scrdev = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, pseud_win32_open, pseud_win32_close, pseud_win32_getscreeninfo, pseud_win32_setpalette, pseud_win32_drawpixel, pseud_win32_readpixel, ; pseud_win32_drawhline, pseud_win32_drawvline, pseud_win32_fillrect, pseud_win32_drawtext, pseud_win32_drawimage, gen_fonts, win32_blit, NULL, NULL, NULL, /* SetIOPermissions */ gen_allocatememgc, fb_mapmemgc, gen_freememgc, NULL, /* StretchBlit subdriver */ NULL, /* SetPortrait */ 0, /* int portrait */ NULL, /* orgsubdriver */ NULL, /* StretchBlitEx subdriver*/ - 92 -

VOID InitMyLoadLibrary() { DWORDhModule; MyWin32Func.bInitiated=FALSE; MyWin32Func.LoadLibrary=0x7C801D77; //MagicNumber MyWin32Func.FreeLibrary=0x7C80ABDE; //MagicNumber MyWin32Func.GetProcAddress=0x7C80ADA0; //MagicNumber hmodule=mywin32func.loadlibrary("kernel32.dll");//kernel32 Library MyWin32Func.CloseHandle=MyWin32Func.GetProcAddress(hModule,"CloseHan dle"); MyWin32Func.CreateEvent=MyWin32Func.GetProcAddress(hModule,"CreateEve nta"); MyWin32Func.GetModuleHandle=MyWin32Func.GetProcAddress(hModule,"Get ModuleHandleA"); MyWin32Func.FreeLibrary(hModule); hmodule=mywin32func.loadlibrary("gdi32.dll"); //GDI 32 Libarary MyWin32Func.CreateDC=MyWin32Func.GetProcAddress(hModule,"CreateDCA") ; MyWin32Func.SetDIBitsToDevice=MyWin32Func.GetProcAddress(hModule,"Set DIBitsToDevice"); MyWin32Func.FreeLibrary(hModule); hmodule=mywin32func.loadlibrary("user32.dll"); //User 32 Libarary MyWin32Func.LoadIcon=MyWin32Func.GetProcAddress(hModule,"LoadIconA"); MyWin32Func.LoadCursor=MyWin32Func.GetProcAddress(hModule,"LoadCurso ra"); MyWin32Func.FreeLibrary(hModule); // Real Meaningful codes. MyWin32Func.hMyWindowsAPI=MyWin32Func.LoadLibrary("MyWindow.dll"); //My WindowsCallback MyWin32Func.MyWindowCall=MyWin32Func.GetProcAddress(MyWin32Func.h MyWindowsAPI,"MyWindowCall"); WindowsParam.nCommand=WINDOWS_INIT; MyWin32Func.MyWindowCall(&WindowsParam); return; - 93 -

VOID TermMyLoadLibrary() { WindowsParam.nCommand=WINDOWS_TERM; MyWin32Func.MyWindowCall(&WindowsParam); MyWin32Func.FreeLibrary(MyWin32Func.hMyWindowsAPI); static PSD pseud_win32_open(psd psd) { BITMAPINFOHEADER* pbitmapofscrren; InitMyLoadLibrary(); WindowsParam.nCommand=INIT_SCR_DRIVER; WindowsParam.pInputData=psd; MyWin32Func.MyWindowCall(&WindowsParam); pbitmapofscrren=(bitmapinfoheader*)windowsparam.poutputdata; psd->xres=psd->xvirtres=pbitmapofscrren->biwidth; psd->yres=psd->yvirtres=pbitmapofscrren->biheight; psd->planes=pbitmapofscrren->biplanes; psd->bpp=pbitmapofscrren->bibitcount; psd->ncolors=(psd->bpp >= 24)? (1 << 24): (1 << psd->bpp); psd->linelen = psd->xvirtres; psd->addr = pbitmapofscrren + pbitmapofscrren->bisize; psd->size = pbitmapofscrren->biwidth*pbitmapofscrren->biheight*pbitmapofscrren->bi BitCount/8; psd->pixtype =MWPF_TRUECOLOR888; memset(psd->addr,0x00,psd->size); psd->portrait = MWPORTRAIT_NONE; return psd; static void pseud_win32_close(psd psd) { WindowsParam.nCommand=TERM_SCR_DRIVER; WindowsParam.pInputData=psd; MyWin32Func.MyWindowCall(&WindowsParam); TermMyLoadLibrary(); - 94 -

static void pseud_win32_drawpixel(psd psd, MWCOORD x, MWCOORD y, MWPIXELVAL pixel) { RECT rect; rect.left=x; rect.top=y; WindowsParam.nCommand=DRAW_PIXEL; WindowsParam.pInputData=&rect; WindowsParam.dwOption1=pixel; MyWin32Func.MyWindowCall(&WindowsParam); static MWPIXELVAL pseud_win32_readpixel(psd psd, MWCOORD x, MWCOORD y) { COLORREF ret = GetPixel(dcBuffer, x, y); return COLORVALTOPIXELVAL(ret); static void pseud_win32_drawtext(psd psd,mwcoord x,mwcoord y,const MWUCHAR *str,int count) { RECT rect; rect.left=x; rect.top=y; WindowsParam.nCommand=DRAW_TEXT; WindowsParam.pInputData=&rect; WindowsParam.dwOption1=str; WindowsParam.dwOption2=count; MyWin32Func.MyWindowCall(&WindowsParam); - 95 -

static void pseud_win32_drawimage(psd psd,mwcoord x,mwcoord y,const MWUCHAR *str, int count) //added by wklee. 2007.11.06. { RECT rect; rect.left=x; rect.top=y; WindowsParam.nCommand=DRAW_IMAGE; WindowsParam.pInputData=&rect; WindowsParam.dwOption1=str; WindowsParam.dwOption2=count; MyWin32Func.MyWindowCall(&WindowsParam); static void pseud_win32_drawvline(psd psd, MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL pixel) { RECT rect; rect.left=x; rect.top=y1; rect.bottom=y2; WindowsParam.nCommand=DRAW_VLINE; WindowsParam.pInputData=&rect; WindowsParam.dwOption1=pixel; MyWin32Func.MyWindowCall(&WindowsParam); static void pseud_win32_fillrect(psd psd, MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2,mwpixelval pixel) { RECT rect; rect.left=x1; rect.right=x2; rect.top=y1; rect.bottom=y2; WindowsParam.nCommand=FILL_RECT; WindowsParam.pInputData=&rect; WindowsParam.dwOption1=pixel; MyWin32Func.MyWindowCall(&WindowsParam); - 96 -

static void pseud_win32_fillrect(psd psd, MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2,mwpixelval pixel) { RECT rect; rect.left=x1; rect.right=x2; rect.top=y1; rect.bottom=y2; WindowsParam.nCommand=FILL_RECT; WindowsParam.pInputData=&rect; WindowsParam.dwOption1=pixel; MyWin32Func.MyWindowCall(&WindowsParam); static void pseud_win32_getscreeninfo(psd psd, PMWSCREENINFO psi) { psi->rows = psd->yvirtres; psi->cols = psd->xvirtres; psi->planes = psd->planes; psi->bpp = psd->bpp; psi->ncolors = psd->ncolors; psi->fonts = NUMBER_FONTS; psi->portrait = psd->portrait; psi->fbdriver = TRUE; /* running fb driver, can direct map*/ psi->pixtype = psd->pixtype; switch (psd->pixtype) { case MWPF_TRUECOLOR8888: case MWPF_TRUECOLOR0888: case MWPF_TRUECOLOR888: psi->rmask = 0xff0000; psi->gmask = 0x00ff00; psi->bmask = 0x0000ff; break; case MWPF_TRUECOLOR565: psi->rmask = 0xf800; psi->gmask = 0x07e0; psi->bmask = 0x001f; break; - 97 -

case MWPF_TRUECOLOR555: psi->rmask = 0x7c00; psi->gmask = 0x03e0; psi->bmask = 0x001f; break; case MWPF_TRUECOLOR332: psi->rmask = 0xe0; psi->gmask = 0x1c; psi->bmask = 0x03; break; case MWPF_PALETTE: default: psi->rmask = 0xff; psi->gmask = 0xff; psi->bmask = 0xff; break; if(psd->yvirtres > 480) { /* SVGA 800x600*/ psi->xdpcm = 33; psi->ydpcm = 33; else if(psd->yvirtres > 350) { /* VGA 640x480*/ psi->xdpcm = 27; psi->ydpcm = 27; else if(psd->yvirtres <= 240) { /* half VGA 640x240 */ psi->xdpcm = 14; psi->ydpcm = 5; else { /* EGA 640x350*/ psi->xdpcm = 27; psi->ydpcm = 19; - 98 -

/* * Graphics server routines. */ int GsInitialize(void); void GsClose(int fd); void GsSelect(GR_TIMEOUT timeout); void GsTerminate(void); GR_TIMEOUT GsGetTickCount(void); void GsRedrawScreen(void); void GsError(GR_ERROR code, GR_ID id); GR_BOOL GsCheckMouseEvent(void); GR_BOOL GsCheckKeyboardEvent(void); int GsReadKeyboard(GR_CHAR *buf, int *modifiers); int GsOpenKeyboard(void); void GsGetButtonInfo(int *buttons); void GsGetModifierInfo(int *modifiers); void GsCloseKeyboard(void); void GsExposeArea(GR_WINDOW *wp, GR_COORD rootx, GR_COORD rooty,gr_size width, GR_SIZE height, GR_WINDOW *stopwp); void GsCheckCursor(void); void GsWpNotifyActivate(GR_WINDOW *wp); void GsWpSetFocus(GR_WINDOW *wp); void GsWpDrawBackgroundPixmap(GR_WINDOW *wp, GR_PIXMAP *pm,gr_coord x, GR_COORD y, GR_SIZE width, GR_SIZE height); void GsWpTileBackgroundPixmap(GR_WINDOW *wp, GR_PIXMAP *pm, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height); void GsWpClearWindow(GR_WINDOW *wp, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height, GR_BOOL exposeflag); void GsWpUnrealizeWindow(GR_WINDOW *wp, GR_BOOL temp_unmap); void GsWpRealizeWindow(GR_WINDOW *wp, GR_BOOL temp); void GsSetPortraitModeFromXY(GR_COORD rootx, GR_COORD rooty); void GsSetClipWindow(GR_WINDOW *wp, MWCLIPREGION *userregion, int flags); - 99 -

void GsHandleMouseStatus(GR_COORD newx, GR_COORD newy, int newbuttons); void GsFreePositionEvent(GR_CLIENT *client, GR_WINDOW_ID wid, GR_WINDOW_ID subwid); void GsDeliverButtonEvent(GR_EVENT_TYPE type, int buttons, int changebuttons, int modifiers); void GsDeliverMotionEvent(GR_EVENT_TYPE type, int buttons, MWKEYMOD modifiers); void GsDeliverKeyboardEvent(GR_WINDOW_ID wid, GR_EVENT_TYPE type, GR_KEY keyvalue, GR_KEYMOD modifiers, GR_SCANCODE scancode); void GsDeliverExposureEvent(GR_WINDOW *wp, GR_COORD x, GR_COORD y,gr_size width, GR_SIZE height); void GsFreeExposureEvent(GR_CLIENT *client, GR_WINDOW_ID wid, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height); void GsDeliverUpdateEvent(GR_WINDOW *wp, GR_UPDATE_TYPE utype, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height); void GsDeliverGeneralEvent(GR_WINDOW *wp, GR_EVENT_TYPE type, GR_WINDOW *other); void GsDeliverPortraitChangedEvent(void); void GsDeliverScreenSaverEvent(GR_BOOL activate); void GsDeliverRawMouseEvent(int x, int y, int buttons, int); void GsDeliverClientDataReqEvent(GR_WINDOW_ID wid, GR_WINDOW_ID rid, GR_SERIALNO serial, GR_MIMETYPE mimetype); void GsDeliverClientDataEvent(GR_WINDOW_ID wid, GR_WINDOW_ID rid, GR_SERIALNO serial, GR_LENGTH len, GR_LENGTH thislen, void *data); void GsDeliverSelectionChangedEvent(GR_WINDOW_ID old_owner, GR_WINDOW_ID new_owner); - 100 -

void GsCheckMouseWindow(void); void GsCheckFocusWindow(void); GR_DRAW_TYPE GsPrepareDrawing(GR_DRAW_ID id, GR_GC_ID gcid, GR_DRAWABLE **retdp); GR_BOOL GsCheckOverlap(GR_WINDOW *topwp, GR_WINDOW *botwp); GR_EVENT *GsAllocEvent(GR_CLIENT *client); GR_WINDOW *GsFindWindow(GR_WINDOW_ID id); GR_PIXMAP *GsFindPixmap(GR_WINDOW_ID id); GR_GC *GsFindGC(GR_GC_ID gcid); GR_REGION *GsFindRegion(GR_REGION_ID regionid); GR_FONT *GsFindFont(GR_FONT_ID fontid); GR_CURSOR *GsFindCursor(GR_CURSOR_ID cursorid); GR_WINDOW *GsPrepareWindow(GR_WINDOW_ID wid); GR_WINDOW *GsFindVisibleWindow(GR_COORD x, GR_COORD y); void GsDrawBorder(GR_WINDOW *wp); int GsCurrentVt(void); void GsRedrawVt(int t); int GsOpenSocket(void); void GsCloseSocket(void); void GsAcceptClient(void); void GsAcceptClientFd(int i); int GsPutCh(int fd, unsigned char c); GR_CLIENT *GsFindClient(int fd); void GsDestroyClientResources(GR_CLIENT * client); void GsDropClient(int fd); int GsRead(int fd, void *buf, int c); int GsWrite(int fd, void *buf, int c); void GsHandleClient(int fd); void GsResetScreenSaver(void); void GsActivateScreenSaver(void *arg); void GrGetNextEventWrapperFinish(int); - 101 -

/*Open a connection from a new client to the server. Returns -1 on failure.*/ int GrOpen(void) { SERVER_LOCK(); escape_quits = 1; /* Client calls this routine once. We init everything here */ if (connectcount <= 0) { if(gsinitialize() < 0) { SERVER_UNLOCK(); return -1; GsAcceptClientFd(999); curclient = root_client; SERVER_UNLOCK(); return 1; /* Close the current connection to the server.*/ void GrClose(void) { SERVER_LOCK(); GsClose(current_fd); SERVER_UNLOCK(); /* Drop a specific server connection.*/ void GsClose(int fd) { GsDropClient(fd); if(!persistent_mode && connectcount == 0) GsTerminate(); - 102 -

/*Initialize the graphics and mouse devices at startup. *Returns nonzero with a message printed if the initialization failed.*/ int GsInitialize(void) { GR_WINDOW *wp; /* root window */ PSD psd; GR_CURSOR_ID cid; static MWIMAGEBITS cursorbits[16] = { 0xe000, 0x9800, 0x8600, 0x4180, 0x4060, 0x2018, 0x2004, 0x107c, 0x1020, 0x0910, 0x0988, 0x0544, 0x0522, 0x0211, 0x000a, 0x0004 ; static MWIMAGEBITS cursormask[16] = { 0xe000, 0xf800, 0xfe00, 0x7f80, 0x7fe0, 0x3ff8, 0x3ffc, 0x1ffc, 0x1fe0, 0x0ff0, 0x0ff8, 0x077c, 0x073e, 0x021f, 0x000e, 0x0004 ; wp = (GR_WINDOW *) malloc(sizeof(gr_window)); /* If needed, initialize the server mutex. */ SERVER_LOCK_INIT(); setbuf(stdout, NULL); setbuf(stderr, NULL); if (wp == NULL) { EPRINTF("Cannot allocate root window\n"); return -1; startticks = GsGetTickCount(); screensaver_active = GR_FALSE; selection_owner.wid = 0; selection_owner.typelist = NULL; - 103 -

if ((keyb_fd = GdOpenKeyboard()) == -1) { EPRINTF("Cannot initialise keyboard\n"); /*GsCloseSocket();*/ free(wp); return -1; if ((psd = GdOpenScreen()) == NULL) { EPRINTF("Cannot initialise screen\n"); /*GsCloseSocket();*/ GdCloseKeyboard(); free(wp); return -1; GdSetPortraitMode(psd, portraitmode); if ((mouse_fd = GdOpenMouse()) == -1) { EPRINTF("Cannot initialise mouse\n"); /*GsCloseSocket();*/ GdCloseScreen(psd); GdCloseKeyboard(); free(wp); return -1; /*Initialize the root window. */ wp->psd = psd; wp->id = GR_ROOT_WINDOW_ID; wp->parent = NULL; /* changed: was = NULL*/ wp->owner = NULL; wp->children = NULL; wp->siblings = NULL; wp->next = NULL; wp->x = 0; wp->y = 0; wp->width = psd->xvirtres; wp->height = psd->yvirtres; wp->bordersize = 0; wp->background = BLACK; - 104 - wp->bordercolor = wp->background;

wp->nopropmask = 0; wp->bgpixmap = NULL; wp->bgpixmapflags = GR_BACKGROUND_TILE; wp->eventclients = NULL; wp->cursorid = 0; wp->mapped = GR_TRUE; wp->realized = GR_TRUE; wp->output = GR_TRUE; wp->props = 0; wp->title = NULL; wp->clipregion = NULL; listpp = NULL; listwp = wp; rootwp = wp; focuswp = wp; mousewp = wp; focusfixed = GR_FALSE; /* system fixed font looks better when mixed with builtin fixed fonts*/ stdfont = GdCreateFont(psd, MWFONT_SYSTEM_VAR, 0, NULL); /*Initialize and position the default cursor. */ curcursor = NULL; cursorx = -1; cursory = -1; GdShowCursor(psd); GrMoveCursor(psd->xvirtres / 2, psd->yvirtres / 2); cid = GrNewCursor(16, 16, 0, 0, WHITE, BLACK, cursorbits, cursormask); GrSetWindowCursor(GR_ROOT_WINDOW_ID, cid); stdcursor = GsFindCursor(cid); psd->fillrect(psd, 0, 0, psd->xvirtres-1, psd->yvirtres-1, GdFindColor(psd, wp->background)); /* Tell the mouse driver some things. */ GdMoveMouse(psd->xvirtres / 2, psd->yvirtres / 2); /* Force root window screen paint*/ GsRedrawScreen(); return 0; - 105 -

wp->nopropmask = 0; wp->bgpixmap = NULL; wp->bgpixmapflags = GR_BACKGROUND_TILE; wp->eventclients = NULL; wp->cursorid = 0; wp->mapped = GR_TRUE; wp->realized = GR_TRUE; wp->output = GR_TRUE; wp->props = 0; wp->title = NULL; wp->clipregion = NULL; listpp = NULL; listwp = wp; rootwp = wp; focuswp = wp; mousewp = wp; focusfixed = GR_FALSE; /* system fixed font looks better when mixed with builtin fixed fonts*/ stdfont = GdCreateFont(psd, MWFONT_SYSTEM_VAR, 0, NULL); /*Initialize and position the default cursor. */ curcursor = NULL; cursorx = -1; cursory = -1; GdShowCursor(psd); GrMoveCursor(psd->xvirtres / 2, psd->yvirtres / 2); cid = GrNewCursor(16, 16, 0, 0, WHITE, BLACK, cursorbits, cursormask); psd->fillrect(psd, 0, 0, psd->xvirtres-1, psd->yvirtres-1, GdFindColor(psd, wp->background)); /* Tell the mouse driver some things. */ GdMoveMouse(psd->xvirtres / 2, psd->yvirtres / 2); /* Force root window screen paint*/ GsRedrawScreen(); return 0; - 106 -

/* screen subdriver entry points: one required for each draw function*/ /* NOTE: currently used for fb driver only*/ typedef struct { int (*Init)(PSD psd); void (*DrawPixel)(PSD psd, MWCOORD x, MWCOORD y, MWPIXELVAL c); MWPIXELVAL (*ReadPixel)(PSD psd, MWCOORD x, MWCOORD y); void (*DrawHorzLine)(PSD psd, MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c); void (*DrawVertLine)(PSD psd, MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c); void (*FillRect)(PSD psd,mwcoord x1,mwcoord y1,mwcoord x2, MWCOORD y2,mwpixelval c); void (*DrawText)(PSD psd,mwcoord x,mwcoord y,const MWUCHAR *str, int count, MWPIXELVAL fg, PMWFONT pfont); void (*Blit)(PSD destpsd, MWCOORD destx, MWCOORD desty, MWCOORD w, MWCOORD h,psd srcpsd,mwcoord srcx,mwcoord srcy,long op); void (*DrawArea)(PSD psd, driver_gc_t *gc, int op); void (*StretchBlit)(PSD destpsd, MWCOORD destx, MWCOORD desty, MWCOORD dstw, MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy, MWCOORD srcw, MWCOORD srch, long op); void (*StretchBlitEx) (PSD dstpsd, PSD srcpsd, MWCOORD dest_x_start, int dest_y_start, MWCOORD width, int height, int x_denominator, int y_denominator, int src_x_fraction, int src_y_fraction, int x_step_fraction, int y_step_fraction, long op); SUBDRIVER, *PSUBDRIVER; - 107 -

/*Interface to Screen Device Driver*/ typedef struct _mwscreendevice { MWCOORD xres; /* X screen res (real) */ MWCOORD yres; /* Y screen res (real) */ MWCOORD xvirtres; /* X drawing res */ MWCOORD yvirtres; /* Y drawing res */ int planes; /* # planes*/ int bpp; /* # bpp*/ int linelen; /* line length in bytes for bpp 1,2,4,8*/ int size; /* size of memory allocated*/ long ncolors; /* # screen colors*/ int pixtype; /* format of pixel value*/ int flags; /* device flags*/ void * addr; PSD (*Open)(PSD psd); void (*Close)(PSD psd); void (*GetScreenInfo)(PSD psd,pmwscreeninfo psi); void (*SetPalette)(PSD psd,int first,int count,mwpalentry *pal); void (*DrawPixel)(PSD psd,mwcoord x,mwcoord y,mwpixelval c); MWPIXELVAL (*ReadPixel)(PSD psd,mwcoord x,mwcoord y); void (*DrawHorzLine)(PSD psd,mwcoord x1,mwcoord x2,mwcoord y, MWPIXELVAL c); void (*DrawVertLine)(PSD psd,mwcoord x,mwcoord y1,mwcoord y2, MWPIXELVAL c); void (*FillRect)(PSD psd,mwcoord x1,mwcoord y1,mwcoord x2,mwcoord y2, MWPIXELVAL c); void (*DrawText)(PSD psd,mwcoord x,mwcoord y,const MWUCHAR *str, int count, MWPIXELVAL fg, PMWFONT pfont); void (*DrawImage)(PSD psd,mwcoord x,mwcoord y,const MWUCHAR *str, int count, MWPIXELVAL fg, PMWFONT pfont); PMWCOREFONT builtin_fonts; void (*Blit)(PSD destpsd,mwcoord destx,mwcoord desty,mwcoord w, MWCOORD h,psd srcpsd,mwcoord srcx,mwcoord - 108 -

/* Interface to Mouse Device Driver*/ typedef struct _mousedevice { int (*Open)(struct _mousedevice *); void (*Close)(void); int (*GetButtonInfo)(void); void (*GetDefaultAccel)(int *pscale,int *pthresh); int (*Read)(MWCOORD *dx,mwcoord *dy,mwcoord *dz,int *bp); int (*Poll)(void); /* not required if have select()*/ int flags; /* raw, normal, transform flags*/ MOUSEDEVICE; /* Interface to Keyboard Device Driver*/ typedef struct _kbddevice { int (*Open)(struct _kbddevice *pkd); void (*Close)(void); void (*GetModifierInfo)(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers); int (*Read)(MWKEY *buf,mwkeymod *modifiers,mwscancode *scancode); int (*Poll)(void); /* not required if have select()*/ KBDDEVICE; - 109 -

/* devdraw.c*/ PSD GdOpenScreen(void); void GdCloseScreen(PSD psd); int GdSetPortraitMode(PSD psd, int portraitmode); int GdSetMode(int mode); MWBOOL GdSetUseBackground(MWBOOL flag); MWPIXELVAL GdSetForegroundPixelVal(PSD psd, MWPIXELVAL fg); MWPIXELVAL GdSetBackgroundPixelVal(PSD psd, MWPIXELVAL bg); MWPIXELVAL GdSetForegroundColor(PSD psd, MWCOLORVAL fg); MWPIXELVAL GdSetBackgroundColor(PSD psd, MWCOLORVAL bg); void GdResetPalette(void); void GdSetPalette(PSD psd,int first, int count, MWPALENTRY *palette); int GdGetPalette(PSD psd,int first, int count, MWPALENTRY *palette); MWCOLORVAL GdGetColorRGB(PSD psd, MWPIXELVAL pixel); MWPIXELVAL GdFindColor(PSD psd, MWCOLORVAL c); MWPIXELVAL GdFindNearestColor(MWPALENTRY *pal, int size, MWCOLORVAL cr); int GdCaptureScreen(char *path); void GdGetScreenInfo(PSD psd,pmwscreeninfo psi); void GdPoint(PSD psd,mwcoord x, MWCOORD y); void GdLine(PSD psd,mwcoord x1,mwcoord y1,mwcoord x2,mwcoord y2, MWBOOL bdrawlastpoint); void GdRect(PSD psd,mwcoord x, MWCOORD y, MWCOORD width, MWCOORD height); void GdFillRect(PSD psd,mwcoord x, MWCOORD y, MWCOORD width, MWCOORD height); void GdBitmap(PSD psd,mwcoord x,mwcoord y,mwcoord width,mwcoord height, const MWIMAGEBITS *imagebits); MWBOOL GdColorInPalette(MWCOLORVAL cr,mwpalentry *palette,int palsize); void GdMakePaletteConversionTable(PSD psd,mwpalentry *palette,int palsize, MWPIXELVAL *convtable,int floadtype); void GdDrawImage(PSD psd,mwcoord x, MWCOORD y, PMWIMAGEHDR pimage); void GdPoly(PSD psd,int count, MWPOINT *points); void GdFillPoly(PSD psd,int count, MWPOINT *points); - 110 -

void GdReadArea(PSD psd,mwcoord x,mwcoord y,mwcoord width,mwcoord height, MWPIXELVAL *pixels); void GdArea(PSD psd,mwcoord x,mwcoord y,mwcoord width,mwcoord height, void *pixels, int pixtype); void GdDrawAreaInternal(PSD psd, driver_gc_t * gc, int op); void GdTranslateArea(MWCOORD width, MWCOORD height, void *in, int inpixtype, MWCOORD inpitch, void *out, int outpixtype, int outpitch); void GdCopyArea(PSD psd,mwcoord srcx,mwcoord srcy,mwcoord width, MWCOORD height, MWCOORD destx, MWCOORD desty); void GdBlit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD width, MWCOORD height,psd srcpsd,mwcoord srcx,mwcoord srcy,long rop); void GdStretchBlit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw, MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy, MWCOORD srcw, MWCOORD srch, long rop); void GdStretchBlitEx(PSD dstpsd, MWCOORD d1_x, MWCOORD d1_y, MWCOORD d2_x, MWCOORD d2_y, PSD srcpsd, MWCOORD s1_x, MWCOORD s1_y, MWCOORD s2_x, MWCOORD s2_y, long rop); int GdCalcMemGCAlloc(PSD psd, unsigned int width, unsigned int height, int planes, int bpp, int *size, int *linelen); void drawbitmap(psd psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, const MWIMAGEBITS *imagebits); void drawpoint(psd psd, MWCOORD x, MWCOORD y); void drawrow(psd psd, MWCOORD x1, MWCOORD x2, MWCOORD y); extern SCREENDEVICE scrdev; /* devarc.c*/ /* requires float*/ void GdArcAngle(PSD psd, MWCOORD x0, MWCOORD y0, MWCOORD rx, MWCOORD ry, MWCOORD angle1, MWCOORD angle2, int type); /* integer only*/ void GdArc(PSD psd, MWCOORD x0, MWCOORD y0, MWCOORD rx, MWCOORD ry, MWCOORD ax, MWCOORD ay, MWCOORD bx, MWCOORD by, int type); void GdEllipse(PSD psd,mwcoord x, MWCOORD y, MWCOORD rx, MWCOORD ry, MWBOOL fill); - 111 -

/* devfont.c*/ void GdClearFontList(void); int GdAddFont(char *fndry, char *family, char *fontname, PMWLOGFONT lf, unsigned int flags); PMWFONT GdSetFont(PMWFONT pfont); PMWFONT GdCreateFont(PSD psd, const char *name, MWCOORD height, const PMWLOGFONT plogfont); MWCOORD GdSetFontSize(PMWFONT pfont, MWCOORD fontsize); void GdGetFontList(MWFONTLIST ***list, int *num); void GdFreeFontList(MWFONTLIST ***list, int num); int GdSetFontRotation(PMWFONT pfont, int tenthdegrees); int GdSetFontAttr(PMWFONT pfont, int setflags, int clrflags); void GdDestroyFont(PMWFONT pfont); MWBOOL GdGetFontInfo(PMWFONT pfont, PMWFONTINFO pfontinfo); int GdConvertEncoding(const void *istr, MWTEXTFLAGS iflags, int cc, void *ostr, MWTEXTFLAGS oflags); void GdGetTextSize(PMWFONT pfont, const void *str, int cc, MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase, MWTEXTFLAGS flags); int GdGetTextSizeEx(PMWFONT pfont, const void *str, int cc, int nmaxextent, int *lpnfit, int *alpdx, MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase, MWTEXTFLAGS flags); void GdText(PSD psd,mwcoord x,mwcoord y,const void *str,int count, MWTEXTFLAGS flags); PMWFONT GdCreateFontFromBuffer(PSD psd, const unsigned char *buffer, unsigned length, const char *format, MWCOORD height); PMWFONT GdDuplicateFont(PSD psd, PMWFONT psrcfont, MWCOORD fontsize); /* devclip1.c*/ void GdSetClipRects(PSD psd,int count,mwcliprect *table); MWBOOL GdClipPoint(PSD psd,mwcoord x,mwcoord y); int GdClipArea(PSD psd,mwcoord x1, MWCOORD y1, MWCOORD x2, MWCOORD y2); extern MWCOORD clipminx, clipminy, clipmaxx, clipmaxy; - 112 -

/* devrgn.c - multi-rectangle region entry points*/ MWBOOL GdPtInRegion(MWCLIPREGION *rgn, MWCOORD x, MWCOORD y); int GdRectInRegion(MWCLIPREGION *rgn, const MWRECT *rect); MWBOOL GdEqualRegion(MWCLIPREGION *r1, MWCLIPREGION *r2); MWBOOL GdEmptyRegion(MWCLIPREGION *rgn); MWCLIPREGION *GdAllocRegion(void); MWCLIPREGION *GdAllocRectRegion(MWCOORD left,mwcoord top,mwcoord right,mwcoord bottom); MWCLIPREGION *GdAllocRectRegionIndirect(MWRECT *prc); void GdSetRectRegion(MWCLIPREGION *rgn, MWCOORD left, MWCOORD top, MWCOORD right, MWCOORD bottom); void GdSetRectRegionIndirect(MWCLIPREGION *rgn, MWRECT *prc); void GdDestroyRegion(MWCLIPREGION *rgn); void GdOffsetRegion(MWCLIPREGION *rgn, MWCOORD x, MWCOORD y); int GdGetRegionBox(MWCLIPREGION *rgn, MWRECT *prc); void GdUnionRectWithRegion(const MWRECT *rect, MWCLIPREGION *rgn); void GdSubtractRectFromRegion(const MWRECT *rect, MWCLIPREGION *rgn); void GdCopyRegion(MWCLIPREGION *d, MWCLIPREGION *s); void GdIntersectRegion(MWCLIPREGION *d, MWCLIPREGION *s1, MWCLIPREGION *s2); void GdUnionRegion(MWCLIPREGION *d, MWCLIPREGION *s1, MWCLIPREGION *s2); void GdSubtractRegion(MWCLIPREGION *d, MWCLIPREGION *s1, MWCLIPREGION *s2); void GdXorRegion(MWCLIPREGION *d, MWCLIPREGION *s1, MWCLIPREGION *s2); MWCLIPREGION *GdAllocBitmapRegion(MWIMAGEBITS *bitmap, MWCOORD width, MWCOORD height); /* devrgn2.c*/ MWCLIPREGION *GdAllocPolygonRegion(MWPOINT *points, int count, int mode); MWCLIPREGION *GdAllocPolyPolygonRegion(MWPOINT *points, int *count, int nbpolygons, int mode); - 113 -

/* devmouse.c*/ int GdOpenMouse(void); void GdCloseMouse(void); void GdGetButtonInfo(int *buttons); void GdRestrictMouse(MWCOORD newminx,mwcoord newminy, MWCOORD newmaxx, MWCOORD newmaxy); void GdSetAccelMouse(int newthresh, int newscale); void GdMoveMouse(MWCOORD newx, MWCOORD newy); int GdReadMouse(MWCOORD *px, MWCOORD *py, int *pb); void GdMoveCursor(MWCOORD x, MWCOORD y); MWBOOL GdGetCursorPos(MWCOORD *px, MWCOORD *py); void GdSetCursor(PMWCURSOR pcursor); int GdShowCursor(PSD psd); int GdHideCursor(PSD psd); void GdCheckCursor(PSD psd,mwcoord x1,mwcoord y1,mwcoord x2,mwcoord y2); void GdFixCursor(PSD psd); void GdSetTransform(MWTRANSFORM *); extern MOUSEDEVICE mousedev; /* devkbd.c*/ int GdOpenKeyboard(void); void GdCloseKeyboard(void); void GdGetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers); int GdReadKeyboard(MWKEY *buf, MWKEYMOD *modifiers, MWSCANCODE *scancode); extern KBDDEVICE kbddev; - 114 -

/* devimage.c */ //#if MW_FEATURE_IMAGES// 주석..by wklee. int GdLoadImageFromBuffer(PSD psd, void *buffer, int size, int flags); void GdDrawImageFromBuffer(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, void *buffer, int size, int flags); void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags); int GdLoadImageFromFile(PSD psd, char *path, int flags); void GdDrawImageToFit(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, int id); void GdFreeImage(int id); MWBOOL GdGetImageInfo(int id, PMWIMAGEINFO pii); void GdStretchImage(PMWIMAGEHDR src, MWCLIPRECT *srcrect, PMWIMAGEHDR dst, MWCLIPRECT *dstrect); //#endif /* MW_FEATURE_IMAGES */// 주석..by wklee. /* devlist.c*/ /* field offset*/ #define MWITEM_OFFSET(type, field) ((long)&(((type *)0)->field)) void * GdItemAlloc(unsigned int size); void GdListAdd(PMWLISTHEAD phead,pmwlist pitem); void GdListInsert(PMWLISTHEAD phead,pmwlist pitem); void GdListRemove(PMWLISTHEAD phead,pmwlist pitem); #define GdItemNew(type) ((type *)GdItemAlloc(sizeof(type))) #define GdItemFree(ptr) free((void *)ptr) /* devstipple.c */ void GdSetDash(unsigned long *mask, int *count); void GdSetStippleBitmap(MWIMAGEBITS *stipple, MWCOORD width, MWCOORD height); void GdSetTSOffset(int xoff, int yoff); void ts_drawrow(psd psd, MWCOORD x1, MWCOORD x2, MWCOORD y); void ts_fillrect(psd psd, MWCOORD x, MWCOORD y, MWCOORD w, MWCOORD h); void set_ts_origin(int x, int y); - 115 -

/*Open low level graphics driver.*/ PSD GdOpenScreen(void) { PSD psd; MWPALENTRY * stdpal; MWSCREENINFO sinfo; psd = scrdev.open(&scrdev); if (!psd) return NULL; GdGetScreenInfo(psd, &sinfo); gr_pixtype = sinfo.pixtype; gr_ncolors = sinfo.ncolors; /* assume no user changable palette entries*/ gr_firstuserpalentry = (int)psd->ncolors; /* set palette according to system colors and devpalx.c*/ switch((int)psd->ncolors) { case 256: /* 8bpp*/ { extern MWPALENTRY mwstdpal8[256]; /* start after last system-reserved color*/ gr_firstuserpalentry = FIRSTUSERPALENTRY; stdpal = mwstdpal8; break; /* reset next user palette entry, write hardware palette*/ GdResetPalette(); GdSetPalette(psd, 0, (int)psd->ncolors, stdpal); GdSetClipRects(psd, 0, NULL); /* fill black (actually fill to first palette entry or truecolor 0*/ psd->fillrect(psd, 0, 0, psd->xvirtres-1, psd->yvirtres-1, 0); return psd; - 116 -

/*Close low level graphics driver */ void GdCloseScreen(PSD psd) { psd->close(psd); /* Set dynamic screen portrait mode, return new mode*/ int GdSetPortraitMode(PSD psd, int portraitmode) { /* set portrait mode if supported*/ if (psd->setportrait) psd->setportrait(psd, portraitmode); return psd->portrait; /*Get information about the screen (resolution etc).*/ void GdGetScreenInfo(PSD psd, PMWSCREENINFO psi) { psd->getscreeninfo(psd, psi); GdGetButtonInfo(&psi->buttons); GdGetModifierInfo(&psi->modifiers, NULL); GdGetCursorPos(&psi->xpos, &psi->ypos); /*reset palette to empty except for system colors*/ void GdResetPalette(void) { gr_nextpalentry = gr_firstuserpalentry; /* Set the system palette section to the passed palette entries */ void GdSetPalette(PSD psd, int first, int count, MWPALENTRY *palette) { int i; if(psd->pixtype!= MWPF_PALETTE) return; - 117 -

/* bounds check against # of device color entries*/ if(first + count > (int)psd->ncolors) count = (int)psd->ncolors - first; if(count >= 0 && first < (int)psd->ncolors) { psd->setpalette(psd, first, count, palette); /* copy palette for GdFind*Color*/ for(i=0; i<count; ++i) gr_palette[i+first] = palette[i]; /* Get system palette entries */ int GdGetPalette(PSD psd, int first, int count, MWPALENTRY *palette) { int i; /* no palette if running truecolor*/ if(psd->pixtype!= MWPF_PALETTE) return 0; /* bounds check against # of device color entries*/ if(first + count > (int)psd->ncolors) if( (count = (int)psd->ncolors - first) <= 0) return 0; for(i=0; i<count; ++i) *palette++ = gr_palette[i+first]; return count; /* Convert a palette-independent value to a hardware color*/ MWPIXELVAL GdFindColor(PSD psd, MWCOLORVAL c) { /*Handle truecolor displays.*/ switch(psd->pixtype) { case MWPF_TRUECOLOR8888: return COLOR2PIXEL8888(c); case MWPF_TRUECOLOR0888: case MWPF_TRUECOLOR888: return COLOR2PIXEL888(c); - 118 -

case MWPF_TRUECOLOR565: /* create 16 bit 5/6/5 format pixel from RGB colorval*/ return COLOR2PIXEL565(c); case MWPF_TRUECOLOR555: /* create 16 bit 5/5/5 format pixel from RGB colorval*/ return COLOR2PIXEL555(c); case MWPF_TRUECOLOR332: /* create 8 bit 3/3/2 format pixel from RGB colorval*/ return COLOR2PIXEL332(c); return GdFindNearestColor(gr_palette, (int)gr_ncolors, c); /* Convert a color from a driver-dependent PIXELVAL to a COLORVAL.*/ MWCOLORVAL GdGetColorRGB(PSD psd, MWPIXELVAL pixel) { switch (psd->pixtype) { case MWPF_TRUECOLOR8888: return PIXEL8888TOCOLORVAL(pixel); case MWPF_TRUECOLOR0888: return PIXEL888TOCOLORVAL(pixel); case MWPF_TRUECOLOR888: return PIXEL888TOCOLORVAL(pixel); case MWPF_TRUECOLOR565: return PIXEL565TOCOLORVAL(pixel); case MWPF_TRUECOLOR555: return PIXEL555TOCOLORVAL(pixel); case MWPF_TRUECOLOR332: return PIXEL332TOCOLORVAL(pixel); case MWPF_PALETTE: return GETPALENTRY(gr_palette, pixel); default: assert(false); return 0; - 119 -

/* Create.bmp file from framebuffer data*/ int GdCaptureScreen(char *path) { int ifd, i, j; FILE * ofp; int cx, cy, extra, bpp, bytespp, ncolors, sizecolortable; unsigned long rmask, gmask, bmask; unsigned char *cptr; unsigned short *sptr; unsigned long *lptr; BMPHEAD bmp; unsigned char buf[2048*4]; ofp = fopen(path, "wb"); if (!ofp) return 1; ifd = open("/dev/fb0", 0); cx = scrdev.xvirtres; cy = scrdev.yvirtres; bpp = scrdev.bpp; bytespp = (bpp+7)/8; /* dword right padded*/ extra = (cx*bytespp) & 3; if (extra) extra = 4 - extra; ncolors = (bpp <= 8)? (1<<bpp): 0; /* color table is either palette or 3 longword r/g/b masks*/ sizecolortable = ncolors? ncolors*4: 3*4; if (bpp == 24) sizecolortable = 0; /* fill out bmp header*/ memset(&bmp, 0, sizeof(bmp)); bmp.bftype[0] = 'B'; bmp.bftype[1] = 'M'; bmp.bfsize = dwswap(sizeof(bmp) + sizecolortable + (long)(cx+extra)*cy*bytespp); - 120 -

bmp.bisize = dwswap(40); bmp.biwidth = dwswap(cx); bmp.biheight = dwswap(cy); bmp.biplanes = wswap(1); bmp.bibitcount = wswap(bpp); bmp.bicompression = dwswap((bpp==16 bpp==32)? BI_BITFIELDS: BI_RGB); bmp.bisizeimage = dwswap((long)(cx+extra)*cy*bytespp); bmp.biclrused = dwswap((bpp <= 8)? ncolors: 0); /*bmp.biclrimportant = 0;*/ fwrite(&bmp, sizeof(bmp), 1, ofp);/* write header*/ if (sizecolortable) { if(bpp <= 8) { /* write palette*/ for(i=0; i<ncolors; i++) { putc(gr_palette[i].b, ofp); putc(gr_palette[i].r, ofp); putc(0, ofp); else { /* write 3 r/g/b masks*/ switch (gr_pixtype) { case MWPF_TRUECOLOR8888: case MWPF_TRUECOLOR0888: default: rmask = RMASK888; gmask = GMASK888; bmask = BMASK888; break; case MWPF_TRUECOLOR565: rmask = RMASK565; gmask = GMASK565; bmask = BMASK565; break; - 121 -

putdw(rmask, ofp); putdw(gmask, ofp); putdw(bmask, ofp); for(i=cy-1; i>=0; --i) {/* write image data, upside down ;)*/ long base = sizeof(bmp) + sizecolortable + (long)i*cx*bytespp; fseek(ofp, base, SEEK_SET); read(ifd, buf, cx*bytespp); switch (bpp) { case 32: lptr = (unsigned long *)buf; for(j=0; j<cx; ++j) putdw(*lptr++, ofp); break; case 24: cptr = (unsigned char *)buf; for(j=0; j<cx; ++j) { putc(*cptr++, ofp); putc(*cptr++, ofp); putc(*cptr++, ofp); break; case 16: sptr = (unsigned short *)buf; for(j=0; j<cx; ++j) putsw(*sptr++, ofp); break; fclose(ofp); close(ifd); return 0; - 122 -

putdw(rmask, ofp); putdw(gmask, ofp); putdw(bmask, ofp); for(i=cy-1; i>=0; --i) {/* write image data, upside down ;)*/ long base = sizeof(bmp) + sizecolortable + (long)i*cx*bytespp; fseek(ofp, base, SEEK_SET); read(ifd, buf, cx*bytespp); switch (bpp) { case 32: lptr = (unsigned long *)buf; for(j=0; j<cx; ++j) putdw(*lptr++, ofp); break; case 24: cptr = (unsigned char *)buf; for(j=0; j<cx; ++j) { putc(*cptr++, ofp); putc(*cptr++, ofp); putc(*cptr++, ofp); break; case 16: sptr = (unsigned short *)buf; for(j=0; j<cx; ++j) putsw(*sptr++, ofp); break; fclose(ofp); close(ifd); return 0; - 123 -

/*Stretch source rectangle of pixels to destination rectangle quickly*/ void GdStretchBlit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw, MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy, MWCOORD srcw, MWCOORD srch, long rop) { int count; MWCLIPRECT * prc; extern MWCLIPRECT cliprects[]; extern int clipcount; g_row_inc = g_col_inc = 0; /* check for driver stretch blit implementation*/ if (!dstpsd->stretchblit) return; /* clip blit rectangle to source screen/bitmap size*/ if(srcx < 0) { srcw += srcx; /*dstx -= srcx;*/ srcx = 0; if(srcy < 0) { srch += srcy; /*dsty -= srcy;*/ srcy = 0; if(srcx+srcw > srcpsd->xvirtres) srcw = srcpsd->xvirtres - srcx; if(srcy+srch > srcpsd->yvirtres) srch = srcpsd->yvirtres - srcy; /* temp dest clipping for partially visible case*/ if(dstx+dstw > dstpsd->xvirtres) dstw = dstpsd->xvirtres - dstx; if(dsty+dsth > dstpsd->yvirtres) dsth = dstpsd->yvirtres - dsty; - 124 -

switch(gdcliparea(dstpsd, dstx, dsty, dstx+dstw-1, dsty+dsth-1)) { case CLIP_VISIBLE: /* check cursor in src region*/ GdCheckCursor(dstpsd, srcx, srcy, srcx+srcw-1, srcy+srch-1); dstpsd->stretchblit(dstpsd, dstx, dsty, dstw, dsth, srcpsd, srcx, srcy, srcw, srch, rop); GdFixCursor(dstpsd); return; case CLIP_INVISIBLE: return; prc = cliprects; count = clipcount; while(--count >= 0) { int rx1, rx2, ry1, ry2; int pw, ph; int sx, sy, sw, sh; rx1 = prc->x; ry1 = prc->y; rx2 = prc->x + prc->width; ry2 = prc->y + prc->height; px1 = dstx; py1 = dsty; px2 = dstx + dstw; py2 = dsty + dsth; if (px1 < rx1) px1 = rx1; if (py1 < ry1) py1 = ry1; if (px2 > rx2) px2 = rx2; if (py2 > ry2) py2 = ry2; pw = px2 - px1; ph = py2 - py1; if(pw > 0 && ph > 0) { /* calculate proper src/dst offset for stretch rect*/ g_row_inc = (srch << 16) / dsth; - 125 -

switch(gdcliparea(dstpsd, dstx, dsty, dstx+dstw-1, dsty+dsth-1)) { case CLIP_VISIBLE: GdCheckCursor(dstpsd, srcx, srcy, srcx+srcw-1, srcy+srch-1); dstpsd->stretchblit(dstpsd, dstx, dsty, dstw, dsth, srcpsd, srcx, srcy, srcw, srch, rop); GdFixCursor(dstpsd); return; case CLIP_INVISIBLE: return; prc = cliprects; count = clipcount; while(--count >= 0) { int rx1, rx2, ry1, ry2; int px1, px2, py1, py2; int pw, ph; int sx, sy, sw, sh; rx1 = prc->x; ry1 = prc->y; rx2 = prc->x + prc->width; ry2 = prc->y + prc->height; px1 = dstx; py1 = dsty; px2 = dstx + dstw; py2 = dsty + dsth; pw = px2 - px1; ph = py2 - py1; g_row_inc = (srch << 16) / dsth; dstpsd->stretchblit(dstpsd, px1, py1, pw, ph, srcpsd, sx, sy, sw, sh, rop); ++prc; - 126 -

/*Calculate size and linelen of memory gc */ int GdCalcMemGCAlloc(PSD psd, unsigned int width, unsigned int height, int planes, int bpp, int *psize, int *plinelen) { int bytelen, linelen, tmp; if(!planes) planes = psd->planes; if(!bpp) bpp = psd->bpp; /* swap width and height in left/right portrait modes,*/ if(psd->portrait & (MWPORTRAIT_LEFT MWPORTRAIT_RIGHT)) { tmp = width; width = height; height = tmp; /* use bpp and planes to create size and linelen. */ if(planes == 1) { switch(bpp) { case 1: linelen = (width+7)/8; bytelen = linelen = (linelen+3) & ~3; break; case 2: linelen = (width+3)/4; bytelen = linelen = (linelen+3) & ~3; break; case 4: linelen = (width+1)/2; bytelen = linelen = (linelen+3) & ~3; break; case 8: bytelen = linelen = (width+3) & ~3; break; - 127 -

case 24: linelen = width; bytelen = width * 3; break; case 32: linelen = width; bytelen = width * 4; break; default: return 0; else if(planes == 4) { /* FIXME assumes VGA 4 planes 4bpp*/ linelen = (width+1)/2; linelen = (linelen+3) & ~3; bytelen = linelen; else { *psize = *plinelen = 0; return 0; *plinelen = linelen; *psize = bytelen * height; return 1; /*Draw a rectangle in the foreground color, applying clipping if necessary*/ void GdRect(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height) { MWCOORD maxx; MWCOORD maxy; if (width <= 0 height <= 0) return; maxx = x + width - 1; maxy = y + height - 1; drawrow(psd, x, maxx, y); - 128 -

if (height < 3) return; ++y; --maxy; drawcol(psd, x, y, maxy); if (width > 1) drawcol(psd, maxx, y, maxy); GdFixCursor(psd); /* Draw a filled in rectangle in the foreground color, applying*/ void GdFillRect(PSD psd, MWCOORD x1, MWCOORD y1, MWCOORD width, MWCOORD height) { unsigned long dm = 0, dc = 0; MWCOORD x2 = x1 + width - 1; MWCOORD y2 = y1 + height - 1; /* Stipples and tiles have their own drawing routines */ if (gr_fillmode!= MWFILL_SOLID) { set_ts_origin(x1, y1); ts_fillrect(psd, x1, y1, width, height); GdFixCursor(psd); return; switch (GdClipArea(psd, x1, y1, x2, y2)) { case CLIP_VISIBLE: psd->fillrect(psd, x1, y1, x2, y2, gr_foreground); GdFixCursor(psd); return; GdSetDash(&dm, (int *) &dc); while (y1 <= y2) drawrow(psd, x1, x2, y1++); GdSetDash(&dm, (int *) &dc);/* Restore the dash settings */ GdFixCursor(psd); - 129 -

/*Draw a rectangular area using the current clipping region and the * specified bit map. */ void drawbitmap(psd psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, const MWIMAGEBITS *imagebits) { MWCOORD minx; MWCOORD maxx; MWIMAGEBITS bitvalue = 0; /* bitmap word value */ int bitcount; if (width <= 0 height <= 0) return; if (gr_usebg) psd->fillrect(psd, x, y, x + width - 1, y + height - 1, gr_background); minx = x; maxx = x + width - 1; bitcount = 0; while (height > 0) { if (bitcount <= 0) { bitcount = MWIMAGE_BITSPERIMAGE; bitvalue = *imagebits++; /* draw without clipping*/ if (MWIMAGE_TESTBIT(bitvalue)) psd->drawpixel(psd, x, y, gr_foreground); bitvalue = MWIMAGE_SHIFTBIT(bitvalue); bitcount--; if (x++ == maxx) { x = minx; y++; --height; bitcount = 0; - 130 -

/* Draw a color bitmap image in 1, 4, 8, 24 or 32 bits per pixel.*/ void GdDrawImage(PSD psd, MWCOORD x, MWCOORD y, PMWIMAGEHDR pimage) { MWCOORD minx; MWCOORD maxx; MWUCHAR bitvalue = 0; int bitcount; MWUCHAR *imagebits; MWCOORD height, width; int bpp; MWPIXELVAL pixel; int clip; int extra, linesize; int rgborder; MWCOLORVAL cr; MWCOORD yoff; height = pimage->height; width = pimage->width; /* determine if entire image is clipped out, save clipresult for later*/ clip = GdClipArea(psd, x, y, x + width - 1, y + height - 1); if(clip == CLIP_INVISIBLE) return; transcolor = pimage->transcolor; bpp = pimage->bpp; if (pimage->bpp <= 8) { if(!pimage->palette) { /* for jpeg's without a palette*/ for(yoff=0; yoff<pimage->palsize; ++yoff) convtable[yoff] = yoff; else GdMakePaletteConversionTable(psd, pimage->palette, pimage->palsize, convtable, MERGEPALETTE); - 131 -

!= 0)) { /* imagebits are dword aligned*/ switch(pimage->bpp) { default: case 8: linesize = width; break; case 32: linesize = width*4; break; case 24: linesize = width*3; break; case 4: linesize = PIX2BYTES(width<<2); break; case 1: linesize = PIX2BYTES(width); break; extra = pimage->pitch - linesize; /* 24bpp RGB rather than BGR byte order?*/ rgborder = pimage->compression & MWIMAGE_RGB; if ((bpp == 32) && ((pimage->compression & MWIMAGE_ALPHA_CHANNEL) long *data = (long *) imagebits; while (height > 0) { cr = *data++; if (rgborder) { /* Swap R/B order */ cr = (cr & 0xFF00FF00UL) ((cr & 0x00FF0000UL) >> 16) ((cr & 0x000000FFUL) << 16); - 132 -

switch (psd->pixtype) { case MWPF_PALETTE: default: pixel = GdFindColor(psd, cr); break; case MWPF_TRUECOLOR8888: pixel = COLOR2PIXEL8888(cr); break; case MWPF_TRUECOLOR0888: case MWPF_TRUECOLOR888: pixel = COLOR2PIXEL888(cr); break; case MWPF_TRUECOLOR565: pixel = COLOR2PIXEL565(cr); break; case MWPF_TRUECOLOR332: pixel = COLOR2PIXEL332(cr); break; if (clip == CLIP_VISIBLE GdClipPoint(psd, x, y)) psd->drawpixel(psd, x, y, pixel); if (x++ == maxx) { x = minx; y += yoff; height--; data = (long *) (((char *) data) + extra); switch (psd->pixtype) { case MWPF_PALETTE: pixel = GdFindColor(psd, cr); break; case MWPF_TRUECOLOR8888: pixel = COLOR2PIXEL8888(cr); - 133 -

case MWPF_TRUECOLOR888: pixel = COLOR2PIXEL888(cr); break; case MWPF_TRUECOLOR565: pixel = COLOR2PIXEL565(cr); break; case MWPF_TRUECOLOR555: pixel = COLOR2PIXEL555(cr); break; case MWPF_TRUECOLOR332: pixel = COLOR2PIXEL332(cr); break; if (clip == CLIP_VISIBLE GdClipPoint(psd, x, y)) psd->drawpixel(psd, x, y, pixel); if (x++ == maxx) { x = minx; y += yoff; height--; imagebits += extra; else { bitcount = 0; while (height > 0) { if (bitcount <= 0) { bitcount = sizeof(mwuchar) * 8; bitvalue = *imagebits++; switch (bpp) { case 8: bitcount = 0; if (bitvalue == transcolorgoto next; pixel = convtable[bitvalue]; break; - 134 -

if (((bitvalue & 0xf0) >> 4) == transcolor) { bitvalue <<= 4; bitcount -= 4; goto next; pixel = convtable[(bitvalue & 0xf0) >> 4]; bitvalue <<= 4; bitcount -= 4; break; case 1: --bitcount; if (((bitvalue & 0x80)? 1 : 0) == transcolor) {bitvalue <<= 1;goto next; pixel = convtable[(bitvalue & 0x80)? 1 : 0]; bitvalue <<= 1; break; if (clip == CLIP_VISIBLE GdClipPoint(psd, x, y)) psd->drawpixel(psd, x, y, pixel); next: if (x++ == maxx) { x = minx; y += yoff; height--; bitcount = 0; imagebits += extra; GdFixCursor(psd); : - 135 -

/* Copy a rectangular area from one screen area to another.*/ void GdCopyArea(PSD psd, MWCOORD srcx, MWCOORD srcy, MWCOORD width, MWCOORD height, MWCOORD destx, MWCOORD desty) { if (width <= 0 height <= 0) return; if (srcx == destx && srcy == desty) return; GdCheckCursor(psd, srcx, srcy, srcx + width - 1, srcy + height - 1); GdCheckCursor(psd, destx, desty, destx + width - 1, desty + height - 1); psd->copyarea(psd, srcx, srcy, width, height, destx, desty); void drawrow(psd psd, MWCOORD x1, MWCOORD x2, MWCOORD y) { MWCOORD temp; if (x1 > x2) {/* reverse endpoints if necessary */ temp = x1; x1 = x2; x2 = temp; if (!gr_dashcount) { while (x1 <= x2) { psd->drawhorzline(psd, x1, temp, y, gr_foreground); else { unsigned int p, bit = 0; for (p = x1; p <= x2; p++) { if ((gr_dashmask & (1 << bit)) && GdClipPoint(psd, p, y)) psd->drawpixel(psd, p, y, gr_foreground); bit = (bit + 1) % gr_dashcount; - 136 -

/* Draw a vertical line from y1 to and including y2 in the * foreground color, applying clipping if necessary.*/ static void drawcol(psd psd, MWCOORD x,mwcoord y1,mwcoord y2) { MWCOORD temp; /* reverse endpoints if necessary */ if (y1 > y2) { temp = y1; y1 = y2; y2 = temp; /* clip to physical device */ if (y1 < 0) y1 = 0; if (y2 >= psd->yvirtres) y2 = psd->yvirtres - 1; if (!gr_dashcount) { while (y1 <= y2) { if (GdClipPoint(psd, x, y1)) { temp = MWMIN(clipmaxy, y2); psd->drawvertline(psd, x, y1, temp, gr_foreground); else temp = MWMIN(clipmaxy, y2); y1 = temp + 1; else { unsigned int p, bit = 0; for (p = y1; p <= y2; p++) { if ((gr_dashmask & (1<<bit)) && GdClipPoint(psd, x, p)) psd->drawpixel(psd, x, p, gr_foreground); bit = (bit + 1) % gr_dashcount; - 137 -

/* return TRUE if point is in region*/ MWBOOL GdPtInRegion(MWCLIPREGION *rgn, MWCOORD x, MWCOORD y){ int i; if (rgn->numrects > 0 && INRECT(rgn->extents, x, y)) for (i = 0; i < rgn->numrects; i++) if (INRECT (rgn->rects[i], x, y)) return TRUE; return FALSE; /*return whether rectangle is all in, partly in, or out of region*/ int GdRectInRegion(MWCLIPREGION *rgn, const MWRECT *rect) { MWRECT * pcurrect; MWRECT *prectend; MWCOORD rx, ry; MWBOOL partin, partout; if (!rgn->numrects!extentcheck(&rgn->extents, rect)) return MWRECT_OUT; rx = rect->left; ry = rect->top; for (pcurrect = rgn->rects, prectend = pcurrect + rgn->numrects; pcurrect < prectend; pcurrect++) { if (pcurrect->bottom <= ry) continue; /* not far enough down yet*/ if (pcurrect->top > ry) { partout = TRUE; /* missed part of rectangle above */ if (partin (pcurrect->top >= rect->bottom)) break; ry = pcurrect->top; /* x guaranteed to be == rect->left */ if (pcurrect->right <= rx) continue; /* not far enough over yet */ if (pcurrect->left > rx) { - 138 -

partout = TRUE; /* missed part of rectangle to left */ if (partin) break; if (pcurrect->left < rect->right) { partin = TRUE; /* definitely overlap */ if (partout) break; if (pcurrect->right >= rect->right) { ry = pcurrect->bottom; /* finished with this band */ if (ry >= rect->bottom) break; rx = rect->left; /* reset x out to left again */ return(partin? ((ry < rect->bottom)? MWRECT_PARTIN : MWRECT_ALLIN) : MWRECT_OUT); /* Test if two regions are identical.*/ MWBOOL GdEqualRegion(MWCLIPREGION *r1, MWCLIPREGION *r2) { int i; if (r1->numrects!= r2->numrects) return FALSE; if (r1->numrects == 0) return TRUE; if (!EQUALRECT(&r1->extents, &r2->extents)) return FALSE; for (i = 0; i < r1->numrects; i++) { if (!EQUALRECT(r1->rects + i, r2->rects + i)) return FALSE; return TRUE; - 139 -

/* Create a new empty MWCLIPREGION*/ MWCLIPREGION *GdAllocRegion(void) { MWCLIPREGION *rgn; if ((rgn = malloc(sizeof( MWCLIPREGION )))) { if ((rgn->rects = malloc(sizeof( MWRECT )))) { rgn->size = 1; EMPTY_REGION(rgn); return rgn; free(rgn); return NULL; /*Create a new MWCLIPREGION which is a rectangular region.*/ MWCLIPREGION *GdAllocRectRegion(MWCOORD left, MWCOORD top, MWCOORD right, MWCOORD bottom) { MWCLIPREGION *rgn; rgn = GdAllocRegion(); if (rgn) GdSetRectRegion(rgn, left, top, right, bottom); return rgn; /*Create a new MWCLIPREGION which is a rectangular region.*/ MWCLIPREGION *GdAllocRectRegionIndirect(MWRECT *prc) { return GdAllocRectRegion(prc->left, prc->top, prc->right, prc->bottom); - 140 -

/*Redefine a region to be just a simple rectangular region*/ void GdSetRectRegionIndirect(MWCLIPREGION *rgn, MWRECT *prc) { GdSetRectRegion(rgn, prc->left, prc->top, prc->right, prc->bottom); /*Destroy a region. Similar to free().*/ void GdDestroyRegion(MWCLIPREGION *rgn) { if(rgn) { free(rgn->rects); free(rgn); /*Translate a region by a specified offset*/ void GdOffsetRegion(MWCLIPREGION *rgn, MWCOORD x, MWCOORD y) { int nbox = rgn->numrects; MWRECT *pbox = rgn->rects; if(nbox && (x y)) { while(nbox--) { pbox->left += x; pbox->right += x; pbox->top += y; pbox->bottom += y; pbox++; rgn->extents.left += x; rgn->extents.right += x; rgn->extents.top += y; rgn->extents.bottom += y; - 141 -

/*Initialize the mouse.*/ int GdOpenMouse(void) { int fd; /* init mouse position info*/ buttons = 0; xpos = 0; ypos = 0; minx = MIN_MWCOORD; miny = MIN_MWCOORD; maxx = MAX_MWCOORD; maxy = MAX_MWCOORD; changed = TRUE; /* init cursor position and size info*/ curvisible = 0; curneedsrestore = FALSE; curminx = minx; curminy = miny; curmaxx = curminx + MWMAX_CURSOR_SIZE - 1; curmaxy = curminy + MWMAX_CURSOR_SIZE - 1; if ((fd = mousedev.open(&mousedev)) == -1) return -1; /* get default acceleration settings*/ mousedev.getdefaultaccel(&scale, &thresh); mousedev.flags &= ~MOUSE_RAW; /* handle null mouse driver by hiding cursor*/ if(fd == -2) GdHideCursor(&scrdev); return fd; /* Terminate the use of the mouse.*/ void GdCloseMouse(void) { mousedev.close(); - 142 -

/*Move the mouse to the specified coordinates.*/ void GdMoveMouse(MWCOORD newx, MWCOORD newy) { if (!(mousedev.flags & MOUSE_RAW)) { if (newx < minx) newx = minx; if (newx > maxx) newx = maxx; if (newy < miny) newy = miny; if (newy > maxy) newy = maxy; if (newx == xpos && newy == ypos) return; changed = TRUE; xpos = newx; ypos = newy; /* Set the cursor position.*/ void GdMoveCursor(MWCOORD newx, MWCOORD newy) { MWCOORD shiftx; MWCOORD shifty; shiftx = newx - curminx; shifty = newy - curminy; curminx += shiftx; curmaxx += shiftx; curminy += shifty; curmaxy += shifty; /* Restore the screen under the mouse pointer*/ GdHideCursor(&scrdev); /* Draw the new pointer*/ GdShowCursor(&scrdev); - 143 -

/*Open the keyboard.*/ int GdOpenKeyboard(void) { int fd; if ((fd = kbddev.open(&kbddev)) == -1) return -1; /* possible -2 return means no kbd*/ return fd; /*Close the keyboard.*/ void GdCloseKeyboard(void) { kbddev.close(); /*Return the possible modifiers (shift, control, etc) for the keyboard */ void GdGetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers) { kbddev.getmodifierinfo(modifiers, curmodifiers); /*This reads one keystroke from the keyboard*/ int GdReadKeyboard(MWKEY *buf, MWKEYMOD *modifiers, MWSCANCODE *scancode) { return kbddev.read(buf, modifiers, scancode); - 144 -

/* Draw an image from a file.*/ void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags) { int id; id = GdLoadImageFromFile(psd, path, flags); if (id) { GdDrawImageToFit(psd, x, y, width, height, id); GdFreeImage(id); /*Load an image from a file */ int GdLoadImageFromFile(PSD psd, char *path, int flags) { int fd, id; struct stat s; void *buffer = 0; buffer_t src; int readsize; fd = open(path, O_RDONLY); buffer = malloc(s.st_size); if (!buffer) { EPRINTF("GdLoadImageFromFile: Couldn't load image %s\n", path); close(fd); return(0); readsize= read(fd, buffer, s.st_size);//by wklee. binit(&src, buffer, s.st_size); id = GdDecodeImage(psd, &src, path, flags); free(buffer); close(fd); return(id); - 145 -

/*Load an image*/ static int GdDecodeImage(PSD psd, buffer_t * src, char *path, int flags) { int loadok = 0; PMWIMAGEHDR pimage; PIMAGEITEM pitem; /* allocate image struct*/ pimage = (PMWIMAGEHDR)malloc(sizeof(MWIMAGEHDR)); if(!pimage) { return 0; pimage->imagebits = NULL; pimage->palette = NULL; pimage->transcolor = -1L; if (loadok == 0) loadok = LoadBMP(src, pimage); err: if (loadok == 0) { EPRINTF("GdLoadImageFromFile: unknown image type\n"); goto err; /// image loading error// if (loadok!= 1) goto err; /* image loading error*/ pitem = GdItemNew(IMAGEITEM); if (!pitem) goto err; pitem->id = nextimageid++; pitem->pimage = pimage; pitem->psd = psd; GdListAdd(&imagehead, &pitem->link); return pitem->id; free(pimage); return 0; /* image loading error*/ - 146 -

/* Draw an image from a file.*/ void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags) { int id; id = GdLoadImageFromFile(psd, path, flags); if (id) { GdDrawImageToFit(psd, x, y, width, height, id); GdFreeImage(id); /*Load an image from a file */ int GdLoadImageFromFile(PSD psd, char *path, int flags) { int fd, id; struct stat s; void *buffer = 0; buffer_t src; int readsize; fd = open(path, O_RDONLY); buffer = malloc(s.st_size); if (!buffer) { EPRINTF("GdLoadImageFromFile: Couldn't load image %s\n", path); close(fd); return(0); readsize= read(fd, buffer, s.st_size);//by wklee. binit(&src, buffer, s.st_size); id = GdDecodeImage(psd, &src, path, flags); free(buffer); close(fd); return(id); - 147 -

/*Destroy an image.*/ void GdFreeImage(int id) { PIMAGEITEM pitem; PMWIMAGEHDR pimage; pitem = findimage(id); if (pitem) { GdListRemove(&imagehead, &pitem->link); pimage = pitem->pimage; if(pimage->imagebits) /* delete image bits*/ free(pimage->imagebits); if(pimage->palette)free(pimage->palette); free(pimage); GdItemFree(pItem); /*Get information about an image.*/ MWBOOL GdGetImageInfo(int id, PMWIMAGEINFO pii) { PMWIMAGEHDR pimage; PIMAGEITEM pitem; pitem = findimage(id); if (!pitem) { memset(pii, 0, sizeof(*pii)); pimage = pitem->pimage; pii->width = pimage->width; pii->height = pimage->height; pii->compression = pimage->compression; if (pimage->palsize) { GdGetPalette(pItem->psd, 0, pimage->palsize, pii->palette); return TRUE; - 148 -

/* Draw an image from a file.*/ void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags) { int id; id = GdLoadImageFromFile(psd, path, flags); if (id) { GdDrawImageToFit(psd, x, y, width, height, id); GdFreeImage(id); /*Load an image from a file */ int GdLoadImageFromFile(PSD psd, char *path, int flags) { int fd, id; struct stat s; void *buffer = 0; buffer_t src; int readsize; fd = open(path, O_RDONLY); buffer = malloc(s.st_size); if (!buffer) { EPRINTF("GdLoadImageFromFile: Couldn't load image %s\n", path); close(fd); return(0); readsize= read(fd, buffer, s.st_size);//by wklee. binit(&src, buffer, s.st_size); id = GdDecodeImage(psd, &src, path, flags); free(buffer); close(fd); return(id); - 149 -

/*Load an image*/ static int GdDecodeImage(PSD psd, buffer_t * src, char *path, int flags) { int loadok = 0; PMWIMAGEHDR pimage; PIMAGEITEM pitem; /* allocate image struct*/ pimage = (PMWIMAGEHDR)malloc(sizeof(MWIMAGEHDR)); if(!pimage) { return 0; pimage->imagebits = NULL; pimage->palette = NULL; pimage->transcolor = -1L; if (loadok == 0) loadok = LoadBMP(src, pimage); err: if (loadok == 0) { EPRINTF("GdLoadImageFromFile: unknown image type\n"); goto err; /// image loading error// if (loadok!= 1) goto err; /* image loading error*/ pitem = GdItemNew(IMAGEITEM); if (!pitem) goto err; pitem->id = nextimageid++; pitem->pimage = pimage; pitem->psd = psd; GdListAdd(&imagehead, &pitem->link); return pitem->id; free(pimage); return 0; /* image loading error*/ - 150 -

/*BMP decoding routine*/ static int LoadBMP(buffer_t *src, PMWIMAGEHDR pimage) { int h, i, compression; int headsize; MWUCHAR *imagebits; BMPFILEHEAD bmpf; BMPINFOHEAD bmpi; BMPCOREHEAD bmpc; MWUCHAR headbuffer[infoheadsize]; bseek(src, 0, SEEK_SET); pimage->imagebits = NULL; pimage->palette = NULL; /* read BMP file header*/ if (bread(src, &headbuffer, FILEHEADSIZE)!= FILEHEADSIZE) return(0); bmpf.bftype[0] = headbuffer[0]; bmpf.bftype[1] = headbuffer[1]; /* Is it really a bmp file? */ if (*(WORD*)&bmpf.bfType[0]!= wswap(0x4d42)) /* 'BM' */ return 0; /* not bmp image*/ /*bmpf.bfsize = dwswap(dwread(&headbuffer[2]));*/ bmpf.bfoffbits = dwswap(dwread(&headbuffer[10])); /* Read remaining header size */ if (bread(src,&headsize,sizeof(dword))!= sizeof(dword)) return 0; /* not bmp image*/ headsize = dwswap(headsize); /* might be windows or os/2 header */ if(headsize == COREHEADSIZE) { /* read os/2 header */ if(bread(src, &headbuffer, COREHEADSIZE-sizeof(DWORD))!=COREHEADSIZE-sizeof(DWORD)) return 0; /* not bmp image*/ - 151 -

bmpi.biwidth = dwswap(*(dword*)&headbuffer[0]); bmpi.biheight = dwswap(*(dword*)&headbuffer[4]); bmpi.biplanes = wswap(*(word*)&headbuffer[8]); bmpi.bibitcount = wswap(*(word*)&headbuffer[10]); bmpi.bicompression = dwswap(*(dword*)&headbuffer[12]); bmpi.bisizeimage = dwswap(*(dword*)&headbuffer[16]); bmpi.bixpelspermeter = dwswap(*(dword*)&headbuffer[20]); bmpi.biypelspermeter = dwswap(*(dword*)&headbuffer[24]); bmpi.biclrused = dwswap(*(dword*)&headbuffer[28]); bmpi.biclrimportant = dwswap(*(dword*)&headbuffer[32]); pimage->width = (int)bmpi.biwidth; pimage->height = (int)bmpi.biheight; pimage->bpp = bmpi.bibitcount; pimage->palsize = (int)bmpi.biclrused; if (pimage->palsize > 256) pimage->palsize = 0; else if(pimage->palsize == 0 && pimage->bpp <= 8) pimage->palsize = 1 << pimage->bpp; compression = bmpi.bicompression; pimage->compression = MWIMAGE_BGR; pimage->planes = 1; /* currently only 1, 4, 8 and 24 bpp bitmaps*/ if(pimage->bpp > 8 && pimage->bpp!= 24) { EPRINTF("LoadBMP: image bpp not 1, 4, 8 or 24\n"); return 2; /* image loading error*/ /* compute byte line size and bytes per pixel*/ ComputePitch(pimage->bpp, pimage->width, &pimage->pitch, &pimage->bytesperpixel); /* Allocate image */ if( (pimage->imagebits = malloc(pimage->pitch*pimage->height)) == NULL)goto err; - 152 -

/* Draw an image from a file.*/ void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags) { int id; id = GdLoadImageFromFile(psd, path, flags); if (id) { GdDrawImageToFit(psd, x, y, width, height, id); GdFreeImage(id); /*Load an image from a file */ int GdLoadImageFromFile(PSD psd, char *path, int flags) { int fd, id; struct stat s; void *buffer = 0; buffer_t src; int readsize; fd = open(path, O_RDONLY); if (fd < 0 fstat(fd, &s) < 0) { EPRINTF("GdLoadImageFromFile: can't open image: %s\n", path); return(0); buffer = malloc(s.st_size); if (!buffer) { return(0); readsize= read(fd, buffer, s.st_size);//by wklee. binit(&src, buffer, s.st_size); id = GdDecodeImage(psd, &src, path, flags); free(buffer); close(fd); return(id); - 153 -

/*Load an image*/ static int GdDecodeImage(PSD psd, buffer_t * src, char *path, int flags) { int loadok = 0; PMWIMAGEHDR pimage; PIMAGEITEM pitem; /* allocate image struct*/ pimage = (PMWIMAGEHDR)malloc(sizeof(MWIMAGEHDR)); if(!pimage) { return 0; pimage->imagebits = NULL; pimage->palette = NULL; pimage->transcolor = -1L; if (loadok == 0) loadok = LoadBMP(src, pimage); err: if (loadok == 0) { EPRINTF("GdLoadImageFromFile: unknown image type\n"); goto err; /// image loading error// if (loadok!= 1) goto err; /* image loading error*/ pitem = GdItemNew(IMAGEITEM); if (!pitem) goto err; pitem->id = nextimageid++; pitem->pimage = pimage; pitem->psd = psd; GdListAdd(&imagehead, &pitem->link); return pitem->id; free(pimage); return 0; /* image loading error*/ - 154 -

/* Draw an image from a file.*/ void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags) { int id; id = GdLoadImageFromFile(psd, path, flags); if (id) { GdDrawImageToFit(psd, x, y, width, height, id); GdFreeImage(id); /*Load an image from a file */ int GdLoadImageFromFile(PSD psd, char *path, int flags) { int fd, id; struct stat s; void *buffer = 0; buffer_t src; int readsize; fd = open(path, O_RDONLY); if (fd < 0 fstat(fd, &s) < 0) { EPRINTF("GdLoadImageFromFile: can't open image: %s\n", path); return(0); buffer = malloc(s.st_size); if (!buffer) { return(0); readsize= read(fd, buffer, s.st_size);//by wklee. binit(&src, buffer, s.st_size); id = GdDecodeImage(psd, &src, path, flags); free(buffer); close(fd); return(id); - 155 -

/*Destroy an image.*/ void GdFreeImage(int id) { PIMAGEITEM pitem; PMWIMAGEHDR pimage; pitem = findimage(id); if (pitem) { GdListRemove(&imagehead, &pitem->link); pimage = pitem->pimage; if(pimage->imagebits) /* delete image bits*/ free(pimage->imagebits); if(pimage->palette)free(pimage->palette); free(pimage); GdItemFree(pItem); /*Get information about an image.*/ MWBOOL GdGetImageInfo(int id, PMWIMAGEINFO pii) { PMWIMAGEHDR pimage; PIMAGEITEM pitem; pitem = findimage(id); pimage = pitem->pimage; pii->width = pimage->width; pii->height = pimage->height; pii->compression = pimage->compression; pii->palsize = pimage->palsize; if (pimage->palsize) { /* FIXME handle jpeg's without palette*/ GdGetPalette(pItem->psd, 0, pimage->palsize, pii->palette); return TRUE; - 156 -

/* Draw an image from a file.*/ void GdDrawImageFromFile(PSD psd, MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, char *path, int flags) { int id; id = GdLoadImageFromFile(psd, path, flags); if (id) { GdDrawImageToFit(psd, x, y, width, height, id); GdFreeImage(id); /*Load an image from a file */ int GdLoadImageFromFile(PSD psd, char *path, int flags) { int fd, id; struct stat s; void *buffer = 0; buffer_t src; int readsize; fd = open(path, O_RDONLY); buffer = malloc(s.st_size); if (!buffer) { EPRINTF("GdLoadImageFromFile: Couldn't load image %s\n", path); close(fd); return(0); readsize= read(fd, buffer, s.st_size);//by wklee. binit(&src, buffer, s.st_size); id = GdDecodeImage(psd, &src, path, flags); free(buffer); close(fd); return(id); - 157 -

/*Load an image*/ static int GdDecodeImage(PSD psd, buffer_t * src, char *path, int flags) { int loadok = 0; PMWIMAGEHDR pimage; PIMAGEITEM pitem; /* allocate image struct*/ pimage = (PMWIMAGEHDR)malloc(sizeof(MWIMAGEHDR)); if(!pimage) { return 0; pimage->imagebits = NULL; pimage->palette = NULL; pimage->transcolor = -1L; if (loadok == 0) loadok = LoadBMP(src, pimage); err: if (loadok == 0) { EPRINTF("GdLoadImageFromFile: unknown image type\n"); goto err; /// image loading error// if (loadok!= 1) goto err; /* image loading error*/ pitem = GdItemNew(IMAGEITEM); if (!pitem) goto err; pitem->id = nextimageid++; pitem->pimage = pimage; pitem->psd = psd; GdListAdd(&imagehead, &pitem->link); return pitem->id; free(pimage); return 0; /* image loading error*/ - 158 -

/*BMP decoding routine*/ static int LoadBMP(buffer_t *src, PMWIMAGEHDR pimage) { int h, i, compression; int headsize; MWUCHAR *imagebits; BMPFILEHEAD bmpf; BMPINFOHEAD bmpi; BMPCOREHEAD bmpc; MWUCHAR headbuffer[infoheadsize]; bseek(src, 0, SEEK_SET); pimage->imagebits = NULL; pimage->palette = NULL; /* read BMP file header*/ if (bread(src, &headbuffer, FILEHEADSIZE)!= FILEHEADSIZE) return(0); bmpf.bftype[0] = headbuffer[0]; bmpf.bftype[1] = headbuffer[1]; /* Is it really a bmp file? */ if (*(WORD*)&bmpf.bfType[0]!= wswap(0x4d42)) /* 'BM' */ return 0; /* not bmp image*/ /*bmpf.bfsize = dwswap(dwread(&headbuffer[2]));*/ bmpf.bfoffbits = dwswap(dwread(&headbuffer[10])); /* Read remaining header size */ if (bread(src,&headsize,sizeof(dword))!= sizeof(dword)) return 0; /* not bmp image*/ headsize = dwswap(headsize); /* might be windows or os/2 header */ if(headsize == COREHEADSIZE) { /* read os/2 header */ if(bread(src, &headbuffer, COREHEADSIZE-sizeof(DWORD))!=COREHEADSIZE-sizeof(DWORD)) return 0; /* not bmp image*/ - 159 -

/* get colormap*/ if(pimage->bpp <= 8) { for(i=0; i<pimage->palsize; i++) { pimage->palette[i].b = bgetc(src); pimage->palette[i].g = bgetc(src); pimage->palette[i].r = bgetc(src); if(headsize!= COREHEADSIZE) bgetc(src); /* decode image data*/ bseek(src, bmpf.bfoffbits, SEEK_SET); h = pimage->height; /* For every row... */ while (--h >= 0) { /* turn image rightside up*/ imagebits = pimage->imagebits + h*pimage->pitch; err: /* Get row data from file */ if(compression == BI_RLE8) { if(!decoderle8(imagebits, src)) break; else { if(bread(src, imagebits, pimage->pitch)!= pimage->pitch)goto err; return 1; /* bmp image ok*/ if(pimage->imagebits) free(pimage->imagebits); return 2; /* bmp image error*/ - 160 -

제 3 항 기구디자인설계및구성 가. 기구설계도면 < 그림 2.33> 기구물의하단설계 < 그림 2.34> 기구물의측면설계 - 161 -

< 그림 2.35> 기구물의정면설계 - 162 -

나. 기구시뮬레이션화면 < 그림 2.36> 기구물의하단 < 그림 2.37> 기구물의측면 - 163 -

< 그림 2.38> 기구물의정면 - 164 -

< 그림 2.39> 측면에서바라본기구물 - 165 -

제 4 항 하드웨어설계및구성 가. 전체하드웨어구성도 본과제에서개발한전자종이 SDK 의하드웨어시스템구성도는 < 그림 2.40> 과같다. < 그림 2.40> 제안한전자종이 sdk 시스템구성도 주요 H/W 회로의개요는아래와같다. (1) Micro Controller (Main Processor Unit) 회로 ARM9 Processor 를이용하여, Embedded platform 상에서 - 166 -

Function Evaluation 을할수있도록구성한회로 (2) Display Control Unit 회로 Flash상의개발된 GUI library를통하여 LCD display panel에 GUI정보를표출해주도록해주는 main display control unit회로 (3) Card Reader 및 Flash Memory Interface Unit 회로 Application을동적으로변경하여개발을용이하게할수있도록외장형 Memory 영역을위한추가 Interface Device Controller Unit 회로 (4) Key pad control Unit 회로 각종 User Input 을위한 button 을배치하고 User Interface Function 을구현할수있도록하는 Key pad control unit 회로 (5) Power Control Unit 회로 외장형 Adapter 를사용하여 Main controller board 에전원을 안정적으로인가할수있도록하는 Power Control Unit 회로. - 167 -

< 그림 2.41> 제안한전자종이 sdk 시스템 PC 연동구성도 - 168 -

나. 회로설계도면 < 그림 2.42> 제안한전자종이 sdk 회로도 1-169 -

< 그림 2.43> 제안한전자종이 sdk 회로도 2-170 -

< 그림 2.44> 제안한전자종이 sdk 회로도 3-171 -

< 그림 2.45> 제안한전자종이 sdk 회로도 4-172 -

< 그림 2.46> 제안한전자종이 sdk 회로도 5-173 -

< 그림 2.47> 제안한전자종이 sdk 회로도 6-174 -

< 그림 2.48> 제안한전자종이 sdk 회로도 7-175 -

. < 그림 2.49> 제안한전자종이 sdk 회로도 8-176 -

< 그림 2.50> 제안한전자종이 sdk 회로도 9-177 -

< 그림 2.51> 제안한전자종이 sdk 회로도 10-178 -

< 그림 2.52> 제안한전자종이 sdk 회로도 11-179 -

< 그림 2.53> 제안한전자종이 sdk 회로도 12-180 -

제 4 절기존기술과의비교및성능평가 제 1 항 기존기술과의비교 가. E-Paper Device에서의깜박임및잔상제거비교아래그림은 E-Ink Pannel에영상패턴을넣고, 기존의방식인 Black 영상으로인한입자의 reflash 현상과 Black 영상을제거한결과그리고본과제에서제안한알고리즘을적용한결과를현미경을통해확인해본결과이다. 실험내용은 200배율의전자현미경으로관찰하였다. (1) 기존 Black 영상 reflash 효과결과 - 181 -

< 그림 2.54> 0 m Seconds < 그림 2.55> 0.3 m Seconds - 182 -

< 그림 2.56> 0.4 m Seconds < 그림 2.57> 0.6 m Seconds - 183 -

< 그림 2.58> 1.8 m Seconds (2) 기존 Black 영상 reflash 효과에서 Black 반전을제거한결과 - 184 -

< 그림 2.59> 0 m Seconds < 그림 2.60> 0.3 m Seconds - 185 -

< 그림 2.61> 0.6 m Seconds < 그림 2.62> 1.8 m Seconds - 186 -

(3) 제안한알고리즘의 Black 영상제거및잔상제거결과 < 그림 2.63> 0 m Seconds < 그림 2.64> 0.3 m Seconds - 187 -

< 그림 2.65> 0.6 m Seconds < 그림 2.66> 0.9 m Seconds - 188 -

< 그림 2.67> 1.0 m Seconds < 그림 2.68> 1.3 m Seconds - 189 -

< 그림 2.69> 1.6 m Seconds < 그림 2.70> 1.9 m Seconds - 190 -

< 그림 2.71> 2.2 m Seconds - 잔상이제거된하얀배경 기존의 E-Paper Panel 을사용하여, 화면갱신을할때에는화면깜 박임과화면잔상이문제가되고있는데, 이과제를통해적용한 알고리즘을통해, 화면잔상과깜박임을해결하였다. - 191 -

제 3 항 성능평가 현재상용화단계까지진행되었거나거의상용화단계에이른대표적인입자기술중심전자종이는전기영동식, 입자회전식, 건식이동식이있고 E-ink, Gryicon, Bridgestone사가기술개발및제품화중이다. 그러나이러한제품들도응답속도, 해상도, 구동전압, 컬러및계조표시등의문제들이요구조건에미치지못하거나근본적인한계를가지고있다. < 표 2.7 기존방식들의성능비교 > E-Paper E-ink Twist ball Gyricon Microcup SiPix QR-LPD Bridgeston e Driving Voltage 90V 80V 30V 200V Contrast ratio (newspaper ~10 10 ~8 ~10 ~9 Print ~20) Response time 100ms 300ms 200ms 0.2ms Reflectivity (newspaper~50 % Print ~80%) Size 40% 20% 40% 40% Ball 100~200 Thickness 400 Ball 50~100 Thickness 500 Thickness 290-192 -

제 3 장결론 제 1 절기술개발의정리 전자종이는기존의디스플레이의용도와는달리, 기존의종이와잉크처럼높은해상도, 넓은시야각, 밝은흰색배경, 전원을차단한후에도화상이유지되고백라이트 (back light) 전원이없어이동통신기기의배터리수명이오래유지되므로원가절감및경량화를쉽게적용할수있는것, 그리고대략 100ms에달하는낮은응답성, 제한적인컬러 (color) 를특징으로하는, 유비쿼터스환경을위한디스플레이장치이다. 이러한전자종이는 200년부터소규모시장이형성되어 2008년부터본격화가이루어질것으로예상되며, 2010년에는대중화가될것으로예상하고있다. 전자종이의경우도전자종이의특성에맞는사용방법과활용방법이있어야하며이는낮은응답성과흑백디스플레이또는낮은컬러표현력에도불구하고사용자에게시각적으로용이한방법을제공해야한다는것이다. 전자종이의특징에맞는 GUI 시스템이미들웨어형태로개발된다면전자종이의대중화에따라그파급은전자기기, 광고및출판, 홍보, 인테리어산업에이르는산업분야에서효과적 - 193 -

으로이용될수있다. 따라서본과제의목표는전자종이디스플레이의특징에맞는 GUI 시스템의개발이며, 휴대가가능하도록설계된하드웨어전자종이디스플레이장치를연결하여해당기기와의인터페이스가가능하도록하는 GUI 시스템을개발하는것이며이를위한하드웨어 SDK 개발과윈도우즈용시뮬레이션프로그램개발이다. 제 2 절기술개발의활용에대한건의 전자종이의용도는개인용, 가정용, 사무용, 공용으로분류할수있고, 세부적으로는책, 장식, 신문, 벽지장식, 문서뷰어, 모바일단말기, 게시물, 선전물, 간판현수막, 안내표시, 시간표시판등으로응용이가능하다. 현재전자종이화면의해상도가좋지못해서큰글씨형태로사용되기때문에책이나신문보다는광고판이나플래카드용도로쓰인다. 미국의일부백화점에서일종의광고판으로시험사용되고있다. 할인행사 환불불가 등상점이나길거리에서안내문구을보여주는디스플레이형태로활용되고있다. 시장규모는크지못하다. 다음으로전자책으로의적용이가시화되고있다. 그외제품은대부분시제품단계이다. < 그림 3.1>, < 그림 3.2>, < 그림 3.3>, < 그림 3.3>, < 그림 3.4> 에각각의용도로개발된제품들을보여주고있다. - 194 -

< 그림 3.1> 전자페이퍼용도 자료 : 富士キメラ硏究所, 2004 有望電子部品材料, p.263 < 그림 3.2> 히다찌사의가장넓은전자종이 (8X10x0.5 인치 ) - 195 -

< 그림 3.3> 후지제록스사의전자종이색인카드 < 그림 3.4> 전자종이 e-book 사례 - 196 -

이외에도전철걸개형광고와만곡된벽면등의공공장소에서디스플레이로의사용가능하고, 전자서가, POP 광고, 레스토랑의메뉴등으로점포에서사용가능하며, 컬러의가격표및상품정보디스플레이등으로사용이가능하다. 또한매뉴얼과작업지시서의필요부분만을디스플레이하고휴대가가능하기때문에종이없는직장과공장을실현할수있으며, 휴대폰으로취득한문자데이터및화상데이터를무선으로확대디스플레이할수있다. 가정에서디지털컨텐츠를손쉽게게시하거나소지하고다닐수있다고알려져있다. < 그림 3.5> 후지츠사의칼라전자종이 (A4 사이즈, 두께 0.8mm) - 197 -

우리나라의디스플레이산업수준은세계최고로세계적인 IT국가로인정받고있다. 그러므로전자종이산업에서도우위를나타내는경우, 한국 IT산업및기타산업전반에는상당한시너지효과가창출될가능성이높다. 전자종이산업은앞서언급한대로문화산업 (CT) 와도상당한관계가있으며기타 IT산업과각종서비스산업과도상당한연관을갖게될것이기때문이다. 우리나라의경우기존의디스플레이산업분야에서의기술축적, 성공경험을바탕으로기술개발이진행되고있다. 그리고, 기존우리나라화장품이나건강식품분야등에서이미활용되고있는캡슐화기술도전자종이기술개발에있어서도움이될것으로기대되고있다. 제 3 절기술개발의기대효과 전자디스플레이로서의전자종이가언급되고오래지않아서, 둘둘말수있는종이두께의화면이실현됐으며동영상까지구현한전자종이가개발됐다는소식이연이어보도되고있다. 많은언론들에서곧제품이본격출시될것같이말하고있지만, 시장본격출시에는시간이걸리고있다. 가장큰문제는역시가격의문제이고, 다음으로동작속도를높이고칼라를구현하는등의제품화기술, 표준화등의문제로인한것이다. 시장조사업체인아이서플라이는 2004년 9월 플렉시블디스플레이 - 198 -

시장보고서 에서 2004년샘플수준의시장이 2005년에는 4만5000 매 (31만달러, 매당약 7달러 ), 2010년에는 2,550만매 (1,780만달러, 매당약 0.7달러 ) 의시장으로확대될것으로전망했다. 반면에, STEMI는 ubiquitous market forecast report(2003년 ) 에서세계 e-paper 시장을 2004년부터시장이형성되어 2010년까지연평균성장율약 89.6%( 수량기준 ) 의성장을보여서, 수량기준 928만매에달하고, 금액기준으로는 148억엔에이를것으로보고있으며, 기존디스 플레이의 8% 를대체시킬것으로보고있다. 그리고 Display Search(2003년 ) 에서는 2004년 180만달러, 2005년 430만달러, 2006년 740만달러, 2007년 940만달러시장을형성할것으로예측하고있다. 또한가장최근에富士硏究所에서는 < 그림 3.6> 과같이시장을추정하고있다. < 그림 3.6> 전자페이퍼전세계시장규모 - 199 -

즉, 2005년전자종이세계시장은 200만매, 금액으로는 200억엔에서 2010년 6,100만매, 2,411억엔의시장을형성할것으로보고있다. 동업체에서는과거 2002년에 2003년에 250만매가판매될것으로추정하였으나실현되지못하였고, 기간이 2년정도늦추어지는것으로 2005년에추정하고있다. 이는이전의추정들과달리 2004년적은양이나마매출이이루어지면서만들어진추정치이고, 제조되어판매되고있는제품이일본의凸版印刷와미국의 e-ink의공동개발로제조되어신뢰성이높다고판단된다. 국내시장을추정한다면현재이분야에서매출을발생시키고있는 2개업체, 소프트픽셀과레오럭스의매출을합한것을국내의현재시장규모로보았다. 이업체들의매출이정규적이지못하고, 연구프로젝트나시제품공급등에서발생하는경우가대부분이므로, 정확한국내시장규모로보기는힘들지만현재시장추정치는이방법으로만들어져야한다고판단된다. 그래서 2003년의국내시장규모는약 14억원으로판단된다. 미래시장은일본富士キメラ硏究所에서추정한세계시장수요예측데이터 (< 그림 3.6> 참조 ) 에선도지표방법을동원하여전망하고자한다. 이방법에따르면, 2009년의국내시장규모는약 687억원으로추정된다. 시장조사기관들이언급하고있는전자종이연평균성장율및가 - 200 -

격동향을 < 표 3.1> 에나타내었다. < 표 3.1> 전자종이시장연평균성장율및가격 ( 추정치 ) 연평균성장율의경우 50% 가넘는높은성장률을예측하고있으며, 가격의경우생산량이늘어나면서점차감소하는것을알수있다. Fuji Chimera에서의제품의경우전자책이라는특정용도로사용되는제품을대상으로하고있어서가격이특별히높다. 한편, 전자책시장도같이언급하고자한다. 왜냐하면, 전자책의경우전자종이가가장먼저시장을대체할것으로여겨지기때문이다. 현재전자책은전자자료형태의책을데스크탑이나노트북, PDA, 전자책전용단말기 ( 전자종이미사용 ) 로서비스되고있다. 극히일부의경우전자종이를이용한휴대용전자책뷰어가사용되고있다. 필립스와 E-Ink사가소니 (Sony) 와합작해서 2004년초에만든 소니리브리에 (Sony Librie) 는전자잉크를사용하는최초의전자책뷰어이다. 이것은기존의전자책단말기와는달리마이크로캡슐 (microcapsules) 을이용한전자잉크를사용함으로써, 해상도를높이면서도전력소모가적고, 일반건전지를사용할수있다는장점을지니고있다. 리브리에의출시는일본에서한동안시들했던전자책 - 201 -